corsa-oxlint 0.30.0 → 0.33.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/dist/checker.js CHANGED
@@ -29,7 +29,7 @@ function createTypeChecker(context) {
29
29
  getTypeAtLocation(node) {
30
30
  if (node.type === "NewExpression") return typeOfNewExpression(node, this);
31
31
  const lookupNode = nodeForTypeLookup(node);
32
- return sessionForContext(context).session.getTypeAtPosition(filenameFor(context, lookupNode), toPosition(lookupNode), sourceTextFor(context, lookupNode));
32
+ return sessionForContext(context).session.getTypeAtSourceRange(filenameFor(context, lookupNode), toPosition(lookupNode), endPosition(lookupNode), sourceTextFor(context, lookupNode), nodeKind(lookupNode));
33
33
  },
34
34
  getContextualType(node) {
35
35
  return this.getTypeAtLocation(node);
@@ -170,6 +170,15 @@ function nodeForTypeLookup(node) {
170
170
  default: return node;
171
171
  }
172
172
  }
173
+ function endPosition(node) {
174
+ if ("end" in node) return node.end;
175
+ const range = node.range;
176
+ if (!range) throw new Error("corsa oxlint requires ESTree nodes with range data");
177
+ return range[1];
178
+ }
179
+ function nodeKind(node) {
180
+ return "pos" in node ? void 0 : node.type;
181
+ }
173
182
  function childNode(node, key) {
174
183
  const value = node[key];
175
184
  if (isNode(value)) return value;
@@ -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 CorsaNode,\n CorsaProgramShape,\n CorsaSignature,\n CorsaSymbol,\n CorsaType,\n CorsaTypeCheckerShape,\n} from \"./types\";\n\nexport function createProgram(\n context: ContextWithParserOptions,\n): CorsaProgramShape & { 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): CorsaTypeCheckerShape {\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 (\n this.getTypeOfSymbol(symbol) ??\n this.getDeclaredTypeOfSymbol(symbol) ??\n this.getTypeAtLocation(node)\n );\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 implementedTypesFromCorsaNode(context, node, this);\n }\n const sourceText = sourceTextFor(context, node);\n const sourceNode = sourceText ? corsaNodeFromEstree(context, node) : undefined;\n if (sourceText && sourceNode) {\n const implemented = implementedTypesFromSourceText(context, sourceNode, sourceText, this);\n if (implemented.length > 0) {\n return implemented;\n }\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 CorsaType => type !== undefined);\n },\n getImplementedTypesOfType(type) {\n return implementedTypesFromTypeAndBases(context, type, this);\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 | CorsaNode | CorsaType | CorsaSymbol | CorsaSignature,\n): string | undefined {\n return sourceTextForPath(context, filenameFor(context, node));\n}\n\nfunction sourceTextForPath(\n context: ContextWithParserOptions,\n fileName: string,\n): string | undefined {\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 : sessionForContext(context).session.getSourceTextForPath(fileName);\n}\n\nfunction typeOfNewExpression(node: Node, checker: CorsaTypeCheckerShape): CorsaType | 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 | CorsaNode): Node | CorsaNode {\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 | CorsaNode): 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 implementedTypesFromCorsaNode(\n context: ContextWithParserOptions,\n node: CorsaNode,\n checker: CorsaTypeCheckerShape,\n): readonly CorsaType[] {\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 return implementedTypesFromSourceText(context, node, sourceText, checker);\n }\n const type = checker.getTypeAtLocation(node);\n return type ? checker.getImplementedTypesOfType(type) : [];\n}\n\nfunction corsaNodeFromEstree(context: ContextWithParserOptions, node: Node): CorsaNode | undefined {\n const range = (node as { readonly range?: unknown }).range;\n if (\n !Array.isArray(range) ||\n range.length < 2 ||\n typeof range[0] !== \"number\" ||\n typeof range[1] !== \"number\"\n ) {\n return undefined;\n }\n return {\n fileName: context.filename,\n pos: range[0],\n end: range[1],\n range: [range[0], range[1]] as const,\n };\n}\n\nfunction implementedTypesFromTypeAndBases(\n context: ContextWithParserOptions,\n type: CorsaType,\n checker: CorsaTypeCheckerShape,\n): readonly CorsaType[] {\n // Iterative DFS over the base chain so we don't pay for one closure call\n // and one `push(...subResult)` spread per base (each spread used to copy\n // the entire growing accumulator). Visit order doesn't matter because we\n // dedupe by `type.id`.\n const seenTypes = new Set<string>();\n const seenImplementedTypes = new Set<string>();\n const implemented: CorsaType[] = [];\n const stack: CorsaType[] = [type];\n while (stack.length > 0) {\n const current = stack.pop()!;\n if (seenTypes.has(current.id)) {\n continue;\n }\n seenTypes.add(current.id);\n\n const ownImplemented = implementedTypesFromTypeDeclaration(context, current, checker);\n for (let index = 0; index < ownImplemented.length; index += 1) {\n const ownType = ownImplemented[index]!;\n if (seenImplementedTypes.has(ownType.id)) {\n continue;\n }\n seenImplementedTypes.add(ownType.id);\n implemented.push(ownType);\n }\n\n const bases = checker.getBaseTypes(current);\n // Push in reverse so the natural visit order matches the recursive form.\n for (let index = bases.length - 1; index >= 0; index -= 1) {\n const baseType = bases[index]!;\n if (seenTypes.has(baseType.id)) {\n continue;\n }\n stack.push(baseType);\n }\n }\n return implemented;\n}\n\nfunction implementedTypesFromTypeDeclaration(\n context: ContextWithParserOptions,\n type: CorsaType,\n checker: CorsaTypeCheckerShape,\n): readonly CorsaType[] {\n const session = sessionForContext(context).session;\n const symbol = type.symbol ? session.getSymbol(type.symbol) : undefined;\n const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0];\n const declarationNode = declaration ? session.getNode(declaration) : undefined;\n const sourceText = declarationNode\n ? sourceTextForPath(context, declarationNode.fileName)\n : undefined;\n return declarationNode && sourceText\n ? implementedTypesFromSourceText(context, declarationNode, sourceText, checker)\n : [];\n}\n\nfunction implementedTypesFromSourceText(\n context: ContextWithParserOptions,\n node: CorsaNode,\n sourceText: string,\n checker: CorsaTypeCheckerShape,\n): readonly CorsaType[] {\n if (node.pos < 0 || node.end > sourceText.length || node.pos >= node.end) {\n return [];\n }\n const classText = sourceText.slice(node.pos, node.end);\n const classStart = findKeywordOutsideTrivia(classText, \"class\");\n const headerStart = classStart >= 0 ? classStart : 0;\n const bodyOpen = findClassBodyOpen(classText, headerStart);\n const headerText = classText.slice(headerStart, bodyOpen >= 0 ? bodyOpen : classText.length);\n const implementsIndex = findKeywordOutsideTrivia(headerText, \"implements\");\n if (implementsIndex < 0) {\n return [];\n }\n const session = sessionForContext(context).session;\n const clauseText = headerText.slice(implementsIndex + \"implements\".length);\n const clauseStart = node.pos + headerStart + implementsIndex + \"implements\".length;\n return 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 = clauseStart + range.start + leading;\n const end = clauseStart + range.end - trailing;\n const lookupNode: CorsaNode = {\n fileName: node.fileName,\n pos,\n end,\n range: [pos, end] as const,\n };\n const symbol = checker.getSymbolAtLocation(lookupNode);\n const type = symbol\n ? (checker.getDeclaredTypeOfSymbol(symbol) ?? checker.getTypeOfSymbol(symbol))\n : checker.getTypeAtLocation(lookupNode);\n if (type) {\n // Implemented-interface handles come back with empty `texts`, so warm\n // the type-text cache with the `implements` identifier. If upstream\n // later evicts the handle, `typeToString` falls back to this name\n // instead of throwing (GH#211).\n session.rememberTypeText(type.id, raw.slice(leading, raw.length - trailing));\n }\n return type;\n })\n .filter((type): type is CorsaType => type !== undefined);\n}\n\nfunction findClassBodyOpen(text: string, start: number): 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 = start; index < text.length; index += 1) {\n const nextIndex = scanner.skip(text, index);\n if (nextIndex > index) {\n index = nextIndex - 1;\n continue;\n }\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 (\n char === \"{\" &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n return index;\n } else if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n }\n return -1;\n}\n\nfunction findKeywordOutsideTrivia(text: string, keyword: string): number {\n const scanner = createScanner();\n for (let index = 0; index < text.length; index += 1) {\n const nextIndex = scanner.skip(text, index);\n if (nextIndex > index) {\n index = nextIndex - 1;\n continue;\n }\n if (matchesKeyword(text, keyword, index)) {\n return index;\n }\n }\n return -1;\n}\n\nfunction matchesKeyword(text: string, keyword: string, index: number): boolean {\n return (\n text.startsWith(keyword, index) &&\n !isIdentifierPart(text[index - 1]) &&\n !isIdentifierPart(text[index + keyword.length])\n );\n}\n\nfunction isIdentifierPart(char: string | undefined): boolean {\n return char !== undefined && /[A-Za-z0-9_$]/.test(char);\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 const nextIndex = scanner.skip(text, index);\n if (nextIndex > index) {\n index = nextIndex - 1;\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 skip(text: string, index: number): number;\n} {\n let quote: string | undefined;\n let escaped = false;\n let inLineComment = false;\n let inBlockComment = false;\n return {\n skip(text, index) {\n const char = text[index];\n const next = text[index + 1];\n if (inLineComment) {\n if (char === \"\\n\" || char === \"\\r\") {\n inLineComment = false;\n }\n return index + 1;\n }\n if (inBlockComment) {\n if (char === \"*\" && next === \"/\") {\n inBlockComment = false;\n return index + 2;\n }\n return index + 1;\n }\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 index + 1;\n }\n if (char === \"/\" && next === \"/\") {\n inLineComment = true;\n return index + 2;\n }\n if (char === \"/\" && next === \"*\") {\n inBlockComment = true;\n return index + 2;\n }\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n return index + 1;\n }\n return index;\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 | CorsaNode | CorsaType | CorsaSymbol | CorsaSignature,\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 CorsaNode,\n CorsaProgramShape,\n CorsaSignature,\n CorsaSymbol,\n CorsaType,\n CorsaTypeCheckerShape,\n} from \"./types\";\n\nexport function createProgram(\n context: ContextWithParserOptions,\n): CorsaProgramShape & { 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): CorsaTypeCheckerShape {\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.getTypeAtSourceRange(\n filenameFor(context, lookupNode),\n toPosition(lookupNode),\n endPosition(lookupNode),\n sourceTextFor(context, lookupNode),\n nodeKind(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 (\n this.getTypeOfSymbol(symbol) ??\n this.getDeclaredTypeOfSymbol(symbol) ??\n this.getTypeAtLocation(node)\n );\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 implementedTypesFromCorsaNode(context, node, this);\n }\n const sourceText = sourceTextFor(context, node);\n const sourceNode = sourceText ? corsaNodeFromEstree(context, node) : undefined;\n if (sourceText && sourceNode) {\n const implemented = implementedTypesFromSourceText(context, sourceNode, sourceText, this);\n if (implemented.length > 0) {\n return implemented;\n }\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 CorsaType => type !== undefined);\n },\n getImplementedTypesOfType(type) {\n return implementedTypesFromTypeAndBases(context, type, this);\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 | CorsaNode | CorsaType | CorsaSymbol | CorsaSignature,\n): string | undefined {\n return sourceTextForPath(context, filenameFor(context, node));\n}\n\nfunction sourceTextForPath(\n context: ContextWithParserOptions,\n fileName: string,\n): string | undefined {\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 : sessionForContext(context).session.getSourceTextForPath(fileName);\n}\n\nfunction typeOfNewExpression(node: Node, checker: CorsaTypeCheckerShape): CorsaType | 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 | CorsaNode): Node | CorsaNode {\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 endPosition(node: Node | CorsaNode): number {\n if (\"end\" in node) {\n return node.end;\n }\n const range = (node as Node & { readonly range?: readonly [number, number] }).range;\n if (!range) {\n throw new Error(\"corsa oxlint requires ESTree nodes with range data\");\n }\n return range[1];\n}\n\nfunction nodeKind(node: Node | CorsaNode): string | undefined {\n return \"pos\" in node ? undefined : (node as { readonly type?: string }).type;\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 | CorsaNode): 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 implementedTypesFromCorsaNode(\n context: ContextWithParserOptions,\n node: CorsaNode,\n checker: CorsaTypeCheckerShape,\n): readonly CorsaType[] {\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 return implementedTypesFromSourceText(context, node, sourceText, checker);\n }\n const type = checker.getTypeAtLocation(node);\n return type ? checker.getImplementedTypesOfType(type) : [];\n}\n\nfunction corsaNodeFromEstree(context: ContextWithParserOptions, node: Node): CorsaNode | undefined {\n const range = (node as { readonly range?: unknown }).range;\n if (\n !Array.isArray(range) ||\n range.length < 2 ||\n typeof range[0] !== \"number\" ||\n typeof range[1] !== \"number\"\n ) {\n return undefined;\n }\n return {\n fileName: context.filename,\n pos: range[0],\n end: range[1],\n range: [range[0], range[1]] as const,\n };\n}\n\nfunction implementedTypesFromTypeAndBases(\n context: ContextWithParserOptions,\n type: CorsaType,\n checker: CorsaTypeCheckerShape,\n): readonly CorsaType[] {\n // Iterative DFS over the base chain so we don't pay for one closure call\n // and one `push(...subResult)` spread per base (each spread used to copy\n // the entire growing accumulator). Visit order doesn't matter because we\n // dedupe by `type.id`.\n const seenTypes = new Set<string>();\n const seenImplementedTypes = new Set<string>();\n const implemented: CorsaType[] = [];\n const stack: CorsaType[] = [type];\n while (stack.length > 0) {\n const current = stack.pop()!;\n if (seenTypes.has(current.id)) {\n continue;\n }\n seenTypes.add(current.id);\n\n const ownImplemented = implementedTypesFromTypeDeclaration(context, current, checker);\n for (let index = 0; index < ownImplemented.length; index += 1) {\n const ownType = ownImplemented[index]!;\n if (seenImplementedTypes.has(ownType.id)) {\n continue;\n }\n seenImplementedTypes.add(ownType.id);\n implemented.push(ownType);\n }\n\n const bases = checker.getBaseTypes(current);\n // Push in reverse so the natural visit order matches the recursive form.\n for (let index = bases.length - 1; index >= 0; index -= 1) {\n const baseType = bases[index]!;\n if (seenTypes.has(baseType.id)) {\n continue;\n }\n stack.push(baseType);\n }\n }\n return implemented;\n}\n\nfunction implementedTypesFromTypeDeclaration(\n context: ContextWithParserOptions,\n type: CorsaType,\n checker: CorsaTypeCheckerShape,\n): readonly CorsaType[] {\n const session = sessionForContext(context).session;\n const symbol = type.symbol ? session.getSymbol(type.symbol) : undefined;\n const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0];\n const declarationNode = declaration ? session.getNode(declaration) : undefined;\n const sourceText = declarationNode\n ? sourceTextForPath(context, declarationNode.fileName)\n : undefined;\n return declarationNode && sourceText\n ? implementedTypesFromSourceText(context, declarationNode, sourceText, checker)\n : [];\n}\n\nfunction implementedTypesFromSourceText(\n context: ContextWithParserOptions,\n node: CorsaNode,\n sourceText: string,\n checker: CorsaTypeCheckerShape,\n): readonly CorsaType[] {\n if (node.pos < 0 || node.end > sourceText.length || node.pos >= node.end) {\n return [];\n }\n const classText = sourceText.slice(node.pos, node.end);\n const classStart = findKeywordOutsideTrivia(classText, \"class\");\n const headerStart = classStart >= 0 ? classStart : 0;\n const bodyOpen = findClassBodyOpen(classText, headerStart);\n const headerText = classText.slice(headerStart, bodyOpen >= 0 ? bodyOpen : classText.length);\n const implementsIndex = findKeywordOutsideTrivia(headerText, \"implements\");\n if (implementsIndex < 0) {\n return [];\n }\n const session = sessionForContext(context).session;\n const clauseText = headerText.slice(implementsIndex + \"implements\".length);\n const clauseStart = node.pos + headerStart + implementsIndex + \"implements\".length;\n return 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 = clauseStart + range.start + leading;\n const end = clauseStart + range.end - trailing;\n const lookupNode: CorsaNode = {\n fileName: node.fileName,\n pos,\n end,\n range: [pos, end] as const,\n };\n const symbol = checker.getSymbolAtLocation(lookupNode);\n const type = symbol\n ? (checker.getDeclaredTypeOfSymbol(symbol) ?? checker.getTypeOfSymbol(symbol))\n : checker.getTypeAtLocation(lookupNode);\n if (type) {\n // Implemented-interface handles come back with empty `texts`, so warm\n // the type-text cache with the `implements` identifier. If upstream\n // later evicts the handle, `typeToString` falls back to this name\n // instead of throwing (GH#211).\n session.rememberTypeText(type.id, raw.slice(leading, raw.length - trailing));\n }\n return type;\n })\n .filter((type): type is CorsaType => type !== undefined);\n}\n\nfunction findClassBodyOpen(text: string, start: number): 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 = start; index < text.length; index += 1) {\n const nextIndex = scanner.skip(text, index);\n if (nextIndex > index) {\n index = nextIndex - 1;\n continue;\n }\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 (\n char === \"{\" &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n return index;\n } else if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n }\n return -1;\n}\n\nfunction findKeywordOutsideTrivia(text: string, keyword: string): number {\n const scanner = createScanner();\n for (let index = 0; index < text.length; index += 1) {\n const nextIndex = scanner.skip(text, index);\n if (nextIndex > index) {\n index = nextIndex - 1;\n continue;\n }\n if (matchesKeyword(text, keyword, index)) {\n return index;\n }\n }\n return -1;\n}\n\nfunction matchesKeyword(text: string, keyword: string, index: number): boolean {\n return (\n text.startsWith(keyword, index) &&\n !isIdentifierPart(text[index - 1]) &&\n !isIdentifierPart(text[index + keyword.length])\n );\n}\n\nfunction isIdentifierPart(char: string | undefined): boolean {\n return char !== undefined && /[A-Za-z0-9_$]/.test(char);\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 const nextIndex = scanner.skip(text, index);\n if (nextIndex > index) {\n index = nextIndex - 1;\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 skip(text: string, index: number): number;\n} {\n let quote: string | undefined;\n let escaped = false;\n let inLineComment = false;\n let inBlockComment = false;\n return {\n skip(text, index) {\n const char = text[index];\n const next = text[index + 1];\n if (inLineComment) {\n if (char === \"\\n\" || char === \"\\r\") {\n inLineComment = false;\n }\n return index + 1;\n }\n if (inBlockComment) {\n if (char === \"*\" && next === \"/\") {\n inBlockComment = false;\n return index + 2;\n }\n return index + 1;\n }\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 index + 1;\n }\n if (char === \"/\" && next === \"/\") {\n inLineComment = true;\n return index + 2;\n }\n if (char === \"/\" && next === \"*\") {\n inBlockComment = true;\n return index + 2;\n }\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n return index + 1;\n }\n return index;\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 | CorsaNode | CorsaType | CorsaSymbol | CorsaSignature,\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/session.d.ts CHANGED
@@ -10,6 +10,7 @@ declare class CorsaProjectSession {
10
10
  getCompilerOptions(): unknown;
11
11
  getRootFileNames(): readonly string[];
12
12
  getTypeAtPosition(fileName: string, position: number, sourceText?: string): CorsaType | undefined;
13
+ getTypeAtSourceRange(fileName: string, start: number, end: number, sourceText: string | undefined, kind: string | undefined): CorsaType | undefined;
13
14
  getSymbolAtPosition(fileName: string, position: number, sourceText?: string): CorsaSymbol | undefined;
14
15
  getSymbol(symbol: string | CorsaSymbol): CorsaSymbol | undefined;
15
16
  getNode(node: string | CorsaNode): CorsaNode | undefined;
@@ -45,6 +46,7 @@ declare class CorsaProjectSession {
45
46
  private rememberTypes;
46
47
  private rememberTypeSource;
47
48
  private cacheTypeText;
49
+ private typeTexts;
48
50
  private rememberSymbol;
49
51
  private rememberSymbols;
50
52
  private rememberSignatures;
package/dist/session.js CHANGED
@@ -65,6 +65,19 @@ var CorsaProjectSession = class {
65
65
  });
66
66
  return type;
67
67
  }
68
+ getTypeAtSourceRange(fileName, start, end, sourceText, kind) {
69
+ if (!sourceText || end <= start) return this.getTypeAtPosition(fileName, start, sourceText);
70
+ const state = this.fileState(fileName, sourceText);
71
+ const key = `${start}:${end}:${kind ?? ""}`;
72
+ if (!state.typeBySourceRange.has(key)) state.typeBySourceRange.set(key, this.client().getTypeAtSourceRange(this.#snapshot, state.projectId, fileName, start, end, sourceText, kind));
73
+ const type = this.rememberType(state.typeBySourceRange.get(key));
74
+ if (type) this.#typeLookupById.set(type.id, {
75
+ fileName,
76
+ position: start,
77
+ sourceText
78
+ });
79
+ return type;
80
+ }
68
81
  getSymbolAtPosition(fileName, position, sourceText) {
69
82
  const state = this.fileState(fileName, sourceText);
70
83
  if (!state.symbolByPosition.has(position)) state.symbolByPosition.set(position, this.client().getSymbolAtPosition(this.#snapshot, state.projectId, fileName, position));
@@ -159,7 +172,8 @@ var CorsaProjectSession = class {
159
172
  return this.rememberTypes(this.client().callJson("getBaseTypes", {
160
173
  snapshot: this.#snapshot,
161
174
  project: this.projectId(),
162
- type: type.id
175
+ type: type.id,
176
+ texts: this.typeTexts(type)
163
177
  }) ?? []);
164
178
  } catch (error) {
165
179
  if (isProtocolPanicError(error) || isStaleHandleError(error)) return [];
@@ -211,7 +225,7 @@ var CorsaProjectSession = class {
211
225
  return (type.flags & typeFlags.substitution) !== 0 ? this.callType("getBaseTypeOfType", type) : void 0;
212
226
  }
213
227
  getConstraintOfType(type) {
214
- return (type.flags & typeFlags.substitution) !== 0 ? this.callType("getConstraintOfType", type) : void 0;
228
+ return this.rememberType(this.client().getConstraintOfType(this.#snapshot, this.projectId(), type.id));
215
229
  }
216
230
  callType(method, type) {
217
231
  return this.rememberType(this.client().callJson(method, {
@@ -276,6 +290,11 @@ var CorsaProjectSession = class {
276
290
  this.#typeTextById.set(type.id, this.client().typeToString(this.#snapshot, this.projectId(), type.id));
277
291
  } catch {}
278
292
  }
293
+ typeTexts(type) {
294
+ if (Array.isArray(type.texts) && type.texts.length > 0) return type.texts;
295
+ const cached = this.#typeTextById.get(type.id);
296
+ return cached === void 0 ? [] : [cached];
297
+ }
279
298
  rememberSymbol(symbol) {
280
299
  if (!symbol) return symbol;
281
300
  const synthetic = this.#syntheticSymbolsById.get(symbol.id);
@@ -392,6 +411,7 @@ var CorsaProjectSession = class {
392
411
  sourceText: prepared.sourceText,
393
412
  projectId: project?.id ?? this.projectId(),
394
413
  typeByPosition: /* @__PURE__ */ new Map(),
414
+ typeBySourceRange: /* @__PURE__ */ new Map(),
395
415
  symbolByPosition: /* @__PURE__ */ new Map()
396
416
  };
397
417
  this.#files.set(fileName, state);
@@ -1 +1 @@
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, CorsaApiClient } from \"@corsa-bind/napi\";\n\nimport type {\n CorsaNode,\n CorsaSignature,\n CorsaSymbol,\n CorsaType,\n CorsaTypePredicate,\n} 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, CorsaType | undefined>;\n symbolByPosition: Map<number, CorsaSymbol | undefined>;\n};\n\ntype PreparedFileState = {\n mtimeMs: number;\n lintSourceText?: string;\n sourceText?: string;\n};\n\ntype SourceSlice = {\n node: CorsaNode;\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: CorsaNode;\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 CorsaProjectSession {\n #client?: CorsaApiClient;\n #config?: { options: unknown; fileNames: string[] };\n #snapshot?: string;\n #projects: ProjectResponse[] = [];\n #files = new Map<string, FileCache>();\n #symbolsById = new Map<string, CorsaSymbol>();\n #syntheticSymbolsById = new Map<string, CorsaSymbol>();\n #symbolTypeById = new Map<string, string>();\n #nodesById = new Map<string, CorsaNode>();\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(\n fileName: string,\n position: number,\n sourceText?: string,\n ): CorsaType | 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 | CorsaType\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 ): CorsaSymbol | 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 | CorsaSymbol\n | undefined,\n );\n }\n return this.rememberSymbol(state.symbolByPosition.get(position));\n }\n\n getSymbol(symbol: string | CorsaSymbol): CorsaSymbol | 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<CorsaSymbol | 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 | CorsaNode): CorsaNode | undefined {\n if (typeof node !== \"string\") {\n return node;\n }\n return this.#nodesById.get(node) ?? this.rememberNode(node);\n }\n\n getSourceTextForPath(path: string): string | undefined {\n return this.sourceTextForPath(path);\n }\n\n getTypeOfSymbol(symbol: CorsaSymbol): CorsaType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n getDeclaredTypeOfSymbol(symbol: CorsaSymbol): CorsaType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getDeclaredTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n typeToString(type: CorsaType, 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 // Seeds the type-text cache from a name the caller already knows (for\n // example the identifier in an `implements` clause). Implemented-interface\n // handles come back with empty `texts`, and upstream Corsa sometimes evicts\n // them from its snapshot registry before `typeToString` runs, so warming the\n // cache here lets `typeToString` fall back to the source name instead of\n // throwing (GH#211). Never overwrites a value the server already provided.\n rememberTypeText(typeId: string, text: string): void {\n if (!this.#typeTextById.has(typeId)) {\n this.#typeTextById.set(typeId, text);\n }\n }\n\n getBaseTypeOfLiteralType(type: CorsaType): CorsaType | 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: CorsaType): readonly CorsaSymbol[] {\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: CorsaType, kind: number): readonly CorsaSignature[] {\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: CorsaSignature): CorsaType | 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: CorsaSignature): CorsaTypePredicate | undefined {\n const predicate = this.client().callJson<CorsaTypePredicate | 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: CorsaType): readonly CorsaType[] {\n if (isArrayOrTupleLikeType(this, type)) {\n return [];\n }\n try {\n return this.rememberTypes(\n this.client().callJson(\"getBaseTypes\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n }) ?? [],\n );\n } catch (error) {\n // Upstream Corsa occasionally drops a type handle from its snapshot\n // registry after the first base-types query on a class that has no\n // explicit `extends` clause. Treating that as \"no base types\" lets a\n // follow-up `getImplementedTypesOfType` on the same handle still report\n // the type's own `implements` clause instead of throwing (GH#206).\n if (isProtocolPanicError(error) || isStaleHandleError(error)) {\n return [];\n }\n throw error;\n }\n }\n\n getTypeArguments(type: CorsaType): readonly CorsaType[] {\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 CorsaType[],\n );\n return argumentsFromApi.length > 0 ? argumentsFromApi : this.fallbackTypeArguments(type);\n }\n\n getTypesOfType(type: CorsaType): readonly CorsaType[] {\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: CorsaType): CorsaType | 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: CorsaType): readonly CorsaType[] {\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: CorsaType): readonly CorsaType[] {\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: CorsaType): readonly CorsaType[] {\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: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getObjectTypeOfType\", type)\n : undefined;\n }\n\n getIndexTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getIndexTypeOfType\", type)\n : undefined;\n }\n\n getCheckTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getCheckTypeOfType\", type)\n : undefined;\n }\n\n getExtendsTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getExtendsTypeOfType\", type)\n : undefined;\n }\n\n getBaseTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.substitution) !== 0\n ? this.callType(\"getBaseTypeOfType\", type)\n : undefined;\n }\n\n getConstraintOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.substitution) !== 0\n ? this.callType(\"getConstraintOfType\", type)\n : undefined;\n }\n\n private callType(method: string, type: CorsaType): CorsaType | undefined {\n return this.rememberType(\n this.client().callJson<CorsaType | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? undefined,\n );\n }\n\n private callTypeArray(method: string, type: CorsaType): readonly CorsaType[] {\n return this.rememberTypes(\n this.client().callJson<readonly CorsaType[] | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? [],\n );\n }\n\n private tryGetSymbolType(\n symbol: CorsaSymbol,\n method: \"getTypeOfSymbol\" | \"getDeclaredTypeOfSymbol\",\n ): CorsaType | undefined {\n try {\n return this.client()[method](this.#snapshot!, this.projectId(), symbol.id) as\n | CorsaType\n | undefined;\n } catch {\n return undefined;\n }\n }\n\n private fallbackTypeArguments(type: CorsaType): readonly CorsaType[] {\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 CorsaType => argument !== undefined);\n }\n\n private sourceSliceForType(type: CorsaType): 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 CorsaType | 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 CorsaType[]>(types: T): T {\n for (const type of types) {\n this.rememberType(type);\n }\n return types;\n }\n\n private rememberTypeSource(type: CorsaType | 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: CorsaType | 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 CorsaSymbol | 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 CorsaSymbol[]>(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 CorsaSignature[]>(signatures: T): T {\n for (const signature of signatures) {\n this.rememberSignature(signature);\n }\n return signatures;\n }\n\n private rememberSignature(signature: CorsaSignature): CorsaSignature {\n if (signature.declaration) {\n this.rememberNode(signature.declaration);\n }\n const parameterIds = Array.isArray(signature.parameters) ? signature.parameters : [];\n const parameters = signature.declaration\n ? this.parameterInfosForDeclaration(signature.declaration, parameterIds.length)\n : [];\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 ): CorsaSymbol {\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: CorsaSymbol = {\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): CorsaNode | 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(\n handle: string,\n expectedCount: number,\n ): readonly ParameterInfo[] {\n const source = this.sourceSliceForHandle(handle);\n if (!source) {\n return this.parameterInfosForUtf8ByteDeclaration(handle);\n }\n const parameters = parameterInfosForSource(source);\n if (parameters.length >= expectedCount || expectedCount === 0) {\n return parameters;\n }\n const utf8Parameters = this.parameterInfosForUtf8ByteDeclaration(handle);\n return utf8Parameters.length > parameters.length ? utf8Parameters : parameters;\n }\n\n private parameterInfosForUtf8ByteDeclaration(handle: string): readonly ParameterInfo[] {\n const source = this.sourceSliceForHandle(handle, \"utf8-byte\");\n return source ? parameterInfosForSource(source) : [];\n }\n\n private sourceSliceForHandle(\n handle: string,\n offsetUnit: \"utf16\" | \"utf8-byte\" = \"utf16\",\n ): SourceSlice | undefined {\n const node = this.getNode(handle);\n if (!node) {\n return undefined;\n }\n const sourceText = this.sourceTextForPath(node.fileName);\n const normalizedNode =\n offsetUnit === \"utf8-byte\" ? nodeFromUtf8ByteOffsets(node, sourceText) : node;\n if (\n !sourceText ||\n !normalizedNode ||\n normalizedNode.pos < 0 ||\n normalizedNode.end > sourceText.length ||\n normalizedNode.pos >= normalizedNode.end\n ) {\n return undefined;\n }\n return {\n node: normalizedNode,\n text: sourceText.slice(normalizedNode.pos, normalizedNode.end),\n };\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(): CorsaApiClient {\n if (!this.#client) {\n this.#client = CorsaApiClient.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 mtimeChanged = cached !== undefined && mtimeMs !== cached.mtimeMs;\n const textChanged = overlayText !== cached?.sourceText;\n const prepared = {\n mtimeMs,\n lintSourceText: sourceText,\n sourceText: overlayText,\n };\n const stale = !this.#snapshot || mtimeChanged || 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 parameterInfosForSource(source: SourceSlice): readonly ParameterInfo[] {\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\nfunction isArrayOrTupleLikeType(session: CorsaProjectSession, type: CorsaType): 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 isProtocolPanicError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.includes(\"protocol error: panic:\") || message.includes(\"panic: runtime error\");\n}\n\nfunction isStaleHandleError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return /handle \"[^\"]*\" not found in snapshot registry/.test(message);\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): CorsaNode | 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 nodeFromUtf8ByteOffsets(\n node: CorsaNode,\n sourceText: string | undefined,\n): CorsaNode | undefined {\n if (sourceText === undefined) {\n return undefined;\n }\n const pos = utf16IndexFromUtf8ByteOffset(sourceText, node.pos);\n const end = utf16IndexFromUtf8ByteOffset(sourceText, node.end);\n if (pos === undefined || end === undefined || end < pos) {\n return undefined;\n }\n return {\n ...node,\n pos,\n end,\n range: [pos, end],\n };\n}\n\nfunction utf16IndexFromUtf8ByteOffset(text: string, byteOffset: number): number | undefined {\n if (!Number.isInteger(byteOffset) || byteOffset < 0) {\n return undefined;\n }\n let bytes = 0;\n for (let index = 0; index < text.length; ) {\n if (bytes === byteOffset) {\n return index;\n }\n const codePoint = text.codePointAt(index);\n if (codePoint === undefined) {\n break;\n }\n const nextBytes = bytes + utf8ByteLengthOfCodePoint(codePoint);\n if (nextBytes > byteOffset) {\n return undefined;\n }\n bytes = nextBytes;\n index += codePoint > 0xffff ? 2 : 1;\n }\n return bytes === byteOffset ? text.length : undefined;\n}\n\nfunction utf8ByteLengthOfCodePoint(codePoint: number): number {\n if (codePoint <= 0x7f) {\n return 1;\n }\n if (codePoint <= 0x7ff) {\n return 2;\n }\n if (codePoint <= 0xffff) {\n return 3;\n }\n return 4;\n}\n\nfunction parameterInfoForText(\n declarationNode: CorsaNode,\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, CorsaApiClient } from \"@corsa-bind/napi\";\n\nimport type {\n CorsaNode,\n CorsaSignature,\n CorsaSymbol,\n CorsaType,\n CorsaTypePredicate,\n} 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, CorsaType | undefined>;\n typeBySourceRange: Map<string, CorsaType | undefined>;\n symbolByPosition: Map<number, CorsaSymbol | undefined>;\n};\n\ntype PreparedFileState = {\n mtimeMs: number;\n lintSourceText?: string;\n sourceText?: string;\n};\n\ntype SourceSlice = {\n node: CorsaNode;\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: CorsaNode;\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 CorsaProjectSession {\n #client?: CorsaApiClient;\n #config?: { options: unknown; fileNames: string[] };\n #snapshot?: string;\n #projects: ProjectResponse[] = [];\n #files = new Map<string, FileCache>();\n #symbolsById = new Map<string, CorsaSymbol>();\n #syntheticSymbolsById = new Map<string, CorsaSymbol>();\n #symbolTypeById = new Map<string, string>();\n #nodesById = new Map<string, CorsaNode>();\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(\n fileName: string,\n position: number,\n sourceText?: string,\n ): CorsaType | 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 | CorsaType\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 getTypeAtSourceRange(\n fileName: string,\n start: number,\n end: number,\n sourceText: string | undefined,\n kind: string | undefined,\n ): CorsaType | undefined {\n if (!sourceText || end <= start) {\n return this.getTypeAtPosition(fileName, start, sourceText);\n }\n const state = this.fileState(fileName, sourceText);\n const key = `${start}:${end}:${kind ?? \"\"}`;\n if (!state.typeBySourceRange.has(key)) {\n state.typeBySourceRange.set(\n key,\n this.client().getTypeAtSourceRange(\n this.#snapshot!,\n state.projectId,\n fileName,\n start,\n end,\n sourceText,\n kind,\n ) as CorsaType | undefined,\n );\n }\n const type = this.rememberType(state.typeBySourceRange.get(key));\n if (type) {\n this.#typeLookupById.set(type.id, { fileName, position: start, sourceText });\n }\n return type;\n }\n\n getSymbolAtPosition(\n fileName: string,\n position: number,\n sourceText?: string,\n ): CorsaSymbol | 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 | CorsaSymbol\n | undefined,\n );\n }\n return this.rememberSymbol(state.symbolByPosition.get(position));\n }\n\n getSymbol(symbol: string | CorsaSymbol): CorsaSymbol | 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<CorsaSymbol | 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 | CorsaNode): CorsaNode | undefined {\n if (typeof node !== \"string\") {\n return node;\n }\n return this.#nodesById.get(node) ?? this.rememberNode(node);\n }\n\n getSourceTextForPath(path: string): string | undefined {\n return this.sourceTextForPath(path);\n }\n\n getTypeOfSymbol(symbol: CorsaSymbol): CorsaType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n getDeclaredTypeOfSymbol(symbol: CorsaSymbol): CorsaType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getDeclaredTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n typeToString(type: CorsaType, 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 // Seeds the type-text cache from a name the caller already knows (for\n // example the identifier in an `implements` clause). Implemented-interface\n // handles come back with empty `texts`, and upstream Corsa sometimes evicts\n // them from its snapshot registry before `typeToString` runs, so warming the\n // cache here lets `typeToString` fall back to the source name instead of\n // throwing (GH#211). Never overwrites a value the server already provided.\n rememberTypeText(typeId: string, text: string): void {\n if (!this.#typeTextById.has(typeId)) {\n this.#typeTextById.set(typeId, text);\n }\n }\n\n getBaseTypeOfLiteralType(type: CorsaType): CorsaType | 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: CorsaType): readonly CorsaSymbol[] {\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: CorsaType, kind: number): readonly CorsaSignature[] {\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: CorsaSignature): CorsaType | 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: CorsaSignature): CorsaTypePredicate | undefined {\n const predicate = this.client().callJson<CorsaTypePredicate | 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: CorsaType): readonly CorsaType[] {\n if (isArrayOrTupleLikeType(this, type)) {\n return [];\n }\n try {\n return this.rememberTypes(\n this.client().callJson(\"getBaseTypes\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n texts: this.typeTexts(type),\n }) ?? [],\n );\n } catch (error) {\n // Upstream Corsa occasionally drops a type handle from its snapshot\n // registry after the first base-types query on a class that has no\n // explicit `extends` clause. Treating that as \"no base types\" lets a\n // follow-up `getImplementedTypesOfType` on the same handle still report\n // the type's own `implements` clause instead of throwing (GH#206).\n if (isProtocolPanicError(error) || isStaleHandleError(error)) {\n return [];\n }\n throw error;\n }\n }\n\n getTypeArguments(type: CorsaType): readonly CorsaType[] {\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 CorsaType[],\n );\n return argumentsFromApi.length > 0 ? argumentsFromApi : this.fallbackTypeArguments(type);\n }\n\n getTypesOfType(type: CorsaType): readonly CorsaType[] {\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: CorsaType): CorsaType | 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: CorsaType): readonly CorsaType[] {\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: CorsaType): readonly CorsaType[] {\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: CorsaType): readonly CorsaType[] {\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: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getObjectTypeOfType\", type)\n : undefined;\n }\n\n getIndexTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getIndexTypeOfType\", type)\n : undefined;\n }\n\n getCheckTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getCheckTypeOfType\", type)\n : undefined;\n }\n\n getExtendsTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getExtendsTypeOfType\", type)\n : undefined;\n }\n\n getBaseTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.substitution) !== 0\n ? this.callType(\"getBaseTypeOfType\", type)\n : undefined;\n }\n\n getConstraintOfType(type: CorsaType): CorsaType | undefined {\n return this.rememberType(\n this.client().getConstraintOfType(this.#snapshot!, this.projectId(), type.id) as\n | CorsaType\n | undefined,\n );\n }\n\n private callType(method: string, type: CorsaType): CorsaType | undefined {\n return this.rememberType(\n this.client().callJson<CorsaType | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? undefined,\n );\n }\n\n private callTypeArray(method: string, type: CorsaType): readonly CorsaType[] {\n return this.rememberTypes(\n this.client().callJson<readonly CorsaType[] | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? [],\n );\n }\n\n private tryGetSymbolType(\n symbol: CorsaSymbol,\n method: \"getTypeOfSymbol\" | \"getDeclaredTypeOfSymbol\",\n ): CorsaType | undefined {\n try {\n return this.client()[method](this.#snapshot!, this.projectId(), symbol.id) as\n | CorsaType\n | undefined;\n } catch {\n return undefined;\n }\n }\n\n private fallbackTypeArguments(type: CorsaType): readonly CorsaType[] {\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 CorsaType => argument !== undefined);\n }\n\n private sourceSliceForType(type: CorsaType): 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 CorsaType | 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 CorsaType[]>(types: T): T {\n for (const type of types) {\n this.rememberType(type);\n }\n return types;\n }\n\n private rememberTypeSource(type: CorsaType | 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: CorsaType | 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 typeTexts(type: CorsaType): readonly string[] {\n if (Array.isArray(type.texts) && type.texts.length > 0) {\n return type.texts;\n }\n const cached = this.#typeTextById.get(type.id);\n return cached === undefined ? [] : [cached];\n }\n\n private rememberSymbol<T extends CorsaSymbol | 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 CorsaSymbol[]>(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 CorsaSignature[]>(signatures: T): T {\n for (const signature of signatures) {\n this.rememberSignature(signature);\n }\n return signatures;\n }\n\n private rememberSignature(signature: CorsaSignature): CorsaSignature {\n if (signature.declaration) {\n this.rememberNode(signature.declaration);\n }\n const parameterIds = Array.isArray(signature.parameters) ? signature.parameters : [];\n const parameters = signature.declaration\n ? this.parameterInfosForDeclaration(signature.declaration, parameterIds.length)\n : [];\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 ): CorsaSymbol {\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: CorsaSymbol = {\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): CorsaNode | 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(\n handle: string,\n expectedCount: number,\n ): readonly ParameterInfo[] {\n const source = this.sourceSliceForHandle(handle);\n if (!source) {\n return this.parameterInfosForUtf8ByteDeclaration(handle);\n }\n const parameters = parameterInfosForSource(source);\n if (parameters.length >= expectedCount || expectedCount === 0) {\n return parameters;\n }\n const utf8Parameters = this.parameterInfosForUtf8ByteDeclaration(handle);\n return utf8Parameters.length > parameters.length ? utf8Parameters : parameters;\n }\n\n private parameterInfosForUtf8ByteDeclaration(handle: string): readonly ParameterInfo[] {\n const source = this.sourceSliceForHandle(handle, \"utf8-byte\");\n return source ? parameterInfosForSource(source) : [];\n }\n\n private sourceSliceForHandle(\n handle: string,\n offsetUnit: \"utf16\" | \"utf8-byte\" = \"utf16\",\n ): SourceSlice | undefined {\n const node = this.getNode(handle);\n if (!node) {\n return undefined;\n }\n const sourceText = this.sourceTextForPath(node.fileName);\n const normalizedNode =\n offsetUnit === \"utf8-byte\" ? nodeFromUtf8ByteOffsets(node, sourceText) : node;\n if (\n !sourceText ||\n !normalizedNode ||\n normalizedNode.pos < 0 ||\n normalizedNode.end > sourceText.length ||\n normalizedNode.pos >= normalizedNode.end\n ) {\n return undefined;\n }\n return {\n node: normalizedNode,\n text: sourceText.slice(normalizedNode.pos, normalizedNode.end),\n };\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(): CorsaApiClient {\n if (!this.#client) {\n this.#client = CorsaApiClient.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 typeBySourceRange: 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 mtimeChanged = cached !== undefined && mtimeMs !== cached.mtimeMs;\n const textChanged = overlayText !== cached?.sourceText;\n const prepared = {\n mtimeMs,\n lintSourceText: sourceText,\n sourceText: overlayText,\n };\n const stale = !this.#snapshot || mtimeChanged || 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 parameterInfosForSource(source: SourceSlice): readonly ParameterInfo[] {\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\nfunction isArrayOrTupleLikeType(session: CorsaProjectSession, type: CorsaType): 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 isProtocolPanicError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.includes(\"protocol error: panic:\") || message.includes(\"panic: runtime error\");\n}\n\nfunction isStaleHandleError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return /handle \"[^\"]*\" not found in snapshot registry/.test(message);\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): CorsaNode | 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 nodeFromUtf8ByteOffsets(\n node: CorsaNode,\n sourceText: string | undefined,\n): CorsaNode | undefined {\n if (sourceText === undefined) {\n return undefined;\n }\n const pos = utf16IndexFromUtf8ByteOffset(sourceText, node.pos);\n const end = utf16IndexFromUtf8ByteOffset(sourceText, node.end);\n if (pos === undefined || end === undefined || end < pos) {\n return undefined;\n }\n return {\n ...node,\n pos,\n end,\n range: [pos, end],\n };\n}\n\nfunction utf16IndexFromUtf8ByteOffset(text: string, byteOffset: number): number | undefined {\n if (!Number.isInteger(byteOffset) || byteOffset < 0) {\n return undefined;\n }\n let bytes = 0;\n for (let index = 0; index < text.length; ) {\n if (bytes === byteOffset) {\n return index;\n }\n const codePoint = text.codePointAt(index);\n if (codePoint === undefined) {\n break;\n }\n const nextBytes = bytes + utf8ByteLengthOfCodePoint(codePoint);\n if (nextBytes > byteOffset) {\n return undefined;\n }\n bytes = nextBytes;\n index += codePoint > 0xffff ? 2 : 1;\n }\n return bytes === byteOffset ? text.length : undefined;\n}\n\nfunction utf8ByteLengthOfCodePoint(codePoint: number): number {\n if (codePoint <= 0x7f) {\n return 1;\n }\n if (codePoint <= 0x7ff) {\n return 2;\n }\n if (codePoint <= 0xffff) {\n return 3;\n }\n return 4;\n}\n\nfunction parameterInfoForText(\n declarationNode: CorsaNode,\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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "corsa-oxlint",
3
- "version": "0.30.0",
3
+ "version": "0.33.0",
4
4
  "description": "Type-aware Oxlint helpers powered by Corsa",
5
5
  "homepage": "https://github.com/ubugeeei-prod/corsa-bind/tree/main/src/bindings/nodejs/corsa_oxlint",
6
6
  "bugs": {
@@ -103,7 +103,7 @@
103
103
  "dependencies": {
104
104
  "@oxlint/plugins": "1.66.0",
105
105
  "oxlint": "1.66.0",
106
- "@corsa-bind/napi": "0.30.0"
106
+ "@corsa-bind/napi": "0.33.0"
107
107
  },
108
108
  "devDependencies": {
109
109
  "@typescript-eslint/utils": "8.59.3"