Usage

May 6, 2026 · View on GitHub

English | 中文

Installation

pnpm i -D unplugin-dts

Previous only for Vite (not recommend):

pnpm i -D vite-plugin-dts

Bundler Setup

Vite

In vite.config.ts:

import { resolve } from 'path'
import { defineConfig } from 'vite'
import dts from 'unplugin-dts/vite'

export default defineConfig({
  build: {
    lib: {
      entry: resolve(__dirname, 'src/index.ts'),
      name: 'MyLib',
      formats: ['es'],
      fileName: 'my-lib',
    },
  },
  plugins: [dts()],
})

Rollup

In rollup.config.mjs:

import { defineConfig } from 'rollup'
import typescript from '@rollup/plugin-typescript'
import dts from 'unplugin-dts/rollup'

export default defineConfig({
  input: {
    index: './src/index.ts',
  },
  output: [
    {
      dir: 'dist',
      exports: 'named',
      format: 'esm',
    },
  ],
  plugins: [typescript(), dts()],
})

Rolldown

In rolldown.config.mjs:

import { defineConfig } from 'rolldown'
import dts from 'unplugin-dts/rolldown'

export default defineConfig({
  input: {
    index: './src/index.ts',
  },
  output: [
    {
      dir: 'dist',
      exports: 'named',
      format: 'esm',
    },
  ],
  plugins: [dts()],
})

Webpack

In webpack.config.js:

import { resolve } from 'node:path'

import dts from 'unplugin-dts/webpack'

export default {
  entry: {
    index: './src/index.ts',
  },
  output: {
    path: resolve(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.ts$/,
        use: 'ts-loader',
        exclude: /node_modules/,
      },
    ],
  },
  plugins: [dts()],
}

Rspack

In rspack.config.mjs:

import { resolve } from 'node:path'
import { fileURLToPath } from 'node:url'

import { defineConfig } from '@rspack/cli'
import dts from 'unplugin-dts/rspack'

const rootDir = resolve(fileURLToPath(import.meta.url), '..')

export default defineConfig({
  entry: {
    index: './src/index.ts',
  },
  output: {
    path: resolve(rootDir, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: [
          {
            loader: 'builtin:swc-loader',
            options: {
              jsc: {
                parser: {
                  syntax: 'ecmascript',
                },
              },
            },
          },
        ],
      },
      {
        test: /\.ts$/,
        use: [
          {
            loader: 'builtin:swc-loader',
            options: {
              jsc: {
                parser: {
                  syntax: 'typescript',
                  decorators: true,
                },
              },
            },
          },
        ],
      },
    ],
  },
  plugins: [dts()],
})

Esbuild

In your build script:

import { build } from 'esbuild'
import dts from 'unplugin-dts/esbuild'

await build({
  entryPoints: ['src/index.ts'],
  format: 'esm',
  outdir: 'dist',
  bundle: true,
  plugins: [dts()],
})

Bundling Types

By default, the generated declaration files follow the source structure.

With the help of API Extractor, the plugin can bundle all types into a single file. You just need to install @microsoft/api-extractor and set bundleTypes: true:

pnpm i -D @microsoft/api-extractor
export default defineConfig({
  plugins: [dts({ bundleTypes: true })],
})

Using with Vite Templates

If you start with the official Vite template, you should specify tsconfigPath:

export default defineConfig({
  plugins: [dts({ tsconfigPath: './tsconfig.app.json' })],
})

Using with Vue

If you are using the plugin in a Vue project, you need to install @vue/language-core as a peer dependency:

pnpm i -D @vue/language-core

The plugin will automatically detect .vue files and use the 'vue' processor when you don't explicitly specify the processor option. However, it is still recommended to explicitly set it:

export default defineConfig({
  plugins: [dts({ processor: 'vue' })],
})