1namespace ts { 2 describe("unittests:: tsbuild:: declarationEmit", () => { 3 function getFiles(): vfs.FileSet { 4 return { 5 "/src/solution/tsconfig.base.json": JSON.stringify({ 6 compilerOptions: { 7 rootDir: "./", 8 outDir: "lib" 9 } 10 }), 11 "/src/solution/tsconfig.json": JSON.stringify({ 12 compilerOptions: { composite: true }, 13 references: [{ path: "./src" }], 14 include: [] 15 }), 16 "/src/solution/src/tsconfig.json": JSON.stringify({ 17 compilerOptions: { composite: true }, 18 references: [{ path: "./subProject" }, { path: "./subProject2" }], 19 include: [] 20 }), 21 "/src/solution/src/subProject/tsconfig.json": JSON.stringify({ 22 extends: "../../tsconfig.base.json", 23 compilerOptions: { composite: true }, 24 references: [{ path: "../common" }], 25 include: ["./index.ts"] 26 }), 27 "/src/solution/src/subProject/index.ts": Utils.dedent` 28import { Nominal } from '../common/nominal'; 29export type MyNominal = Nominal<string, 'MyNominal'>;`, 30 "/src/solution/src/subProject2/tsconfig.json": JSON.stringify({ 31 extends: "../../tsconfig.base.json", 32 compilerOptions: { composite: true }, 33 references: [{ path: "../subProject" }], 34 include: ["./index.ts"] 35 }), 36 "/src/solution/src/subProject2/index.ts": Utils.dedent` 37import { MyNominal } from '../subProject/index'; 38const variable = { 39 key: 'value' as MyNominal, 40}; 41export function getVar(): keyof typeof variable { 42 return 'key'; 43}`, 44 "/src/solution/src/common/tsconfig.json": JSON.stringify({ 45 extends: "../../tsconfig.base.json", 46 compilerOptions: { composite: true }, 47 include: ["./nominal.ts"] 48 }), 49 "/src/solution/src/common/nominal.ts": Utils.dedent` 50/// <reference path="./types.d.ts" /> 51export declare type Nominal<T, Name extends string> = MyNominal<T, Name>;`, 52 "/src/solution/src/common/types.d.ts": Utils.dedent` 53declare type MyNominal<T, Name extends string> = T & { 54 specialKey: Name; 55};`, 56 }; 57 } 58 verifyTsc({ 59 scenario: "declarationEmit", 60 subScenario: "when declaration file is referenced through triple slash", 61 fs: () => loadProjectFromFiles(getFiles()), 62 commandLineArgs: ["--b", "/src/solution/tsconfig.json", "--verbose"] 63 }); 64 65 verifyTsc({ 66 scenario: "declarationEmit", 67 subScenario: "when declaration file is referenced through triple slash but uses no references", 68 fs: () => loadProjectFromFiles({ 69 ...getFiles(), 70 "/src/solution/tsconfig.json": JSON.stringify({ 71 extends: "./tsconfig.base.json", 72 compilerOptions: { composite: true }, 73 include: ["./src/**/*.ts"] 74 }), 75 }), 76 commandLineArgs: ["--b", "/src/solution/tsconfig.json", "--verbose"] 77 }); 78 79 verifyTsc({ 80 scenario: "declarationEmit", 81 subScenario: "when declaration file used inferred type from referenced project", 82 fs: () => loadProjectFromFiles({ 83 "/src/tsconfig.json": JSON.stringify({ 84 compilerOptions: { 85 composite: true, 86 baseUrl: ".", 87 paths: { "@fluentui/*": ["packages/*/src"] } 88 } 89 }), 90 "/src/packages/pkg1/src/index.ts": Utils.dedent` 91export interface IThing { 92 a: string; 93} 94export interface IThings { 95 thing1: IThing; 96}`, 97 "/src/packages/pkg1/tsconfig.json": JSON.stringify({ 98 extends: "../../tsconfig", 99 compilerOptions: { outDir: "lib" }, 100 include: ["src"] 101 }), 102 "/src/packages/pkg2/src/index.ts": Utils.dedent` 103import { IThings } from '@fluentui/pkg1'; 104export function fn4() { 105 const a: IThings = { thing1: { a: 'b' } }; 106 return a.thing1; 107}`, 108 "/src/packages/pkg2/tsconfig.json": JSON.stringify({ 109 extends: "../../tsconfig", 110 compilerOptions: { outDir: "lib" }, 111 include: ["src"], 112 references: [{ path: "../pkg1" }] 113 }), 114 }), 115 commandLineArgs: ["--b", "/src/packages/pkg2/tsconfig.json", "--verbose"] 116 }); 117 }); 118} 119