From 0f2b403cd66772223bef08616eecdbd85379f546 Mon Sep 17 00:00:00 2001 From: Kitson Kelly Date: Tue, 10 Nov 2020 06:50:33 +1100 Subject: [PATCH] fix(cli): allow setting of importsNotUsedAsValues in Deno.compile() (#8306) Fixes #6663 --- cli/dts/lib.deno.unstable.d.ts | 14 ++++++++++++++ cli/tests/compiler_api_test.ts | 21 +++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/cli/dts/lib.deno.unstable.d.ts b/cli/dts/lib.deno.unstable.d.ts index 6eb39c21c4a20b..044e1b4e242996 100644 --- a/cli/dts/lib.deno.unstable.d.ts +++ b/cli/dts/lib.deno.unstable.d.ts @@ -318,6 +318,20 @@ declare namespace Deno { /** Import emit helpers (e.g. `__extends`, `__rest`, etc..) from * [tslib](https://www.npmjs.com/package/tslib). */ importHelpers?: boolean; + /** This flag controls how `import` works, there are 3 different options: + * + * - `remove`: The default behavior of dropping import statements which only + * reference types. + * - `preserve`: Preserves all `import` statements whose values or types are + * never used. This can cause imports/side-effects to be preserved. + * - `error`: This preserves all imports (the same as the preserve option), + * but will error when a value import is only used as a type. This might + * be useful if you want to ensure no values are being accidentally + * imported, but still make side-effect imports explicit. + * + * This flag works because you can use `import type` to explicitly create an + * `import` statement which should never be emitted into JavaScript. */ + importsNotUsedAsValues?: "remove" | "preserve" | "error"; /** Emit a single file with source maps instead of having a separate file. * Defaults to `false`. */ inlineSourceMap?: boolean; diff --git a/cli/tests/compiler_api_test.ts b/cli/tests/compiler_api_test.ts index a236a3f3fa0654..4535ad6edd3f09 100644 --- a/cli/tests/compiler_api_test.ts +++ b/cli/tests/compiler_api_test.ts @@ -199,3 +199,24 @@ Deno.test({ }); }, }); + +Deno.test({ + name: `Deno.compile() - Allows setting of "importsNotUsedAsValues"`, + async fn() { + const [diagnostics] = await Deno.compile("/a.ts", { + "/a.ts": `import { B } from "./b.ts"; + const b: B = { b: "b" }; + `, + "/b.ts": `export interface B { + b: string; + }; + `, + }, { + importsNotUsedAsValues: "error", + }); + assert(diagnostics); + assertEquals(diagnostics.length, 1); + assert(diagnostics[0].messageText); + assert(diagnostics[0].messageText.includes("This import is never used")); + }, +});