8000 feat(exports): add more features · rolldown/tsdown@8dfcd2a · GitHub
[go: up one dir, main page]

Skip to content

Commit 8dfcd2a

Browse files
committed
feat(exports): add more features
1 parent a6ad844 commit 8dfcd2a

File tree

4 files changed

+343
-76
lines changed

4 files changed

+343
-76
lines changed

src/features/exports.test.ts

Lines changed: 196 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,42 +11,54 @@ const FAKE_PACKAGE_JSON = {
1111
}
1212

1313
describe('generateExports', () => {
14-
test('no entries', () => {
15-
const results = generateExports(FAKE_PACKAGE_JSON, cwd, {})
16-
expect(results).toMatchInlineSnapshot(`
14+
test('no entries', async () => {
15+
const results = generateExports(FAKE_PACKAGE_JSON, cwd, {}, {})
16+
await expect(results).resolves.toMatchInlineSnapshot(`
1717
{
1818
"exports": {
1919
"./package.json": "./package.json",
2020
},
2121
"main": undefined,
2222
"module": undefined,
23+
"publishExports": undefined,
2324
"types": undefined,
2425
}
2526
`)
2627
})
2728

28-
test('only one entry', () => {
29-
const results = generateExports(FAKE_PACKAGE_JSON, cwd, {
30-
es: [genChunk('main.js')],
31-
})
32-
expect(results).toMatchInlineSnapshot(`
29+
test('only one entry', async () => {
30+
const results = generateExports(
31+
FAKE_PACKAGE_JSON,
32+
cwd,
33+
{
34+
es: [genChunk('main.js')],
35+
},
36+
{},
37+
)
38+
await expect(results).resolves.toMatchInlineSnapshot(`
3339
{
3440
"exports": {
3541
".": "./main.js",
3642
"./package.json": "./package.json",
3743
},
3844
"main": "./main.js",
3945
"module": "./main.js",
46+
"publishExports": undefined,
4047
"types": undefined,
4148
}
4249
`)
4350
})
4451

45-
test('index entry', () => {
46-
const results = generateExports(FAKE_PACKAGE_JSON, cwd, {
47-
es: [genChunk('index.js'), genChunk('foo.js')],
48-
})
49-
expect(results).toMatchInlineSnapshot(`
52+
test('index entry', async () => {
53+
const results = generateExports(
54+
FAKE_PACKAGE_JSON,
55+
cwd,
56+
{
57+
es: [genChunk('index.js'), genChunk('foo.js')],
58+
},
59+
{},
60+
)
61+
await expect(results).resolves.toMatchInlineSnapshot(`
5062
{
5163
"exports": {
5264
".": "./index.js",
@@ -55,16 +67,22 @@ describe('generateExports', () => {
5567
},
5668
"main": "./index.js",
5769
"module": "./index.js",
70+
"publishExports": undefined,
5871
"types": undefined,
5972
}
6073
`)
6174
})
6275

63-
test('multiple entries', () => {
64-
const results = generateExports(FAKE_PACKAGE_JSON, cwd, {
65-
es: [genChunk('foo.js'), genChunk('bar.js')],
66-
})
67-
expect(results).toMatchInlineSnapshot(`
76+
test('multiple entries', async () => {
77+
const results = generateExports(
78+
FAKE_PACKAGE_JSON,
79+
cwd,
80+
{
81+
es: [genChunk('foo.js'), genChunk('bar.js')],
82+
},
83+
{},
84+
)
85+
await expect(results).resolves.toMatchInlineSnapshot(`
6886
{
6987
"exports": {
7088
"./bar": "./bar.js",
@@ -73,17 +91,23 @@ describe('generateExports', () => {
7391
},
7492
"main": undefined,
7593
"module": undefined,
94+
"publishExports": undefined,
7695
"types": undefined,
7796
}
7897
`)
7998
})
8099

81-
test('dual formats', () => {
82-
const results = generateExports(FAKE_PACKAGE_JSON, cwd, {
83-
es: [genChunk('foo.js')],
84-
cjs: [genChunk('foo.cjs')],
85-
})
86-
expect(results).toMatchInlineSnapshot(`
100+
test('dual formats', async () => {
101+
const results = generateExports(
102+
FAKE_PACKAGE_JSON,
103+
cwd,
104+
{
105+
es: [genChunk('foo.js')],
106+
cjs: [genChunk('foo.cjs')],
107+
},
108+
{},
109+
)
110+
await expect(results).resolves.toMatchInlineSnapshot(`
87111
{
88112
"exports": {
89113
".": {
@@ -94,17 +118,23 @@ describe('generateExports', () => {
94118
},
95119
"main": "./foo.cjs",
96120
"module": "./foo.js",
121+
"publishExports": undefined,
97122
"types": undefined,
98123
}
99124
`)
100125
})
101126

102-
test('dts', () => {
103-
const results = generateExports(FAKE_PACKAGE_JSON, cwd, {
104-
es: [genChunk('foo.js'), genChunk('foo.d.ts')],
105-
cjs: [genChunk('foo.cjs'), genChunk('foo.d.cts')],
106-
})
107-
expect(results).toMatchInlineSnapshot(`
127+
test('dts', async () => {
128+
const results = generateExports(
129+
FAKE_PACKAGE_JSON,
130+
cwd,
131+
{
132+
es: [genChunk('foo.js'), genChunk('foo.d.ts')],
133+
cjs: [genChunk('foo.cjs'), genChunk('foo.d.cts')],
134+
},
135+
{},
136+
)
137+
await expect(results).resolves.toMatchInlineSnapshot(`
108138
{
109139
"exports": {
110140
".": {
@@ -115,17 +145,23 @@ describe('generateExports', () => {
115145
},
116146
"main": "./foo.cjs",
117147
"module": "./foo.js",
148+
"publishExports": undefined,
118149
"types": "./foo.d.cts",
119150
}
120151
`)
121152
})
122153

123-
test('fixed extension', () => {
124-
const results = generateExports(FAKE_PACKAGE_JSON, cwd, {
125-
es: [genChunk('index.mjs'), genChunk('index.d.mts')],
126-
cjs: [genChunk('index.cjs'), genChunk('index.d.cts')],
127-
})
128-
expect(results).toMatchInlineSnapshot(`
154+
test('fixed extension', async () => {
155+
const results = generateExports(
156+
FAKE_PACKAGE_JSON,
157+
cwd,
158+
{
159+
es: [genChunk('index.mjs'), genChunk('index.d.mts')],
160+
cjs: [genChunk('index.cjs'), genChunk('index.d.cts')],
161+
},
162+
{},
163+
)
164+
await expect(results).resolves.toMatchInlineSnapshot(`
129165
{
130166
"exports": {
131167
".": {
@@ -136,13 +172,136 @@ describe('generateExports', () => {
136172
},
137173
"main": "./index.cjs",
138174
"module": "./index.mjs",
175+
"publishExports": undefined,
139176
"types": "./index.d.cts",
140177
}
141178
`)
142179
})
180+
181+
test('dev exports: dev condition', async () => {
182+
const results = await generateExports(
183+
FAKE_PACKAGE_JSON,
184+
cwd,
185+
{ es: [genChunk('index.js')], cjs: [genChunk('index.cjs')] },
186+
{ devExports: 'dev' },
187+
)
188+
// key order matters
189+
expect(JSON.stringify(results, undefined, 2)).toMatchInlineSnapshot(`
190+
"{
191+
"main": "./index.cjs",
192+
"module": "./index.js",
193+
"exports": {
194+
".": {
195+
"dev": "./SRC/index.js",
196+
"import": "./index.js",
197+
"require": "./index.cjs"
198+
},
199+
"./package.json": "./package.json"
200+
},
201+
"publishExports": {
202+
".": {
203+
"import": "./index.js",
204+
"require": "./index.cjs"
205+
},
206+
"./package.json": "./package.json"
207+
}
208+
}"
209+
`)
210+
})
211+
212+
test('dev exports: all conditions', async () => {
213+
const results = generateExports(
214+
FAKE_PACKAGE_JSON,
215+
cwd,
216+
{ es: [genChunk('index.js')], cjs: [genChunk('index.cjs')] },
217+
{ devExports: true },
218+
)
219+
await expect(results).resolves.toMatchInlineSnapshot(`
220+
{
221+
"exports": {
222+
".": "./SRC/index.js",
223+
"./package.json": "./package.json",
224+
},
225+
"main": "./index.cjs",
226+
"module": "./index.js",
227+
"publishExports": {
228+
".": {
229+
"import": "./index.js",
230+
"require": "./index.cjs",
231+
},
232+
"./package.json": "./package.json",
233+
},
234+
"types": undefined,
235+
}
236+
`)
237+
})
238+
239+
test('customExports', async () => {
240+
const results = await generateExports(
241+
FAKE_PACKAGE_JSON,
242+
cwd,
243+
{ es: [genChunk('index.js')] },
244+
{
245+
devExports: 'dev',
246+
customExports(exports) {
247+
exports['./TEST'] = './TEST'
248+
return Promise.resolve(exports)
249+
},
250+
},
251+
)
252+
// key order matters
253+
expect(JSON.stringify(results, undefined, 2)).toMatchInlineSnapshot(`
254+
"{
255+
"main": "./index.js",
256+
"module": "./index.js",
257+
"exports": {
258+
".": {
259+
"dev": "./SRC/index.js",
260+
"default": "./index.js"
261+
},
262+
"./package.json": "./package.json",
263+
"./TEST": "./TEST"
264+
},
265+
"publishExports": {
266+
".": "./index.js",
267+
"./package.json": "./package.json",
268+
"./TEST": "./TEST"
269+
}
270+
}"
271+
`)
272+
})
273+
274+
test('export all', async () => {
275+
const results = generateExports(
276+
FAKE_PACKAGE_JSON,
277+
cwd,
278+
{ es: [genChunk('index.js')], cjs: [genChunk('index.cjs')] },
279+
{ all: true },
280+
)
281+
await expect(results).resolves.toMatchInlineSnapshot(`
282+
{
283+
"exports": {
284+
".": {
285+
"import": "./index.js",
286+
"require": "./index.cjs",
287+
},
288+
"./*": "./*",
289+
},
290+
"main": "./index.cjs",
291+
"module": "./index.js",
292+
"publishExports": undefined,
293+
"types": undefined,
294+
}
295+
`)
296+
})
143297
})
144298

145299
function genChunk(fileName: string) {
146300
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
147-
return { type: 'chunk', fileName, isEntry: true } as OutputChunk
301+
return {
302+
type: 'chunk',
303+
fileName,
304+
isEntry: true,
305+
facadeModuleId: `./SRC/${fileName}`,
306+
} as OutputChunk
148307
}

0 commit comments

Comments
 (0)
0