corsa-oxlint 0.33.0 → 0.35.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/session.d.ts CHANGED
@@ -40,7 +40,6 @@ declare class CorsaProjectSession {
40
40
  private callType;
41
41
  private callTypeArray;
42
42
  private tryGetSymbolType;
43
- private fallbackTypeArguments;
44
43
  private sourceSliceForType;
45
44
  private rememberType;
46
45
  private rememberTypes;
package/dist/session.js CHANGED
@@ -181,8 +181,8 @@ var CorsaProjectSession = class {
181
181
  }
182
182
  }
183
183
  getTypeArguments(type) {
184
- const argumentsFromApi = this.rememberTypes(this.client().getTypeArguments(this.#snapshot, this.projectId(), type.id, type.objectFlags));
185
- return argumentsFromApi.length > 0 ? argumentsFromApi : this.fallbackTypeArguments(type);
184
+ const source = this.sourceSliceForType(type);
185
+ return this.rememberTypes(source ? this.client().getTypeArgumentsAtSourceRange(this.#snapshot, this.projectId(), type.id, type.objectFlags, source.node.fileName, source.node.pos, source.node.end, this.sourceTextForPath(source.node.fileName) ?? "") : this.client().getTypeArguments(this.#snapshot, this.projectId(), type.id, type.objectFlags));
186
186
  }
187
187
  getTypesOfType(type) {
188
188
  if ((type.flags & (typeFlags.union | typeFlags.intersection | typeFlags.templateLiteral)) === 0) return [];
@@ -246,14 +246,6 @@ var CorsaProjectSession = class {
246
246
  return;
247
247
  }
248
248
  }
249
- fallbackTypeArguments(type) {
250
- const source = this.sourceSliceForType(type);
251
- if (!source) return [];
252
- return typeArgumentInfosForSource(source).map((argument) => {
253
- const symbol = this.getSymbolAtPosition(source.node.fileName, argument.pos, this.sourceTextForPath(source.node.fileName));
254
- return symbol ? this.getDeclaredTypeOfSymbol(symbol) ?? this.getTypeOfSymbol(symbol) : void 0;
255
- }).filter((argument) => argument !== void 0);
256
- }
257
249
  sourceSliceForType(type) {
258
250
  const cached = this.#typeSourceById.get(type.id);
259
251
  if (cached) return cached;
@@ -606,21 +598,6 @@ function parameterNameForText(text) {
606
598
  if (left.startsWith("{") || left.startsWith("[")) return left;
607
599
  return left.split(/\s+/).at(-1);
608
600
  }
609
- function typeArgumentInfosForSource(source) {
610
- const annotationMarker = firstTopLevelIndexOfAny(source.text, [":", "="]);
611
- const typeStart = annotationMarker >= 0 ? annotationMarker + 1 : 0;
612
- const openInType = firstTopLevelOpeningAngle(source.text.slice(typeStart));
613
- if (openInType < 0) return [];
614
- const open = typeStart + openInType;
615
- const close = matchingCloseAngle(source.text, open);
616
- if (close < 0) return [];
617
- const argumentsText = source.text.slice(open + 1, close);
618
- return splitTopLevelRanges(argumentsText, ",").map((range) => {
619
- const leading = argumentsText.slice(range.start, range.end).search(/\S/);
620
- if (leading < 0) return;
621
- return { pos: source.node.pos + open + 1 + range.start + leading };
622
- }).filter((argument) => argument !== void 0);
623
- }
624
601
  function matchingCloseParen(text, open) {
625
602
  let depth = 0;
626
603
  const scanner = createScanner();
@@ -635,20 +612,6 @@ function matchingCloseParen(text, open) {
635
612
  }
636
613
  return -1;
637
614
  }
638
- function matchingCloseAngle(text, open) {
639
- let depth = 0;
640
- const scanner = createScanner();
641
- for (let index = open; index < text.length; index += 1) {
642
- const char = text[index];
643
- if (scanner.inQuote(char)) continue;
644
- if (char === "<") depth += 1;
645
- else if (char === ">") {
646
- depth -= 1;
647
- if (depth === 0) return index;
648
- }
649
- }
650
- return -1;
651
- }
652
615
  function splitTopLevelRanges(text, delimiter) {
653
616
  const ranges = [];
654
617
  const scanner = createScanner();
@@ -703,24 +666,6 @@ function firstTopLevelIndexOfAny(text, needles) {
703
666
  }
704
667
  return -1;
705
668
  }
706
- function firstTopLevelOpeningAngle(text) {
707
- const scanner = createScanner();
708
- let parenDepth = 0;
709
- let bracketDepth = 0;
710
- let braceDepth = 0;
711
- for (let index = 0; index < text.length; index += 1) {
712
- const char = text[index];
713
- if (scanner.inQuote(char)) continue;
714
- if (char === "(") parenDepth += 1;
715
- else if (char === ")") parenDepth = Math.max(0, parenDepth - 1);
716
- else if (char === "[") bracketDepth += 1;
717
- else if (char === "]") bracketDepth = Math.max(0, bracketDepth - 1);
718
- else if (char === "{") braceDepth += 1;
719
- else if (char === "}") braceDepth = Math.max(0, braceDepth - 1);
720
- else if (char === "<" && parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) return index;
721
- }
722
- return -1;
723
- }
724
669
  function createScanner() {
725
670
  let quote;
726
671
  let escaped = false;
@@ -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 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":";;;AAiDA,MAAM,YAAY;CAChB,QAAQ,KAAK;CACb,OAAO,KAAK;CACZ,iBAAiB,KAAK;CACtB,eAAe,KAAK;CACpB,cAAc,KAAK;CACnB,eAAe,KAAK;CACpB,aAAa,KAAK;CAClB,OAAO,KAAK;CACZ,cAAc,KAAK;CACpB;AAED,MAAM,cAAc;CAClB,kBAAkB;CAClB,WAAW;CACX,QAAQ;CACT;AAED,IAAa,sBAAb,MAAiC;CAC/B;CACA;CACA;CACA,YAA+B,EAAE;CACjC,yBAAS,IAAI,KAAwB;CACrC,+BAAe,IAAI,KAA0B;CAC7C,wCAAwB,IAAI,KAA0B;CACtD,kCAAkB,IAAI,KAAqB;CAC3C,6BAAa,IAAI,KAAwB;CACzC,kCAAkB,IAAI,KAAyB;CAC/C,kCAAkB,IAAI,KAA0B;CAChD,gCAAgB,IAAI,KAAqB;CACzC,iBAAiB;CACjB;CAEA,YACE,SACA,SACA;EAFS,KAAA,UAAA;EACA,KAAA,UAAA;;CAGX,QAAc;EACZ,IAAI,KAAKA,WAAW;GAClB,KAAKC,SAAS,cAAc,KAAKD,UAAU;GAC3C,KAAKA,YAAY,KAAA;;EAEnB,KAAKC,SAAS,OAAO;EACrB,KAAKA,UAAU,KAAA;EACf,KAAKC,0BAA0B,KAAA;EAC/B,KAAKC,OAAO,OAAO;EACnB,KAAK,mBAAmB;EACxB,KAAKC,cAAc,OAAO;;CAG5B,qBAA8B;EAC5B,OAAO,KAAK,QAAQ,CAAC;;CAGvB,mBAAsC;EACpC,OAAO,KAAK,QAAQ,CAAC;;CAGvB,kBACE,UACA,UACA,YACuB;EACvB,MAAM,QAAQ,KAAK,UAAU,UAAU,WAAW;EAClD,IAAI,CAAC,MAAM,eAAe,IAAI,SAAS,EACrC,MAAM,eAAe,IACnB,UACA,KAAK,QAAQ,CAAC,kBAAkB,KAAKJ,WAAY,MAAM,WAAW,UAAU,SAAS,CAGtF;EAEH,MAAM,OAAO,KAAK,aAAa,MAAM,eAAe,IAAI,SAAS,CAAC;EAClE,IAAI,MACF,KAAKK,gBAAgB,IAAI,KAAK,IAAI;GAAE;GAAU;GAAU;GAAY,CAAC;EAEvE,OAAO;;CAGT,qBACE,UACA,OACA,KACA,YACA,MACuB;EACvB,IAAI,CAAC,cAAc,OAAO,OACxB,OAAO,KAAK,kBAAkB,UAAU,OAAO,WAAW;EAE5D,MAAM,QAAQ,KAAK,UAAU,UAAU,WAAW;EAClD,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ;EACvC,IAAI,CAAC,MAAM,kBAAkB,IAAI,IAAI,EACnC,MAAM,kBAAkB,IACtB,KACA,KAAK,QAAQ,CAAC,qBACZ,KAAKL,WACL,MAAM,WACN,UACA,OACA,KACA,YACA,KACD,CACF;EAEH,MAAM,OAAO,KAAK,aAAa,MAAM,kBAAkB,IAAI,IAAI,CAAC;EAChE,IAAI,MACF,KAAKK,gBAAgB,IAAI,KAAK,IAAI;GAAE;GAAU,UAAU;GAAO;GAAY,CAAC;EAE9E,OAAO;;CAGT,oBACE,UACA,UACA,YACyB;EACzB,MAAM,QAAQ,KAAK,UAAU,UAAU,WAAW;EAClD,IAAI,CAAC,MAAM,iBAAiB,IAAI,SAAS,EACvC,MAAM,iBAAiB,IACrB,UACA,KAAK,QAAQ,CAAC,oBAAoB,KAAKL,WAAY,MAAM,WAAW,UAAU,SAAS,CAGxF;EAEH,OAAO,KAAK,eAAe,MAAM,iBAAiB,IAAI,SAAS,CAAC;;CAGlE,UAAU,QAAuD;EAC/D,IAAI,OAAO,WAAW,UACpB,OAAO,KAAK,eAAe,OAAO;EAEpC,MAAM,YAAY,KAAKM,sBAAsB,IAAI,OAAO;EACxD,IAAI,WACF,OAAO;EAET,MAAM,SAAS,KAAKC,aAAa,IAAI,OAAO;EAC5C,IAAI,QACF,OAAO;EAET,MAAM,SAAS,KAAKC,gBAAgB,IAAI,OAAO;EAC/C,IAAI,CAAC,UAAU,CAAC,KAAKR,WACnB;EAEF,MAAM,WAAW,KAAK,QAAQ,CAAC,SAA6B,mBAAmB;GAC7E,UAAU,KAAKA;GACf,MAAM;GACP,CAAC;EACF,OAAO,UAAU,OAAO,SAAS,KAAK,eAAe,SAAS,GAAG,KAAA;;CAGnE,QAAQ,MAAiD;EACvD,IAAI,OAAO,SAAS,UAClB,OAAO;EAET,OAAO,KAAKS,WAAW,IAAI,KAAK,IAAI,KAAK,aAAa,KAAK;;CAG7D,qBAAqB,MAAkC;EACrD,OAAO,KAAK,kBAAkB,KAAK;;CAGrC,gBAAgB,QAA4C;EAC1D,MAAM,OAAO,KAAK,aAAa,KAAK,iBAAiB,QAAQ,kBAAkB,CAAC;EAChF,KAAK,mBAAmB,MAAM,OAAO,iBAAiB;EACtD,OAAO;;CAGT,wBAAwB,QAA4C;EAClE,MAAM,OAAO,KAAK,aAAa,KAAK,iBAAiB,QAAQ,0BAA0B,CAAC;EACxF,KAAK,mBAAmB,MAAM,OAAO,iBAAiB;EACtD,OAAO;;CAGT,aAAa,MAAiB,OAAwB;EACpD,IAAI;GACF,MAAM,OAAO,KAAK,QAAQ,CAAC,aACzB,KAAKT,WACL,KAAK,WAAW,EAChB,KAAK,IACL,KAAA,GACA,MACD;GACD,IAAI,UAAU,KAAA,GACZ,KAAKI,cAAc,IAAI,KAAK,IAAI,KAAK;GAEvC,OAAO;WACA,OAAO;GACd,MAAM,SAAS,UAAU,KAAA,IAAY,KAAKA,cAAc,IAAI,KAAK,GAAG,GAAG,KAAA;GACvE,IAAI,WAAW,KAAA,GACb,OAAO;GAET,MAAM;;;CAUV,iBAAiB,QAAgB,MAAoB;EACnD,IAAI,CAAC,KAAKA,cAAc,IAAI,OAAO,EACjC,KAAKA,cAAc,IAAI,QAAQ,KAAK;;CAIxC,yBAAyB,MAAwC;EAC/D,OAAO,KAAK,aACV,KAAK,QAAQ,CAAC,SAAS,4BAA4B;GACjD,UAAU,KAAKJ;GACf,SAAS,KAAK,WAAW;GACzB,MAAM,KAAK;GACZ,CAAC,CACH;;CAGH,oBAAoB,MAAyC;EAC3D,OAAO,KAAK,gBACV,KAAK,QAAQ,CAAC,SAAS,uBAAuB;GAC5C,UAAU,KAAKA;GACf,SAAS,KAAK,WAAW;GACzB,MAAM,KAAK;GACZ,CAAC,IAAI,EAAE,CACT;;CAGH,oBAAoB,MAAiB,MAAyC;EAC5E,OAAO,KAAK,mBACV,KAAK,QAAQ,CAAC,SAAS,uBAAuB;GAC5C,UAAU,KAAKA;GACf,SAAS,KAAK,WAAW;GACzB,MAAM,KAAK;GACX;GACD,CAAC,IAAI,EAAE,CACT;;CAGH,yBAAyB,WAAkD;EACzE,OAAO,KAAK,aACV,KAAK,QAAQ,CAAC,SAAS,4BAA4B;GACjD,UAAU,KAAKA;GACf,SAAS,KAAK,WAAW;GACzB,WAAW,UAAU;GACtB,CAAC,CACH;;CAGH,4BAA4B,WAA2D;EACrF,MAAM,YAAY,KAAK,QAAQ,CAAC,SAC9B,+BACA;GACE,UAAU,KAAKA;GACf,SAAS,KAAK,WAAW;GACzB,WAAW,UAAU;GACtB,CACF;EACD,IAAI,WAAW,MACb,KAAK,aAAa,UAAU,KAAK;EAEnC,OAAO;;CAGT,aAAa,MAAuC;EAClD,IAAI,uBAAuB,MAAM,KAAK,EACpC,OAAO,EAAE;EAEX,IAAI;GACF,OAAO,KAAK,cACV,KAAK,QAAQ,CAAC,SAAS,gBAAgB;IACrC,UAAU,KAAKA;IACf,SAAS,KAAK,WAAW;IACzB,MAAM,KAAK;IACX,OAAO,KAAK,UAAU,KAAK;IAC5B,CAAC,IAAI,EAAE,CACT;WACM,OAAO;GAMd,IAAI,qBAAqB,MAAM,IAAI,mBAAmB,MAAM,EAC1D,OAAO,EAAE;GAEX,MAAM;;;CAIV,iBAAiB,MAAuC;EACtD,MAAM,mBAAmB,KAAK,cAC5B,KAAK,QAAQ,CAAC,iBACZ,KAAKA,WACL,KAAK,WAAW,EAChB,KAAK,IACL,KAAK,YACN,CACF;EACD,OAAO,iBAAiB,SAAS,IAAI,mBAAmB,KAAK,sBAAsB,KAAK;;CAG1F,eAAe,MAAuC;EACpD,KACG,KAAK,SAAS,UAAU,QAAQ,UAAU,eAAe,UAAU,sBACpE,GAEA,OAAO,EAAE;EAEX,OAAO,KAAK,cAAc,kBAAkB,KAAK;;CAGnD,gBAAgB,MAAwC;EACtD,KACG,KAAK,SAAS,UAAU,QAAQ,UAAU,oBAAoB,OAC7D,KAAK,eAAe,MAAM,YAAY,YAAY,YAAY,aAAa,GAE7E;EAEF,MAAM,SAAS,KAAK,SAAS,mBAAmB,KAAK;EACrD,KAAK,cAAc,OAAO;EAC1B,OAAO;;CAGT,wBAAwB,MAAuC;EAC7D,MAAM,QAAQ,KAAK,eAAe;EAClC,KAAK,KAAK,QAAQ,UAAU,YAAY,MAAM,QAAQ,YAAY,sBAAsB,GACtF,OAAO,EAAE;EAEX,OAAO,KAAK,cAAc,2BAA2B,KAAK;;CAG5D,6BAA6B,MAAuC;EAClE,MAAM,QAAQ,KAAK,eAAe;EAClC,KAAK,KAAK,QAAQ,UAAU,YAAY,MAAM,QAAQ,YAAY,sBAAsB,GACtF,OAAO,EAAE;EAEX,OAAO,KAAK,cAAc,gCAAgC,KAAK;;CAGjE,6BAA6B,MAAuC;EAClE,MAAM,QAAQ,KAAK,eAAe;EAClC,KAAK,KAAK,QAAQ,UAAU,YAAY,MAAM,QAAQ,YAAY,sBAAsB,GACtF,OAAO,EAAE;EAEX,OAAO,KAAK,cAAc,gCAAgC,KAAK;;CAGjE,oBAAoB,MAAwC;EAC1D,QAAQ,KAAK,QAAQ,UAAU,mBAAmB,IAC9C,KAAK,SAAS,uBAAuB,KAAK,GAC1C,KAAA;;CAGN,mBAAmB,MAAwC;EACzD,QAAQ,KAAK,QAAQ,UAAU,mBAAmB,IAC9C,KAAK,SAAS,sBAAsB,KAAK,GACzC,KAAA;;CAGN,mBAAmB,MAAwC;EACzD,QAAQ,KAAK,QAAQ,UAAU,iBAAiB,IAC5C,KAAK,SAAS,sBAAsB,KAAK,GACzC,KAAA;;CAGN,qBAAqB,MAAwC;EAC3D,QAAQ,KAAK,QAAQ,UAAU,iBAAiB,IAC5C,KAAK,SAAS,wBAAwB,KAAK,GAC3C,KAAA;;CAGN,kBAAkB,MAAwC;EACxD,QAAQ,KAAK,QAAQ,UAAU,kBAAkB,IAC7C,KAAK,SAAS,qBAAqB,KAAK,GACxC,KAAA;;CAGN,oBAAoB,MAAwC;EAC1D,OAAO,KAAK,aACV,KAAK,QAAQ,CAAC,oBAAoB,KAAKA,WAAY,KAAK,WAAW,EAAE,KAAK,GAAG,CAG9E;;CAGH,SAAiB,QAAgB,MAAwC;EACvE,OAAO,KAAK,aACV,KAAK,QAAQ,CAAC,SAA2B,QAAQ;GAC/C,UAAU,KAAKA;GACf,MAAM,KAAK;GACZ,CAAC,IAAI,KAAA,EACP;;CAGH,cAAsB,QAAgB,MAAuC;EAC3E,OAAO,KAAK,cACV,KAAK,QAAQ,CAAC,SAAsC,QAAQ;GAC1D,UAAU,KAAKA;GACf,MAAM,KAAK;GACZ,CAAC,IAAI,EAAE,CACT;;CAGH,iBACE,QACA,QACuB;EACvB,IAAI;GACF,OAAO,KAAK,QAAQ,CAAC,QAAQ,KAAKA,WAAY,KAAK,WAAW,EAAE,OAAO,GAAG;UAGpE;GACN;;;CAIJ,sBAA8B,MAAuC;EACnE,MAAM,SAAS,KAAK,mBAAmB,KAAK;EAC5C,IAAI,CAAC,QACH,OAAO,EAAE;EAEX,OAAO,2BAA2B,OAAO,CACtC,KAAK,aAAa;GACjB,MAAM,SAAS,KAAK,oBAClB,OAAO,KAAK,UACZ,SAAS,KACT,KAAK,kBAAkB,OAAO,KAAK,SAAS,CAC7C;GACD,OAAO,SACF,KAAK,wBAAwB,OAAO,IAAI,KAAK,gBAAgB,OAAO,GACrE,KAAA;IACJ,CACD,QAAQ,aAAoC,aAAa,KAAA,EAAU;;CAGxE,mBAA2B,MAA0C;EACnE,MAAM,SAAS,KAAKU,gBAAgB,IAAI,KAAK,GAAG;EAChD,IAAI,QACF,OAAO;EAET,MAAM,SAAS,KAAKL,gBAAgB,IAAI,KAAK,GAAG;EAChD,IAAI,QAAQ;GACV,MAAM,SAAS,KAAK,oBAAoB,OAAO,UAAU,OAAO,UAAU,OAAO,WAAW;GAC5F,KAAK,mBAAmB,MAAM,QAAQ,iBAAiB;GACvD,MAAM,aAAa,KAAKK,gBAAgB,IAAI,KAAK,GAAG;GACpD,IAAI,YACF,OAAO;;EAGX,IAAI,KAAK,QAAQ;GACf,MAAM,SAAS,KAAK,UAAU,KAAK,OAAO;GAC1C,KAAK,mBAAmB,MAAM,QAAQ,iBAAiB;;EAEzD,OAAO,KAAKA,gBAAgB,IAAI,KAAK,GAAG;;CAG1C,aAAsD,MAAY;EAChE,IAAI,MAAM,QACR,KAAKF,gBAAgB,IAAI,KAAK,QAAQ,KAAK,GAAG;EAEhD,IAAI,MAAM,QAAQ,IAChB,KAAKJ,cAAc,IAAI,KAAK,IAAI,KAAK,MAAM,GAAG;EAEhD,OAAO;;CAGT,cAAsD,OAAa;EACjE,KAAK,MAAM,QAAQ,OACjB,KAAK,aAAa,KAAK;EAEzB,OAAO;;CAGT,mBAA2B,MAA6B,QAAkC;EACxF,IAAI,CAAC,QAAQ,CAAC,UAAU,KAAKM,gBAAgB,IAAI,KAAK,GAAG,EACvD;EAEF,MAAM,SAAS,KAAK,qBAAqB,OAAO;EAChD,IAAI,QACF,KAAKA,gBAAgB,IAAI,KAAK,IAAI,OAAO;;CAI7C,cAAsB,MAAmC;EACvD,IAAI,CAAC,QAAQ,KAAKN,cAAc,IAAI,KAAK,GAAG,EAC1C;EAEF,IAAI;GACF,KAAKA,cAAc,IACjB,KAAK,IACL,KAAK,QAAQ,CAAC,aAAa,KAAKJ,WAAY,KAAK,WAAW,EAAE,KAAK,GAAG,CACvE;UACK;;CAKV,UAAkB,MAAoC;EACpD,IAAI,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,MAAM,SAAS,GACnD,OAAO,KAAK;EAEd,MAAM,SAAS,KAAKI,cAAc,IAAI,KAAK,GAAG;EAC9C,OAAO,WAAW,KAAA,IAAY,EAAE,GAAG,CAAC,OAAO;;CAG7C,eAA0D,QAAc;EACtE,IAAI,CAAC,QACH,OAAO;EAET,MAAM,YAAY,KAAKE,sBAAsB,IAAI,OAAO,GAAG;EAC3D,IAAI,WACF,OAAO;EAET,KAAKC,aAAa,IAAI,OAAO,IAAI,OAAO;EACxC,KAAK,MAAM,eAAe,OAAO,gBAAgB,EAAE,EACjD,KAAK,aAAa,YAAY;EAEhC,IAAI,OAAO,kBACT,KAAK,aAAa,OAAO,iBAAiB;EAE5C,OAAO;;CAGT,gBAA0D,SAAe;EACvE,KAAK,MAAM,UAAU,SACnB,KAAK,eAAe,OAAO;EAE7B,OAAO;;CAGT,mBAAgE,YAAkB;EAChF,KAAK,MAAM,aAAa,YACtB,KAAK,kBAAkB,UAAU;EAEnC,OAAO;;CAGT,kBAA0B,WAA2C;EACnE,IAAI,UAAU,aACZ,KAAK,aAAa,UAAU,YAAY;EAE1C,MAAM,eAAe,MAAM,QAAQ,UAAU,WAAW,GAAG,UAAU,aAAa,EAAE;EACpF,MAAM,aAAa,UAAU,cACzB,KAAK,6BAA6B,UAAU,aAAa,aAAa,OAAO,GAC7E,EAAE;EACN,aAAa,SAAS,IAAI,UAAU;GAClC,KAAK,wBAAwB,IAAI,WAAW,OAAO;IACnD;EACF,IAAI,UAAU,eACZ,KAAK,wBAAwB,UAAU,eAAe,KAAA,GAAW,OAAO;EAE1E,OAAO;;CAGT,wBACE,IACA,WACA,eAAe,IACF;EACb,MAAM,SAAS,KAAKD,sBAAsB,IAAI,GAAG;EACjD,IAAI,WAAW,OAAO,QAAQ,CAAC,WAAW,OACxC,OAAO;EAET,MAAM,cAAc,WAAW,KAAK;EACpC,MAAM,SAAsB;GAC1B;GACA,MAAM,WAAW,QAAQ;GACzB,OAAO,QAAQ,SAAS;GACxB,YAAY,QAAQ,cAAc;GAClC,cAAc,cAAc,CAAC,YAAY,GAAI,QAAQ,gBAAgB,EAAE;GACvE,kBAAkB,eAAe,QAAQ;GAC1C;EACD,KAAKA,sBAAsB,IAAI,IAAI,OAAO;EAC1C,KAAKC,aAAa,IAAI,IAAI,OAAO;EACjC,IAAI,aACF,KAAKE,WAAW,IAAI,aAAa,UAAU,KAAK;EAElD,OAAO;;CAGT,aAAqB,QAAuC;EAC1D,MAAM,SAAS,gBAAgB,OAAO;EACtC,IAAI,CAAC,QACH;EAEF,KAAKA,WAAW,IAAI,QAAQ,OAAO;EACnC,OAAO;;CAGT,oBAAkC;EAChC,KAAKF,aAAa,OAAO;EACzB,KAAKD,sBAAsB,OAAO;EAClC,KAAKE,gBAAgB,OAAO;EAC5B,KAAKC,WAAW,OAAO;EACvB,KAAKJ,gBAAgB,OAAO;EAC5B,KAAKK,gBAAgB,OAAO;;CAG9B,6BACE,QACA,eAC0B;EAC1B,MAAM,SAAS,KAAK,qBAAqB,OAAO;EAChD,IAAI,CAAC,QACH,OAAO,KAAK,qCAAqC,OAAO;EAE1D,MAAM,aAAa,wBAAwB,OAAO;EAClD,IAAI,WAAW,UAAU,iBAAiB,kBAAkB,GAC1D,OAAO;EAET,MAAM,iBAAiB,KAAK,qCAAqC,OAAO;EACxE,OAAO,eAAe,SAAS,WAAW,SAAS,iBAAiB;;CAGtE,qCAA6C,QAA0C;EACrF,MAAM,SAAS,KAAK,qBAAqB,QAAQ,YAAY;EAC7D,OAAO,SAAS,wBAAwB,OAAO,GAAG,EAAE;;CAGtD,qBACE,QACA,aAAoC,SACX;EACzB,MAAM,OAAO,KAAK,QAAQ,OAAO;EACjC,IAAI,CAAC,MACH;EAEF,MAAM,aAAa,KAAK,kBAAkB,KAAK,SAAS;EACxD,MAAM,iBACJ,eAAe,cAAc,wBAAwB,MAAM,WAAW,GAAG;EAC3E,IACE,CAAC,cACD,CAAC,kBACD,eAAe,MAAM,KACrB,eAAe,MAAM,WAAW,UAChC,eAAe,OAAO,eAAe,KAErC;EAEF,OAAO;GACL,MAAM;GACN,MAAM,WAAW,MAAM,eAAe,KAAK,eAAe,IAAI;GAC/D;;CAGH,kBAA0B,MAAkC;EAC1D,KAAK,MAAM,CAAC,UAAU,WAAW,KAAKP,QACpC,IAAI,aAAa,QAAQ,SAAS,SAAS,KAAK,EAC9C,OAAO,OAAO,kBAAkB,OAAO,cAAc,oBAAoB,SAAS;EAGtF,OAAO,oBAAoB,KAAK,IAAI,oBAAoB,GAAG,KAAK,QAAQ,IAAI,GAAG,OAAO;;CAGxF,SAAiC;EAC/B,IAAI,CAAC,KAAKF,SAAS;GACjB,KAAKA,UAAU,eAAe,MAAM;IAClC,YAAY,KAAK,QAAQ;IACzB,KAAK,KAAK,QAAQ;IAClB,MAAM,KAAK,QAAQ;IACpB,CAAC;GACF,KAAKA,QAAQ,YAAY;;EAE3B,OAAO,KAAKA;;CAGd,SAA4D;EAC1D,IAAI,CAAC,KAAKU,SACR,KAAKA,UAAU,KAAK,QAAQ,CAAC,gBAAgB,KAAK,QAAQ,WAAW;EAEvE,MAAM,SAAS,KAAKA;EACpB,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,mDAAmD,KAAK,QAAQ,aAAa;EAE/F,OAAO;;CAGT,UAAkB,UAAkB,YAAgC;EAClE,MAAM,WAAW,KAAK,gBAAgB,UAAU,WAAW;EAC3D,MAAM,UAAU,KAAKR,OAAO,IAAI,SAAS;EACzC,IAAI,SACF,OAAO;EAET,MAAM,UAAU,KAAK,QAAQ,CAAC,SAAiC,4BAA4B;GACzF,UAAU,KAAKH;GACf,MAAM;GACP,CAAC;EACF,MAAM,QAAmB;GACvB,SAAS,SAAS;GAClB,gBAAgB,SAAS;GACzB,YAAY,SAAS;GACrB,WAAW,SAAS,MAAM,KAAK,WAAW;GAC1C,gCAAgB,IAAI,KAAK;GACzB,mCAAmB,IAAI,KAAK;GAC5B,kCAAkB,IAAI,KAAK;GAC5B;EACD,KAAKG,OAAO,IAAI,UAAU,MAAM;EAChC,OAAO;;CAGT,gBAAwB,UAAkB,YAAwC;EAChF,MAAM,MAAM,KAAK,KAAK;EACtB,MAAM,UAAU,MAAM,KAAKS,iBAAiB,KAAK,QAAQ;EACzD,MAAM,SAAS,KAAKT,OAAO,IAAI,SAAS;EACxC,MAAM,UAAU,YAAY,SAAS;EACrC,MAAM,cAAc,KAAK,qBAAqB,UAAU,YAAY,SAAS,OAAO;EACpF,MAAM,eAAe,WAAW,KAAA,KAAa,YAAY,OAAO;EAChE,MAAM,cAAc,gBAAgB,QAAQ;EAC5C,MAAM,WAAW;GACf;GACA,gBAAgB;GAChB,YAAY;GACb;EAED,IAAI,EADU,CAAC,KAAKH,aAAa,gBAAgB,eAAe,UAE9D,OAAO;EAET,MAAM,WAAW,KAAKA;EACtB,MAAM,iBAAiB,KAAK,eAAe,UAAU,aAAa,OAAO;EACzE,MAAM,WAAW,KAAK,QAAQ,CAAC,eAAe;GAC5C,GAAI,WACA,EAAE,aAAa,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,GACxC,EAAE,aAAa,KAAK,QAAQ,YAAY;GAC5C,GAAI,mBAAmB,KAAA,IAAY,EAAE,GAAG,EAAE,gBAAgB;GAC3D,CAAC;EACF,KAAKA,YAAY,SAAS;EAC1B,KAAKa,YAAY,SAAS;EAC1B,KAAKD,iBAAiB;EACtB,KAAKT,OAAO,OAAO;EACnB,KAAK,mBAAmB;EACxB,IAAI,YAAY,aAAa,KAAKH,WAChC,KAAK,QAAQ,CAAC,cAAc,SAAS;EAEvC,OAAO;;CAGT,YAA4B;EAC1B,MAAM,KAAK,KAAKa,UAAU,IAAI;EAC9B,IAAI,CAAC,IACH,MAAM,IAAI,MACR,sDAAsD,KAAK,QAAQ,WACpE;EAEH,OAAO;;CAGT,qBACE,UACA,YACA,SACA,QACoB;EACpB,IAAI,eAAe,KAAA,KAAa,CAAC,KAAK,wBAAwB,EAC5D;EAEF,IAAI,QAAQ,mBAAmB,cAAc,OAAO,YAAY,SAC9D,OAAO,OAAO;EAEhB,OAAO,eAAe,UAAU,WAAW;;CAG7C,eACE,UACA,aACA,QAMY;EACZ,IAAI,CAAC,KAAK,wBAAwB,EAChC;EAEF,IAAI,gBAAgB,KAAA,GAClB,OAAO,EACL,QAAQ,CACN;GACE,UAAU;GACV,MAAM;GACN,YAAY,cAAc,SAAS;GACpC,CACF,EACF;EAEH,IAAI,QAAQ,eAAe,KAAA,GACzB,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE;;CAKjC,yBAA0C;EACxC,IAAI,KAAKX,4BAA4B,KAAA,GACnC,OAAO,KAAKA;EAEd,IAAI;GACF,MAAM,eAAe,KAAK,QAAQ,CAAC,SAEhC,uBAAuB;GAC1B,KAAKA,0BAA0B,cAAc,SAAS,iCAAiC;UACjF;GACN,KAAKA,0BAA0B;;EAEjC,OAAO,KAAKA;;;AAIhB,SAAS,wBAAwB,QAA+C;CAC9E,MAAM,OAAO,6BAA6B,OAAO,KAAK;CACtD,IAAI,OAAO,GACT,OAAO,EAAE;CAEX,MAAM,QAAQ,mBAAmB,OAAO,MAAM,KAAK;CACnD,IAAI,QAAQ,GACV,OAAO,EAAE;CAEX,MAAM,iBAAiB,OAAO,KAAK,MAAM,OAAO,GAAG,MAAM;CACzD,OAAO,oBAAoB,gBAAgB,IAAI,CAC5C,KAAK,UAAU,qBAAqB,OAAO,MAAM,gBAAgB,OAAO,OAAO,EAAE,CAAC,CAClF,QAAQ,cAA0C,cAAc,KAAA,EAAU;;AAG/E,SAAS,uBAAuB,SAA8B,MAA0B;CAGtF,QADE,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,MAAM,SAAS,IAAI,KAAK,QAAQ,CAAC,QAAQ,aAAa,KAAK,CAAC,EACnF,MAAM,SAAS;EAC1B,MAAM,aAAa,KAAK,WAAW;EACnC,OACE,WAAW,WAAW,aAAa,IAAI,WAAW,WAAW,IAAI,IAAI,WAAW,SAAS,KAAK;GAEhG;;AAGJ,SAAS,6BAA6B,MAAsB;CAC1D,MAAM,qBAAqB;CAC3B,IAAI;CACJ,IAAI,OAAO;CACX,QAAQ,QAAQ,mBAAmB,KAAK,KAAK,MAAM,MACjD,OAAO,MAAM,QAAQ,MAAM,GAAG,YAAY,IAAI;CAEhD,IAAI,QAAQ,GACV,OAAO;CAET,OAAO,KAAK,QAAQ,IAAI;;AAG1B,SAAS,eAAe,UAAkB,YAAyC;CACjF,IAAI,eAAe,KAAA,GACjB;CAEF,IAAI;EACF,OAAO,aAAa,UAAU,OAAO,KAAK,aAAa,KAAA,IAAY;SAC7D;EACN,OAAO;;;AAIX,SAAS,qBAAqB,OAAyB;CACrD,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;CACtE,OAAO,QAAQ,SAAS,yBAAyB,IAAI,QAAQ,SAAS,uBAAuB;;AAG/F,SAAS,mBAAmB,OAAyB;CACnD,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;CACtE,OAAO,gDAAgD,KAAK,QAAQ;;AAGtE,SAAS,YAAY,UAA0B;CAC7C,IAAI;EACF,OAAO,SAAS,SAAS,CAAC;SACpB;EACN,OAAO;;;AAIX,SAAS,cAAc,UAA0B;CAC/C,IAAI,SAAS,SAAS,OAAO,EAC3B,OAAO;CAET,IAAI,SAAS,SAAS,OAAO,EAC3B,OAAO;CAET,IAAI,SAAS,SAAS,MAAM,EAC1B,OAAO;CAET,OAAO;;AAGT,SAAS,gBAAgB,OAAsC;CAC7D,MAAM,CAAC,SAAS,SAAS,WAAW,GAAG,aAAa,MAAM,MAAM,IAAI;CACpE,MAAM,MAAM,OAAO,QAAQ;CAC3B,MAAM,MAAM,OAAO,QAAQ;CAC3B,MAAM,WAAW,UAAU,KAAK,IAAI;CACpC,IAAI,CAAC,OAAO,SAAS,IAAI,IAAI,CAAC,OAAO,SAAS,IAAI,IAAI,CAAC,UACrD;CAEF,OAAO;EAAE,IAAI;EAAO;EAAU;EAAK;EAAK,OAAO,CAAC,KAAK,IAAI;EAAE;;AAG7D,SAAS,wBACP,MACA,YACuB;CACvB,IAAI,eAAe,KAAA,GACjB;CAEF,MAAM,MAAM,6BAA6B,YAAY,KAAK,IAAI;CAC9D,MAAM,MAAM,6BAA6B,YAAY,KAAK,IAAI;CAC9D,IAAI,QAAQ,KAAA,KAAa,QAAQ,KAAA,KAAa,MAAM,KAClD;CAEF,OAAO;EACL,GAAG;EACH;EACA;EACA,OAAO,CAAC,KAAK,IAAI;EAClB;;AAGH,SAAS,6BAA6B,MAAc,YAAwC;CAC1F,IAAI,CAAC,OAAO,UAAU,WAAW,IAAI,aAAa,GAChD;CAEF,IAAI,QAAQ;CACZ,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAAU;EACzC,IAAI,UAAU,YACZ,OAAO;EAET,MAAM,YAAY,KAAK,YAAY,MAAM;EACzC,IAAI,cAAc,KAAA,GAChB;EAEF,MAAM,YAAY,QAAQ,0BAA0B,UAAU;EAC9D,IAAI,YAAY,YACd;EAEF,QAAQ;EACR,SAAS,YAAY,QAAS,IAAI;;CAEpC,OAAO,UAAU,aAAa,KAAK,SAAS,KAAA;;AAG9C,SAAS,0BAA0B,WAA2B;CAC5D,IAAI,aAAa,KACf,OAAO;CAET,IAAI,aAAa,MACf,OAAO;CAET,IAAI,aAAa,OACf,OAAO;CAET,OAAO;;AAGT,SAAS,qBACP,iBACA,gBACA,OACA,iBAC2B;CAC3B,MAAM,MAAM,eAAe,MAAM,MAAM,OAAO,MAAM,IAAI;CACxD,MAAM,UAAU,IAAI,OAAO,KAAK;CAChC,IAAI,UAAU,GACZ;CAEF,MAAM,WAAW,IAAI,MAAM,OAAO,GAAG,GAAG,UAAU;CAElD,MAAM,OAAO,qBADA,IAAI,MAAM,SAAS,IAAI,SAAS,SACP,CAAC;CACvC,IAAI,CAAC,MACH;CAEF,MAAM,MAAM,gBAAgB,MAAM,kBAAkB,MAAM,QAAQ;CAClE,MAAM,MAAM,gBAAgB,MAAM,kBAAkB,MAAM,MAAM;CAEhE,OAAO;EACL;EACA,MAAM;GACJ,IAAA,GAJU,IAAI,GAAG,IAAI,KAAK,gBAAgB;GAK1C,UAAU,gBAAgB;GAC1B;GACA;GACA,OAAO,CAAC,KAAK,IAAI;GAClB;EACF;;AAGH,SAAS,qBAAqB,MAAkC;CAC9D,IAAI,YAAY,KAAK,MAAM,CAAC,QAAQ,cAAc,GAAG;CACrD,IAAI,UAAU;CACd,OAAO,SAAS;EACd,MAAM,WAAW;EACjB,YAAY,UAAU,QACpB,8EACA,GACD;EACD,UAAU,cAAc;;CAE1B,MAAM,YAAY,wBAAwB,WAAW,CAAC,KAAK,IAAI,CAAC;CAChE,IAAI,QAAQ,aAAa,IAAI,UAAU,MAAM,GAAG,UAAU,GAAG,WAAW,MAAM;CAC9E,IAAI,KAAK,SAAS,IAAI,EACpB,OAAO,KAAK,MAAM,GAAG,GAAG,CAAC,MAAM;CAEjC,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,EAC9C,OAAO;CAET,OAAO,KAAK,MAAM,MAAM,CAAC,GAAG,GAAG;;AAGjC,SAAS,2BAA2B,QAAkD;CACpF,MAAM,mBAAmB,wBAAwB,OAAO,MAAM,CAAC,KAAK,IAAI,CAAC;CACzE,MAAM,YAAY,oBAAoB,IAAI,mBAAmB,IAAI;CACjE,MAAM,aAAa,0BAA0B,OAAO,KAAK,MAAM,UAAU,CAAC;CAC1E,IAAI,aAAa,GACf,OAAO,EAAE;CAEX,MAAM,OAAO,YAAY;CACzB,MAAM,QAAQ,mBAAmB,OAAO,MAAM,KAAK;CACnD,IAAI,QAAQ,GACV,OAAO,EAAE;CAEX,MAAM,gBAAgB,OAAO,KAAK,MAAM,OAAO,GAAG,MAAM;CACxD,OAAO,oBAAoB,eAAe,IAAI,CAC3C,KAAK,UAAU;EAEd,MAAM,UADM,cAAc,MAAM,MAAM,OAAO,MAAM,IAChC,CAAC,OAAO,KAAK;EAChC,IAAI,UAAU,GACZ;EAEF,OAAO,EACL,KAAK,OAAO,KAAK,MAAM,OAAO,IAAI,MAAM,QAAQ,SACjD;GACD,CACD,QAAQ,aAA2C,aAAa,KAAA,EAAU;;AAG/E,SAAS,mBAAmB,MAAc,MAAsB;CAC9D,IAAI,QAAQ;CACZ,MAAM,UAAU,eAAe;CAC/B,KAAK,IAAI,QAAQ,MAAM,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACtD,MAAM,OAAO,KAAK;EAClB,IAAI,QAAQ,QAAQ,KAAK,EACvB;EAEF,IAAI,SAAS,KACX,SAAS;OACJ,IAAI,SAAS,KAAK;GACvB,SAAS;GACT,IAAI,UAAU,GACZ,OAAO;;;CAIb,OAAO;;AAGT,SAAS,mBAAmB,MAAc,MAAsB;CAC9D,IAAI,QAAQ;CACZ,MAAM,UAAU,eAAe;CAC/B,KAAK,IAAI,QAAQ,MAAM,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACtD,MAAM,OAAO,KAAK;EAClB,IAAI,QAAQ,QAAQ,KAAK,EACvB;EAEF,IAAI,SAAS,KACX,SAAS;OACJ,IAAI,SAAS,KAAK;GACvB,SAAS;GACT,IAAI,UAAU,GACZ,OAAO;;;CAIb,OAAO;;AAGT,SAAS,oBACP,MACA,WAC6D;CAC7D,MAAM,SAA2C,EAAE;CACnD,MAAM,UAAU,eAAe;CAC/B,IAAI,QAAQ;CACZ,IAAI,aAAa;CACjB,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,IAAI,aAAa;CACjB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,OAAO,KAAK;EAClB,IAAI,QAAQ,QAAQ,KAAK,EACvB;EAEF,IAAI,SAAS,KAAK,cAAc;OAC3B,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IAAI,SAAS,KAAK,cAAc;OAChC,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IAAI,SAAS,KAAK,gBAAgB;OAClC,IAAI,SAAS,KAAK,eAAe,KAAK,IAAI,GAAG,eAAe,EAAE;OAC9D,IAAI,SAAS,KAAK,cAAc;OAChC,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IACH,SAAS,aACT,eAAe,KACf,eAAe,KACf,iBAAiB,KACjB,eAAe,GACf;GACA,OAAO,KAAK;IAAE;IAAO,KAAK;IAAO,CAAC;GAClC,QAAQ,QAAQ;;;CAGpB,OAAO,KAAK;EAAE;EAAO,KAAK,KAAK;EAAQ,CAAC;CACxC,OAAO;;AAGT,SAAS,wBAAwB,MAAc,SAAoC;CACjF,MAAM,UAAU,eAAe;CAC/B,IAAI,aAAa;CACjB,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,IAAI,aAAa;CACjB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,OAAO,KAAK;EAClB,IAAI,QAAQ,QAAQ,KAAK,EACvB;EAEF,IAAI,SAAS,KAAK,cAAc;OAC3B,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IAAI,SAAS,KAAK,cAAc;OAChC,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IAAI,SAAS,KAAK,gBAAgB;OAClC,IAAI,SAAS,KAAK,eAAe,KAAK,IAAI,GAAG,eAAe,EAAE;OAC9D,IAAI,SAAS,KAAK,cAAc;OAChC,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IACH,QAAQ,SAAS,KAAK,IACtB,eAAe,KACf,eAAe,KACf,iBAAiB,KACjB,eAAe,GAEf,OAAO;;CAGX,OAAO;;AAGT,SAAS,0BAA0B,MAAsB;CACvD,MAAM,UAAU,eAAe;CAC/B,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,IAAI,aAAa;CACjB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,OAAO,KAAK;EAClB,IAAI,QAAQ,QAAQ,KAAK,EACvB;EAEF,IAAI,SAAS,KAAK,cAAc;OAC3B,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IAAI,SAAS,KAAK,gBAAgB;OAClC,IAAI,SAAS,KAAK,eAAe,KAAK,IAAI,GAAG,eAAe,EAAE;OAC9D,IAAI,SAAS,KAAK,cAAc;OAChC,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IAAI,SAAS,OAAO,eAAe,KAAK,iBAAiB,KAAK,eAAe,GAChF,OAAO;;CAGX,OAAO;;AAGT,SAAS,gBAEP;CACA,IAAI;CACJ,IAAI,UAAU;CACd,OAAO,EACL,QAAQ,MAAM;EACZ,IAAI,OAAO;GACT,IAAI,SACF,UAAU;QACL,IAAI,SAAS,MAClB,UAAU;QACL,IAAI,SAAS,OAClB,QAAQ,KAAA;GAEV,OAAO;;EAET,IAAI,SAAS,QAAO,SAAS,OAAO,SAAS,KAAK;GAChD,QAAQ;GACR,OAAO;;EAET,OAAO;IAEV;;AAGH,SAAS,oBAAoB,MAAkC;CAC7D,IAAI;EACF,OAAO,aAAa,MAAM,OAAO;SAC3B;EACN"}
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\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 source = this.sourceSliceForType(type);\n return this.rememberTypes(\n source\n ? (this.client().getTypeArgumentsAtSourceRange(\n this.#snapshot!,\n this.projectId(),\n type.id,\n type.objectFlags,\n source.node.fileName,\n source.node.pos,\n source.node.end,\n this.sourceTextForPath(source.node.fileName) ?? \"\",\n ) as unknown as readonly CorsaType[])\n : (this.client().getTypeArguments(\n this.#snapshot!,\n this.projectId(),\n type.id,\n type.objectFlags,\n ) as unknown as readonly CorsaType[]),\n );\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 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 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 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 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":";;;AA6CA,MAAM,YAAY;CAChB,QAAQ,KAAK;CACb,OAAO,KAAK;CACZ,iBAAiB,KAAK;CACtB,eAAe,KAAK;CACpB,cAAc,KAAK;CACnB,eAAe,KAAK;CACpB,aAAa,KAAK;CAClB,OAAO,KAAK;CACZ,cAAc,KAAK;CACpB;AAED,MAAM,cAAc;CAClB,kBAAkB;CAClB,WAAW;CACX,QAAQ;CACT;AAED,IAAa,sBAAb,MAAiC;CAC/B;CACA;CACA;CACA,YAA+B,EAAE;CACjC,yBAAS,IAAI,KAAwB;CACrC,+BAAe,IAAI,KAA0B;CAC7C,wCAAwB,IAAI,KAA0B;CACtD,kCAAkB,IAAI,KAAqB;CAC3C,6BAAa,IAAI,KAAwB;CACzC,kCAAkB,IAAI,KAAyB;CAC/C,kCAAkB,IAAI,KAA0B;CAChD,gCAAgB,IAAI,KAAqB;CACzC,iBAAiB;CACjB;CAEA,YACE,SACA,SACA;EAFS,KAAA,UAAA;EACA,KAAA,UAAA;;CAGX,QAAc;EACZ,IAAI,KAAKA,WAAW;GAClB,KAAKC,SAAS,cAAc,KAAKD,UAAU;GAC3C,KAAKA,YAAY,KAAA;;EAEnB,KAAKC,SAAS,OAAO;EACrB,KAAKA,UAAU,KAAA;EACf,KAAKC,0BAA0B,KAAA;EAC/B,KAAKC,OAAO,OAAO;EACnB,KAAK,mBAAmB;EACxB,KAAKC,cAAc,OAAO;;CAG5B,qBAA8B;EAC5B,OAAO,KAAK,QAAQ,CAAC;;CAGvB,mBAAsC;EACpC,OAAO,KAAK,QAAQ,CAAC;;CAGvB,kBACE,UACA,UACA,YACuB;EACvB,MAAM,QAAQ,KAAK,UAAU,UAAU,WAAW;EAClD,IAAI,CAAC,MAAM,eAAe,IAAI,SAAS,EACrC,MAAM,eAAe,IACnB,UACA,KAAK,QAAQ,CAAC,kBAAkB,KAAKJ,WAAY,MAAM,WAAW,UAAU,SAAS,CAGtF;EAEH,MAAM,OAAO,KAAK,aAAa,MAAM,eAAe,IAAI,SAAS,CAAC;EAClE,IAAI,MACF,KAAKK,gBAAgB,IAAI,KAAK,IAAI;GAAE;GAAU;GAAU;GAAY,CAAC;EAEvE,OAAO;;CAGT,qBACE,UACA,OACA,KACA,YACA,MACuB;EACvB,IAAI,CAAC,cAAc,OAAO,OACxB,OAAO,KAAK,kBAAkB,UAAU,OAAO,WAAW;EAE5D,MAAM,QAAQ,KAAK,UAAU,UAAU,WAAW;EAClD,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ;EACvC,IAAI,CAAC,MAAM,kBAAkB,IAAI,IAAI,EACnC,MAAM,kBAAkB,IACtB,KACA,KAAK,QAAQ,CAAC,qBACZ,KAAKL,WACL,MAAM,WACN,UACA,OACA,KACA,YACA,KACD,CACF;EAEH,MAAM,OAAO,KAAK,aAAa,MAAM,kBAAkB,IAAI,IAAI,CAAC;EAChE,IAAI,MACF,KAAKK,gBAAgB,IAAI,KAAK,IAAI;GAAE;GAAU,UAAU;GAAO;GAAY,CAAC;EAE9E,OAAO;;CAGT,oBACE,UACA,UACA,YACyB;EACzB,MAAM,QAAQ,KAAK,UAAU,UAAU,WAAW;EAClD,IAAI,CAAC,MAAM,iBAAiB,IAAI,SAAS,EACvC,MAAM,iBAAiB,IACrB,UACA,KAAK,QAAQ,CAAC,oBAAoB,KAAKL,WAAY,MAAM,WAAW,UAAU,SAAS,CAGxF;EAEH,OAAO,KAAK,eAAe,MAAM,iBAAiB,IAAI,SAAS,CAAC;;CAGlE,UAAU,QAAuD;EAC/D,IAAI,OAAO,WAAW,UACpB,OAAO,KAAK,eAAe,OAAO;EAEpC,MAAM,YAAY,KAAKM,sBAAsB,IAAI,OAAO;EACxD,IAAI,WACF,OAAO;EAET,MAAM,SAAS,KAAKC,aAAa,IAAI,OAAO;EAC5C,IAAI,QACF,OAAO;EAET,MAAM,SAAS,KAAKC,gBAAgB,IAAI,OAAO;EAC/C,IAAI,CAAC,UAAU,CAAC,KAAKR,WACnB;EAEF,MAAM,WAAW,KAAK,QAAQ,CAAC,SAA6B,mBAAmB;GAC7E,UAAU,KAAKA;GACf,MAAM;GACP,CAAC;EACF,OAAO,UAAU,OAAO,SAAS,KAAK,eAAe,SAAS,GAAG,KAAA;;CAGnE,QAAQ,MAAiD;EACvD,IAAI,OAAO,SAAS,UAClB,OAAO;EAET,OAAO,KAAKS,WAAW,IAAI,KAAK,IAAI,KAAK,aAAa,KAAK;;CAG7D,qBAAqB,MAAkC;EACrD,OAAO,KAAK,kBAAkB,KAAK;;CAGrC,gBAAgB,QAA4C;EAC1D,MAAM,OAAO,KAAK,aAAa,KAAK,iBAAiB,QAAQ,kBAAkB,CAAC;EAChF,KAAK,mBAAmB,MAAM,OAAO,iBAAiB;EACtD,OAAO;;CAGT,wBAAwB,QAA4C;EAClE,MAAM,OAAO,KAAK,aAAa,KAAK,iBAAiB,QAAQ,0BAA0B,CAAC;EACxF,KAAK,mBAAmB,MAAM,OAAO,iBAAiB;EACtD,OAAO;;CAGT,aAAa,MAAiB,OAAwB;EACpD,IAAI;GACF,MAAM,OAAO,KAAK,QAAQ,CAAC,aACzB,KAAKT,WACL,KAAK,WAAW,EAChB,KAAK,IACL,KAAA,GACA,MACD;GACD,IAAI,UAAU,KAAA,GACZ,KAAKI,cAAc,IAAI,KAAK,IAAI,KAAK;GAEvC,OAAO;WACA,OAAO;GACd,MAAM,SAAS,UAAU,KAAA,IAAY,KAAKA,cAAc,IAAI,KAAK,GAAG,GAAG,KAAA;GACvE,IAAI,WAAW,KAAA,GACb,OAAO;GAET,MAAM;;;CAUV,iBAAiB,QAAgB,MAAoB;EACnD,IAAI,CAAC,KAAKA,cAAc,IAAI,OAAO,EACjC,KAAKA,cAAc,IAAI,QAAQ,KAAK;;CAIxC,yBAAyB,MAAwC;EAC/D,OAAO,KAAK,aACV,KAAK,QAAQ,CAAC,SAAS,4BAA4B;GACjD,UAAU,KAAKJ;GACf,SAAS,KAAK,WAAW;GACzB,MAAM,KAAK;GACZ,CAAC,CACH;;CAGH,oBAAoB,MAAyC;EAC3D,OAAO,KAAK,gBACV,KAAK,QAAQ,CAAC,SAAS,uBAAuB;GAC5C,UAAU,KAAKA;GACf,SAAS,KAAK,WAAW;GACzB,MAAM,KAAK;GACZ,CAAC,IAAI,EAAE,CACT;;CAGH,oBAAoB,MAAiB,MAAyC;EAC5E,OAAO,KAAK,mBACV,KAAK,QAAQ,CAAC,SAAS,uBAAuB;GAC5C,UAAU,KAAKA;GACf,SAAS,KAAK,WAAW;GACzB,MAAM,KAAK;GACX;GACD,CAAC,IAAI,EAAE,CACT;;CAGH,yBAAyB,WAAkD;EACzE,OAAO,KAAK,aACV,KAAK,QAAQ,CAAC,SAAS,4BAA4B;GACjD,UAAU,KAAKA;GACf,SAAS,KAAK,WAAW;GACzB,WAAW,UAAU;GACtB,CAAC,CACH;;CAGH,4BAA4B,WAA2D;EACrF,MAAM,YAAY,KAAK,QAAQ,CAAC,SAC9B,+BACA;GACE,UAAU,KAAKA;GACf,SAAS,KAAK,WAAW;GACzB,WAAW,UAAU;GACtB,CACF;EACD,IAAI,WAAW,MACb,KAAK,aAAa,UAAU,KAAK;EAEnC,OAAO;;CAGT,aAAa,MAAuC;EAClD,IAAI,uBAAuB,MAAM,KAAK,EACpC,OAAO,EAAE;EAEX,IAAI;GACF,OAAO,KAAK,cACV,KAAK,QAAQ,CAAC,SAAS,gBAAgB;IACrC,UAAU,KAAKA;IACf,SAAS,KAAK,WAAW;IACzB,MAAM,KAAK;IACX,OAAO,KAAK,UAAU,KAAK;IAC5B,CAAC,IAAI,EAAE,CACT;WACM,OAAO;GAMd,IAAI,qBAAqB,MAAM,IAAI,mBAAmB,MAAM,EAC1D,OAAO,EAAE;GAEX,MAAM;;;CAIV,iBAAiB,MAAuC;EACtD,MAAM,SAAS,KAAK,mBAAmB,KAAK;EAC5C,OAAO,KAAK,cACV,SACK,KAAK,QAAQ,CAAC,8BACb,KAAKA,WACL,KAAK,WAAW,EAChB,KAAK,IACL,KAAK,aACL,OAAO,KAAK,UACZ,OAAO,KAAK,KACZ,OAAO,KAAK,KACZ,KAAK,kBAAkB,OAAO,KAAK,SAAS,IAAI,GACjD,GACA,KAAK,QAAQ,CAAC,iBACb,KAAKA,WACL,KAAK,WAAW,EAChB,KAAK,IACL,KAAK,YACN,CACN;;CAGH,eAAe,MAAuC;EACpD,KACG,KAAK,SAAS,UAAU,QAAQ,UAAU,eAAe,UAAU,sBACpE,GAEA,OAAO,EAAE;EAEX,OAAO,KAAK,cAAc,kBAAkB,KAAK;;CAGnD,gBAAgB,MAAwC;EACtD,KACG,KAAK,SAAS,UAAU,QAAQ,UAAU,oBAAoB,OAC7D,KAAK,eAAe,MAAM,YAAY,YAAY,YAAY,aAAa,GAE7E;EAEF,MAAM,SAAS,KAAK,SAAS,mBAAmB,KAAK;EACrD,KAAK,cAAc,OAAO;EAC1B,OAAO;;CAGT,wBAAwB,MAAuC;EAC7D,MAAM,QAAQ,KAAK,eAAe;EAClC,KAAK,KAAK,QAAQ,UAAU,YAAY,MAAM,QAAQ,YAAY,sBAAsB,GACtF,OAAO,EAAE;EAEX,OAAO,KAAK,cAAc,2BAA2B,KAAK;;CAG5D,6BAA6B,MAAuC;EAClE,MAAM,QAAQ,KAAK,eAAe;EAClC,KAAK,KAAK,QAAQ,UAAU,YAAY,MAAM,QAAQ,YAAY,sBAAsB,GACtF,OAAO,EAAE;EAEX,OAAO,KAAK,cAAc,gCAAgC,KAAK;;CAGjE,6BAA6B,MAAuC;EAClE,MAAM,QAAQ,KAAK,eAAe;EAClC,KAAK,KAAK,QAAQ,UAAU,YAAY,MAAM,QAAQ,YAAY,sBAAsB,GACtF,OAAO,EAAE;EAEX,OAAO,KAAK,cAAc,gCAAgC,KAAK;;CAGjE,oBAAoB,MAAwC;EAC1D,QAAQ,KAAK,QAAQ,UAAU,mBAAmB,IAC9C,KAAK,SAAS,uBAAuB,KAAK,GAC1C,KAAA;;CAGN,mBAAmB,MAAwC;EACzD,QAAQ,KAAK,QAAQ,UAAU,mBAAmB,IAC9C,KAAK,SAAS,sBAAsB,KAAK,GACzC,KAAA;;CAGN,mBAAmB,MAAwC;EACzD,QAAQ,KAAK,QAAQ,UAAU,iBAAiB,IAC5C,KAAK,SAAS,sBAAsB,KAAK,GACzC,KAAA;;CAGN,qBAAqB,MAAwC;EAC3D,QAAQ,KAAK,QAAQ,UAAU,iBAAiB,IAC5C,KAAK,SAAS,wBAAwB,KAAK,GAC3C,KAAA;;CAGN,kBAAkB,MAAwC;EACxD,QAAQ,KAAK,QAAQ,UAAU,kBAAkB,IAC7C,KAAK,SAAS,qBAAqB,KAAK,GACxC,KAAA;;CAGN,oBAAoB,MAAwC;EAC1D,OAAO,KAAK,aACV,KAAK,QAAQ,CAAC,oBAAoB,KAAKA,WAAY,KAAK,WAAW,EAAE,KAAK,GAAG,CAG9E;;CAGH,SAAiB,QAAgB,MAAwC;EACvE,OAAO,KAAK,aACV,KAAK,QAAQ,CAAC,SAA2B,QAAQ;GAC/C,UAAU,KAAKA;GACf,MAAM,KAAK;GACZ,CAAC,IAAI,KAAA,EACP;;CAGH,cAAsB,QAAgB,MAAuC;EAC3E,OAAO,KAAK,cACV,KAAK,QAAQ,CAAC,SAAsC,QAAQ;GAC1D,UAAU,KAAKA;GACf,MAAM,KAAK;GACZ,CAAC,IAAI,EAAE,CACT;;CAGH,iBACE,QACA,QACuB;EACvB,IAAI;GACF,OAAO,KAAK,QAAQ,CAAC,QAAQ,KAAKA,WAAY,KAAK,WAAW,EAAE,OAAO,GAAG;UAGpE;GACN;;;CAIJ,mBAA2B,MAA0C;EACnE,MAAM,SAAS,KAAKU,gBAAgB,IAAI,KAAK,GAAG;EAChD,IAAI,QACF,OAAO;EAET,MAAM,SAAS,KAAKL,gBAAgB,IAAI,KAAK,GAAG;EAChD,IAAI,QAAQ;GACV,MAAM,SAAS,KAAK,oBAAoB,OAAO,UAAU,OAAO,UAAU,OAAO,WAAW;GAC5F,KAAK,mBAAmB,MAAM,QAAQ,iBAAiB;GACvD,MAAM,aAAa,KAAKK,gBAAgB,IAAI,KAAK,GAAG;GACpD,IAAI,YACF,OAAO;;EAGX,IAAI,KAAK,QAAQ;GACf,MAAM,SAAS,KAAK,UAAU,KAAK,OAAO;GAC1C,KAAK,mBAAmB,MAAM,QAAQ,iBAAiB;;EAEzD,OAAO,KAAKA,gBAAgB,IAAI,KAAK,GAAG;;CAG1C,aAAsD,MAAY;EAChE,IAAI,MAAM,QACR,KAAKF,gBAAgB,IAAI,KAAK,QAAQ,KAAK,GAAG;EAEhD,IAAI,MAAM,QAAQ,IAChB,KAAKJ,cAAc,IAAI,KAAK,IAAI,KAAK,MAAM,GAAG;EAEhD,OAAO;;CAGT,cAAsD,OAAa;EACjE,KAAK,MAAM,QAAQ,OACjB,KAAK,aAAa,KAAK;EAEzB,OAAO;;CAGT,mBAA2B,MAA6B,QAAkC;EACxF,IAAI,CAAC,QAAQ,CAAC,UAAU,KAAKM,gBAAgB,IAAI,KAAK,GAAG,EACvD;EAEF,MAAM,SAAS,KAAK,qBAAqB,OAAO;EAChD,IAAI,QACF,KAAKA,gBAAgB,IAAI,KAAK,IAAI,OAAO;;CAI7C,cAAsB,MAAmC;EACvD,IAAI,CAAC,QAAQ,KAAKN,cAAc,IAAI,KAAK,GAAG,EAC1C;EAEF,IAAI;GACF,KAAKA,cAAc,IACjB,KAAK,IACL,KAAK,QAAQ,CAAC,aAAa,KAAKJ,WAAY,KAAK,WAAW,EAAE,KAAK,GAAG,CACvE;UACK;;CAKV,UAAkB,MAAoC;EACpD,IAAI,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,MAAM,SAAS,GACnD,OAAO,KAAK;EAEd,MAAM,SAAS,KAAKI,cAAc,IAAI,KAAK,GAAG;EAC9C,OAAO,WAAW,KAAA,IAAY,EAAE,GAAG,CAAC,OAAO;;CAG7C,eAA0D,QAAc;EACtE,IAAI,CAAC,QACH,OAAO;EAET,MAAM,YAAY,KAAKE,sBAAsB,IAAI,OAAO,GAAG;EAC3D,IAAI,WACF,OAAO;EAET,KAAKC,aAAa,IAAI,OAAO,IAAI,OAAO;EACxC,KAAK,MAAM,eAAe,OAAO,gBAAgB,EAAE,EACjD,KAAK,aAAa,YAAY;EAEhC,IAAI,OAAO,kBACT,KAAK,aAAa,OAAO,iBAAiB;EAE5C,OAAO;;CAGT,gBAA0D,SAAe;EACvE,KAAK,MAAM,UAAU,SACnB,KAAK,eAAe,OAAO;EAE7B,OAAO;;CAGT,mBAAgE,YAAkB;EAChF,KAAK,MAAM,aAAa,YACtB,KAAK,kBAAkB,UAAU;EAEnC,OAAO;;CAGT,kBAA0B,WAA2C;EACnE,IAAI,UAAU,aACZ,KAAK,aAAa,UAAU,YAAY;EAE1C,MAAM,eAAe,MAAM,QAAQ,UAAU,WAAW,GAAG,UAAU,aAAa,EAAE;EACpF,MAAM,aAAa,UAAU,cACzB,KAAK,6BAA6B,UAAU,aAAa,aAAa,OAAO,GAC7E,EAAE;EACN,aAAa,SAAS,IAAI,UAAU;GAClC,KAAK,wBAAwB,IAAI,WAAW,OAAO;IACnD;EACF,IAAI,UAAU,eACZ,KAAK,wBAAwB,UAAU,eAAe,KAAA,GAAW,OAAO;EAE1E,OAAO;;CAGT,wBACE,IACA,WACA,eAAe,IACF;EACb,MAAM,SAAS,KAAKD,sBAAsB,IAAI,GAAG;EACjD,IAAI,WAAW,OAAO,QAAQ,CAAC,WAAW,OACxC,OAAO;EAET,MAAM,cAAc,WAAW,KAAK;EACpC,MAAM,SAAsB;GAC1B;GACA,MAAM,WAAW,QAAQ;GACzB,OAAO,QAAQ,SAAS;GACxB,YAAY,QAAQ,cAAc;GAClC,cAAc,cAAc,CAAC,YAAY,GAAI,QAAQ,gBAAgB,EAAE;GACvE,kBAAkB,eAAe,QAAQ;GAC1C;EACD,KAAKA,sBAAsB,IAAI,IAAI,OAAO;EAC1C,KAAKC,aAAa,IAAI,IAAI,OAAO;EACjC,IAAI,aACF,KAAKE,WAAW,IAAI,aAAa,UAAU,KAAK;EAElD,OAAO;;CAGT,aAAqB,QAAuC;EAC1D,MAAM,SAAS,gBAAgB,OAAO;EACtC,IAAI,CAAC,QACH;EAEF,KAAKA,WAAW,IAAI,QAAQ,OAAO;EACnC,OAAO;;CAGT,oBAAkC;EAChC,KAAKF,aAAa,OAAO;EACzB,KAAKD,sBAAsB,OAAO;EAClC,KAAKE,gBAAgB,OAAO;EAC5B,KAAKC,WAAW,OAAO;EACvB,KAAKJ,gBAAgB,OAAO;EAC5B,KAAKK,gBAAgB,OAAO;;CAG9B,6BACE,QACA,eAC0B;EAC1B,MAAM,SAAS,KAAK,qBAAqB,OAAO;EAChD,IAAI,CAAC,QACH,OAAO,KAAK,qCAAqC,OAAO;EAE1D,MAAM,aAAa,wBAAwB,OAAO;EAClD,IAAI,WAAW,UAAU,iBAAiB,kBAAkB,GAC1D,OAAO;EAET,MAAM,iBAAiB,KAAK,qCAAqC,OAAO;EACxE,OAAO,eAAe,SAAS,WAAW,SAAS,iBAAiB;;CAGtE,qCAA6C,QAA0C;EACrF,MAAM,SAAS,KAAK,qBAAqB,QAAQ,YAAY;EAC7D,OAAO,SAAS,wBAAwB,OAAO,GAAG,EAAE;;CAGtD,qBACE,QACA,aAAoC,SACX;EACzB,MAAM,OAAO,KAAK,QAAQ,OAAO;EACjC,IAAI,CAAC,MACH;EAEF,MAAM,aAAa,KAAK,kBAAkB,KAAK,SAAS;EACxD,MAAM,iBACJ,eAAe,cAAc,wBAAwB,MAAM,WAAW,GAAG;EAC3E,IACE,CAAC,cACD,CAAC,kBACD,eAAe,MAAM,KACrB,eAAe,MAAM,WAAW,UAChC,eAAe,OAAO,eAAe,KAErC;EAEF,OAAO;GACL,MAAM;GACN,MAAM,WAAW,MAAM,eAAe,KAAK,eAAe,IAAI;GAC/D;;CAGH,kBAA0B,MAAkC;EAC1D,KAAK,MAAM,CAAC,UAAU,WAAW,KAAKP,QACpC,IAAI,aAAa,QAAQ,SAAS,SAAS,KAAK,EAC9C,OAAO,OAAO,kBAAkB,OAAO,cAAc,oBAAoB,SAAS;EAGtF,OAAO,oBAAoB,KAAK,IAAI,oBAAoB,GAAG,KAAK,QAAQ,IAAI,GAAG,OAAO;;CAGxF,SAAiC;EAC/B,IAAI,CAAC,KAAKF,SAAS;GACjB,KAAKA,UAAU,eAAe,MAAM;IAClC,YAAY,KAAK,QAAQ;IACzB,KAAK,KAAK,QAAQ;IAClB,MAAM,KAAK,QAAQ;IACpB,CAAC;GACF,KAAKA,QAAQ,YAAY;;EAE3B,OAAO,KAAKA;;CAGd,SAA4D;EAC1D,IAAI,CAAC,KAAKU,SACR,KAAKA,UAAU,KAAK,QAAQ,CAAC,gBAAgB,KAAK,QAAQ,WAAW;EAEvE,MAAM,SAAS,KAAKA;EACpB,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,mDAAmD,KAAK,QAAQ,aAAa;EAE/F,OAAO;;CAGT,UAAkB,UAAkB,YAAgC;EAClE,MAAM,WAAW,KAAK,gBAAgB,UAAU,WAAW;EAC3D,MAAM,UAAU,KAAKR,OAAO,IAAI,SAAS;EACzC,IAAI,SACF,OAAO;EAET,MAAM,UAAU,KAAK,QAAQ,CAAC,SAAiC,4BAA4B;GACzF,UAAU,KAAKH;GACf,MAAM;GACP,CAAC;EACF,MAAM,QAAmB;GACvB,SAAS,SAAS;GAClB,gBAAgB,SAAS;GACzB,YAAY,SAAS;GACrB,WAAW,SAAS,MAAM,KAAK,WAAW;GAC1C,gCAAgB,IAAI,KAAK;GACzB,mCAAmB,IAAI,KAAK;GAC5B,kCAAkB,IAAI,KAAK;GAC5B;EACD,KAAKG,OAAO,IAAI,UAAU,MAAM;EAChC,OAAO;;CAGT,gBAAwB,UAAkB,YAAwC;EAChF,MAAM,MAAM,KAAK,KAAK;EACtB,MAAM,UAAU,MAAM,KAAKS,iBAAiB,KAAK,QAAQ;EACzD,MAAM,SAAS,KAAKT,OAAO,IAAI,SAAS;EACxC,MAAM,UAAU,YAAY,SAAS;EACrC,MAAM,cAAc,KAAK,qBAAqB,UAAU,YAAY,SAAS,OAAO;EACpF,MAAM,eAAe,WAAW,KAAA,KAAa,YAAY,OAAO;EAChE,MAAM,cAAc,gBAAgB,QAAQ;EAC5C,MAAM,WAAW;GACf;GACA,gBAAgB;GAChB,YAAY;GACb;EAED,IAAI,EADU,CAAC,KAAKH,aAAa,gBAAgB,eAAe,UAE9D,OAAO;EAET,MAAM,WAAW,KAAKA;EACtB,MAAM,iBAAiB,KAAK,eAAe,UAAU,aAAa,OAAO;EACzE,MAAM,WAAW,KAAK,QAAQ,CAAC,eAAe;GAC5C,GAAI,WACA,EAAE,aAAa,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,GACxC,EAAE,aAAa,KAAK,QAAQ,YAAY;GAC5C,GAAI,mBAAmB,KAAA,IAAY,EAAE,GAAG,EAAE,gBAAgB;GAC3D,CAAC;EACF,KAAKA,YAAY,SAAS;EAC1B,KAAKa,YAAY,SAAS;EAC1B,KAAKD,iBAAiB;EACtB,KAAKT,OAAO,OAAO;EACnB,KAAK,mBAAmB;EACxB,IAAI,YAAY,aAAa,KAAKH,WAChC,KAAK,QAAQ,CAAC,cAAc,SAAS;EAEvC,OAAO;;CAGT,YAA4B;EAC1B,MAAM,KAAK,KAAKa,UAAU,IAAI;EAC9B,IAAI,CAAC,IACH,MAAM,IAAI,MACR,sDAAsD,KAAK,QAAQ,WACpE;EAEH,OAAO;;CAGT,qBACE,UACA,YACA,SACA,QACoB;EACpB,IAAI,eAAe,KAAA,KAAa,CAAC,KAAK,wBAAwB,EAC5D;EAEF,IAAI,QAAQ,mBAAmB,cAAc,OAAO,YAAY,SAC9D,OAAO,OAAO;EAEhB,OAAO,eAAe,UAAU,WAAW;;CAG7C,eACE,UACA,aACA,QAMY;EACZ,IAAI,CAAC,KAAK,wBAAwB,EAChC;EAEF,IAAI,gBAAgB,KAAA,GAClB,OAAO,EACL,QAAQ,CACN;GACE,UAAU;GACV,MAAM;GACN,YAAY,cAAc,SAAS;GACpC,CACF,EACF;EAEH,IAAI,QAAQ,eAAe,KAAA,GACzB,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE;;CAKjC,yBAA0C;EACxC,IAAI,KAAKX,4BAA4B,KAAA,GACnC,OAAO,KAAKA;EAEd,IAAI;GACF,MAAM,eAAe,KAAK,QAAQ,CAAC,SAEhC,uBAAuB;GAC1B,KAAKA,0BAA0B,cAAc,SAAS,iCAAiC;UACjF;GACN,KAAKA,0BAA0B;;EAEjC,OAAO,KAAKA;;;AAIhB,SAAS,wBAAwB,QAA+C;CAC9E,MAAM,OAAO,6BAA6B,OAAO,KAAK;CACtD,IAAI,OAAO,GACT,OAAO,EAAE;CAEX,MAAM,QAAQ,mBAAmB,OAAO,MAAM,KAAK;CACnD,IAAI,QAAQ,GACV,OAAO,EAAE;CAEX,MAAM,iBAAiB,OAAO,KAAK,MAAM,OAAO,GAAG,MAAM;CACzD,OAAO,oBAAoB,gBAAgB,IAAI,CAC5C,KAAK,UAAU,qBAAqB,OAAO,MAAM,gBAAgB,OAAO,OAAO,EAAE,CAAC,CAClF,QAAQ,cAA0C,cAAc,KAAA,EAAU;;AAG/E,SAAS,uBAAuB,SAA8B,MAA0B;CAGtF,QADE,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,MAAM,SAAS,IAAI,KAAK,QAAQ,CAAC,QAAQ,aAAa,KAAK,CAAC,EACnF,MAAM,SAAS;EAC1B,MAAM,aAAa,KAAK,WAAW;EACnC,OACE,WAAW,WAAW,aAAa,IAAI,WAAW,WAAW,IAAI,IAAI,WAAW,SAAS,KAAK;GAEhG;;AAGJ,SAAS,6BAA6B,MAAsB;CAC1D,MAAM,qBAAqB;CAC3B,IAAI;CACJ,IAAI,OAAO;CACX,QAAQ,QAAQ,mBAAmB,KAAK,KAAK,MAAM,MACjD,OAAO,MAAM,QAAQ,MAAM,GAAG,YAAY,IAAI;CAEhD,IAAI,QAAQ,GACV,OAAO;CAET,OAAO,KAAK,QAAQ,IAAI;;AAG1B,SAAS,eAAe,UAAkB,YAAyC;CACjF,IAAI,eAAe,KAAA,GACjB;CAEF,IAAI;EACF,OAAO,aAAa,UAAU,OAAO,KAAK,aAAa,KAAA,IAAY;SAC7D;EACN,OAAO;;;AAIX,SAAS,qBAAqB,OAAyB;CACrD,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;CACtE,OAAO,QAAQ,SAAS,yBAAyB,IAAI,QAAQ,SAAS,uBAAuB;;AAG/F,SAAS,mBAAmB,OAAyB;CACnD,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;CACtE,OAAO,gDAAgD,KAAK,QAAQ;;AAGtE,SAAS,YAAY,UAA0B;CAC7C,IAAI;EACF,OAAO,SAAS,SAAS,CAAC;SACpB;EACN,OAAO;;;AAIX,SAAS,cAAc,UAA0B;CAC/C,IAAI,SAAS,SAAS,OAAO,EAC3B,OAAO;CAET,IAAI,SAAS,SAAS,OAAO,EAC3B,OAAO;CAET,IAAI,SAAS,SAAS,MAAM,EAC1B,OAAO;CAET,OAAO;;AAGT,SAAS,gBAAgB,OAAsC;CAC7D,MAAM,CAAC,SAAS,SAAS,WAAW,GAAG,aAAa,MAAM,MAAM,IAAI;CACpE,MAAM,MAAM,OAAO,QAAQ;CAC3B,MAAM,MAAM,OAAO,QAAQ;CAC3B,MAAM,WAAW,UAAU,KAAK,IAAI;CACpC,IAAI,CAAC,OAAO,SAAS,IAAI,IAAI,CAAC,OAAO,SAAS,IAAI,IAAI,CAAC,UACrD;CAEF,OAAO;EAAE,IAAI;EAAO;EAAU;EAAK;EAAK,OAAO,CAAC,KAAK,IAAI;EAAE;;AAG7D,SAAS,wBACP,MACA,YACuB;CACvB,IAAI,eAAe,KAAA,GACjB;CAEF,MAAM,MAAM,6BAA6B,YAAY,KAAK,IAAI;CAC9D,MAAM,MAAM,6BAA6B,YAAY,KAAK,IAAI;CAC9D,IAAI,QAAQ,KAAA,KAAa,QAAQ,KAAA,KAAa,MAAM,KAClD;CAEF,OAAO;EACL,GAAG;EACH;EACA;EACA,OAAO,CAAC,KAAK,IAAI;EAClB;;AAGH,SAAS,6BAA6B,MAAc,YAAwC;CAC1F,IAAI,CAAC,OAAO,UAAU,WAAW,IAAI,aAAa,GAChD;CAEF,IAAI,QAAQ;CACZ,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAAU;EACzC,IAAI,UAAU,YACZ,OAAO;EAET,MAAM,YAAY,KAAK,YAAY,MAAM;EACzC,IAAI,cAAc,KAAA,GAChB;EAEF,MAAM,YAAY,QAAQ,0BAA0B,UAAU;EAC9D,IAAI,YAAY,YACd;EAEF,QAAQ;EACR,SAAS,YAAY,QAAS,IAAI;;CAEpC,OAAO,UAAU,aAAa,KAAK,SAAS,KAAA;;AAG9C,SAAS,0BAA0B,WAA2B;CAC5D,IAAI,aAAa,KACf,OAAO;CAET,IAAI,aAAa,MACf,OAAO;CAET,IAAI,aAAa,OACf,OAAO;CAET,OAAO;;AAGT,SAAS,qBACP,iBACA,gBACA,OACA,iBAC2B;CAC3B,MAAM,MAAM,eAAe,MAAM,MAAM,OAAO,MAAM,IAAI;CACxD,MAAM,UAAU,IAAI,OAAO,KAAK;CAChC,IAAI,UAAU,GACZ;CAEF,MAAM,WAAW,IAAI,MAAM,OAAO,GAAG,GAAG,UAAU;CAElD,MAAM,OAAO,qBADA,IAAI,MAAM,SAAS,IAAI,SAAS,SACP,CAAC;CACvC,IAAI,CAAC,MACH;CAEF,MAAM,MAAM,gBAAgB,MAAM,kBAAkB,MAAM,QAAQ;CAClE,MAAM,MAAM,gBAAgB,MAAM,kBAAkB,MAAM,MAAM;CAEhE,OAAO;EACL;EACA,MAAM;GACJ,IAAA,GAJU,IAAI,GAAG,IAAI,KAAK,gBAAgB;GAK1C,UAAU,gBAAgB;GAC1B;GACA;GACA,OAAO,CAAC,KAAK,IAAI;GAClB;EACF;;AAGH,SAAS,qBAAqB,MAAkC;CAC9D,IAAI,YAAY,KAAK,MAAM,CAAC,QAAQ,cAAc,GAAG;CACrD,IAAI,UAAU;CACd,OAAO,SAAS;EACd,MAAM,WAAW;EACjB,YAAY,UAAU,QACpB,8EACA,GACD;EACD,UAAU,cAAc;;CAE1B,MAAM,YAAY,wBAAwB,WAAW,CAAC,KAAK,IAAI,CAAC;CAChE,IAAI,QAAQ,aAAa,IAAI,UAAU,MAAM,GAAG,UAAU,GAAG,WAAW,MAAM;CAC9E,IAAI,KAAK,SAAS,IAAI,EACpB,OAAO,KAAK,MAAM,GAAG,GAAG,CAAC,MAAM;CAEjC,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,EAC9C,OAAO;CAET,OAAO,KAAK,MAAM,MAAM,CAAC,GAAG,GAAG;;AAGjC,SAAS,mBAAmB,MAAc,MAAsB;CAC9D,IAAI,QAAQ;CACZ,MAAM,UAAU,eAAe;CAC/B,KAAK,IAAI,QAAQ,MAAM,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACtD,MAAM,OAAO,KAAK;EAClB,IAAI,QAAQ,QAAQ,KAAK,EACvB;EAEF,IAAI,SAAS,KACX,SAAS;OACJ,IAAI,SAAS,KAAK;GACvB,SAAS;GACT,IAAI,UAAU,GACZ,OAAO;;;CAIb,OAAO;;AAGT,SAAS,oBACP,MACA,WAC6D;CAC7D,MAAM,SAA2C,EAAE;CACnD,MAAM,UAAU,eAAe;CAC/B,IAAI,QAAQ;CACZ,IAAI,aAAa;CACjB,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,IAAI,aAAa;CACjB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,OAAO,KAAK;EAClB,IAAI,QAAQ,QAAQ,KAAK,EACvB;EAEF,IAAI,SAAS,KAAK,cAAc;OAC3B,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IAAI,SAAS,KAAK,cAAc;OAChC,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IAAI,SAAS,KAAK,gBAAgB;OAClC,IAAI,SAAS,KAAK,eAAe,KAAK,IAAI,GAAG,eAAe,EAAE;OAC9D,IAAI,SAAS,KAAK,cAAc;OAChC,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IACH,SAAS,aACT,eAAe,KACf,eAAe,KACf,iBAAiB,KACjB,eAAe,GACf;GACA,OAAO,KAAK;IAAE;IAAO,KAAK;IAAO,CAAC;GAClC,QAAQ,QAAQ;;;CAGpB,OAAO,KAAK;EAAE;EAAO,KAAK,KAAK;EAAQ,CAAC;CACxC,OAAO;;AAGT,SAAS,wBAAwB,MAAc,SAAoC;CACjF,MAAM,UAAU,eAAe;CAC/B,IAAI,aAAa;CACjB,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,IAAI,aAAa;CACjB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,OAAO,KAAK;EAClB,IAAI,QAAQ,QAAQ,KAAK,EACvB;EAEF,IAAI,SAAS,KAAK,cAAc;OAC3B,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IAAI,SAAS,KAAK,cAAc;OAChC,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IAAI,SAAS,KAAK,gBAAgB;OAClC,IAAI,SAAS,KAAK,eAAe,KAAK,IAAI,GAAG,eAAe,EAAE;OAC9D,IAAI,SAAS,KAAK,cAAc;OAChC,IAAI,SAAS,KAAK,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;OAC1D,IACH,QAAQ,SAAS,KAAK,IACtB,eAAe,KACf,eAAe,KACf,iBAAiB,KACjB,eAAe,GAEf,OAAO;;CAGX,OAAO;;AAGT,SAAS,gBAEP;CACA,IAAI;CACJ,IAAI,UAAU;CACd,OAAO,EACL,QAAQ,MAAM;EACZ,IAAI,OAAO;GACT,IAAI,SACF,UAAU;QACL,IAAI,SAAS,MAClB,UAAU;QACL,IAAI,SAAS,OAClB,QAAQ,KAAA;GAEV,OAAO;;EAET,IAAI,SAAS,QAAO,SAAS,OAAO,SAAS,KAAK;GAChD,QAAQ;GACR,OAAO;;EAET,OAAO;IAEV;;AAGH,SAAS,oBAAoB,MAAkC;CAC7D,IAAI;EACF,OAAO,aAAa,MAAM,OAAO;SAC3B;EACN"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "corsa-oxlint",
3
- "version": "0.33.0",
3
+ "version": "0.35.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.33.0"
106
+ "@corsa-bind/napi": "0.35.0"
107
107
  },
108
108
  "devDependencies": {
109
109
  "@typescript-eslint/utils": "8.59.3"