• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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