corsa-oxlint 0.49.0 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -24,6 +24,30 @@ The design goal is simple: performance-critical pieces live in Rust, `napi-rs`
24
24
  bridges them into Node, and end users still get to author custom plugins and
25
25
  custom rules in plain JS/TS.
26
26
 
27
+ ## Plugin-Owned Runtime Resolution
28
+
29
+ If a plugin ships its own `@typescript/native-preview` dependency, pass a
30
+ module anchor to `definePlugin()` so `corsa-oxlint` can resolve that runtime
31
+ even when package managers like pnpm do not hoist it to the consumer root.
32
+
33
+ ```ts
34
+ import { definePlugin } from "corsa-oxlint";
35
+
36
+ export default definePlugin({
37
+ meta: {
38
+ name: "example-plugin",
39
+ },
40
+ resolveFrom: import.meta.url,
41
+ rules: {
42
+ // ...
43
+ },
44
+ });
45
+ ```
46
+
47
+ Consumer overrides still win. `CORSA_EXECUTABLE`,
48
+ `parserOptions.corsa.executable`, and `settings.corsaOxlint` continue to take
49
+ priority over the plugin anchor.
50
+
27
51
  ## Configuration
28
52
 
29
53
  Oxlint does not expose arbitrary parser options at runtime, so
package/dist/context.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ContextWithParserOptions, ResolvedProjectConfig, TypeAwareParserOptions } from "./types.js";
2
2
 
3
3
  //#region src/bindings/nodejs/corsa_oxlint/ts/context.d.ts
4
- declare function defaultCorsaExecutable(rootDir: string, platform?: NodeJS.Platform): string;
4
+ declare function defaultCorsaExecutable(rootDir: string, platform?: NodeJS.Platform, resolveFrom?: string): string;
5
5
  declare function resolveProjectConfig(context: ContextWithParserOptions): ResolvedProjectConfig;
6
6
  /**
7
7
  * Resolves the type-aware parser options visible to a rule.
@@ -17,7 +17,7 @@ declare function resolveProjectConfig(context: ContextWithParserOptions): Resolv
17
17
  * parserOptions.corsa?.mode;
18
18
  * ```
19
19
  */
