configFor

tcmts.cli.lint.configFor · #nwthcirs · term · runs on the server

uses node:crypto

The oxlint configuration for code with these traits: written to .tcm/lint, keyed by its content.

import type { Codebase } from "#codebase/tcmts/cli/codebase";
import { LINT_FORMAT, provideTool, userConfig } from "#codebase/tcmts/cli/lint";
import type { LintTraits } from "#codebase/tcmts/cli/lint";
import { createHash } from "node:crypto";
import fs from "node:fs";
import path from "node:path";

export function configFor(
  cb: Codebase,
  traits: LintTraits,
): { file: string; key: string; bin: string } {
  const tool = provideTool(cb, "oxlint");
  const user = userConfig(cb);
  const plugins = new Set(["typescript", "unicorn", "oxc"]);
  if (traits.jsx) for (const p of ["react", "jsx-a11y"]) plugins.add(p);
  if (traits.tests) plugins.add("vitest");
  if (traits.node) plugins.add("node");
  for (const p of (user.config.plugins as string[] | undefined) ?? []) plugins.add(p);
  const config = {
    plugins: [...plugins].sort(),
    categories: { correctness: "warn", ...(user.config.categories as object | undefined) },
    rules: (user.config.rules as object | undefined) ?? {},
    ...(user.jsPlugins.length ? { jsPlugins: user.jsPlugins } : {}),
    ...(user.config.settings ? { settings: user.config.settings } : {}),
  };
  const text = JSON.stringify(config, null, 2);
  const key = createHash("sha256")
    .update(`${tool.version}\n${LINT_FORMAT}\n${text}`)
    .digest("hex")
    .slice(0, 24);
  const dir = path.join(cb.lay.tcmDir, "lint");
  fs.mkdirSync(dir, { recursive: true });
  const file = path.join(dir, `oxlintrc-${key}.json`);
  if (!fs.existsSync(file)) fs.writeFileSync(file, text + "\n");
  return { file, key, bin: path.join(tool.dir, "bin", "oxlint") };
}

uses

used by