testPruneUnusedImports

tcmts.cli.main.testPruneUnusedImports · #wleexkbc · term

import { pruneUnusedImports } from "#codebase/tcmts/cli/main";
import assert from "node:assert/strict";

export const testPruneUnusedImports = () => {
  const prune = (text: string, file = "s.ts") => pruneUnusedImports(file, text);
  // a whole import, and some of another's names
  assert.deepEqual(
    prune(
      `// tcm: namespace lib\nimport { randomBytes } from "node:crypto";\nimport { a, b, c } from "#codebase/lib";\n\nexport const f = () => a() + c();\n`,
    ),
    {
      text: `// tcm: namespace lib\nimport { a, c } from "#codebase/lib";\n\nexport const f = () => a() + c();\n`,
      dropped: ["randomBytes", "b"],
    },
  );
  // a run at the end, over lines as `tcm edit` groups them; an alias by its local name
  assert.equal(
    prune(
      `import {\n  a, b as b_1, c,\n  d,\n} from "#codebase/lib";\nexport const f = () => b_1;\n`,
    ).text,
    `import {\n  b as b_1,\n} from "#codebase/lib";\nexport const f = () => b_1;\n`,
  );
  // a default name with named ones, either part unused; a namespace import
  assert.equal(
    prune(`import d, { a } from "m";\nexport const f = a;\n`).text,
    `import { a } from "m";\nexport const f = a;\n`,
  );
  assert.equal(
    prune(`import d, { a } from "m";\nexport const f = d;\n`).text,
    `import d from "m";\nexport const f = d;\n`,
  );
  assert.equal(
    prune(`import * as ts from "m";\nexport const f = 1;\n`).text,
    `export const f = 1;\n`,
  );
  // kept: what runs for its effect, a type used as a type, a name only a comment's {@link} or a conflict's other
  // side uses, and React where JSX is
  const kept = [
    `import "./setup";\nexport const f = 1;\n`,
    `import type { T } from "#codebase/lib";\nexport const f = (t: T) => t;\n`,
    `import { g } from "#codebase/lib";\n/** Like {@link g}. */\nexport const f = 1;\n`,
    `import { g, h } from "#codebase/lib";\nexport const f = () =>\n<<<<<<< ours\n  g();\n=======\n  h();\n>>>>>>> theirs\n`,
  ];
  for (const text of kept) assert.deepEqual(prune(text), { text, dropped: [] });
  const jsx = `import React from "react";\nexport const F = () => <div />;\n`;
  assert.deepEqual(prune(jsx, "s.tsx"), { text: jsx, dropped: [] });
}

uses