Skip to content

Commit 622d45d

Browse files
userquinantfu
andauthored
fix: add back types/* subpackages exports (#418)
Co-authored-by: Anthony Fu <[email protected]>
1 parent 4a013ad commit 622d45d

File tree

2 files changed

+93
-3
lines changed

2 files changed

+93
-3
lines changed

package.json

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,46 @@
5858
"import": "./dist/webpack.js",
5959
"require": "./dist/webpack.cjs"
6060
},
61-
"./package.json": "./package.json"
61+
"./package.json": "./package.json",
62+
"./types/astro": {
63+
"types": "./types/astro.d.ts"
64+
},
65+
"./types/preact": {
66+
"types": "./types/preact.d.ts"
67+
},
68+
"./types/qwik": {
69+
"types": "./types/qwik.d.ts"
70+
},
71+
"./types/raw": {
72+
"types": "./types/raw.d.ts"
73+
},
74+
"./types/react": {
75+
"types": "./types/react.d.ts"
76+
},
77+
"./types/solid": {
78+
"types": "./types/solid.d.ts"
79+
},
80+
"./types/svelte": {
81+
"types": "./types/svelte.d.ts"
82+
},
83+
"./types/svelte3": {
84+
"types": "./types/svelte3.d.ts"
85+
},
86+
"./types/svelte4": {
87+
"types": "./types/svelte4.d.ts"
88+
},
89+
"./types/svelte5": {
90+
"types": "./types/svelte5.d.ts"
91+
},
92+
"./types/vue": {
93+
"types": "./types/vue.d.ts"
94+
},
95+
"./types/vue3": {
96+
"types": "./types/vue3.d.ts"
97+
},
98+
"./types/web-components": {
99+
"types": "./types/web-components.d.ts"
100+
}
62101
},
63102
"main": "./dist/index.cjs",
64103
"module": "./dist/index.js",
@@ -72,7 +111,6 @@
72111
}
73112
},
74113
"files": [
75-
"*.d.ts",
76114
"dist",
77115
"types"
78116
],

tsdown.config.ts

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,60 @@
1+
import * as fsPromises from 'node:fs/promises'
12
import { defineConfig } from 'tsdown'
23

34
export default defineConfig({
45
entry: ['src/*.ts'],
56
format: ['esm', 'cjs'],
67
external: ['vue', '@iconify/json/package.json'],
7-
exports: true,
8+
exports: {
9+
async customExports(exp) {
10+
// replace this for await with `import { glob } from 'node:fs/promises'
11+
// requires node v22.14.0+ => https://nodejs.org/api/fs.html
12+
for await (const [key, types] of getDtsTypesFiles()) {
13+
if (!exp[key]) {
14+
exp[key] = { types }
15+
}
16+
}
17+
return exp
18+
},
19+
},
20+
hooks: {
21+
'build:done': async () => {
22+
await patchNode16CJSDefaultExports([
23+
'index',
24+
'resolver',
25+
])
26+
},
27+
},
828
})
29+
30+
async function patchNode16CJSDefaultExports(
31+
files: string[],
32+
) {
33+
await Promise.all(files.map(async (file) => {
34+
const path = `./dist/${file}.d.cts`
35+
const content = await fsPromises.readFile(path, { encoding: 'utf8' })
36+
const fixedContent = content.match(/export\s+\{(.*)\};/)
37+
if (fixedContent && fixedContent.length > 0) {
38+
const exports = fixedContent[1].split(',').map(e => e.trim()).filter(e => e.includes(' as default'))
39+
if (exports.length === 1) {
40+
await fsPromises.writeFile(
41+
path,
42+
content.replace(fixedContent[0], `export = ${exports[0].replace(' as default', '').trim()};`),
43+
{ encoding: 'utf8' },
44+
)
45+
}
46+
}
47+
}))
48+
}
49+
50+
async function* getDtsTypesFiles(): AsyncGenerator<[
51+
key: string,
52+
types: string,
53+
], undefined, void> {
54+
const files = await fsPromises.readdir('./types/')
55+
for (const file of files) {
56+
if (file.endsWith('.d.ts') && file !== 'index.d.ts') {
57+
yield [`./types/${file.replace(/\.d\.ts$/, '')}`, `./types/${file}`] as const
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)