test.scripts/core/resolvers/specifier.resolver.test.ts
test.scripts/core/resolvers/specifier.resolver.test.ts is a file in Codebase Testing. 62 lines of code and 0 definitions.
import {
anchorSpecifier,
relativeSpecifier,
resolveSelfImport,
selfImportTargets,
} from "@project/scripts/core/resolvers/specifier.resolver.ts";
import { describe, expect, it } from "vitest";
import { join } from "node:path";
const ZONE = "zone";
const KINDS = "kinds";
const NAME = "@fixture/member";
const ENTRY = "entry.ts";
const IMPORTER = `${ZONE}/a.ts`;
const MANIFEST = {
exports: { "./*": "./*" },
imports: { [`#${KINDS}/*`]: `./${KINDS}/*.ts`, [`#${ZONE}/*`]: `./${ZONE}/*.ts` },
main: ENTRY,
name: NAME,
};
describe("selfImportTargets and resolveSelfImport", () => {
const targets = selfImportTargets(MANIFEST);
it("maps each imports key to the container it targets", () => {
expect([...targets]).toStrictEqual([
[`#${KINDS}`, KINDS],
[`#${ZONE}`, ZONE],
]);
});
it("rewrites a self import relative to the importing file, and leaves any other specifier alone", () => {
expect(resolveSelfImport(targets, `#${KINDS}/base`, `${ZONE}/deep/b.ts`)).toBe(`../../${KINDS}/base.ts`);
expect(resolveSelfImport(targets, `#${ZONE}/c`, IMPORTER)).toBe("./c.ts");
expect(resolveSelfImport(targets, "#other/c", IMPORTER)).toBe("#other/c");
expect(resolveSelfImport(targets, "node:fs", IMPORTER)).toBe("node:fs");
});
});
describe("relativeSpecifier", () => {
it("climbs only as far as the paths diverge", () => {
expect(relativeSpecifier("", IMPORTER)).toBe(`./${IMPORTER}`);
expect(relativeSpecifier(ZONE, IMPORTER)).toBe("./a.ts");
expect(relativeSpecifier(`${ZONE}/x`, `${KINDS}/a.ts`)).toBe(`../../${KINDS}/a.ts`);
});
});
describe("anchorSpecifier", () => {
const root = join("member");
const importer = join(root, ZONE, "a.ts");
it("anchors a relative specifier at the member root and keeps one that climbs out of it", () => {
expect(anchorSpecifier(root, MANIFEST, importer, "./b.ts")).toBe(`./${ZONE}/b.ts`);
expect(anchorSpecifier(root, MANIFEST, join(root, "a.ts"), "../outside.ts")).toBe("../outside.ts");
});
it("rewrites the member's own package name through main and its export pattern", () => {
expect(anchorSpecifier(root, MANIFEST, importer, NAME)).toBe(`./${ENTRY}`);
expect(anchorSpecifier(root, MANIFEST, importer, `${NAME}/${ZONE}/b.ts`)).toBe(`./${ZONE}/b.ts`);
expect(anchorSpecifier(root, MANIFEST, importer, "vite")).toBe("vite");
expect(anchorSpecifier(root, { name: NAME }, importer, NAME)).toBe(NAME);
});
it("anchors a self import from a file inside the member, and keeps one it cannot resolve", () => {
expect(anchorSpecifier(root, MANIFEST, join(root, "vite.config.ts"), `#${KINDS}/base`)).toBe(
`./${KINDS}/base.ts`,
);
expect(anchorSpecifier(root, MANIFEST, importer, "#other/c")).toBe("#other/c");
expect(anchorSpecifier(root, MANIFEST, join("elsewhere", "a.ts"), `#${KINDS}/base`)).toBe(`#${KINDS}/base`);
});
});