### Loader Options Example
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/loader-system.md
An example demonstrating how to configure loader options, including file extension, module format, TypeScript declaration generation, esbuild settings, and PostCSS configurations for autoprefixer and cssnano.
```typescript
const options: LoaderOptions = {
ext: 'mjs',
format: 'esm',
declaration: true,
esbuild: {
minify: true,
target: 'es2020',
jsx: 'automatic'
},
postcss: {
autoprefixer: { overrideBrowserslist: ['last 2 versions'] },
cssnano: { preset: ['default', { discardComments: { removeAll: true } }] }
}
}
```
--------------------------------
### CLI Output Example
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Example of the output displayed by the Mkdist CLI after a successful build, listing the files written to the distribution directory.
```bash
$ mkdist
- /home/user/project/dist/index.mjs
- /home/user/project/dist/index.d.ts
- /home/user/project/dist/Button.vue
- /home/user/project/dist/styles.css
```
--------------------------------
### Vue Component Example
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
A standard Vue 3 component using `
```
--------------------------------
### Install mkdist Globally or Locally
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Install mkdist using npm. You can install it globally for direct command-line access or locally as a development dependency.
```bash
# Global installation
npm install -g mkdist
mkdist
# Local installation
npm install --save-dev mkdist
npx mkdist
```
--------------------------------
### OutputFile Example
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/loader-system.md
Defines the structure of a transformed file produced by a loader. This example shows a typical output file configuration.
```typescript
const output: OutputFile = {
path: 'module.mjs',
srcPath: '/project/src/module.ts',
contents: 'export const value = 42;',
extension: '.mjs',
declaration: false
}
```
--------------------------------
### mkdist with Detailed Options
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/mkdist-core.md
Shows a comprehensive example of `mkdist` configuration, including custom root, source, and destination directories, glob patterns, loaders, TypeScript compiler options, and PostCSS configuration.
```typescript
const result = await mkdist({
rootDir: process.cwd(),
srcDir: 'src',
distDir: 'dist',
pattern: '**/*.{ts,tsx,js,jsx}',
declaration: true,
format: 'esm',
ext: 'mjs',
cleanDist: true,
loaders: ['js', 'vue'],
addRelativeDeclarationExtensions: true,
typescript: {
compilerOptions: {
target: 'ES2020',
moduleResolution: 'bundler'
}
},
postcss: {
autoprefixer: { overrideBrowserslist: ['last 2 versions'] },
cssnano: {}
}
})
```
--------------------------------
### Sass Partial File Example
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/loaders.md
Illustrates how partial SASS files (starting with '_') are handled by the Sass loader. These files are skipped from being written as standalone CSS files.
```typescript
const input = {
path: '_variables.scss',
extension: '.scss',
srcPath: '/project/src/_variables.scss',
getContents: async () => '$primary: #3498db;'
}
const outputs = await loadFile(input)
// Outputs: [{ path: '_variables.scss', skip: true }]
```
--------------------------------
### Example: Custom Declaration Processing with Mkdist
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/utilities.md
Demonstrates how to set up a virtual file system, normalize TypeScript compiler options, generate declarations using getDeclarations, and process the results, including error handling.
```typescript
import {
normalizeCompilerOptions,
getDeclarations,
extractDeclarations
} from 'mkdist'
// Setup virtual file system
const vfs = new Map([
['/src/utils.ts', 'export const add = (a: number, b: number) => a + b']
])
// Normalize TypeScript options
const compilerOptions = await normalizeCompilerOptions({
target: 'ES2020',
strict: true
})
// Generate declarations
const output = await getDeclarations(vfs, {
typescript: { compilerOptions }
})
// Process results
for (const [path, decl] of Object.entries(output)) {
if (decl.errors) {
console.error(`${path}: ${decl.errors.length} errors`)
} else {
console.log(`${path}: ${decl.contents.split('\n').length} lines`)
}
}
```
--------------------------------
### VueBlock Type Example
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/vue-loader-advanced.md
Illustrates the structure of VueBlock objects for different Vue SFC block types, including script setup and style blocks, showing their content and attributes.
```typescript
//
`
}
const outputs = await loadFile(input)
// Outputs declaration and processed Vue file
```
--------------------------------
### Build Monorepo Package
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
Configure mkdist for building a package within a monorepo. This setup uses 'rootDir' to resolve paths relative to the package directory and generates declaration files.
```typescript
// packages/utils/build.ts
import { mkdist } from 'mkdist'
await mkdist({
rootDir: import.meta.dirname,
srcDir: 'src',
distDir: 'dist',
declaration: true
})
```
--------------------------------
### Build React Library with JSX
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
Configure mkdist to build a React library, enabling automatic JSX runtime transformation. This setup generates ES modules with type definitions.
```typescript
// build.ts
import { mkdist } from 'mkdist'
await mkdist({
srcDir: 'src',
distDir: 'dist',
declaration: true,
format: 'esm',
esbuild: {
jsx: 'automatic',
target: 'es2020'
}
})
```
--------------------------------
### InputFile Interface
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/types.md
Represents a source file to be processed, including its path, extension, optional source path, and a method to get its contents.
```typescript
interface InputFile {
path: string
extension: string
srcPath?: string
getContents: () => Promise | string
}
```
--------------------------------
### Implement a Custom Vue Loader
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/README.md
Define a custom loader function for Vue projects. This example shows how to create a loader that handles a '.custom' file extension.
```typescript
const customLoader: Loader = async (input, { loadFile }) => {
if (input.extension === '.custom') {
// Transform and return
}
}
await mkdist({ loaders: [customLoader, 'js'] })
```
--------------------------------
### Custom Vue Block Loader Implementation
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/vue-loader-advanced.md
Example of a custom Vue block loader that handles a specific block type ('custom'). It demonstrates transforming block content using other loaders and adding output files.
```typescript
import type { VueBlockLoader } from 'mkdist'
const customBlockLoader: VueBlockLoader = async (
block,
{ loadFile, rawInput, addOutput, options }
) => {
// Only handle custom block type
if (block.type !== 'custom') return
// Transform block content through loaders
const lang = block.attrs.lang || 'js'
const files = await loadFile({
getContents: () => block.content,
path: `${rawInput.path}.${lang}`,
srcPath: `${rawInput.srcPath}.${lang}`,
extension: `.${lang}`
})
if (!files?.length) return
// Use transformed content
const mainFile = files[0]
const otherFiles = files.slice(1)
addOutput(...otherFiles)
return {
...block,
content: mainFile.contents || ''
}
}
```
--------------------------------
### Configure jsLoader for TypeScript and Declarations
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/loaders.md
Use `createLoader` to configure the 'js' loader for specific formats, extensions, and features like TypeScript declaration file generation. This example sets up esbuild options for minification and target.
```typescript
import { createLoader } from 'mkdist'
const { loadFile } = createLoader({
format: 'esm',
ext: 'mjs',
declaration: true,
esbuild: {
minify: true,
target: 'es2020',
jsx: 'automatic'
}
})
```
--------------------------------
### Build Vue Component Library
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
Configure mkdist to build Vue Single File Components (SFCs) along with associated styles and TypeScript definitions. This setup supports ESM output and specifies loaders for Vue, Sass, and PostCSS.
```typescript
// build.ts
import { mkdist } from 'mkdist'
await mkdist({
srcDir: 'src',
distDir: 'dist',
loaders: ['vue', 'sass', 'postcss'],
declaration: true,
format: 'esm',
ext: 'mjs',
esbuild: {
target: 'es2020',
jsx: 'preserve'
}
})
```
--------------------------------
### Custom Vue Loader Example
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/vue-loader-advanced.md
Defines a custom Vue loader that handles SASS for style blocks and processes script blocks by loading them as separate files. Use this to integrate custom preprocessors or complex script transformations.
```typescript
import { defineVueLoader, defineDefaultBlockLoader } from 'mkdist'
import type { VueBlockLoader } from 'mkdist'
// Custom style block loader that handles SASS
const customStyleLoader = defineDefaultBlockLoader({
type: 'style',
outputLang: 'css'
})
// Custom loader for script blocks
const customScriptLoader: VueBlockLoader = async (
block,
{ loadFile, rawInput, addOutput }
) => {
if (block.type !== 'script') return
const lang = block.attrs.lang || 'js'
const extension = `.${lang}`
const files = await loadFile({
getContents: () => block.content,
path: `${rawInput.path}${extension}`,
srcPath: `${rawInput.srcPath}${extension}`,
extension
})
const scriptFile = files?.find(f => f.extension === `.${lang}`)
if (!scriptFile) return
addOutput(...files.filter(f => f !== scriptFile))
return {
type: 'script',
attrs: block.attrs,
content: scriptFile.contents || ''
}
}
const loader = defineVueLoader({
blockLoaders: {
style: customStyleLoader,
script: customScriptLoader
}
})
```
--------------------------------
### Running npm Build Scripts
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Demonstrates how to execute the defined npm build scripts from the command line.
```bash
npm run build
npm run build:prod
```
--------------------------------
### Basic CLI Build
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/README.md
Perform a basic build using the mkdist command-line interface. This command specifies the source and distribution directories and enables declaration file generation.
```bash
mkdist --src src --dist dist --declaration
```
--------------------------------
### Custom Source and Distribution Directories
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Specifies custom source and distribution directories for the build process. Code from 'lib/' will be built into 'output/'.
```bash
mkdist --src lib --dist output
# lib/ → output/
```
--------------------------------
### Basic mkdist Usage
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/mkdist-core.md
Demonstrates a basic usage of the `mkdist` function to transform files from a source directory to a destination directory, including declaration generation.
```typescript
import { mkdist } from 'mkdist'
const result = await mkdist({
rootDir: '/home/user/project',
srcDir: 'src',
distDir: 'dist',
declaration: true,
format: 'esm'
})
console.log(`Wrote ${result.writtenFiles.length} files`)
if (result.errors.length > 0) {
console.error('Declaration errors:', result.errors)
}
```
--------------------------------
### Production Build Configuration
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Creates a production-ready build with ES modules, type declarations, minification, and a specific target, while preserving the dist directory.
```bash
mkdist \
--format esm \
--ext mjs \
--declaration \
--minify \
--target es2020 \
--no-clean
# ES modules, declarations, minified, target ES2020, preserve dist
```
--------------------------------
### CLI Build with Vue and Styles
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/README.md
Use the mkdist CLI to build projects that include Vue components and styles. This command enables the 'vue', 'sass', and 'postcss' loaders and generates declaration files.
```bash
mkdist --loaders vue,sass,postcss --declaration
```
--------------------------------
### Running Programmatic Build Script
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Shows how to execute a TypeScript build script using `jiti` or `node` with the `--loader` flag.
```bash
npx jiti build.ts
# or
node --loader jiti build.ts
```
--------------------------------
### React Component Example
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
A simple React functional component with TypeScript props, including default values and type checking. It uses JSX with the automatic runtime.
```typescript
// src/Button.tsx
import type { ReactNode } from 'react'
interface ButtonProps {
children?: ReactNode
onClick?: () => void
variant?: 'primary' | 'secondary'
}
export const Button = ({
children,
onClick,
variant = 'primary'
}: ButtonProps) => {
return (
)
}
```
--------------------------------
### Use Built-in Loaders in mkdist
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/loaders.md
Specify loader names in the `loaders` array when configuring mkdist. This example shows using 'js', 'vue', and 'postcss' loaders.
```typescript
import { mkdist } from 'mkdist'
// Use loader names
await mkdist({
loaders: ['js', 'vue', 'postcss']
})
```
--------------------------------
### Create Loader Context
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/loader-system.md
Initializes the loader system with specified options and a chain of loaders. Use this to set up the file transformation pipeline.
```typescript
import { createLoader } from 'mkdist'
const { loadFile } = createLoader({
format: 'esm',
declaration: true,
loaders: ['js', 'postcss']
})
const input = {
path: 'index.ts',
extension: '.ts',
srcPath: '/project/src/index.ts',
getContents: () => import('fs').then(fs =>
fs.promises.readFile('/project/src/index.ts', 'utf-8')
)
}
const outputs = await loadFile(input)
```
--------------------------------
### Basic Library Build with mkdist
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/README.md
Use this snippet to perform a basic build for a TypeScript library. It configures the source and distribution directories, enables declaration file generation, and sets the output format to ES modules.
```typescript
import {
mkdist
} from 'mkdist'
await mkdist({
srcDir: 'src',
distDir: 'dist',
declaration: true,
format: 'esm'
})
```
--------------------------------
### Hook into Declaration Generation in Mkdist
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/utilities.md
Illustrates how to hook into the declaration generation process in Mkdist to handle errors or perform custom actions. This example shows processing declaration errors.
```typescript
import { mkdist } from 'mkdist'
const result = await mkdist({
declaration: true,
typescript: {
compilerOptions: {
strict: true
}
}
})
// Process results
for (const { filename, errors } of result.errors) {
console.error(`${filename}: Declaration errors`)
errors.forEach(e => console.error(e.message))
}
```
--------------------------------
### Relative Declaration Extension Handling Example
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/declarations.md
Illustrates how mkdist modifies relative import paths in declaration files when `addRelativeDeclarationExtensions` is enabled. This ensures correct module resolution in the generated types.
```typescript
// With addRelativeDeclarationExtensions: true
// Input: import { utils } from './utils'
// Output: import { utils } from './utils.js'
// With directory import
// Input: import { config } from './config'
// Output: import { config } from './config/index.js'
```
--------------------------------
### Resolve Custom Set of Loaders
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/loaders.md
Provide an array of loader names or custom functions to `resolveLoaders` to get a specific set of resolved loaders. Invalid entries are logged as warnings and excluded.
```typescript
// Custom set
const loaders2 = resolveLoaders(['js', 'postcss'])
// Returns: [jsLoader, postcssLoader]
```
```typescript
const custom = async (input, ctx) => {
if (input.extension === '.custom') {
return [{ path: input.path, contents: 'export {}' }]
}
}
const loaders3 = resolveLoaders([custom, 'js'])
// Returns: [custom, jsLoader]
```
--------------------------------
### Selective File Processing with Patterns
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
Demonstrates how to use the 'pattern' option in Mkdist to build only specific file types, directories, or to exclude certain files from the build process.
```typescript
// build.ts
import { mkdist } from 'mkdist'
// Only TypeScript files
await mkdist({
pattern: '**/*.ts',
declaration: true
})
// Vue components only
await mkdist({
pattern: '**/*.vue',
loaders: ['vue', 'postcss']
})
// Exclude test files
await mkdist({
pattern: ['**', '!**/*.spec.ts', '!**/__tests__/**']
})
// Specific directories
await mkdist({
pattern: ['src/core/**', 'src/utils/**']
})
```
--------------------------------
### Including Pre-built Vendor Files
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
Integrates pre-built vendor files into the build process without transformation by using a custom loader that marks files for raw copying.
```typescript
import { mkdist } from 'mkdist'
import type { Loader } from 'mkdist'
// Skip transformation for vendor files
const vendorLoader: Loader = async (input) => {
if (!input.path.startsWith('vendor/')) return
// Raw copy without transformation
return [{
path: input.path,
srcPath: input.srcPath,
raw: true
}]
}
await mkdist({
loaders: [vendorLoader, 'js', 'vue']
})
```
--------------------------------
### CLI Production Build
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/README.md
Execute a production build using the mkdist CLI, enabling minification, declaration file generation, and targeting ES2020. This is suitable for optimizing output for modern environments.
```bash
mkdist --minify --declaration --target es2020
```
--------------------------------
### Custom Loader Implementation in Mkdist
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/utilities.md
Shows how to create a custom loader to transform a custom file format (e.g., '.custom') into JavaScript. The loader defines how to process the input and what the output should be.
```typescript
import type { Loader } from 'mkdist'
const customLoader: Loader = async (input, { options }) => {
if (input.extension !== '.custom') return
const content = await input.getContents()
// Transform content
const transformed = transformCustomFormat(content)
return [{
path: input.path,
contents: transformed,
extension: '.js'
}]
}
// Use in mkdist
await mkdist({
loaders: [customLoader, 'js', 'vue']
})
```
--------------------------------
### Chaining Loaders in Mkdist
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/utilities.md
Demonstrates how to create a custom loader that chains other loaders. This allows processing a file through multiple transformations, such as converting a custom component format to TypeScript.
```typescript
import type { Loader } from 'mkdist'
const chainLoader: Loader = async (input, { loadFile }) => {
if (!input.path.endsWith('.component')) return
// Process through other loaders
const tsFile = {
...input,
extension: '.ts',
getContents: async () => {
const content = await input.getContents()
return transformToTypeScript(content)
}
}
return loadFile(tsFile)
}
```
--------------------------------
### Configure Loaders for Transformation
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/configuration.md
Specify loaders to apply during transformation. Loaders are applied sequentially, and the first matching loader handles the file. This example shows default loaders, only JS, Vue and styles, and a custom loader.
```typescript
await mkdist()
```
```typescript
await mkdist({ loaders: ['js'] })
```
```typescript
await mkdist({ loaders: ['vue', 'sass', 'postcss'] })
```
```typescript
const customLoader = async (input, ctx) => {
if (input.extension === '.custom') {
return [{ path: input.path, contents: 'export {}' }]
}
}
await mkdist({ loaders: [customLoader, 'js', 'vue'] })
```
--------------------------------
### Basic Build with Watch Mode
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
Sets up a basic build process for TypeScript projects, including declaration file generation and an optional watch mode for continuous development.
```typescript
// build.ts
import { mkdist } from 'mkdist'
import { watch } from 'node:fs'
async function build() {
const result = await mkdist({
srcDir: 'src',
distDir: 'dist',
declaration: true,
cleanDist: false // Don't clean, just update
})
console.log(`Built ${result.writtenFiles.length} files`)
if (result.errors.length > 0) {
console.error(`${result.errors.length} declaration errors`)
}
}
if (process.argv.includes('--watch')) {
console.log('Watching src/ for changes...')
watch('src', { recursive: true }, async () => {
try {
await build()
} catch (error) {
console.error('Build failed:', error)
}
})
} else {
await build()
}
```
```json
{
"scripts": {
"build": "jiti build.ts",
"dev": "jiti build.ts --watch"
}
}
```
--------------------------------
### MkdistOptions
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/types.md
Configuration object for the `mkdist()` function. It extends `LoaderOptions` and provides specific settings for the build process.
```APIDOC
## MkdistOptions
### Description
Configuration object for the `mkdist()` function. Extends `LoaderOptions`.
### Type Definition
```typescript
interface MkdistOptions extends LoaderOptions {
rootDir?: string
srcDir?: string
pattern?: string | string[]
globOptions?: GlobOptions
distDir?: string
cleanDist?: boolean
loaders?: (LoaderName | Loader)[]
addRelativeDeclarationExtensions?: boolean
typescript?: {
compilerOptions?: TSConfig["compilerOptions"]
}
}
```
### Used By
`mkdist()`
```
--------------------------------
### Generate TypeScript Declarations for Vue SFCs
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/declarations.md
This function generates TypeScript declarations from Vue Single File Components. It requires a virtual file system map of SFCs and optional build options. Ensure `vue-tsc` is installed for this functionality.
```typescript
import { getVueDeclarations } from 'mkdist'
const vfs = new Map([
['/src/Button.vue.ts', 'export interface Props { disabled?: boolean }'],
['/src/Button.vue.js', 'export default {}']
])
const result = await getVueDeclarations(vfs, {
typescript: {
compilerOptions: { strict: true }
}
})
console.log(result)
// {
// '/src/Button.vue': {
// contents: 'export interface Props { disabled?: boolean }',
// errors: []
// }
// }
```
--------------------------------
### Configure esbuild for JavaScript/TypeScript Transformation
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/configuration.md
Pass options to esbuild for JavaScript/TypeScript transformation, controlling target, minification, JSX handling, and source maps. Examples include modern ES2020 target, React JSX, Vue JSX, and inline source maps.
```typescript
await mkdist({
esbuild: {
target: 'es2020',
minify: true
}
})
```
```typescript
await mkdist({
esbuild: {
jsx: 'automatic',
jsxFactory: 'React.createElement',
jsxFragment: 'React.Fragment'
}
})
```
```typescript
await mkdist({
esbuild: {
jsx: 'transform',
jsxFactory: 'h',
jsxFragment: 'Fragment'
}
})
```
```typescript
await mkdist({
esbuild: {
sourcemap: 'inline'
}
})
```
--------------------------------
### Set Source Directory
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Use the --src option to specify a custom directory for input files. This overrides the default 'src' directory.
```bash
mkdist --src source
mkdist --src lib
```
--------------------------------
### getVueDeclarations
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/declarations.md
Generates TypeScript declarations for Vue Single File Components. It maps Vue files to their source TypeScript files, checks for vue-tsc installation, uses the appropriate emission function based on the vue-tsc version, maps declarations back to original Vue paths, and augments output with compiler diagnostics.
```APIDOC
## Function: getVueDeclarations
Generates TypeScript declarations for Vue Single File Components.
### Signature
```typescript
async function getVueDeclarations(
vfs: Map,
opts?: MkdistOptions
): Promise
```
### Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| vfs | `Map` | Virtual file system containing compiled Vue SFC files |
| opts | `MkdistOptions` | Build options including TypeScript configuration |
### Return Type
`Promise` — Map of Vue file paths to generated declarations.
### Behavior
1. Maps Vue files (`.vue`) to their source TypeScript files (`.vue.ts`)
2. Checks if `vue-tsc` is installed; warns and returns early if not
3. Detects `vue-tsc` version and uses appropriate emission function:
- **v1.8.27**: Uses `emitVueTscV1` with vue-tsc v1 API
- **v2.0.x**: Uses `emitVueTscV2` with Volar TypeScript integration
- **Latest**: Uses `emitVueTscLatest` with newest Volar API
4. Maps generated declarations back from TypeScript source paths to original Vue paths
5. Augments output with compiler diagnostics
### Example
```typescript
import { getVueDeclarations } from 'mkdist'
const vfs = new Map([
['/src/Button.vue.ts', 'export interface Props { disabled?: boolean }'],
['/src/Button.vue.js', 'export default {}']
])
const result = await getVueDeclarations(vfs, {
typescript: {
compilerOptions: { strict: true }
}
})
console.log(result)
// {
// '/src/Button.vue': {
// contents: 'export interface Props { disabled?: boolean }',
// errors: []
// }
// }
```
```
--------------------------------
### Configure Production Build
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/configuration.md
Optimize Mkdist for production builds. This configuration sets the module format to ESM, generates type declarations, enables minification and targets a specific ECMAScript version via esbuild, and includes CSS minification via PostCSS.
```typescript
await mkdist({
format: 'esm',
ext: 'mjs',
declaration: true,
esbuild: {
minify: true,
target: 'es2020'
},
postcss: {
cssnano: {}
}
})
```
--------------------------------
### Configure Incremental/Development Build
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/configuration.md
Set up Mkdist for incremental development builds. This configuration disables cleaning the distribution directory to preserve existing files and enables source maps for easier debugging.
```typescript
await mkdist({
cleanDist: false,
esbuild: {
sourcemap: true
}
})
```
--------------------------------
### Basic mkdist Command Syntax
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
The fundamental command structure for mkdist. It accepts an optional root directory and various options to control the transformation process.
```bash
mkdist [rootDir] [options]
```
--------------------------------
### Production Build with Optimization
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
Use this snippet for a large library build with optimizations like minification and tree shaking. It configures esbuild and postcss for production.
```typescript
// build.ts
import { mkdist } from 'mkdist'
// Large library build with optimization
await mkdist({
srcDir: 'src',
distDir: 'dist',
declaration: true,
format: 'esm',
ext: 'mjs',
esbuild: {
minify: true,
target: 'es2020',
treeShaking: true,
legalComments: 'none'
},
postcss: {
cssnano: {
preset: ['default', {
discardComments: { removeAll: true }
}]
}
}
})
console.log('Production build complete')
```
--------------------------------
### Enable Minification
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Use the --minify flag to enable minification of the output JavaScript and CSS files. This reduces file size for production deployments.
```bash
mkdist --minify
```
--------------------------------
### npm Scripts for Building
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Defines various build scripts in `package.json` for different build configurations, including default, CommonJS, ESM, declarations, and production builds.
```json
{
"scripts": {
"build": "mkdist",
"build:cjs": "mkdist --format cjs",
"build:esm": "mkdist --format esm --ext mjs",
"build:declarations": "mkdist --declaration",
"build:prod": "mkdist --minify --declaration --target es2020"
}
}
```
--------------------------------
### Basic Usage
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Transforms TypeScript source files to JavaScript using default settings. Outputs to 'dist/' in ESM format.
```bash
mkdist
# Uses defaults: src/ → dist/, ESM format
```
--------------------------------
### MkdistOptions Interface
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/mkdist-core.md
Defines the configuration options for the mkdist function, including directory settings, file patterns, loaders, and TypeScript configurations.
```APIDOC
## Interface: MkdistOptions
Configuration for the `mkdist` function. Extends `LoaderOptions` with project-level settings.
### Properties
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
| `rootDir` | `string` | No | `"."` | Root directory for all relative path resolution. Resolved relative to current working directory. |
| `srcDir` | `string` | No | `"src"` | Source directory containing input files. Resolved relative to `rootDir`. |
| `distDir` | `string` | No | `"dist"` | Output directory for transformed files. Resolved relative to `rootDir`. |
| `cleanDist` | `boolean` | No | `true` | Whether to remove and recreate `distDir` before processing files. |
| `pattern` | `string | string[]` | No | `"**"` | Glob pattern(s) to match input files in `srcDir`. |
| `globOptions` | `GlobOptions` | No | `undefined` | Options passed to glob pattern matcher (tinyglobby). |
| `loaders` | `(LoaderName | Loader)[]` | No | `["js", "vue", "sass", "postcss"]` | List of loaders to apply. Can be loader names or custom Loader functions. |
| `addRelativeDeclarationExtensions` | `boolean` | No | `false` | Whether to add file extensions to relative import paths in generated `.d.ts` files. |
| `typescript` | `{ compilerOptions?: TSConfig["compilerOptions"] }` | No | `{}` | TypeScript compiler options for `.d.ts` generation. |
| `ext` | `"js" | "mjs" | "cjs" | "ts" | "mts" | "cts"` | No | — | Output file extension (from `LoaderOptions`). |
| `format` | `"cjs" | "esm"` | No | — | Output module format (from `LoaderOptions`). |
| `declaration` | `boolean` | No | — | Generate TypeScript declaration files (from `LoaderOptions`). |
| `esbuild` | `CommonOptions` | No | — | esbuild configuration options (from `LoaderOptions`). |
| `postcss` | `false | PostcssLoaderConfig` | No | — | PostCSS configuration (from `LoaderOptions`). |
### TypeScript Configuration Defaults
When `typescript.compilerOptions` is provided, they are merged with these defaults:
```typescript
{
noEmit: false,
allowJs: true,
declaration: true,
skipLibCheck: true,
strictNullChecks: true,
emitDeclarationOnly: true,
allowImportingTsExtensions: true,
allowNonTsExtensions: true
}
```
### Example
```typescript
const result = await mkdist({
rootDir: process.cwd(),
srcDir: 'src',
distDir: 'dist',
pattern: '**/*.{ts,tsx,js,jsx}',
declaration: true,
format: 'esm',
ext: 'mjs',
cleanDist: true,
loaders: ['js', 'vue'],
addRelativeDeclarationExtensions: true,
typescript: {
compilerOptions: {
target: 'ES2020',
moduleResolution: 'bundler'
}
},
postcss: {
autoprefixer: { overrideBrowserslist: ['last 2 versions'] },
cssnano: {}
}
})
```
```
--------------------------------
### Override Output File Extension
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Use the --ext option to specify a custom file extension for the output files. This can be useful for compatibility or specific build requirements.
```bash
mkdist --ext mjs # .mjs files
mkdist --ext cjs # .cjs files
mkdist --ext .js # .js files
```
--------------------------------
### Build Script with Error Handling
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
This snippet demonstrates a build script with comprehensive error handling. It checks for declaration errors and logs them, exiting with a non-zero code on failure.
```typescript
// build.ts
import { mkdist } from 'mkdist'
async function build() {
try {
const result = await mkdist({
srcDir: 'src',
distDir: 'dist',
declaration: true
})
console.log(`✓ Built ${result.writtenFiles.length} files`)
if (result.errors.length > 0) {
console.error(`
⚠ Declaration errors (${result.errors.length}):`)
for (const { filename, errors } of result.errors) {
console.error(`
${filename}:`)
for (const error of errors) {
console.error(` ${error.message}`)
}
}
process.exit(1)
}
} catch (error) {
console.error('Build failed:', error)
process.exit(1)
}
}
await build()
```
--------------------------------
### Minified Production Build Configuration
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
Configures Mkdist for production builds with minification, sourcemaps, and target specification. It uses environment variables to toggle production-specific settings.
```typescript
// build.ts
import { mkdist } from 'mkdist'
const isProd = process.env.NODE_ENV === 'production'
await mkdist({
srcDir: 'src',
distDir: 'dist',
declaration: true,
format: 'esm',
ext: 'mjs',
esbuild: {
minify: isProd,
sourcemap: !isProd,
target: 'es2020'
},
postcss: isProd ? {} : { cssnano: false }
})
```
```json
{
"scripts": {
"build:dev": "jiti build.ts",
"build:prod": "NODE_ENV=production jiti build.ts"
}
}
```
--------------------------------
### Dual-Package Build (CommonJS + ESM)
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/README.md
This snippet demonstrates how to configure mkdist for dual-package support, generating both CommonJS and ES module outputs. It specifies different distribution directories and file extensions for each format, while enabling declaration file generation for both.
```typescript
await Promise.all([
mkdist({
distDir: 'dist/cjs',
format: 'cjs',
ext: 'cjs',
declaration: true
}),
mkdist({
distDir: 'dist/esm',
format: 'esm',
ext: 'mjs',
declaration: true
})
])
```
--------------------------------
### Build Basic TypeScript Library
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
Use this snippet to transform TypeScript source files into ES modules with generated type definitions. Ensure your project has 'src' and 'dist' directories configured.
```typescript
// build.ts
import { mkdist } from 'mkdist'
await mkdist({
srcDir: 'src',
distDir: 'dist',
declaration: true,
format: 'esm'
})
```
--------------------------------
### LoaderOptions
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/types.md
Configuration options for loaders, including file extensions, module formats, and esbuild/postcss settings.
```APIDOC
## LoaderOptions
### Description
Configuration for loaders.
### Type Definition
```typescript
interface LoaderOptions {
ext?: "js" | "mjs" | "cjs" | "ts" | "mts" | "cts"
format?: "cjs" | "esm"
declaration?: boolean
esbuild?: CommonOptions
postcss ?:
| false
| {
nested?: false | PostcssNestedOptions
autoprefixer?: false | AutoprefixerOptions
cssnano?: false | CssnanoOptions
plugins?: PostcssPlugin[]
processOptions?: Omit
}
}
```
### Fields
- **ext** (`string`) - Output file extension (optional)
- **format** (`"cjs" | "esm"`) - Module format (optional)
- **declaration** (`boolean`) - Generate `.d.ts` files (optional)
- **esbuild** (`Object`) - esbuild transform options (optional)
- **postcss** (`Object`) - PostCSS plugin configuration (optional)
### Used In
`MkdistOptions`, `LoaderContext.options`
```
--------------------------------
### Build Library with ES Modules and Types
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/configuration.md
Configure Mkdist to build a library using ES modules and generate TypeScript declaration files. Specifies source and distribution directories, module format, file extension, and TypeScript compiler options.
```typescript
await mkdist({
srcDir: 'src',
distDir: 'dist',
format: 'esm',
ext: 'mjs',
declaration: true,
typescript: {
compilerOptions: {
strict: true,
skipLibCheck: true
}
}
})
```
--------------------------------
### Set Module Output Format
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/cli.md
Use the --format option to specify the module system for the output files. Supported formats are 'cjs' (CommonJS) and 'esm' (ES modules).
```bash
mkdist --format cjs # Output CommonJS
mkdist --format esm # Output ES modules
```
--------------------------------
### Configure Source Directory for mkdist
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/configuration.md
Define the source directory containing input files. mkdist scans this directory for files matching the specified glob pattern. Defaults to 'src'.
```typescript
await mkdist({ srcDir: 'src' })
// Alternative structure
await mkdist({ srcDir: 'lib' })
// Multiple entry points (use with custom loaders)
await mkdist({ srcDir: 'packages/core/src' })
```
--------------------------------
### Build with Output Validation
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
This build script includes output validation to ensure declarations exist and are not empty, and verifies the entry point. It logs warnings for empty declarations and throws an error if the entry point is missing.
```typescript
// build.ts
import { mkdist } from 'mkdist'
import fs from 'node:fs/promises'
import path from 'node:path'
async function build() {
const result = await mkdist({
srcDir: 'src',
distDir: 'dist',
declaration: true
})
// Validate declarations exist
for (const file of result.writtenFiles) {
if (file.endsWith('.d.ts')) {
const content = await fs.readFile(file, 'utf-8')
if (!content.includes('export')) {
console.warn(`Empty declaration: ${file}`)
}
}
}
// Verify entry point
const entryPoint = path.join('dist', 'index.mjs')
if (!result.writtenFiles.includes(entryPoint)) {
throw new Error(`Entry point ${entryPoint} not found`)
}
console.log('✓ All validation checks passed')
return result
}
await build()
```
--------------------------------
### package.json for Basic TypeScript Library
Source: https://github.com/unjs/mkdist/blob/main/_autodocs/usage-patterns.md
Configure your package.json to specify the main module export and type definitions for your library. The 'build' script uses 'jiti' to execute the build script.
```json
{
"name": "my-lib",
"type": "module",
"exports": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"scripts": {
"build": "jiti build.ts"
}
}
```