1namespace ts.projectSystem { 2 describe("unittests:: tsserver:: with project references and error reporting", () => { 3 const dependecyLocation = `${tscWatch.projectRoot}/dependency`; 4 const usageLocation = `${tscWatch.projectRoot}/usage`; 5 6 function verifyUsageAndDependency(scenario: string, dependencyTs: File, dependencyConfig: File, usageTs: File, usageConfig: File) { 7 function usageProjectDiagnostics(): GetErrForProjectDiagnostics { 8 return { project: usageTs, files: [usageTs, dependencyTs] }; 9 } 10 11 function dependencyProjectDiagnostics(): GetErrForProjectDiagnostics { 12 return { project: dependencyTs, files: [dependencyTs] }; 13 } 14 15 describe("when dependency project is not open", () => { 16 verifyGetErrScenario({ 17 scenario: "projectReferenceErrors", 18 subScenario: `${scenario} when dependency project is not open`, 19 allFiles: () => [dependencyTs, dependencyConfig, usageTs, usageConfig], 20 openFiles: () => [usageTs], 21 getErrRequest: () => [usageTs], 22 getErrForProjectRequest: () => [ 23 usageProjectDiagnostics(), 24 { 25 project: dependencyTs, 26 files: [dependencyTs, usageTs] 27 } 28 ], 29 syncDiagnostics: () => [ 30 // Without project 31 { file: usageTs }, 32 { file: dependencyTs }, 33 // With project 34 { file: usageTs, project: usageConfig }, 35 { file: dependencyTs, project: usageConfig }, 36 ], 37 }); 38 }); 39 40 describe("when the depedency file is open", () => { 41 verifyGetErrScenario({ 42 scenario: "projectReferenceErrors", 43 subScenario: `${scenario} when the depedency file is open`, 44 allFiles: () => [dependencyTs, dependencyConfig, usageTs, usageConfig], 45 openFiles: () => [usageTs, dependencyTs], 46 getErrRequest: () => [usageTs, dependencyTs], 47 getErrForProjectRequest: () => [ 48 usageProjectDiagnostics(), 49 dependencyProjectDiagnostics() 50 ], 51 syncDiagnostics: () => [ 52 // Without project 53 { file: usageTs }, 54 { file: dependencyTs }, 55 // With project 56 { file: usageTs, project: usageConfig }, 57 { file: dependencyTs, project: usageConfig }, 58 { file: dependencyTs, project: dependencyConfig }, 59 ], 60 }); 61 }); 62 } 63 64 describe("with module scenario", () => { 65 const dependencyTs: File = { 66 path: `${dependecyLocation}/fns.ts`, 67 content: `export function fn1() { } 68export function fn2() { } 69// Introduce error for fnErr import in main 70// export function fnErr() { } 71// Error in dependency ts file 72export let x: string = 10;` 73 }; 74 const dependencyConfig: File = { 75 path: `${dependecyLocation}/tsconfig.json`, 76 content: JSON.stringify({ compilerOptions: { composite: true, declarationDir: "../decls" } }) 77 }; 78 const usageTs: File = { 79 path: `${usageLocation}/usage.ts`, 80 content: `import { 81 fn1, 82 fn2, 83 fnErr 84} from '../decls/fns' 85fn1(); 86fn2(); 87fnErr(); 88` 89 }; 90 const usageConfig: File = { 91 path: `${usageLocation}/tsconfig.json`, 92 content: JSON.stringify({ 93 compilerOptions: { composite: true }, 94 references: [{ path: "../dependency" }] 95 }) 96 }; 97 verifyUsageAndDependency("with module scenario", dependencyTs, dependencyConfig, usageTs, usageConfig); 98 }); 99 100 describe("with non module --out", () => { 101 const dependencyTs: File = { 102 path: `${dependecyLocation}/fns.ts`, 103 content: `function fn1() { } 104function fn2() { } 105// Introduce error for fnErr import in main 106// function fnErr() { } 107// Error in dependency ts file 108let x: string = 10;` 109 }; 110 const dependencyConfig: File = { 111 path: `${dependecyLocation}/tsconfig.json`, 112 content: JSON.stringify({ compilerOptions: { composite: true, outFile: "../dependency.js" } }) 113 }; 114 const usageTs: File = { 115 path: `${usageLocation}/usage.ts`, 116 content: `fn1(); 117fn2(); 118fnErr(); 119` 120 }; 121 const usageConfig: File = { 122 path: `${usageLocation}/tsconfig.json`, 123 content: JSON.stringify({ 124 compilerOptions: { composite: true, outFile: "../usage.js" }, 125 references: [{ path: "../dependency" }] 126 }) 127 }; 128 verifyUsageAndDependency("with non module", dependencyTs, dependencyConfig, usageTs, usageConfig); 129 }); 130 }); 131} 132