SIGN IN SIGN UP
denoland / deno UNCLAIMED

A modern runtime for JavaScript and TypeScript.

0 0 30 Rust

fix(config): hook up verbatimModuleSyntax for the emit pipeline (#34495)

## Summary

\`verbatimModuleSyntax\` was accepted in \`compilerOptions\` and
forwarded to TSC for type-checking, but the transpile path always
threaded \`verbatim_module_syntax: false\` into
\`deno_ast::TranspileOptions\` (with a \`todo!\` from @dsherret). That
meant value imports used only as types were elided at emit time even
when the user opted into \`verbatimModuleSyntax: true\`.

This wires the option through:

- \`EmitConfigOptions\` gains a \`verbatim_module_syntax: bool\` field
(defaulted to \`false\` for compatibility).
- \`compiler_options_to_transpile_and_emit_options\` passes it into
\`deno_ast::TranspileOptions\` instead of hard-coding \`false\`.

With this change, swc's TypeScript pass treats \`import type\`
declarations as the only ones to strip and preserves every other import
literally — matching TypeScript's \`verbatimModuleSyntax\` semantics.

Fixes #26678.

## Test plan

- [x] New spec test \`tests/specs/run/verbatim_module_syntax\` covers
both directions:
- With \`verbatimModuleSyntax: true\`, an import whose binding is only
used as a type is preserved at runtime (its side-effecting
\`console.log\` fires).
- With \`verbatimModuleSyntax: false\` (or unset), the same import is
elided as before.
- [x] \`cargo check -p deno_config\` and \`cargo check -p
deno_resolver\` pass.

Closes denoland/orchid#267

Co-authored-by: divybot <divybot@users.noreply.github.com>
Co-authored-by: Divy Srivastava <me@littledivy.com>
E
em committed
fcbe725f5d32ea04a0cbc963306f38365c288be6
Parent: a474bd0
Committed by GitHub <noreply@github.com> on 5/30/2026, 2:12:32 AM