refactor(api): generate types next to modules (#8392)

* refactor(api): generate types next to modules"

this fixes an issue with `moduleResolution: node`

* change file

* Update api-module-resolution-node.md
This commit is contained in:
Amr Bashir 2023-12-14 18:27:48 +02:00 committed by GitHub
parent 3c371aa8ee
commit 1c582a942e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 43 deletions

View File

@ -0,0 +1,5 @@
---
"@tauri-apps/api": "patch:bug"
---
Fix a regression where typescript could not find types when using `"moduleResolution": "node"`

View File

@ -19,10 +19,17 @@
},
"homepage": "https://github.com/tauri-apps/tauri#readme",
"type": "module",
"types": "./types/index.d.ts",
"main": "./index.cjs",
"module": "./index.js",
"exports": {
".": {
"import": "./index.js",
"require": "./index.cjs"
},
"./*": {
"import": "./*.js",
"require": "./*.cjs"
},
"./package.json": "./package.json"
},
"scripts": {

View File

@ -7,14 +7,7 @@ import typescript from '@rollup/plugin-typescript'
import terser from '@rollup/plugin-terser'
import fg from 'fast-glob'
import { basename, join } from 'path'
import {
writeFileSync,
copyFileSync,
opendirSync,
rmSync,
Dir,
readFileSync
} from 'fs'
import { copyFileSync, opendirSync, rmSync, Dir } from 'fs'
import { fileURLToPath } from 'url'
// cleanup dist dir
@ -45,7 +38,7 @@ export default defineConfig([
plugins: [
typescript({
declaration: true,
declarationDir: './dist/types',
declarationDir: './dist',
rootDir: 'src'
}),
makeFlatPackageInDist()
@ -75,40 +68,10 @@ function makeFlatPackageInDist(): Plugin {
return {
name: 'makeFlatPackageInDist',
writeBundle() {
// append our api modules to `exports` in `package.json` then write it to `./dist`
const pkg = JSON.parse(readFileSync('package.json', 'utf8'))
const mods = modules.map((p) => basename(p).split('.')[0])
const outputPkg = {
...pkg,
devDependencies: {},
exports: Object.assign(
{},
...mods.map((mod) => {
const exports: Record<
string,
{ types: string; import: string; require: string }
> = {}
const key = mod === 'index' ? '.' : `./${mod}`
exports[key] = {
types: `./types/${mod}.d.ts`,
import: `./${mod}.js`,
require: `./${mod}.cjs`
}
return exports
}),
// if for some reason in the future we manually add something in the `exports` field
// this will ensure it doesn't get overwritten by the logic above
{ ...(pkg.exports || {}) }
)
}
writeFileSync(
'dist/package.json',
JSON.stringify(outputPkg, undefined, 2)
)
// copy necessary files like `CHANGELOG.md` , `README.md` and Licenses to `./dist`
fg.sync('(LICENSE*|*.md)').forEach((f) => copyFileSync(f, `dist/${f}`))
fg.sync('(LICENSE*|*.md|package.json)').forEach((f) =>
copyFileSync(f, `dist/${f}`)
)
}
}
}