diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 44eae36d65470..a67d70a21cf3f 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -2577,7 +2577,7 @@ namespace ts { } // Cannot specify module gen that isn't amd or system with --out - if (outFile) { + if (outFile && !options.emitDeclarationOnly) { if (options.module && !(options.module === ModuleKind.AMD || options.module === ModuleKind.System)) { createDiagnosticForOptionName(Diagnostics.Only_amd_and_system_modules_are_supported_alongside_0, options.out ? "out" : "outFile", "module"); } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index d4c28ee94c64d..20155459444e9 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -3265,7 +3265,7 @@ namespace ts { const isSourceFileFromExternalLibrary = (file: SourceFile) => host.isSourceFileFromExternalLibrary(file); if (options.outFile || options.out) { const moduleKind = getEmitModuleKind(options); - const moduleEmitEnabled = moduleKind === ModuleKind.AMD || moduleKind === ModuleKind.System; + const moduleEmitEnabled = options.emitDeclarationOnly || moduleKind === ModuleKind.AMD || moduleKind === ModuleKind.System; // Can emit only sources that are not declaration file and are either non module code or module with --module or --target es6 specified return filter(host.getSourceFiles(), sourceFile => (moduleEmitEnabled || !isExternalModule(sourceFile)) && sourceFileMayBeEmitted(sourceFile, options, isSourceFileFromExternalLibrary)); diff --git a/tests/baselines/reference/outModuleConcatCommonjsDeclarationOnly.js b/tests/baselines/reference/outModuleConcatCommonjsDeclarationOnly.js new file mode 100644 index 0000000000000..93b94d9c2e2f6 --- /dev/null +++ b/tests/baselines/reference/outModuleConcatCommonjsDeclarationOnly.js @@ -0,0 +1,21 @@ +//// [tests/cases/compiler/outModuleConcatCommonjsDeclarationOnly.ts] //// + +//// [a.ts] +export class A { } + +//// [b.ts] +import {A} from "./ref/a"; +export class B extends A { } + + + +//// [all.d.ts] +declare module "ref/a" { + export class A { + } +} +declare module "b" { + import { A } from "ref/a"; + export class B extends A { + } +} diff --git a/tests/baselines/reference/outModuleConcatCommonjsDeclarationOnly.symbols b/tests/baselines/reference/outModuleConcatCommonjsDeclarationOnly.symbols new file mode 100644 index 0000000000000..8f2ac39afbead --- /dev/null +++ b/tests/baselines/reference/outModuleConcatCommonjsDeclarationOnly.symbols @@ -0,0 +1,12 @@ +=== tests/cases/compiler/ref/a.ts === +export class A { } +>A : Symbol(A, Decl(a.ts, 0, 0)) + +=== tests/cases/compiler/b.ts === +import {A} from "./ref/a"; +>A : Symbol(A, Decl(b.ts, 0, 8)) + +export class B extends A { } +>B : Symbol(B, Decl(b.ts, 0, 26)) +>A : Symbol(A, Decl(b.ts, 0, 8)) + diff --git a/tests/baselines/reference/outModuleConcatCommonjsDeclarationOnly.types b/tests/baselines/reference/outModuleConcatCommonjsDeclarationOnly.types new file mode 100644 index 0000000000000..f1f7a7f12f99c --- /dev/null +++ b/tests/baselines/reference/outModuleConcatCommonjsDeclarationOnly.types @@ -0,0 +1,12 @@ +=== tests/cases/compiler/ref/a.ts === +export class A { } +>A : A + +=== tests/cases/compiler/b.ts === +import {A} from "./ref/a"; +>A : typeof A + +export class B extends A { } +>B : B +>A : A + diff --git a/tests/baselines/reference/outModuleConcatUnspecifiedModuleKindDeclarationOnly.js b/tests/baselines/reference/outModuleConcatUnspecifiedModuleKindDeclarationOnly.js new file mode 100644 index 0000000000000..43f944f6715df --- /dev/null +++ b/tests/baselines/reference/outModuleConcatUnspecifiedModuleKindDeclarationOnly.js @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/outModuleConcatUnspecifiedModuleKindDeclarationOnly.ts] //// + +//// [a.ts] +export class A { } // module + +//// [b.ts] +var x = 0; // global + + + +//// [out.d.ts] +declare module "a" { + export class A { + } +} +declare var x: number; diff --git a/tests/baselines/reference/outModuleConcatUnspecifiedModuleKindDeclarationOnly.symbols b/tests/baselines/reference/outModuleConcatUnspecifiedModuleKindDeclarationOnly.symbols new file mode 100644 index 0000000000000..9eb8517f2571a --- /dev/null +++ b/tests/baselines/reference/outModuleConcatUnspecifiedModuleKindDeclarationOnly.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/a.ts === +export class A { } // module +>A : Symbol(A, Decl(a.ts, 0, 0)) + +=== tests/cases/compiler/b.ts === +var x = 0; // global +>x : Symbol(x, Decl(b.ts, 0, 3)) + diff --git a/tests/baselines/reference/outModuleConcatUnspecifiedModuleKindDeclarationOnly.types b/tests/baselines/reference/outModuleConcatUnspecifiedModuleKindDeclarationOnly.types new file mode 100644 index 0000000000000..823f468497232 --- /dev/null +++ b/tests/baselines/reference/outModuleConcatUnspecifiedModuleKindDeclarationOnly.types @@ -0,0 +1,9 @@ +=== tests/cases/compiler/a.ts === +export class A { } // module +>A : A + +=== tests/cases/compiler/b.ts === +var x = 0; // global +>x : number +>0 : 0 + diff --git a/tests/cases/compiler/outModuleConcatCommonjsDeclarationOnly.ts b/tests/cases/compiler/outModuleConcatCommonjsDeclarationOnly.ts new file mode 100644 index 0000000000000..aa662e337c9f4 --- /dev/null +++ b/tests/cases/compiler/outModuleConcatCommonjsDeclarationOnly.ts @@ -0,0 +1,13 @@ +// @target: ES5 +// @sourcemap: true +// @declaration: true +// @emitDeclarationOnly: true +// @module: commonjs +// @outFile: all.js + +// @Filename: ref/a.ts +export class A { } + +// @Filename: b.ts +import {A} from "./ref/a"; +export class B extends A { } \ No newline at end of file diff --git a/tests/cases/compiler/outModuleConcatUnspecifiedModuleKindDeclarationOnly.ts b/tests/cases/compiler/outModuleConcatUnspecifiedModuleKindDeclarationOnly.ts new file mode 100644 index 0000000000000..862f64507a243 --- /dev/null +++ b/tests/cases/compiler/outModuleConcatUnspecifiedModuleKindDeclarationOnly.ts @@ -0,0 +1,10 @@ +// @target: ES5 +// @outFile: out.js +// @declaration: true +// @emitDeclarationOnly: true + +// @Filename: a.ts +export class A { } // module + +// @Filename: b.ts +var x = 0; // global \ No newline at end of file