Skip to content

Commit 4a704ea

Browse files
committed
test: add PackageTypesResolver tests
1 parent dd3c729 commit 4a704ea

File tree

1 file changed

+215
-0
lines changed

1 file changed

+215
-0
lines changed

src/package-types-resolver.test.ts

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
import { expect, test } from "vitest";
2+
import { PackageTypesResolver } from "./package-types-resolver.ts";
3+
4+
test("optional subpath in constructor", () => {
5+
const r = new PackageTypesResolver({});
6+
expect(r.getTypes()).toBeUndefined();
7+
});
8+
9+
test("empty package.json", () => {
10+
const r = new PackageTypesResolver({}, ".");
11+
expect(r.getTypes()).toBeUndefined();
12+
});
13+
14+
test("not a TypeScript type definitions file", () => {
15+
const r = new PackageTypesResolver({ types: "foo.wrong.ext" }, ".");
16+
expect(r.getTypes()).toBeUndefined();
17+
});
18+
19+
test("subpath not found", () => {
20+
const r = new PackageTypesResolver(
21+
{ name: "foo", exports: { ".": { types: "index.d.ts" } } },
22+
"bar",
23+
);
24+
expect(r.getTypes()).toBeUndefined();
25+
});
26+
27+
test("types from exports map for implicit root `.` subpath", () => {
28+
const r = new PackageTypesResolver({ name: "foo", exports: { ".": { types: "index.d.ts" } } });
29+
expect(r.getTypes()).toBe("index.d.ts");
30+
expect(r.getExportsMapTypes()).toBe("index.d.ts");
31+
});
32+
33+
test("types from exports map for root `.` subpath", () => {
34+
const r = new PackageTypesResolver(
35+
{ name: "foo", exports: { ".": { types: "index.d.ts" } } },
36+
".",
37+
);
38+
expect(r.getTypes()).toBe("index.d.ts");
39+
expect(r.getExportsMapTypes()).toBe("index.d.ts");
40+
});
41+
42+
test("types from exports map for root `foo` package name subpath", () => {
43+
const r = new PackageTypesResolver(
44+
{ name: "foo", exports: { ".": { types: "index.d.ts" } } },
45+
"foo",
46+
);
47+
expect(r.getTypes()).toBe("index.d.ts");
48+
expect(r.getExportsMapTypes()).toBe("index.d.ts");
49+
});
50+
51+
test("types from `custom` subpath", () => {
52+
const r = new PackageTypesResolver(
53+
{
54+
name: "foo",
55+
exports: {
56+
".": { types: "index.d.ts" },
57+
"./custom": { types: "custom.d.ts" },
58+
},
59+
},
60+
"custom",
61+
);
62+
expect(r.getTypes()).toBe("custom.d.ts");
63+
expect(r.getExportsMapTypes()).toBe("custom.d.ts");
64+
});
65+
66+
test("types from `package.json/#types` fallback", () => {
67+
const r = new PackageTypesResolver({ types: "index.d.ts" }, ".");
68+
expect(r.getTypes()).toBe("index.d.ts");
69+
expect(r.getTypesOrTypings()).toBe("index.d.ts");
70+
});
71+
72+
test("types from `package.json/#typings` fallback", () => {
73+
const r = new PackageTypesResolver({ types: "index.d.ts" }, ".");
74+
expect(r.getTypes()).toBe("index.d.ts");
75+
expect(r.getTypesOrTypings()).toBe("index.d.ts");
76+
});
77+
78+
test("types from `package.json/#types` fallback and not from `default` condition for root subpath", () => {
79+
const r = new PackageTypesResolver(
80+
{
81+
name: "foo",
82+
types: "index.d.ts",
83+
exports: {
84+
".": { default: "index.js" },
85+
},
86+
},
87+
".",
88+
);
89+
expect(r.getTypes()).toBe("index.d.ts");
90+
});
91+
92+
test("types not from `package.json/#types` fallback if not root subpath", () => {
93+
const r = new PackageTypesResolver(
94+
{
95+
name: "foo",
96+
types: "index.d.ts",
97+
exports: {
98+
".": { default: "index.js" },
99+
},
100+
},
101+
"custom",
102+
);
103+
expect(r.getTypes()).toBeUndefined();
104+
});
105+
106+
test("types not from `package.json/#typings` fallback if not root subpath", () => {
107+
const r = new PackageTypesResolver(
108+
{
109+
name: "foo",
110+
typings: "index.d.ts",
111+
exports: {
112+
".": { default: "index.js" },
113+
},
114+
},
115+
"custom",
116+
);
117+
expect(r.getTypes()).toBeUndefined();
118+
});
119+
120+
test("ts-api-utils@2.1.0", () => {
121+
const r = new PackageTypesResolver(
122+
{
123+
name: "ts-api-utils",
124+
version: "2.1.0",
125+
type: "module",
126+
exports: {
127+
".": {
128+
types: {
129+
import: "./lib/index.d.ts",
130+
require: "./lib/index.d.cts",
131+
},
132+
import: "./lib/index.js",
133+
require: "./lib/index.cjs",
134+
},
135+
},
136+
},
137+
".",
138+
);
139+
expect(r.getTypes()).toBe("./lib/index.d.ts");
140+
});
141+
142+
// https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-7.html#packagejson-exports-imports-and-self-referencing
143+
test("ts 4.7 release", () => {
144+
const r = new PackageTypesResolver(
145+
{
146+
name: "my-package",
147+
type: "module",
148+
exports: {
149+
".": {
150+
// Entry-point for `import "my-package"` in ESM
151+
import: {
152+
// Where TypeScript will look.
153+
types: "./types/esm/index.d.ts",
154+
// Where Node.js will look.
155+
default: "./esm/index.js",
156+
},
157+
// Entry-point for `require("my-package") in CJS
158+
require: {
159+
// Where TypeScript will look.
160+
types: "./types/commonjs/index.d.cts",
161+
// Where Node.js will look.
162+
default: "./commonjs/index.cjs",
163+
},
164+
},
165+
},
166+
// Fall-back for older versions of TypeScript
167+
types: "./types/index.d.ts",
168+
// CJS fall-back for older versions of Node.js
169+
main: "./commonjs/index.cjs",
170+
},
171+
".",
172+
);
173+
expect(r.getTypes()).toBe("./types/esm/index.d.ts");
174+
});
175+
176+
// https://www.typescriptlang.org/docs/handbook/modules/reference.html#example-explicit-types-condition
177+
test("ts module handbook explicit types", () => {
178+
const r = new PackageTypesResolver(
179+
{
180+
name: "pkg",
181+
exports: {
182+
"./subpath": {
183+
import: {
184+
types: "./types/subpath/index.d.mts",
185+
default: "./es/subpath/index.mjs",
186+
},
187+
require: {
188+
types: "./types/subpath/index.d.cts",
189+
default: "./cjs/subpath/index.cjs",
190+
},
191+
},
192+
},
193+
},
194+
"subpath",
195+
);
196+
expect(r.getTypes()).toBe("./types/subpath/index.d.mts");
197+
});
198+
199+
// https://www.typescriptlang.org/docs/handbook/modules/reference.html#example-subpath-patterns
200+
test("ts module handbook subpath patterns", () => {
201+
const r = new PackageTypesResolver(
202+
{
203+
name: "pkg",
204+
type: "module",
205+
exports: {
206+
"./*.js": {
207+
types: "./types/*.d.ts",
208+
default: "./dist/*.js",
209+
},
210+
},
211+
},
212+
"wildcard.js",
213+
);
214+
expect(r.getTypes()).toBe("./types/wildcard.d.ts");
215+
});

0 commit comments

Comments
 (0)