{"id":25334,"library":"esbuild-plugin-emit-decorator-metadata","title":"esbuild-plugin-emit-decorator-metadata","description":"An esbuild plugin that enables TypeScript's `emitDecoratorMetadata` option for decorators, generating metadata for `reflect-metadata`. Current version 0.2.3 requires esbuild ^0.14.29 to ^0.25.0. It rewrites and improves upon the original esbuild-decorators package, fixing broken source maps and adding worker-thread support for parallel transpilation. Supports both ESM and CommonJS, ships TypeScript types. Key differentiators: correct source map handling, optional workers for performance, and support for `.tsx` files. Best alternative to using `tsc` for decorator metadata in esbuild.","status":"active","version":"0.2.3","language":"javascript","source_language":"en","source_url":"https://github.com/YevheniiYusenkov/esbuild-plugin-emit-decorator-metadata","tags":["javascript","emitDecoratorMetadata","emit-decorator-metadata","experimentalDecorator","experimentalDecorators","reflect-metadata","decorator-metadata","esbuild-plugin","esbuild plugin","typescript"],"install":[{"cmd":"npm install esbuild-plugin-emit-decorator-metadata","lang":"bash","label":"npm"},{"cmd":"yarn add esbuild-plugin-emit-decorator-metadata","lang":"bash","label":"yarn"},{"cmd":"pnpm add esbuild-plugin-emit-decorator-metadata","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"peer dependency; plugin hooks into esbuild's build process","package":"esbuild","optional":false}],"imports":[{"note":"The package exports both ESM and CJS; named import works in both environments.","wrong":"const esbuildEmitDecoratorMetadata = require('esbuild-plugin-emit-decorator-metadata')","symbol":"esbuildEmitDecoratorMetadata","correct":"import { esbuildEmitDecoratorMetadata } from 'esbuild-plugin-emit-decorator-metadata'"},{"note":"CJS users must destructure; default export does not exist.","wrong":"const plugin = require('esbuild-plugin-emit-decorator-metadata').default","symbol":"esbuildEmitDecoratorMetadata","correct":"const { esbuildEmitDecoratorMetadata } = require('esbuild-plugin-emit-decorator-metadata')"},{"note":"PluginOptions is not exported; only the function is exported. Use ReturnType<typeof esbuildEmitDecoratorMetadata> or inline type.","wrong":"import { PluginOptions } from 'esbuild-plugin-emit-decorator-metadata'","symbol":"PluginOptions","correct":"import type { esbuildEmitDecoratorMetadata } from 'esbuild-plugin-emit-decorator-metadata'"}],"quickstart":{"code":"import { esbuildEmitDecoratorMetadata } from 'esbuild-plugin-emit-decorator-metadata';\nimport { resolve } from 'node:path';\nimport esbuild from 'esbuild';\n\nawait esbuild.build({\n  entryPoints: ['./src/index.ts'],\n  outfile: './dist/bundle.js',\n  bundle: true,\n  platform: 'node',\n  tsconfig: resolve('tsconfig.json'),\n  plugins: [\n    esbuildEmitDecoratorMetadata({\n      tsconfig: resolve('tsconfig.json'),\n      workers: 'auto',\n    }),\n  ],\n});\nconsole.log('Build complete');","lang":"typescript","description":"Shows basic esbuild build configuration using the plugin with automatic worker threads."},"warnings":[{"fix":"Enable workers option: `workers: 'auto'` or `workers: true`. Also ensure `tsconfig` path is correct to avoid repeated resolution.","message":"Using `esbuildEmitDecoratorMetadata` will significantly slow down builds because each file is transpiled by TypeScript separately. For large projects, consider using workers or incremental builds.","severity":"gotcha","affected_versions":">=0.1.0"},{"fix":"Add `tsx: true` to the plugin options: `{ tsconfig: '...', tsx: true }`.","message":"The plugin does not support `.tsx` files by default; you must pass `tsx: true` in options.","severity":"gotcha","affected_versions":">=0.1.0"},{"fix":"Use it only for debugging; prefer letting esbuild handle caching.","message":"The `force` option (transpile all `.ts` files) may be deprecated in future versions because it ignores esbuild's caching.","severity":"deprecated","affected_versions":">=0.2.0"},{"fix":"Set `sourceRoot: resolve(process.cwd(), 'src')` in esbuild config.","message":"Source maps may be incorrect if `sourceRoot` is not set correctly. The plugin expects `sourceRoot` to be absolute path to source directory.","severity":"gotcha","affected_versions":">=0.1.0"},{"fix":"If you want to disable workers, explicitly set `workers: false`.","message":"Version 0.2.0 changed the internal worker pool behavior: previously default was no workers, now default is `workers: 'auto'`.","severity":"breaking","affected_versions":">=0.2.0"}],"env_vars":null,"last_verified":"2026-05-01T00:00:00.000Z","next_check":"2026-07-30T00:00:00.000Z","problems":[{"fix":"npm install -D esbuild-plugin-emit-decorator-metadata","cause":"The package is not installed or not in the current project's dependencies.","error":"Error: Cannot find module 'esbuild-plugin-emit-decorator-metadata'"},{"fix":"Use named import: import { esbuildEmitDecoratorMetadata } from 'esbuild-plugin-emit-decorator-metadata'","cause":"Incorrect import style (e.g., default import instead of named import).","error":"TypeError: esbuildEmitDecoratorMetadata is not a function"},{"fix":"Ensure tsconfig path is absolute and valid: esbuildEmitDecoratorMetadata({ tsconfig: resolve(__dirname, 'tsconfig.json') })","cause":"The `tsconfig` option path is incorrect or file does not exist.","error":"Error: tsconfig file not found at /path/to/tsconfig.json"},{"fix":"Add to tsconfig.json: { \"compilerOptions\": { \"experimentalDecorators\": true, \"emitDecoratorMetadata\": true } }","cause":"The tsconfig.json does not have these options enabled.","error":"Error: Decorator metadata emission is only supported when 'experimentalDecorators' and 'emitDecoratorMetadata' are enabled in tsconfig"}],"ecosystem":"npm","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}