{"record":{"id":"1831a358e3bb12c5","repo":"denoland/deno","slug":"cannot-use-declaration-without-output-or-out","errorCode":null,"errorMessage":"Cannot use --declaration without --output or --outdir. Declaration files must be written to disk.","messagePattern":"Cannot use --declaration without --output or --outdir\\. Declaration files must be written to disk\\.","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"cli/tools/transpile.rs","lineNumber":46,"sourceCode":"  transpile_flags: TranspileFlags,\n) -> Result<(), AnyError> {\n  let files = &transpile_flags.files;\n\n  if files.is_empty() {\n    anyhow::bail!(\"No input files specified\");\n  }\n\n  if files.len() > 1 && transpile_flags.output.is_some() {\n    anyhow::bail!(\n      \"Cannot use --output with multiple input files. Use --outdir instead.\"\n    );\n  }\n\n  if transpile_flags.declaration\n    && transpile_flags.output.is_none()\n    && transpile_flags.output_dir.is_none()\n  {\n    anyhow::bail!(\n      \"Cannot use --declaration without --output or --outdir. Declaration files must be written to disk.\"\n    );\n  }\n\n  let is_stdout_mode = files.len() == 1\n    && transpile_flags.output.is_none()\n    && transpile_flags.output_dir.is_none();\n\n  if is_stdout_mode\n    && matches!(transpile_flags.source_map, SourceMapMode::Separate)\n  {\n    anyhow::bail!(\n      \"Cannot use --source-map separate when outputting to stdout. Use --output or --outdir, or use --source-map inline instead.\"\n    );\n  }\n\n  let factory = CliFactory::from_flags(flags.clone());\n  let cli_options = factory.cli_options()?;","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/denoland/deno/blob/89f33cbef296a2b287f323d42de54c871fa69c77/cli/tools/transpile.rs#L28-L64","documentation":"Declaration (.d.ts) files are separate on-disk artifacts; they cannot be streamed to stdout alongside the transpiled JavaScript. `--declaration` is therefore rejected when neither `--output` nor `--outdir` is set.","triggerScenarios":"`deno transpile mod.ts --declaration` with no `--output`/`-o` and no `--outdir`.","commonSituations":"Assuming declarations print to stdout the way transpiled JS does in single-file mode; pipelines that transpile to stdout and later gain a --declaration flag.","solutions":["Add --outdir (usual case): `deno transpile mod.ts --declaration --outdir dist`","Or add --output for a single file: `deno transpile mod.ts --declaration -o dist/mod.js`","Or drop --declaration if only the emitted JavaScript is needed"],"exampleFix":"# before\ndeno transpile mod.ts --declaration > out.js\n# after\ndeno transpile mod.ts --declaration --outdir dist","handlingStrategy":"validation","validationCode":"# bash: require an output target whenever declarations are on\noutdir=\"${OUTDIR:-dist}\"\n[ -n \"$outdir\" ] && deno transpile \"$@\" --declaration --outdir \"$outdir\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remember declarations are files, not stdout content — always pair --declaration with --outdir or --output","In pipelines that capture stdout, never add --declaration without redirecting output to disk","Codify the flag pairing in a npm/script alias so it cannot be half-specified"],"tags":["cli","transpile","declarations","flags"],"backgroundTag":null,"analyzedSha":"89f33cbef296a2b287f323d42de54c871fa69c77","analyzedAt":"2026-08-16T07:54:21.310Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}