20
- declare function resolveTypeAwareParserOptions(context: ContextWithParserOptions, defaults?: TypeAwareParserOptionDefaults): TypeAwareParserOptions;
20
+ declare function resolveTypeAwareParserOptions(context: ContextWithParserOptions, defaults?: TypeAwareParserOptionDefaults, resolveFrom?: string): TypeAwareParserOptions;
21
21
  type TypeAwareParserOptionDefaults = {
22
22
  readonly corsa?: boolean;
23
23
  readonly projectService?: boolean;
package/dist/context.js CHANGED
@@ -14,12 +14,12 @@ const DEFAULT_TS_CONFIG = { compilerOptions: {
14
14
  target: "es2022",
15
15
  strict: true
16
16
  } };
17
- function defaultCorsaExecutable(rootDir, platform = process.platform) {
18
- const nativePreview = resolveNativePreviewExecutable(rootDir);
17
+ function defaultCorsaExecutable(rootDir, platform = process.platform, resolveFrom) {
18
+ const nativePreview = resolveNativePreviewExecutableFrom(resolve(rootDir, "package.json")) ?? (resolveFrom ? resolveNativePreviewExecutableFrom(resolveFrom) : void 0);
19
19
  if (nativePreview) return nativePreview;
20
20
  const fallback = resolve(rootDir, platform === "win32" ? ".cache/corsa.exe" : ".cache/corsa");
21
21
  if (existsSync(fallback)) return fallback;
22
- throw new Error(["corsa-oxlint could not locate a Corsa runtime executable.", "Install `@typescript/native-preview`, set `CORSA_EXECUTABLE`, or configure `parserOptions.corsa.executable`."].join(" "));
22
+ throw new Error(["corsa-oxlint could not locate a Corsa runtime executable.", "Install `@typescript/native-preview`, set `CORSA_EXECUTABLE`, configure `parserOptions.corsa.executable`, or pass `resolveFrom` to `definePlugin`."].join(" "));
23
23
  }
24
24
  function resolveProjectConfig(context) {
25
25
  const filename = resolve(context.filename);
@@ -49,9 +49,9 @@ function resolveProjectConfig(context) {
49
49
  * parserOptions.corsa?.mode;
50
50
  * ```
51
51
  */
52
- function resolveTypeAwareParserOptions(context, defaults = {}) {
52
+ function resolveTypeAwareParserOptions(context, defaults = {}, resolveFrom) {
53
53
  const parserOptions = mergeTypeAwareParserOptions(resolveSettingsParserOptions(context.settings?.corsaOxlint), mergeTypeAwareParserOptions(context.parserOptions, context.languageOptions?.parserOptions));
54
- return applyTypeAwareParserOptionDefaults(parserOptions, defaults, resolve(parserOptions.tsconfigRootDir ?? context.cwd));
54
+ return applyTypeAwareParserOptionDefaults(parserOptions, defaults, resolve(parserOptions.tsconfigRootDir ?? context.cwd), resolveFrom);
55
55
  }
56
56
  function resolveRuntimeOptions(rootDir, parserOptions) {
57
57
  const runtime = parserOptions.corsa;
@@ -104,8 +104,8 @@ function globMatch(value, pattern) {
104
104
  function asArray(value) {
105
105
  return value ? Array.isArray(value) ? value : [value] : [];
106
106
  }
107
- function resolveNativePreviewExecutable(rootDir) {
108
- const requireFromRoot = createRequire(resolve(rootDir, "package.json"));
107
+ function resolveNativePreviewExecutableFrom(anchor) {
108
+ const requireFromRoot = createRequire(anchor);
109
109
  const packageJsonPath = resolveOptional(requireFromRoot, "@typescript/native-preview/package.json");
110
110
  if (packageJsonPath) {
111
111
  const binPath = nativePreviewBinPath(packageJsonPath);
@@ -135,13 +135,13 @@ function resolveSettingsParserOptions(settings) {
135
135
  const { parserOptions, ...inline } = settings;
136
136
  return mergeTypeAwareParserOptions(inline, parserOptions);
137
137
  }
138
- function applyTypeAwareParserOptionDefaults(parserOptions, defaults, rootDir) {
138
+ function applyTypeAwareParserOptionDefaults(parserOptions, defaults, rootDir, resolveFrom) {
139
139
  let resolved = parserOptions;
140
140
  if (defaults.projectService === true && parserOptions.projectService === void 0 && parserOptions.project === void 0) resolved = {
141
141
  ...resolved,
142
142
  projectService: true
143
143
  };
144
- if (defaults.corsa === true && resolved.corsa?.executable === void 0) resolved = mergeTypeAwareParserOptions(resolved, { corsa: { executable: process.env.CORSA_EXECUTABLE ?? defaultCorsaExecutable(rootDir) } });
144
+ if (defaults.corsa === true && resolved.corsa?.executable === void 0) resolved = mergeTypeAwareParserOptions(resolved, { corsa: { executable: process.env.CORSA_EXECUTABLE ?? defaultCorsaExecutable(rootDir, void 0, resolveFrom) } });
145
145
  return resolved;
146
146
  }
147
147
  function mergeTypeAwareParserOptions(base, override) {
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../ts/context.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path\";\n\nimport type {\n ContextWithParserOptions,\n CorsaOxlintSettings,\n ProjectServiceOptions,\n ResolvedProjectConfig,\n ResolvedRuntimeOptions,\n TypeAwareParserOptions,\n} from \"./types\";\n\nconst DEFAULT_CACHE_LIFETIME_MS = 250;\nconst DEFAULT_PROJECT_PATTERNS = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\nconst DEFAULT_TS_CONFIG = {\n compilerOptions: {\n module: \"esnext\",\n target: \"es2022\",\n strict: true,\n },\n};\n\nexport function defaultCorsaExecutable(rootDir: string, platform = process.platform): string {\n const nativePreview = resolveNativePreviewExecutable(rootDir);\n if (nativePreview) {\n return nativePreview;\n }\n const fallback = resolve(rootDir, platform === \"win32\" ? \".cache/corsa.exe\" : \".cache/corsa\");\n if (existsSync(fallback)) {\n return fallback;\n }\n throw new Error(\n [\n \"corsa-oxlint could not locate a Corsa runtime executable.\",\n \"Install `@typescript/native-preview`, set `CORSA_EXECUTABLE`, or configure `parserOptions.corsa.executable`.\",\n ].join(\" \"),\n );\n}\n\nexport function resolveProjectConfig(context: ContextWithParserOptions): ResolvedProjectConfig {\n const filename = resolve(context.filename);\n const parserOptions = resolveTypeAwareParserOptions(context);\n const rootDir = resolve(parserOptions.tsconfigRootDir ?? context.cwd);\n const runtime = resolveRuntimeOptions(rootDir, parserOptions);\n const configPath =\n resolveExplicitProject(rootDir, parserOptions) ??\n discoverTsconfig(filename, rootDir) ??\n resolveDefaultProject(rootDir, filename, parserOptions.projectService);\n if (!configPath) {\n throw new Error(`corsa oxlint could not resolve a tsconfig for ${filename}`);\n }\n return { filename, rootDir, configPath, runtime };\n}\n\n/**\n * Resolves the type-aware parser options visible to a rule.\n *\n * Oxlint exposes a fixed `context.languageOptions.parserOptions` object at\n * runtime, so `corsa oxlint` stores its richer configuration under\n * `settings.corsaOxlint` and rehydrates the rule-facing parser options\n * shape from there.\n *\n * @example\n * ```ts\n * const parserOptions = resolveTypeAwareParserOptions(context);\n * parserOptions.corsa?.mode;\n * ```\n */\nexport function resolveTypeAwareParserOptions(\n context: ContextWithParserOptions,\n defaults: TypeAwareParserOptionDefaults = {},\n): TypeAwareParserOptions {\n const parserOptions = mergeTypeAwareParserOptions(\n resolveSettingsParserOptions(context.settings?.corsaOxlint),\n mergeTypeAwareParserOptions(context.parserOptions, context.languageOptions?.parserOptions),\n );\n const rootDir = resolve(parserOptions.tsconfigRootDir ?? context.cwd);\n return applyTypeAwareParserOptionDefaults(parserOptions, defaults, rootDir);\n}\n\ntype TypeAwareParserOptionDefaults = {\n readonly corsa?: boolean;\n readonly projectService?: boolean;\n};\n\nfunction resolveRuntimeOptions(\n rootDir: string,\n parserOptions: TypeAwareParserOptions,\n): ResolvedRuntimeOptions {\n const runtime = parserOptions.corsa;\n return {\n executable: resolve(\n runtime?.executable ?? process.env.CORSA_EXECUTABLE ?? defaultCorsaExecutable(rootDir),\n ),\n cwd: resolve(runtime?.cwd ?? rootDir),\n mode: runtime?.mode ?? \"msgpack\",\n cacheLifetimeMs: runtime?.cacheLifetimeMs ?? DEFAULT_CACHE_LIFETIME_MS,\n };\n}\n\nfunction resolveExplicitProject(\n rootDir: string,\n parserOptions: TypeAwareParserOptions,\n): string | undefined {\n const projects = asArray(parserOptions.project).map((project) => {\n return resolve(rootDir, project);\n });\n return projects.find(existsSync);\n}\n\nfunction discoverTsconfig(filename: string, rootDir: string): string | undefined {\n let current = dirname(filename);\n const boundary = resolve(rootDir);\n while (current.startsWith(boundary)) {\n const candidate = resolve(current, \"tsconfig.json\");\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n return undefined;\n}\n\nfunction resolveDefaultProject(\n rootDir: string,\n filename: string,\n projectService: boolean | ProjectServiceOptions | undefined,\n): string | undefined {\n if (!projectService) {\n return undefined;\n }\n if (projectService !== true && projectService.defaultProject) {\n return resolve(rootDir, projectService.defaultProject);\n }\n if (!matchesDefaultProject(filename, projectService as true | ProjectServiceOptions)) {\n return undefined;\n }\n const id = Buffer.from(filename).toString(\"hex\").slice(0, 24);\n const cacheDir = resolve(rootDir, \".cache/corsa_oxlint/default\");\n const configPath = resolve(cacheDir, `${id}.tsconfig.json`);\n if (!existsSync(configPath)) {\n mkdirSync(cacheDir, { recursive: true });\n writeFileSync(\n configPath,\n JSON.stringify(\n {\n ...DEFAULT_TS_CONFIG,\n files: [filename],\n },\n null,\n 2,\n ),\n );\n }\n return configPath;\n}\n\nfunction matchesDefaultProject(\n filename: string,\n projectService: true | ProjectServiceOptions,\n): boolean {\n const patterns =\n (projectService === true ? undefined : projectService.allowDefaultProject) ??\n DEFAULT_PROJECT_PATTERNS;\n return patterns.some((pattern: string) => globMatch(filename, pattern));\n}\n\nfunction globMatch(value: string, pattern: string): boolean {\n const escaped = pattern.replaceAll(\".\", \"\\\\.\").replaceAll(\"*\", \".*\");\n return new RegExp(`${escaped}$`).test(value);\n}\n\nfunction asArray(value: string | string[] | undefined): string[] {\n return value ? (Array.isArray(value) ? value : [value]) : [];\n}\n\nfunction resolveNativePreviewExecutable(rootDir: string): string | undefined {\n const requireFromRoot = createRequire(resolve(rootDir, \"package.json\"));\n const packageJsonPath = resolveOptional(\n requireFromRoot,\n \"@typescript/native-preview/package.json\",\n );\n if (packageJsonPath) {\n const binPath = nativePreviewBinPath(packageJsonPath);\n if (binPath && existsSync(binPath)) {\n return binPath;\n }\n }\n const packageEntry = resolveOptional(requireFromRoot, \"@typescript/native-preview\");\n return packageEntry && existsSync(packageEntry) ? packageEntry : undefined;\n}\n\nfunction resolveOptional(requireFromRoot: NodeJS.Require, specifier: string): string | undefined {\n try {\n return requireFromRoot.resolve(specifier);\n } catch {\n return undefined;\n }\n}\n\nfunction nativePreviewBinPath(packageJsonPath: string): string | undefined {\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n readonly bin?: string | Record<string, string>;\n };\n const bin =\n typeof packageJson.bin === \"string\"\n ? packageJson.bin\n : (packageJson.bin?.tsgo ?? Object.values(packageJson.bin ?? {})[0]);\n return bin ? resolve(dirname(packageJsonPath), bin) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction resolveSettingsParserOptions(\n settings: CorsaOxlintSettings | undefined,\n): TypeAwareParserOptions {\n if (!settings) {\n return {};\n }\n const { parserOptions, ...inline } = settings;\n return mergeTypeAwareParserOptions(inline, parserOptions);\n}\n\nfunction applyTypeAwareParserOptionDefaults(\n parserOptions: TypeAwareParserOptions,\n defaults: TypeAwareParserOptionDefaults,\n rootDir: string,\n): TypeAwareParserOptions {\n let resolved = parserOptions;\n if (\n defaults.projectService === true &&\n parserOptions.projectService === undefined &&\n parserOptions.project === undefined\n ) {\n resolved = {\n ...resolved,\n projectService: true,\n };\n }\n if (defaults.corsa === true && resolved.corsa?.executable === undefined) {\n resolved = mergeTypeAwareParserOptions(resolved, {\n corsa: {\n executable: process.env.CORSA_EXECUTABLE ?? defaultCorsaExecutable(rootDir),\n },\n });\n }\n return resolved;\n}\n\nexport function mergeTypeAwareParserOptions(\n base: TypeAwareParserOptions | undefined,\n override: TypeAwareParserOptions | undefined,\n): TypeAwareParserOptions {\n if (!base) {\n return normalizeTypeAwareParserOptions(override ?? {});\n }\n if (!override) {\n return normalizeTypeAwareParserOptions(base);\n }\n const runtime = {\n ...base.corsa,\n ...override.corsa,\n };\n return {\n ...base,\n ...override,\n project: override.project ?? base.project,\n projectService: mergeProjectService(base.projectService, override.projectService),\n tsconfigRootDir: override.tsconfigRootDir ?? base.tsconfigRootDir,\n ...(Object.keys(runtime).length > 0 ? { corsa: runtime } : {}),\n };\n}\n\nfunction normalizeTypeAwareParserOptions(options: TypeAwareParserOptions): TypeAwareParserOptions {\n const runtime = options.corsa;\n if (!runtime) {\n return options;\n }\n return {\n ...options,\n corsa: runtime,\n };\n}\n\nfunction mergeProjectService(\n base: boolean | ProjectServiceOptions | undefined,\n override: boolean | ProjectServiceOptions | undefined,\n): boolean | ProjectServiceOptions | undefined {\n if (override === undefined) {\n return base;\n }\n if (typeof override === \"boolean\") {\n return override;\n }\n if (base === undefined || typeof base === \"boolean\") {\n return override;\n }\n return {\n ...base,\n ...override,\n allowDefaultProject: override.allowDefaultProject ?? base.allowDefaultProject,\n defaultProject: override.defaultProject ?? base.defaultProject,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../ts/context.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path\";\n\nimport type {\n ContextWithParserOptions,\n CorsaOxlintSettings,\n ProjectServiceOptions,\n ResolvedProjectConfig,\n ResolvedRuntimeOptions,\n TypeAwareParserOptions,\n} from \"./types\";\n\nconst DEFAULT_CACHE_LIFETIME_MS = 250;\nconst DEFAULT_PROJECT_PATTERNS = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\nconst DEFAULT_TS_CONFIG = {\n compilerOptions: {\n module: \"esnext\",\n target: \"es2022\",\n strict: true,\n },\n};\n\nexport function defaultCorsaExecutable(\n rootDir: string,\n platform = process.platform,\n resolveFrom?: string,\n): string {\n const nativePreview =\n resolveNativePreviewExecutableFrom(resolve(rootDir, \"package.json\")) ??\n (resolveFrom ? resolveNativePreviewExecutableFrom(resolveFrom) : undefined);\n if (nativePreview) {\n return nativePreview;\n }\n const fallback = resolve(rootDir, platform === \"win32\" ? \".cache/corsa.exe\" : \".cache/corsa\");\n if (existsSync(fallback)) {\n return fallback;\n }\n throw new Error(\n [\n \"corsa-oxlint could not locate a Corsa runtime executable.\",\n \"Install `@typescript/native-preview`, set `CORSA_EXECUTABLE`, configure `parserOptions.corsa.executable`, or pass `resolveFrom` to `definePlugin`.\",\n ].join(\" \"),\n );\n}\n\nexport function resolveProjectConfig(context: ContextWithParserOptions): ResolvedProjectConfig {\n const filename = resolve(context.filename);\n const parserOptions = resolveTypeAwareParserOptions(context);\n const rootDir = resolve(parserOptions.tsconfigRootDir ?? context.cwd);\n const runtime = resolveRuntimeOptions(rootDir, parserOptions);\n const configPath =\n resolveExplicitProject(rootDir, parserOptions) ??\n discoverTsconfig(filename, rootDir) ??\n resolveDefaultProject(rootDir, filename, parserOptions.projectService);\n if (!configPath) {\n throw new Error(`corsa oxlint could not resolve a tsconfig for ${filename}`);\n }\n return { filename, rootDir, configPath, runtime };\n}\n\n/**\n * Resolves the type-aware parser options visible to a rule.\n *\n * Oxlint exposes a fixed `context.languageOptions.parserOptions` object at\n * runtime, so `corsa oxlint` stores its richer configuration under\n * `settings.corsaOxlint` and rehydrates the rule-facing parser options\n * shape from there.\n *\n * @example\n * ```ts\n * const parserOptions = resolveTypeAwareParserOptions(context);\n * parserOptions.corsa?.mode;\n * ```\n */\nexport function resolveTypeAwareParserOptions(\n context: ContextWithParserOptions,\n defaults: TypeAwareParserOptionDefaults = {},\n resolveFrom?: string,\n): TypeAwareParserOptions {\n const parserOptions = mergeTypeAwareParserOptions(\n resolveSettingsParserOptions(context.settings?.corsaOxlint),\n mergeTypeAwareParserOptions(context.parserOptions, context.languageOptions?.parserOptions),\n );\n const rootDir = resolve(parserOptions.tsconfigRootDir ?? context.cwd);\n return applyTypeAwareParserOptionDefaults(parserOptions, defaults, rootDir, resolveFrom);\n}\n\ntype TypeAwareParserOptionDefaults = {\n readonly corsa?: boolean;\n readonly projectService?: boolean;\n};\n\nfunction resolveRuntimeOptions(\n rootDir: string,\n parserOptions: TypeAwareParserOptions,\n): ResolvedRuntimeOptions {\n const runtime = parserOptions.corsa;\n return {\n executable: resolve(\n runtime?.executable ?? process.env.CORSA_EXECUTABLE ?? defaultCorsaExecutable(rootDir),\n ),\n cwd: resolve(runtime?.cwd ?? rootDir),\n mode: runtime?.mode ?? \"msgpack\",\n cacheLifetimeMs: runtime?.cacheLifetimeMs ?? DEFAULT_CACHE_LIFETIME_MS,\n };\n}\n\nfunction resolveExplicitProject(\n rootDir: string,\n parserOptions: TypeAwareParserOptions,\n): string | undefined {\n const projects = asArray(parserOptions.project).map((project) => {\n return resolve(rootDir, project);\n });\n return projects.find(existsSync);\n}\n\nfunction discoverTsconfig(filename: string, rootDir: string): string | undefined {\n let current = dirname(filename);\n const boundary = resolve(rootDir);\n while (current.startsWith(boundary)) {\n const candidate = resolve(current, \"tsconfig.json\");\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n return undefined;\n}\n\nfunction resolveDefaultProject(\n rootDir: string,\n filename: string,\n projectService: boolean | ProjectServiceOptions | undefined,\n): string | undefined {\n if (!projectService) {\n return undefined;\n }\n if (projectService !== true && projectService.defaultProject) {\n return resolve(rootDir, projectService.defaultProject);\n }\n if (!matchesDefaultProject(filename, projectService as true | ProjectServiceOptions)) {\n return undefined;\n }\n const id = Buffer.from(filename).toString(\"hex\").slice(0, 24);\n const cacheDir = resolve(rootDir, \".cache/corsa_oxlint/default\");\n const configPath = resolve(cacheDir, `${id}.tsconfig.json`);\n if (!existsSync(configPath)) {\n mkdirSync(cacheDir, { recursive: true });\n writeFileSync(\n configPath,\n JSON.stringify(\n {\n ...DEFAULT_TS_CONFIG,\n files: [filename],\n },\n null,\n 2,\n ),\n );\n }\n return configPath;\n}\n\nfunction matchesDefaultProject(\n filename: string,\n projectService: true | ProjectServiceOptions,\n): boolean {\n const patterns =\n (projectService === true ? undefined : projectService.allowDefaultProject) ??\n DEFAULT_PROJECT_PATTERNS;\n return patterns.some((pattern: string) => globMatch(filename, pattern));\n}\n\nfunction globMatch(value: string, pattern: string): boolean {\n const escaped = pattern.replaceAll(\".\", \"\\\\.\").replaceAll(\"*\", \".*\");\n return new RegExp(`${escaped}$`).test(value);\n}\n\nfunction asArray(value: string | string[] | undefined): string[] {\n return value ? (Array.isArray(value) ? value : [value]) : [];\n}\n\nfunction resolveNativePreviewExecutableFrom(anchor: string): string | undefined {\n const requireFromRoot = createRequire(anchor);\n const packageJsonPath = resolveOptional(\n requireFromRoot,\n \"@typescript/native-preview/package.json\",\n );\n if (packageJsonPath) {\n const binPath = nativePreviewBinPath(packageJsonPath);\n if (binPath && existsSync(binPath)) {\n return binPath;\n }\n }\n const packageEntry = resolveOptional(requireFromRoot, \"@typescript/native-preview\");\n return packageEntry && existsSync(packageEntry) ? packageEntry : undefined;\n}\n\nfunction resolveOptional(requireFromRoot: NodeJS.Require, specifier: string): string | undefined {\n try {\n return requireFromRoot.resolve(specifier);\n } catch {\n return undefined;\n }\n}\n\nfunction nativePreviewBinPath(packageJsonPath: string): string | undefined {\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n readonly bin?: string | Record<string, string>;\n };\n const bin =\n typeof packageJson.bin === \"string\"\n ? packageJson.bin\n : (packageJson.bin?.tsgo ?? Object.values(packageJson.bin ?? {})[0]);\n return bin ? resolve(dirname(packageJsonPath), bin) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction resolveSettingsParserOptions(\n settings: CorsaOxlintSettings | undefined,\n): TypeAwareParserOptions {\n if (!settings) {\n return {};\n }\n const { parserOptions, ...inline } = settings;\n return mergeTypeAwareParserOptions(inline, parserOptions);\n}\n\nfunction applyTypeAwareParserOptionDefaults(\n parserOptions: TypeAwareParserOptions,\n defaults: TypeAwareParserOptionDefaults,\n rootDir: string,\n resolveFrom?: string,\n): TypeAwareParserOptions {\n let resolved = parserOptions;\n if (\n defaults.projectService === true &&\n parserOptions.projectService === undefined &&\n parserOptions.project === undefined\n ) {\n resolved = {\n ...resolved,\n projectService: true,\n };\n }\n if (defaults.corsa === true && resolved.corsa?.executable === undefined) {\n resolved = mergeTypeAwareParserOptions(resolved, {\n corsa: {\n executable:\n process.env.CORSA_EXECUTABLE ?? defaultCorsaExecutable(rootDir, undefined, resolveFrom),\n },\n });\n }\n return resolved;\n}\n\nexport function mergeTypeAwareParserOptions(\n base: TypeAwareParserOptions | undefined,\n override: TypeAwareParserOptions | undefined,\n): TypeAwareParserOptions {\n if (!base) {\n return normalizeTypeAwareParserOptions(override ?? {});\n }\n if (!override) {\n return normalizeTypeAwareParserOptions(base);\n }\n const runtime = {\n ...base.corsa,\n ...override.corsa,\n };\n return {\n ...base,\n ...override,\n project: override.project ?? base.project,\n projectService: mergeProjectService(base.projectService, override.projectService),\n tsconfigRootDir: override.tsconfigRootDir ?? base.tsconfigRootDir,\n ...(Object.keys(runtime).length > 0 ? { corsa: runtime } : {}),\n };\n}\n\nfunction normalizeTypeAwareParserOptions(options: TypeAwareParserOptions): TypeAwareParserOptions {\n const runtime = options.corsa;\n if (!runtime) {\n return options;\n }\n return {\n ...options,\n corsa: runtime,\n };\n}\n\nfunction mergeProjectService(\n base: boolean | ProjectServiceOptions | undefined,\n override: boolean | ProjectServiceOptions | undefined,\n): boolean | ProjectServiceOptions | undefined {\n if (override === undefined) {\n return base;\n }\n if (typeof override === \"boolean\") {\n return override;\n }\n if (base === undefined || typeof base === \"boolean\") {\n return override;\n }\n return {\n ...base,\n ...override,\n allowDefaultProject: override.allowDefaultProject ?? base.allowDefaultProject,\n defaultProject: override.defaultProject ?? base.defaultProject,\n };\n}\n"],"mappings":"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"}
package/dist/plugin.d.ts CHANGED
@@ -5,6 +5,11 @@ import { Diagnostic, Plugin as Plugin$1, Rule as Rule$1, RuleMeta } from "@oxlin
5
5
 
6
6
  //#region src/bindings/nodejs/corsa_oxlint/ts/plugin.d.ts
7
7
  type Plugin = Omit<Plugin$1, "rules"> & {
8
+ /**
9
+ * Optional module URL or absolute path used to resolve the plugin's own
10
+ * runtime dependencies when they are not visible from the consumer root.
11
+ */
12
+ readonly resolveFrom?: string;
8
13
  readonly rules: Record<string, Rule>;
9
14
  } & Record<string, unknown>;
10
15
  type Rule = Rule$1 & Record<string, unknown>;
@@ -67,7 +72,7 @@ declare function definePlugin(plugin: Plugin): Plugin;
67
72
  */
68
73
  declare function defineRule<MessageId extends string = string, const Options extends readonly unknown[] = readonly unknown[]>(rule: RuleDefinition<MessageId, Options>): Rule;
69
74
  declare function compatPlugin(plugin: Plugin): Plugin;
70
- declare function decorateRule(rule: Rule): Rule;
75
+ declare function decorateRule(rule: Rule, resolveFrom?: string): Rule;
71
76
  //#endregion
72
77
  export { Plugin, Rule, RuleContext, RuleDefinition, RuleDiagnostic, RuleDocs, RuleMetaWithMessages, Visitor, VisitorWithHooks, compatPlugin, decorateRule, definePlugin, defineRule };
73
78
  //# sourceMappingURL=plugin.d.ts.map
package/dist/plugin.js CHANGED
@@ -6,10 +6,15 @@ const defineOxlintPlugin = oxlintPluginApi.definePlugin;
6
6
  const defineOxlintRule = oxlintPluginApi.defineRule;
7
7
  const baseCompatPlugin = Reflect.get(oxlintPluginApi, ["es", "lintCompatPlugin"].join(""));
8
8
  function definePlugin(plugin) {
9
- return defineOxlintPlugin({
9
+ const defined = defineOxlintPlugin({
10
10
  ...plugin,
11
- rules: wrapRules(plugin.rules ?? {})
11
+ rules: wrapRules(plugin.rules ?? {}, plugin.resolveFrom)
12
12
  });
13
+ if (plugin.resolveFrom === void 0) return defined;
14
+ return {
15
+ ...defined,
16
+ resolveFrom: plugin.resolveFrom
17
+ };
13
18
  }
14
19
  function defineRule(rule) {
15
20
  return defineOxlintRule(decorateRule(rule));
@@ -17,30 +22,30 @@ function defineRule(rule) {
17
22
  function compatPlugin(plugin) {
18
23
  return baseCompatPlugin(definePlugin(plugin));
19
24
  }
20
- function decorateRule(rule) {
25
+ function decorateRule(rule, resolveFrom) {
21
26
  if (rule.create) return {
22
27
  ...rule,
23
28
  create(context) {
24
- return rule.create(decorateContext(context, rule));
29
+ return rule.create(decorateContext(context, rule, resolveFrom));
25
30
  }
26
31
  };
27
32
  if ("createOnce" in rule && typeof rule.createOnce === "function") return {
28
33
  ...rule,
29
34
  createOnce(context) {
30
- return rule.createOnce(decorateContext(context, rule));
35
+ return rule.createOnce(decorateContext(context, rule, resolveFrom));
31
36
  }
32
37
  };
33
38
  return rule;
34
39
  }
35
- function wrapRules(rules) {
36
- return Object.fromEntries(Object.entries(rules).map(([name, rule]) => [name, decorateRule(rule)]));
40
+ function wrapRules(rules, resolveFrom) {
41
+ return Object.fromEntries(Object.entries(rules).map(([name, rule]) => [name, decorateRule(rule, resolveFrom)]));
37
42
  }
38
- function decorateContext(context, rule) {
43
+ function decorateContext(context, rule, resolveFrom) {
39
44
  const typeAware = requiresTypeChecking(rule);
40
45
  const parserOptions = Object.freeze(resolveTypeAwareParserOptions(context, {
41
46
  corsa: typeAware,
42
47
  projectService: typeAware
43
- }));
48
+ }, resolveFrom));
44
49
  const baseLanguageOptions = context.languageOptions;
45
50
  const languageOptions = Object.freeze({
46
51
  ...baseLanguageOptions,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","names":[],"sources":["../ts/plugin.ts"],"sourcesContent":["import * as oxlintPluginApi from \"@oxlint/plugins\";\nimport type {\n Context as OxlintContext,\n Diagnostic,\n Plugin as OxlintPlugin,\n Rule as OxlintRule,\n RuleMeta as OxlintRuleMeta,\n} from \"@oxlint/plugins\";\n\nimport { AST_NODE_TYPES } from \"./compat\";\nimport { resolveTypeAwareParserOptions } from \"./context\";\nimport type { ESTree as PublicESTree } from \"./index\";\nimport { getParserServices } from \"./parser_services\";\nimport type { ContextWithParserOptions, ParserServices } from \"./types\";\n\nexport type Plugin = Omit<OxlintPlugin, \"rules\"> & {\n readonly rules: Record<string, Rule>;\n} & Record<string, unknown>;\nexport type Rule = OxlintRule & Record<string, unknown>;\nexport type RuleDiagnostic<MessageId extends string = string> = Diagnostic & {\n readonly messageId?: MessageId | null | undefined;\n};\nexport type RuleContext<\n MessageId extends string = string,\n Options extends readonly unknown[] = readonly unknown[],\n> = Omit<ContextWithParserOptions, \"options\" | \"report\"> & {\n readonly options: Readonly<Options>;\n report(this: void, diagnostic: RuleDiagnostic<MessageId>): void;\n};\nexport type RuleDocs = {\n readonly description?: string;\n readonly recommended?: unknown;\n readonly url?: string;\n /**\n * Enables corsa-oxlint's type-aware parser service defaults for this rule.\n *\n * @default false\n */\n readonly requiresTypeChecking?: boolean;\n};\nexport type RuleMetaWithMessages<MessageId extends string = string> = Omit<\n OxlintRuleMeta,\n \"docs\" | \"messages\"\n> & {\n readonly docs?: RuleDocs;\n readonly messages?: Record<MessageId, string>;\n};\ntype CorsaAstNodeType = keyof typeof AST_NODE_TYPES;\ntype BivariantVisitorHandler<Handler extends (...args: any[]) => any> = {\n bivarianceHack(...args: Parameters<Handler>): ReturnType<Handler>;\n}[\"bivarianceHack\"];\ntype VisitorNode<Kind extends CorsaAstNodeType> = PublicESTree[Kind];\n\nexport type Visitor = {\n [Kind in CorsaAstNodeType]?: BivariantVisitorHandler<(node: VisitorNode<Kind>) => void>;\n} & {\n [Kind in CorsaAstNodeType as `${Kind}:exit`]?: BivariantVisitorHandler<\n (node: VisitorNode<Kind>) => void\n >;\n} & Record<string, BivariantVisitorHandler<(node: PublicESTree.Node) => void> | undefined>;\n\nexport type VisitorWithHooks = Visitor & {\n readonly before?: () => boolean | void;\n readonly after?: () => void;\n};\nexport type RuleDefinition<\n MessageId extends string = string,\n Options extends readonly unknown[] = readonly unknown[],\n> = Record<string, unknown> & {\n readonly defaultOptions?: Options;\n readonly meta?: RuleMetaWithMessages<MessageId>;\n} & (\n | {\n readonly create: (context: RuleContext<MessageId, Options>) => Visitor;\n readonly createOnce?: never;\n }\n | {\n readonly create?: (context: RuleContext<MessageId, Options>) => Visitor;\n readonly createOnce: (context: RuleContext<MessageId, Options>) => VisitorWithHooks;\n }\n );\n\nconst defineOxlintPlugin = oxlintPluginApi.definePlugin;\nconst defineOxlintRule = oxlintPluginApi.defineRule;\nconst baseCompatPlugin = Reflect.get(\n oxlintPluginApi as object,\n [\"es\", \"lintCompatPlugin\"].join(\"\"),\n) as typeof oxlintPluginApi.definePlugin;\n\nexport function definePlugin(plugin: Plugin): Plugin {\n return defineOxlintPlugin({\n ...plugin,\n rules: wrapRules(plugin.rules ?? {}),\n } as OxlintPlugin) as Plugin;\n}\n\n/**\n * Defines a single Oxlint rule with type-aware parser services.\n *\n * @example\n * ```ts\n * export default defineRule({\n * meta: { schema: [], messages: { demo: \"demo\" } },\n * create(context) {\n * const services = context.parserServices;\n * return {};\n * },\n * });\n * ```\n */\nexport function defineRule<\n MessageId extends string = string,\n const Options extends readonly unknown[] = readonly unknown[],\n>(rule: RuleDefinition<MessageId, Options>): Rule;\nexport function defineRule(rule: RuleDefinition): Rule {\n return defineOxlintRule(decorateRule(rule as unknown as Rule) as OxlintRule) as Rule;\n}\n\nexport function compatPlugin(plugin: Plugin): Plugin {\n return baseCompatPlugin(definePlugin(plugin)) as Plugin;\n}\n\nexport function decorateRule(rule: Rule): Rule {\n if (rule.create) {\n return {\n ...rule,\n create(context) {\n return rule.create!(decorateContext(context, rule));\n },\n } as Rule;\n }\n if (\"createOnce\" in rule && typeof (rule as any).createOnce === \"function\") {\n return {\n ...rule,\n createOnce(context) {\n return (rule as any).createOnce(decorateContext(context, rule));\n },\n } as Rule;\n }\n return rule;\n}\n\nfunction wrapRules(rules: Record<string, Rule>): Record<string, Rule> {\n return Object.fromEntries(\n Object.entries(rules).map(([name, rule]) => [name, decorateRule(rule)]),\n );\n}\n\nfunction decorateContext(context: ContextWithParserOptions, rule: Rule): ContextWithParserOptions {\n const typeAware = requiresTypeChecking(rule);\n const parserOptions = Object.freeze(\n resolveTypeAwareParserOptions(context, {\n corsa: typeAware,\n projectService: typeAware,\n }),\n );\n const baseLanguageOptions = context.languageOptions;\n const languageOptions = Object.freeze({\n ...baseLanguageOptions,\n parserOptions,\n });\n return Object.create(context as OxlintContext, {\n languageOptions: {\n configurable: true,\n enumerable: true,\n get() {\n return languageOptions;\n },\n },\n parserOptions: {\n configurable: true,\n enumerable: false,\n get() {\n return parserOptions;\n },\n },\n parserServices: {\n configurable: true,\n enumerable: false,\n get(): ParserServices {\n return getParserServices(context);\n },\n },\n }) as ContextWithParserOptions;\n}\n\nfunction requiresTypeChecking(rule: Rule): boolean {\n return (\n (rule.meta as { readonly docs?: { readonly requiresTypeChecking?: unknown } } | undefined)?.docs\n ?.requiresTypeChecking === true\n );\n}\n"],"mappings":";;;;AAkFA,MAAM,qBAAqB,gBAAgB;AAC3C,MAAM,mBAAmB,gBAAgB;AACzC,MAAM,mBAAmB,QAAQ,IAC/B,iBACA,CAAC,MAAM,kBAAkB,EAAE,KAAK,EAAE,CACpC;AAEA,SAAgB,aAAa,QAAwB;CACnD,OAAO,mBAAmB;EACxB,GAAG;EACH,OAAO,UAAU,OAAO,SAAS,CAAC,CAAC;CACrC,CAAiB;AACnB;AAoBA,SAAgB,WAAW,MAA4B;CACrD,OAAO,iBAAiB,aAAa,IAAuB,CAAe;AAC7E;AAEA,SAAgB,aAAa,QAAwB;CACnD,OAAO,iBAAiB,aAAa,MAAM,CAAC;AAC9C;AAEA,SAAgB,aAAa,MAAkB;CAC7C,IAAI,KAAK,QACP,OAAO;EACL,GAAG;EACH,OAAO,SAAS;GACd,OAAO,KAAK,OAAQ,gBAAgB,SAAS,IAAI,CAAC;EACpD;CACF;CAEF,IAAI,gBAAgB,QAAQ,OAAQ,KAAa,eAAe,YAC9D,OAAO;EACL,GAAG;EACH,WAAW,SAAS;GAClB,OAAQ,KAAa,WAAW,gBAAgB,SAAS,IAAI,CAAC;EAChE;CACF;CAEF,OAAO;AACT;AAEA,SAAS,UAAU,OAAmD;CACpE,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,EAAE,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,aAAa,IAAI,CAAC,CAAC,CACxE;AACF;AAEA,SAAS,gBAAgB,SAAmC,MAAsC;CAChG,MAAM,YAAY,qBAAqB,IAAI;CAC3C,MAAM,gBAAgB,OAAO,OAC3B,8BAA8B,SAAS;EACrC,OAAO;EACP,gBAAgB;CAClB,CAAC,CACH;CACA,MAAM,sBAAsB,QAAQ;CACpC,MAAM,kBAAkB,OAAO,OAAO;EACpC,GAAG;EACH;CACF,CAAC;CACD,OAAO,OAAO,OAAO,SAA0B;EAC7C,iBAAiB;GACf,cAAc;GACd,YAAY;GACZ,MAAM;IACJ,OAAO;GACT;EACF;EACA,eAAe;GACb,cAAc;GACd,YAAY;GACZ,MAAM;IACJ,OAAO;GACT;EACF;EACA,gBAAgB;GACd,cAAc;GACd,YAAY;GACZ,MAAsB;IACpB,OAAO,kBAAkB,OAAO;GAClC;EACF;CACF,CAAC;AACH;AAEA,SAAS,qBAAqB,MAAqB;CACjD,OACG,KAAK,MAAsF,MACxF,yBAAyB;AAEjC"}
1
+ {"version":3,"file":"plugin.js","names":[],"sources":["../ts/plugin.ts"],"sourcesContent":["import * as oxlintPluginApi from \"@oxlint/plugins\";\nimport type {\n Context as OxlintContext,\n Diagnostic,\n Plugin as OxlintPlugin,\n Rule as OxlintRule,\n RuleMeta as OxlintRuleMeta,\n} from \"@oxlint/plugins\";\n\nimport { AST_NODE_TYPES } from \"./compat\";\nimport { resolveTypeAwareParserOptions } from \"./context\";\nimport type { ESTree as PublicESTree } from \"./index\";\nimport { getParserServices } from \"./parser_services\";\nimport type { ContextWithParserOptions, ParserServices } from \"./types\";\n\nexport type Plugin = Omit<OxlintPlugin, \"rules\"> & {\n /**\n * Optional module URL or absolute path used to resolve the plugin's own\n * runtime dependencies when they are not visible from the consumer root.\n */\n readonly resolveFrom?: string;\n readonly rules: Record<string, Rule>;\n} & Record<string, unknown>;\nexport type Rule = OxlintRule & Record<string, unknown>;\nexport type RuleDiagnostic<MessageId extends string = string> = Diagnostic & {\n readonly messageId?: MessageId | null | undefined;\n};\nexport type RuleContext<\n MessageId extends string = string,\n Options extends readonly unknown[] = readonly unknown[],\n> = Omit<ContextWithParserOptions, \"options\" | \"report\"> & {\n readonly options: Readonly<Options>;\n report(this: void, diagnostic: RuleDiagnostic<MessageId>): void;\n};\nexport type RuleDocs = {\n readonly description?: string;\n readonly recommended?: unknown;\n readonly url?: string;\n /**\n * Enables corsa-oxlint's type-aware parser service defaults for this rule.\n *\n * @default false\n */\n readonly requiresTypeChecking?: boolean;\n};\nexport type RuleMetaWithMessages<MessageId extends string = string> = Omit<\n OxlintRuleMeta,\n \"docs\" | \"messages\"\n> & {\n readonly docs?: RuleDocs;\n readonly messages?: Record<MessageId, string>;\n};\ntype CorsaAstNodeType = keyof typeof AST_NODE_TYPES;\ntype BivariantVisitorHandler<Handler extends (...args: any[]) => any> = {\n bivarianceHack(...args: Parameters<Handler>): ReturnType<Handler>;\n}[\"bivarianceHack\"];\ntype VisitorNode<Kind extends CorsaAstNodeType> = PublicESTree[Kind];\n\nexport type Visitor = {\n [Kind in CorsaAstNodeType]?: BivariantVisitorHandler<(node: VisitorNode<Kind>) => void>;\n} & {\n [Kind in CorsaAstNodeType as `${Kind}:exit`]?: BivariantVisitorHandler<\n (node: VisitorNode<Kind>) => void\n >;\n} & Record<string, BivariantVisitorHandler<(node: PublicESTree.Node) => void> | undefined>;\n\nexport type VisitorWithHooks = Visitor & {\n readonly before?: () => boolean | void;\n readonly after?: () => void;\n};\nexport type RuleDefinition<\n MessageId extends string = string,\n Options extends readonly unknown[] = readonly unknown[],\n> = Record<string, unknown> & {\n readonly defaultOptions?: Options;\n readonly meta?: RuleMetaWithMessages<MessageId>;\n} & (\n | {\n readonly create: (context: RuleContext<MessageId, Options>) => Visitor;\n readonly createOnce?: never;\n }\n | {\n readonly create?: (context: RuleContext<MessageId, Options>) => Visitor;\n readonly createOnce: (context: RuleContext<MessageId, Options>) => VisitorWithHooks;\n }\n );\n\nconst defineOxlintPlugin = oxlintPluginApi.definePlugin;\nconst defineOxlintRule = oxlintPluginApi.defineRule;\nconst baseCompatPlugin = Reflect.get(\n oxlintPluginApi as object,\n [\"es\", \"lintCompatPlugin\"].join(\"\"),\n) as typeof oxlintPluginApi.definePlugin;\n\nexport function definePlugin(plugin: Plugin): Plugin {\n const defined = defineOxlintPlugin({\n ...plugin,\n rules: wrapRules(plugin.rules ?? {}, plugin.resolveFrom),\n } as OxlintPlugin) as Plugin;\n if (plugin.resolveFrom === undefined) {\n return defined;\n }\n return {\n ...defined,\n resolveFrom: plugin.resolveFrom,\n };\n}\n\n/**\n * Defines a single Oxlint rule with type-aware parser services.\n *\n * @example\n * ```ts\n * export default defineRule({\n * meta: { schema: [], messages: { demo: \"demo\" } },\n * create(context) {\n * const services = context.parserServices;\n * return {};\n * },\n * });\n * ```\n */\nexport function defineRule<\n MessageId extends string = string,\n const Options extends readonly unknown[] = readonly unknown[],\n>(rule: RuleDefinition<MessageId, Options>): Rule;\nexport function defineRule(rule: RuleDefinition): Rule {\n return defineOxlintRule(decorateRule(rule as unknown as Rule) as OxlintRule) as Rule;\n}\n\nexport function compatPlugin(plugin: Plugin): Plugin {\n return baseCompatPlugin(definePlugin(plugin)) as Plugin;\n}\n\nexport function decorateRule(rule: Rule, resolveFrom?: string): Rule {\n if (rule.create) {\n return {\n ...rule,\n create(context) {\n return rule.create!(decorateContext(context, rule, resolveFrom));\n },\n } as Rule;\n }\n if (\"createOnce\" in rule && typeof (rule as any).createOnce === \"function\") {\n return {\n ...rule,\n createOnce(context) {\n return (rule as any).createOnce(decorateContext(context, rule, resolveFrom));\n },\n } as Rule;\n }\n return rule;\n}\n\nfunction wrapRules(rules: Record<string, Rule>, resolveFrom?: string): Record<string, Rule> {\n return Object.fromEntries(\n Object.entries(rules).map(([name, rule]) => [name, decorateRule(rule, resolveFrom)]),\n );\n}\n\nfunction decorateContext(\n context: ContextWithParserOptions,\n rule: Rule,\n resolveFrom?: string,\n): ContextWithParserOptions {\n const typeAware = requiresTypeChecking(rule);\n const parserOptions = Object.freeze(\n resolveTypeAwareParserOptions(\n context,\n {\n corsa: typeAware,\n projectService: typeAware,\n },\n resolveFrom,\n ),\n );\n const baseLanguageOptions = context.languageOptions;\n const languageOptions = Object.freeze({\n ...baseLanguageOptions,\n parserOptions,\n });\n return Object.create(context as OxlintContext, {\n languageOptions: {\n configurable: true,\n enumerable: true,\n get() {\n return languageOptions;\n },\n },\n parserOptions: {\n configurable: true,\n enumerable: false,\n get() {\n return parserOptions;\n },\n },\n parserServices: {\n configurable: true,\n enumerable: false,\n get(): ParserServices {\n return getParserServices(context);\n },\n },\n }) as ContextWithParserOptions;\n}\n\nfunction requiresTypeChecking(rule: Rule): boolean {\n return (\n (rule.meta as { readonly docs?: { readonly requiresTypeChecking?: unknown } } | undefined)?.docs\n ?.requiresTypeChecking === true\n );\n}\n"],"mappings":";;;;AAuFA,MAAM,qBAAqB,gBAAgB;AAC3C,MAAM,mBAAmB,gBAAgB;AACzC,MAAM,mBAAmB,QAAQ,IAC/B,iBACA,CAAC,MAAM,kBAAkB,EAAE,KAAK,EAAE,CACpC;AAEA,SAAgB,aAAa,QAAwB;CACnD,MAAM,UAAU,mBAAmB;EACjC,GAAG;EACH,OAAO,UAAU,OAAO,SAAS,CAAC,GAAG,OAAO,WAAW;CACzD,CAAiB;CACjB,IAAI,OAAO,gBAAgB,KAAA,GACzB,OAAO;CAET,OAAO;EACL,GAAG;EACH,aAAa,OAAO;CACtB;AACF;AAoBA,SAAgB,WAAW,MAA4B;CACrD,OAAO,iBAAiB,aAAa,IAAuB,CAAe;AAC7E;AAEA,SAAgB,aAAa,QAAwB;CACnD,OAAO,iBAAiB,aAAa,MAAM,CAAC;AAC9C;AAEA,SAAgB,aAAa,MAAY,aAA4B;CACnE,IAAI,KAAK,QACP,OAAO;EACL,GAAG;EACH,OAAO,SAAS;GACd,OAAO,KAAK,OAAQ,gBAAgB,SAAS,MAAM,WAAW,CAAC;EACjE;CACF;CAEF,IAAI,gBAAgB,QAAQ,OAAQ,KAAa,eAAe,YAC9D,OAAO;EACL,GAAG;EACH,WAAW,SAAS;GAClB,OAAQ,KAAa,WAAW,gBAAgB,SAAS,MAAM,WAAW,CAAC;EAC7E;CACF;CAEF,OAAO;AACT;AAEA,SAAS,UAAU,OAA6B,aAA4C;CAC1F,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,EAAE,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,aAAa,MAAM,WAAW,CAAC,CAAC,CACrF;AACF;AAEA,SAAS,gBACP,SACA,MACA,aAC0B;CAC1B,MAAM,YAAY,qBAAqB,IAAI;CAC3C,MAAM,gBAAgB,OAAO,OAC3B,8BACE,SACA;EACE,OAAO;EACP,gBAAgB;CAClB,GACA,WACF,CACF;CACA,MAAM,sBAAsB,QAAQ;CACpC,MAAM,kBAAkB,OAAO,OAAO;EACpC,GAAG;EACH;CACF,CAAC;CACD,OAAO,OAAO,OAAO,SAA0B;EAC7C,iBAAiB;GACf,cAAc;GACd,YAAY;GACZ,MAAM;IACJ,OAAO;GACT;EACF;EACA,eAAe;GACb,cAAc;GACd,YAAY;GACZ,MAAM;IACJ,OAAO;GACT;EACF;EACA,gBAAgB;GACd,cAAc;GACd,YAAY;GACZ,MAAsB;IACpB,OAAO,kBAAkB,OAAO;GAClC;EACF;CACF,CAAC;AACH;AAEA,SAAS,qBAAqB,MAAqB;CACjD,OACG,KAAK,MAAsF,MACxF,yBAAyB;AAEjC"}
package/dist/session.d.ts CHANGED
@@ -16,7 +16,10 @@ declare class CorsaProjectSession {
16
16
  getSymbolAtPosition(fileName: string, position: number, sourceText?: string): CorsaSymbol | undefined;
17
17
  private getSymbolAtPositionUnchecked;
18
18
  getSymbol(symbol: string | CorsaSymbol): CorsaSymbol | undefined;
19
+ private getSymbolUnchecked;
19
20
  getSymbolOfType(type: CorsaType): CorsaSymbol | undefined;
21
+ private getSymbolOfTypeUnchecked;
22
+ private getSymbolOfTypeById;
20
23
  getNode(node: string | CorsaNode): CorsaNode | undefined;
21
24
  getSourceTextForPath(path: string): string | undefined;
22
25
  getTypeOfSymbol(symbol: CorsaSymbol): CorsaType | undefined;
package/dist/session.js CHANGED
@@ -99,21 +99,35 @@ var CorsaProjectSession = class {
99
99
  return this.rememberSymbol(state.symbolByPosition.get(position));
100
100
  }
101
101
  getSymbol(symbol) {
102
+ return this.withTransportRecovery(() => this.getSymbolUnchecked(symbol), "looking up a symbol");
103
+ }
104
+ getSymbolUnchecked(symbol) {
102
105
  if (typeof symbol !== "string") return this.rememberSymbol(symbol);
103
106
  const cached = this.#symbolsById.get(symbol);
104
107
  if (cached) return cached;
105
108
  const typeId = this.#symbolTypeById.get(symbol);
106
109
  if (!typeId || !this.#snapshot) return;
107
- const resolved = this.client().getSymbolOfType(this.#snapshot, typeId);
108
- return resolved?.id === symbol ? this.rememberUsableSymbol(resolved) : void 0;
110
+ const resolved = this.getSymbolOfTypeById(typeId);
111
+ return resolved?.id === symbol ? resolved : void 0;
109
112
  }
110
113
  getSymbolOfType(type) {
114
+ return this.withTransportRecovery(() => this.getSymbolOfTypeUnchecked(type), "looking up a symbol");
115
+ }
116
+ getSymbolOfTypeUnchecked(type) {
111
117
  if (type.symbol) {
112
118
  const symbol = this.getSymbol(type.symbol);
113
119
  if (isUsableSymbol(symbol)) return symbol;
114
120
  }
121
+ return this.getSymbolOfTypeById(type.id);
122
+ }
123
+ getSymbolOfTypeById(typeId) {
115
124
  if (!this.#snapshot) return;
116
- return this.rememberUsableSymbol(this.client().getSymbolOfType(this.#snapshot, type.id));
125
+ try {
126
+ return this.rememberUsableSymbol(this.client().getSymbolOfType(this.#snapshot, typeId));
127
+ } catch (error) {
128
+ if (isStaleHandleError(error)) return;
129
+ throw error;
130
+ }
117
131
  }
118
132
  getNode(node) {
119
133
  if (typeof node !== "string") return node;
@@ -596,6 +610,9 @@ function isRecoverableTransportError(error) {
596
610
  const message = errorMessage(error);
597
611
  return message.includes("process is closed:") || message.includes("Broken pipe") || message.includes("EPIPE") || message.includes("failed to fill whole buffer") || message.includes("msgpack worker") || message.includes("msgpack stdin") || message.includes("msgpack stdout") || message.includes("jsonrpc reader") || message.includes("jsonrpc writer") || message.includes("jsonrpc connection");
598
612
  }
613
+ function isStaleHandleError(error) {
614
+ return errorMessage(error).includes("not found in snapshot registry");
615
+ }
599
616
  function errorMessage(error) {
600
617
  return error instanceof Error ? error.message : String(error);
601
618
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","names":["#snapshot","#client","#supportsOverlayChanges","#files","#typeTextById","#typeLookupById","#symbolsById","#symbolTypeById","#nodesById","#typeSourceById","#snapshotHasIssuedHandles","#fatalTransportError","#config","#projects","#lastRefreshMs"],"sources":["../ts/session.ts"],"sourcesContent":["import { readFileSync, statSync } from \"node:fs\";\n\nimport { type ProjectResponse, CorsaApiClient } from \"@corsa-bind/napi\";\n\nimport type {\n CorsaCallSignatureFacts,\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\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 #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 #snapshotHasIssuedHandles = false;\n #supportsOverlayChanges?: boolean;\n #fatalTransportError?: Error;\n\n constructor(\n readonly project: ResolvedProjectConfig,\n readonly runtime: ResolvedRuntimeOptions,\n ) {}\n\n close(): void {\n if (this.#snapshot) {\n this.tryReleaseHandle(this.#snapshot);\n this.#snapshot = undefined;\n }\n this.tryCloseClient();\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.withTransportRecovery(() => this.config().options, \"reading compiler options\");\n }\n\n getRootFileNames(): readonly string[] {\n return this.withTransportRecovery(() => this.config().fileNames, \"reading root file names\");\n }\n\n getTypeAtPosition(\n fileName: string,\n position: number,\n sourceText?: string,\n ): CorsaType | undefined {\n return this.withTransportRecovery(\n () => this.getTypeAtPositionUnchecked(fileName, position, sourceText),\n \"looking up a type\",\n );\n }\n\n private getTypeAtPositionUnchecked(\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 return this.withTransportRecovery(\n () => this.getTypeAtSourceRangeUnchecked(fileName, start, end, sourceText, kind),\n \"looking up a type\",\n );\n }\n\n private getTypeAtSourceRangeUnchecked(\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.getTypeAtPositionUnchecked(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 if (kind !== \"Identifier\") {\n this.rememberTypeSourceRange(type, fileName, start, end, sourceText);\n }\n }\n return type;\n }\n\n getSymbolAtPosition(\n fileName: string,\n position: number,\n sourceText?: string,\n ): CorsaSymbol | undefined {\n return this.withTransportRecovery(\n () => this.getSymbolAtPositionUnchecked(fileName, position, sourceText),\n \"looking up a symbol\",\n );\n }\n\n private getSymbolAtPositionUnchecked(\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 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().getSymbolOfType(this.#snapshot, typeId) as CorsaSymbol | null;\n return resolved?.id === symbol ? this.rememberUsableSymbol(resolved) : undefined;\n }\n\n getSymbolOfType(type: CorsaType): CorsaSymbol | undefined {\n if (type.symbol) {\n const symbol = this.getSymbol(type.symbol);\n if (isUsableSymbol(symbol)) {\n return symbol;\n }\n }\n if (!this.#snapshot) {\n return undefined;\n }\n return this.rememberUsableSymbol(\n this.client().getSymbolOfType(this.#snapshot, type.id) as CorsaSymbol | null,\n );\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 getTypeOfSymbolById(id: string): CorsaType | undefined {\n return this.rememberType(this.tryGetSymbolTypeId(id, \"getTypeOfSymbol\"));\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 getDeclaredTypeOfSymbolById(id: string): CorsaType | undefined {\n return this.rememberType(this.tryGetSymbolTypeId(id, \"getDeclaredTypeOfSymbol\"));\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 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 const source = this.sourceContextForType(type);\n return this.rememberSignatures(\n this.client().callJson(\"getSignaturesOfType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n kind,\n ...source,\n }) ?? [],\n );\n }\n\n getCallSignatureFacts(\n type: CorsaType,\n kind: number,\n argumentTypeTexts: readonly (readonly string[])[],\n explicitTypeArgumentTexts: readonly string[],\n ): CorsaCallSignatureFacts {\n const source = this.sourceContextForType(type);\n const facts = this.client().callJson<CorsaCallSignatureFacts>(\"getCallSignatureFacts\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n kind,\n ...source,\n argumentTypeTexts,\n explicitTypeArgumentTexts,\n });\n if (facts?.signature) {\n this.rememberSignature(facts.signature);\n }\n return facts ?? {};\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 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 }\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 return this.tryGetSymbolTypeId(symbol.id, method);\n }\n\n private tryGetSymbolTypeId(\n id: string,\n method: \"getTypeOfSymbol\" | \"getDeclaredTypeOfSymbol\",\n ): CorsaType | undefined {\n try {\n return this.client()[method](this.#snapshot!, this.projectId(), id) as CorsaType | 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) {\n this.#snapshotHasIssuedHandles = true;\n }\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 rememberTypeSourceRange(\n type: CorsaType,\n fileName: string,\n start: number,\n end: number,\n sourceText: string | undefined,\n ): void {\n if (\n this.#typeSourceById.has(type.id) ||\n !sourceText ||\n start < 0 ||\n end > sourceText.length ||\n start >= end\n ) {\n return;\n }\n const node = {\n fileName,\n pos: start,\n end,\n range: [start, end] as const,\n };\n this.#typeSourceById.set(type.id, {\n node,\n text: sourceText.slice(start, end),\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 sourceContextForType(type: CorsaType): { file?: string; sourceText?: string } {\n const lookup = this.#typeLookupById.get(type.id);\n if (lookup) {\n const sourceText = lookup.sourceText ?? this.sourceTextForPath(lookup.fileName);\n return sourceText ? { file: lookup.fileName, sourceText } : {};\n }\n const source = this.#typeSourceById.get(type.id);\n if (source) {\n const sourceText = this.sourceTextForPath(source.node.fileName);\n return sourceText ? { file: source.node.fileName, sourceText } : {};\n }\n return {};\n }\n\n private rememberSymbol<T extends CorsaSymbol | undefined>(symbol: T): T {\n if (!symbol) {\n return symbol;\n }\n this.#snapshotHasIssuedHandles = true;\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 rememberUsableSymbol(symbol: CorsaSymbol | null | undefined): CorsaSymbol | undefined {\n return isUsableSymbol(symbol) ? this.rememberSymbol(symbol) : undefined;\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 for (const symbol of signature.parameterSymbols ?? []) {\n this.rememberSymbol(symbol);\n }\n if (signature.thisParameterSymbol) {\n this.rememberSymbol(signature.thisParameterSymbol);\n }\n return signature;\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.#symbolTypeById.clear();\n this.#nodesById.clear();\n this.#typeLookupById.clear();\n this.#typeSourceById.clear();\n this.#snapshotHasIssuedHandles = false;\n }\n\n private sourceSliceForHandle(handle: string): SourceSlice | undefined {\n const node = this.getNode(handle);\n if (!node) {\n return undefined;\n }\n const sourceText = this.sourceTextForPath(node.fileName);\n if (!sourceText || node.pos < 0 || node.end > sourceText.length || node.pos >= node.end) {\n return undefined;\n }\n return {\n node,\n text: sourceText.slice(node.pos, node.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 withTransportRecovery<T>(operation: () => T, action: string): T {\n if (this.#fatalTransportError) {\n throw this.#fatalTransportError;\n }\n try {\n return operation();\n } catch (error) {\n if (!isRecoverableTransportError(error)) {\n throw error;\n }\n this.resetClientAfterTransportFailure();\n try {\n return operation();\n } catch (retryError) {\n if (!isRecoverableTransportError(retryError)) {\n throw retryError;\n }\n const fatal = new Error(\n `corsa type-aware backend exited while ${action}; restarted the session, but the retry failed`,\n );\n (fatal as Error & { cause?: unknown }).cause = retryError;\n this.#fatalTransportError = fatal;\n throw fatal;\n }\n }\n }\n\n private resetClientAfterTransportFailure(): void {\n this.tryCloseClient();\n this.#client = undefined;\n this.#config = undefined;\n this.#snapshot = undefined;\n this.#projects = [];\n this.#files.clear();\n this.clearHandleCaches();\n this.#typeTextById.clear();\n this.#lastRefreshMs = 0;\n this.#supportsOverlayChanges = undefined;\n this.#fatalTransportError = undefined;\n }\n\n private tryReleaseHandle(handle: string): void {\n try {\n this.#client?.releaseHandle(handle);\n } catch (error) {\n if (!isRecoverableTransportError(error)) {\n throw error;\n }\n }\n }\n\n private tryCloseClient(): void {\n try {\n this.#client?.close();\n } catch (error) {\n if (!isRecoverableTransportError(error)) {\n throw error;\n }\n }\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 =\n !this.#snapshot ||\n mtimeChanged ||\n textChanged ||\n (expired && !this.#snapshotHasIssuedHandles);\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.tryReleaseHandle(previous);\n }\n return prepared;\n }\n\n private projectId(): string {\n const id = this.#projects[0]?.id;\n if (!id) {\n throw new Error(\n `corsa oxlint could not resolve a Corsa project for ${this.project.filename}`,\n );\n }\n return id;\n }\n\n private supportedOverlayText(\n fileName: string,\n sourceText: string | undefined,\n mtimeMs: number,\n cached?: FileCache,\n ): string | undefined {\n if (sourceText === undefined || !this.supportsOverlayChanges()) {\n return undefined;\n }\n if (cached?.lintSourceText === sourceText && cached.mtimeMs === mtimeMs) {\n return cached.sourceText;\n }\n return overlayTextFor(fileName, sourceText);\n }\n\n private overlayChanges(\n fileName: string,\n overlayText: string | undefined,\n cached?: FileCache,\n ):\n | {\n upsert?: { document: string; text: string; languageId: string }[];\n delete?: string[];\n }\n | undefined {\n if (!this.supportsOverlayChanges()) {\n return undefined;\n }\n if (overlayText !== undefined) {\n return {\n upsert: [\n {\n document: fileName,\n text: overlayText,\n languageId: languageIdFor(fileName),\n },\n ],\n };\n }\n if (cached?.sourceText !== undefined) {\n return { delete: [fileName] };\n }\n return undefined;\n }\n\n private supportsOverlayChanges(): boolean {\n if (this.#supportsOverlayChanges !== undefined) {\n return this.#supportsOverlayChanges;\n }\n try {\n const capabilities = this.client().callJson<{\n overlay?: { updateSnapshotOverlayChanges?: boolean };\n }>(\"describeCapabilities\");\n this.#supportsOverlayChanges = capabilities?.overlay?.updateSnapshotOverlayChanges === true;\n } catch {\n this.#supportsOverlayChanges = false;\n }\n return this.#supportsOverlayChanges;\n }\n}\n\nfunction isArrayOrTupleLikeType(session: 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 isUsableSymbol(symbol: CorsaSymbol | null | undefined): symbol is CorsaSymbol {\n return symbol != null && !symbol.name.includes(\"\\ufffd\");\n}\n\nfunction overlayTextFor(fileName: string, sourceText?: string): string | undefined {\n if (sourceText === undefined) {\n return undefined;\n }\n try {\n return readFileSync(fileName, \"utf8\") === sourceText ? undefined : sourceText;\n } catch {\n return sourceText;\n }\n}\n\nfunction statMtimeMs(fileName: string): number {\n try {\n return statSync(fileName).mtimeMs;\n } catch {\n return 0;\n }\n}\n\nfunction languageIdFor(fileName: string): string {\n if (fileName.endsWith(\".tsx\")) {\n return \"typescriptreact\";\n }\n if (fileName.endsWith(\".jsx\")) {\n return \"javascriptreact\";\n }\n if (fileName.endsWith(\".js\")) {\n return \"javascript\";\n }\n return \"typescript\";\n}\n\nfunction parseNodeHandle(value: string): 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 isRecoverableTransportError(error: unknown): boolean {\n const message = errorMessage(error);\n return (\n message.includes(\"process is closed:\") ||\n message.includes(\"Broken pipe\") ||\n message.includes(\"EPIPE\") ||\n message.includes(\"failed to fill whole buffer\") ||\n message.includes(\"msgpack worker\") ||\n message.includes(\"msgpack stdin\") ||\n message.includes(\"msgpack stdout\") ||\n message.includes(\"jsonrpc reader\") ||\n message.includes(\"jsonrpc writer\") ||\n message.includes(\"jsonrpc connection\")\n );\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction readFileOrUndefined(path: string): string | undefined {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session.js","names":["#snapshot","#client","#supportsOverlayChanges","#files","#typeTextById","#typeLookupById","#symbolsById","#symbolTypeById","#nodesById","#typeSourceById","#snapshotHasIssuedHandles","#fatalTransportError","#config","#projects","#lastRefreshMs"],"sources":["../ts/session.ts"],"sourcesContent":["import { readFileSync, statSync } from \"node:fs\";\n\nimport { type ProjectResponse, CorsaApiClient } from \"@corsa-bind/napi\";\n\nimport type {\n CorsaCallSignatureFacts,\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\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 #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 #snapshotHasIssuedHandles = false;\n #supportsOverlayChanges?: boolean;\n #fatalTransportError?: Error;\n\n constructor(\n readonly project: ResolvedProjectConfig,\n readonly runtime: ResolvedRuntimeOptions,\n ) {}\n\n close(): void {\n if (this.#snapshot) {\n this.tryReleaseHandle(this.#snapshot);\n this.#snapshot = undefined;\n }\n this.tryCloseClient();\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.withTransportRecovery(() => this.config().options, \"reading compiler options\");\n }\n\n getRootFileNames(): readonly string[] {\n return this.withTransportRecovery(() => this.config().fileNames, \"reading root file names\");\n }\n\n getTypeAtPosition(\n fileName: string,\n position: number,\n sourceText?: string,\n ): CorsaType | undefined {\n return this.withTransportRecovery(\n () => this.getTypeAtPositionUnchecked(fileName, position, sourceText),\n \"looking up a type\",\n );\n }\n\n private getTypeAtPositionUnchecked(\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 return this.withTransportRecovery(\n () => this.getTypeAtSourceRangeUnchecked(fileName, start, end, sourceText, kind),\n \"looking up a type\",\n );\n }\n\n private getTypeAtSourceRangeUnchecked(\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.getTypeAtPositionUnchecked(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 if (kind !== \"Identifier\") {\n this.rememberTypeSourceRange(type, fileName, start, end, sourceText);\n }\n }\n return type;\n }\n\n getSymbolAtPosition(\n fileName: string,\n position: number,\n sourceText?: string,\n ): CorsaSymbol | undefined {\n return this.withTransportRecovery(\n () => this.getSymbolAtPositionUnchecked(fileName, position, sourceText),\n \"looking up a symbol\",\n );\n }\n\n private getSymbolAtPositionUnchecked(\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 return this.withTransportRecovery(() => this.getSymbolUnchecked(symbol), \"looking up a symbol\");\n }\n\n private getSymbolUnchecked(symbol: string | CorsaSymbol): CorsaSymbol | undefined {\n if (typeof symbol !== \"string\") {\n return this.rememberSymbol(symbol);\n }\n const cached = this.#symbolsById.get(symbol);\n if (cached) {\n return cached;\n }\n const typeId = this.#symbolTypeById.get(symbol);\n if (!typeId || !this.#snapshot) {\n return undefined;\n }\n const resolved = this.getSymbolOfTypeById(typeId);\n return resolved?.id === symbol ? resolved : undefined;\n }\n\n getSymbolOfType(type: CorsaType): CorsaSymbol | undefined {\n return this.withTransportRecovery(\n () => this.getSymbolOfTypeUnchecked(type),\n \"looking up a symbol\",\n );\n }\n\n private getSymbolOfTypeUnchecked(type: CorsaType): CorsaSymbol | undefined {\n if (type.symbol) {\n const symbol = this.getSymbol(type.symbol);\n if (isUsableSymbol(symbol)) {\n return symbol;\n }\n }\n return this.getSymbolOfTypeById(type.id);\n }\n\n private getSymbolOfTypeById(typeId: string): CorsaSymbol | undefined {\n if (!this.#snapshot) {\n return undefined;\n }\n try {\n return this.rememberUsableSymbol(\n this.client().getSymbolOfType(this.#snapshot, typeId) as CorsaSymbol | null,\n );\n } catch (error) {\n if (isStaleHandleError(error)) {\n return undefined;\n }\n throw error;\n }\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 getTypeOfSymbolById(id: string): CorsaType | undefined {\n return this.rememberType(this.tryGetSymbolTypeId(id, \"getTypeOfSymbol\"));\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 getDeclaredTypeOfSymbolById(id: string): CorsaType | undefined {\n return this.rememberType(this.tryGetSymbolTypeId(id, \"getDeclaredTypeOfSymbol\"));\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 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 const source = this.sourceContextForType(type);\n return this.rememberSignatures(\n this.client().callJson(\"getSignaturesOfType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n kind,\n ...source,\n }) ?? [],\n );\n }\n\n getCallSignatureFacts(\n type: CorsaType,\n kind: number,\n argumentTypeTexts: readonly (readonly string[])[],\n explicitTypeArgumentTexts: readonly string[],\n ): CorsaCallSignatureFacts {\n const source = this.sourceContextForType(type);\n const facts = this.client().callJson<CorsaCallSignatureFacts>(\"getCallSignatureFacts\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n kind,\n ...source,\n argumentTypeTexts,\n explicitTypeArgumentTexts,\n });\n if (facts?.signature) {\n this.rememberSignature(facts.signature);\n }\n return facts ?? {};\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 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 }\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 return this.tryGetSymbolTypeId(symbol.id, method);\n }\n\n private tryGetSymbolTypeId(\n id: string,\n method: \"getTypeOfSymbol\" | \"getDeclaredTypeOfSymbol\",\n ): CorsaType | undefined {\n try {\n return this.client()[method](this.#snapshot!, this.projectId(), id) as CorsaType | 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) {\n this.#snapshotHasIssuedHandles = true;\n }\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 rememberTypeSourceRange(\n type: CorsaType,\n fileName: string,\n start: number,\n end: number,\n sourceText: string | undefined,\n ): void {\n if (\n this.#typeSourceById.has(type.id) ||\n !sourceText ||\n start < 0 ||\n end > sourceText.length ||\n start >= end\n ) {\n return;\n }\n const node = {\n fileName,\n pos: start,\n end,\n range: [start, end] as const,\n };\n this.#typeSourceById.set(type.id, {\n node,\n text: sourceText.slice(start, end),\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 sourceContextForType(type: CorsaType): { file?: string; sourceText?: string } {\n const lookup = this.#typeLookupById.get(type.id);\n if (lookup) {\n const sourceText = lookup.sourceText ?? this.sourceTextForPath(lookup.fileName);\n return sourceText ? { file: lookup.fileName, sourceText } : {};\n }\n const source = this.#typeSourceById.get(type.id);\n if (source) {\n const sourceText = this.sourceTextForPath(source.node.fileName);\n return sourceText ? { file: source.node.fileName, sourceText } : {};\n }\n return {};\n }\n\n private rememberSymbol<T extends CorsaSymbol | undefined>(symbol: T): T {\n if (!symbol) {\n return symbol;\n }\n this.#snapshotHasIssuedHandles = true;\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 rememberUsableSymbol(symbol: CorsaSymbol | null | undefined): CorsaSymbol | undefined {\n return isUsableSymbol(symbol) ? this.rememberSymbol(symbol) : undefined;\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 for (const symbol of signature.parameterSymbols ?? []) {\n this.rememberSymbol(symbol);\n }\n if (signature.thisParameterSymbol) {\n this.rememberSymbol(signature.thisParameterSymbol);\n }\n return signature;\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.#symbolTypeById.clear();\n this.#nodesById.clear();\n this.#typeLookupById.clear();\n this.#typeSourceById.clear();\n this.#snapshotHasIssuedHandles = false;\n }\n\n private sourceSliceForHandle(handle: string): SourceSlice | undefined {\n const node = this.getNode(handle);\n if (!node) {\n return undefined;\n }\n const sourceText = this.sourceTextForPath(node.fileName);\n if (!sourceText || node.pos < 0 || node.end > sourceText.length || node.pos >= node.end) {\n return undefined;\n }\n return {\n node,\n text: sourceText.slice(node.pos, node.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 withTransportRecovery<T>(operation: () => T, action: string): T {\n if (this.#fatalTransportError) {\n throw this.#fatalTransportError;\n }\n try {\n return operation();\n } catch (error) {\n if (!isRecoverableTransportError(error)) {\n throw error;\n }\n this.resetClientAfterTransportFailure();\n try {\n return operation();\n } catch (retryError) {\n if (!isRecoverableTransportError(retryError)) {\n throw retryError;\n }\n const fatal = new Error(\n `corsa type-aware backend exited while ${action}; restarted the session, but the retry failed`,\n );\n (fatal as Error & { cause?: unknown }).cause = retryError;\n this.#fatalTransportError = fatal;\n throw fatal;\n }\n }\n }\n\n private resetClientAfterTransportFailure(): void {\n this.tryCloseClient();\n this.#client = undefined;\n this.#config = undefined;\n this.#snapshot = undefined;\n this.#projects = [];\n this.#files.clear();\n this.clearHandleCaches();\n this.#typeTextById.clear();\n this.#lastRefreshMs = 0;\n this.#supportsOverlayChanges = undefined;\n this.#fatalTransportError = undefined;\n }\n\n private tryReleaseHandle(handle: string): void {\n try {\n this.#client?.releaseHandle(handle);\n } catch (error) {\n if (!isRecoverableTransportError(error)) {\n throw error;\n }\n }\n }\n\n private tryCloseClient(): void {\n try {\n this.#client?.close();\n } catch (error) {\n if (!isRecoverableTransportError(error)) {\n throw error;\n }\n }\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 =\n !this.#snapshot ||\n mtimeChanged ||\n textChanged ||\n (expired && !this.#snapshotHasIssuedHandles);\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.tryReleaseHandle(previous);\n }\n return prepared;\n }\n\n private projectId(): string {\n const id = this.#projects[0]?.id;\n if (!id) {\n throw new Error(\n `corsa oxlint could not resolve a Corsa project for ${this.project.filename}`,\n );\n }\n return id;\n }\n\n private supportedOverlayText(\n fileName: string,\n sourceText: string | undefined,\n mtimeMs: number,\n cached?: FileCache,\n ): string | undefined {\n if (sourceText === undefined || !this.supportsOverlayChanges()) {\n return undefined;\n }\n if (cached?.lintSourceText === sourceText && cached.mtimeMs === mtimeMs) {\n return cached.sourceText;\n }\n return overlayTextFor(fileName, sourceText);\n }\n\n private overlayChanges(\n fileName: string,\n overlayText: string | undefined,\n cached?: FileCache,\n ):\n | {\n upsert?: { document: string; text: string; languageId: string }[];\n delete?: string[];\n }\n | undefined {\n if (!this.supportsOverlayChanges()) {\n return undefined;\n }\n if (overlayText !== undefined) {\n return {\n upsert: [\n {\n document: fileName,\n text: overlayText,\n languageId: languageIdFor(fileName),\n },\n ],\n };\n }\n if (cached?.sourceText !== undefined) {\n return { delete: [fileName] };\n }\n return undefined;\n }\n\n private supportsOverlayChanges(): boolean {\n if (this.#supportsOverlayChanges !== undefined) {\n return this.#supportsOverlayChanges;\n }\n try {\n const capabilities = this.client().callJson<{\n overlay?: { updateSnapshotOverlayChanges?: boolean };\n }>(\"describeCapabilities\");\n this.#supportsOverlayChanges = capabilities?.overlay?.updateSnapshotOverlayChanges === true;\n } catch {\n this.#supportsOverlayChanges = false;\n }\n return this.#supportsOverlayChanges;\n }\n}\n\nfunction isArrayOrTupleLikeType(session: 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 isUsableSymbol(symbol: CorsaSymbol | null | undefined): symbol is CorsaSymbol {\n return symbol != null && !symbol.name.includes(\"\\ufffd\");\n}\n\nfunction overlayTextFor(fileName: string, sourceText?: string): string | undefined {\n if (sourceText === undefined) {\n return undefined;\n }\n try {\n return readFileSync(fileName, \"utf8\") === sourceText ? undefined : sourceText;\n } catch {\n return sourceText;\n }\n}\n\nfunction statMtimeMs(fileName: string): number {\n try {\n return statSync(fileName).mtimeMs;\n } catch {\n return 0;\n }\n}\n\nfunction languageIdFor(fileName: string): string {\n if (fileName.endsWith(\".tsx\")) {\n return \"typescriptreact\";\n }\n if (fileName.endsWith(\".jsx\")) {\n return \"javascriptreact\";\n }\n if (fileName.endsWith(\".js\")) {\n return \"javascript\";\n }\n return \"typescript\";\n}\n\nfunction parseNodeHandle(value: string): 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 isRecoverableTransportError(error: unknown): boolean {\n const message = errorMessage(error);\n return (\n message.includes(\"process is closed:\") ||\n message.includes(\"Broken pipe\") ||\n message.includes(\"EPIPE\") ||\n message.includes(\"failed to fill whole buffer\") ||\n message.includes(\"msgpack worker\") ||\n message.includes(\"msgpack stdin\") ||\n message.includes(\"msgpack stdout\") ||\n message.includes(\"jsonrpc reader\") ||\n message.includes(\"jsonrpc writer\") ||\n message.includes(\"jsonrpc connection\")\n );\n}\n\nfunction isStaleHandleError(error: unknown): boolean {\n return errorMessage(error).includes(\"not found in snapshot registry\");\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction readFileOrUndefined(path: string): string | undefined {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "corsa-oxlint",
3
- "version": "0.49.0",
3
+ "version": "0.51.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": {
@@ -101,7 +101,7 @@
101
101
  "./package.json": "./package.json"
102
102
  },
103
103
  "dependencies": {
104
- "@corsa-bind/napi": "0.49.0"
104
+ "@corsa-bind/napi": "0.51.0"
105
105
  },
106
106
  "devDependencies": {
107
107
  "@oxlint/plugins": "1.69.0",