# Target Environment Configure JavaScript syntax transformations for target environments. ## Overview The `target` option controls which JavaScript features are downleveled (transformed to older syntax) for compatibility. **Important:** Only affects syntax transformations, not runtime polyfills. ## Default Behavior tsdown auto-reads from `package.json`: ```json // package.json { "engines": { "node": ">=18.0.0" } } ``` Automatically sets `target` to `node18.0.0`. If no `engines.node` field exists, behaves as if `target: false` (no transformations). ## Disabling Transformations Set to `false` to preserve modern syntax: ```ts export default defineConfig({ target: false, }) ``` **Result:** - No JavaScript downleveling - Modern features preserved (optional chaining `?.`, nullish coalescing `??`, etc.) **Use when:** - Targeting modern environments - Handling transformations elsewhere - Building libraries for further processing ## Setting Target ### CLI ```bash # Single target tsdown --target es2020 tsdown --target node20 # Multiple targets tsdown --target chrome100 --target node20.18 # Disable tsdown --no-target ``` ### Config File ```ts export default defineConfig({ entry: ['src/index.ts'], target: 'es2020', }) ``` ### Multiple Targets ```ts export default defineConfig({ entry: ['src/index.ts'], target: ['chrome100', 'safari15', 'node18'], }) ``` ## Supported Targets ### ECMAScript Versions - `es2015`, `es2016`, `es2017`, `es2018`, `es2019`, `es2020`, `es2021`, `es2022`, `es2023`, `esnext` ### Browser Versions - `chrome100`, `safari18`, `firefox110`, `edge100`, etc. ### Node.js Versions - `node16`, `node18`, `node20`, `node20.18`, etc. ## Examples ### Modern Browsers ```ts export default defineConfig({ entry: ['src/index.ts'], format: ['esm'], target: ['chrome100', 'safari15', 'firefox100'], }) ``` ### Node.js Library ```ts export default defineConfig({ entry: ['src/index.ts'], format: ['esm', 'cjs'], target: 'node18', }) ``` ### Legacy Support ```ts export default defineConfig({ entry: ['src/index.ts'], format: ['esm'], target: 'es2015', // Maximum compatibility }) ``` ### Per-Format Targets ```ts export default defineConfig({ entry: ['src/index.ts'], format: { esm: { target: 'es2020', }, cjs: { target: 'node16', }, }, }) ``` ## Decorators ### Legacy Decorators (Stage 2) Enable in `tsconfig.json`: ```json { "compilerOptions": { "experimentalDecorators": true } } ``` ### Stage 3 Decorators **Not currently supported** by tsdown/Rolldown/Oxc. See [oxc issue #9170](https://github.com/oxc-project/oxc/issues/9170). ## Common Patterns ### Universal Library ```ts export default defineConfig({ entry: ['src/index.ts'], format: ['esm', 'cjs'], target: 'es2020', // Wide compatibility }) ``` ### Modern-Only Library ```ts export default defineConfig({ entry: ['src/index.ts'], format: ['esm'], target: false, // No transformations }) ``` ### Browser Component ```ts export default defineConfig({ entry: ['src/index.tsx'], format: ['esm'], target: ['chrome100', 'safari15', 'firefox100'], platform: 'browser', }) ``` ## Tips 1. **Let tsdown auto-detect** from package.json when possible 2. **Use `false`** for modern-only builds 3. **Specify multiple targets** for broader compatibility 4. **Use legacy decorators** with `experimentalDecorators` 6. **Test output** in target environments ## Related Options - [Platform](option-platform.md) - Runtime environment - [Output Format](option-output-format.md) - Module formats - [Minification](option-minification.md) - Code optimization