@@ -1747,4 +1747,138 @@ namespace ts.projectSystem {
17471747 assert . isTrue ( containsNavToItem ( items2 , "foo" , "function" ) , `Cannot find function symbol "foo".` ) ;
17481748 } ) ;
17491749 } ) ;
1750+
1751+ describe ( "external projects" , ( ) => {
1752+ it ( "correctly handling add/remove tsconfig - 1" , ( ) => {
1753+ const f1 = {
1754+ path : "/a/b/app.ts" ,
1755+ content : "let x = 1;"
1756+ } ;
1757+ const f2 = {
1758+ path : "/a/b/lib.ts" ,
1759+ content : ""
1760+ } ;
1761+ const tsconfig = {
1762+ path : "/a/b/tsconfig.json" ,
1763+ content : ""
1764+ } ;
1765+ const host = createServerHost ( [ f1 , f2 ] ) ;
1766+ const projectService = createProjectService ( host ) ;
1767+
1768+ // open external project
1769+ const projectName = "/a/b/proj1" ;
1770+ projectService . openExternalProject ( {
1771+ projectFileName : projectName ,
1772+ rootFiles : toExternalFiles ( [ f1 . path , f2 . path ] ) ,
1773+ options : { }
1774+ } ) ;
1775+ projectService . openClientFile ( f1 . path ) ;
1776+ projectService . checkNumberOfProjects ( { externalProjects : 1 } ) ;
1777+ checkProjectActualFiles ( projectService . externalProjects [ 0 ] , [ f1 . path , f2 . path ] ) ;
1778+
1779+ // rename lib.ts to tsconfig.json
1780+ host . reloadFS ( [ f1 , tsconfig ] ) ;
1781+ projectService . openExternalProject ( {
1782+ projectFileName : projectName ,
1783+ rootFiles : toExternalFiles ( [ f1 . path , tsconfig . path ] ) ,
1784+ options : { }
1785+ } ) ;
1786+ projectService . checkNumberOfProjects ( { configuredProjects : 1 } ) ;
1787+ checkProjectActualFiles ( projectService . configuredProjects [ 0 ] , [ f1 . path ] ) ;
1788+
1789+ // rename tsconfig.json back to lib.ts
1790+ host . reloadFS ( [ f1 , f2 ] ) ;
1791+ host . triggerFileWatcherCallback ( tsconfig . path , /*removed*/ true ) ;
1792+ projectService . openExternalProject ( {
1793+ projectFileName : projectName ,
1794+ rootFiles : toExternalFiles ( [ f1 . path , f2 . path ] ) ,
1795+ options : { }
1796+ } ) ;
1797+
1798+ projectService . checkNumberOfProjects ( { externalProjects : 1 } ) ;
1799+ checkProjectActualFiles ( projectService . externalProjects [ 0 ] , [ f1 . path , f2 . path ] ) ;
1800+ } ) ;
1801+
1802+
1803+ it ( "correctly handling add/remove tsconfig - 2" , ( ) => {
1804+ const f1 = {
1805+ path : "/a/b/app.ts" ,
1806+ content : "let x = 1;"
1807+ } ;
1808+ const cLib = {
1809+ path : "/a/b/c/lib.ts" ,
1810+ content : ""
1811+ } ;
1812+ const cTsconfig = {
1813+ path : "/a/b/c/tsconfig.json" ,
1814+ content : "{}"
1815+ } ;
1816+ const dLib = {
1817+ path : "/a/b/d/lib.ts" ,
1818+ content : ""
1819+ } ;
1820+ const dTsconfig = {
1821+ path : "/a/b/d/tsconfig.json" ,
1822+ content : "{}"
1823+ } ;
1824+ const host = createServerHost ( [ f1 , cLib , cTsconfig , dLib , dTsconfig ] ) ;
1825+ const projectService = createProjectService ( host ) ;
1826+
1827+ // open external project
1828+ const projectName = "/a/b/proj1" ;
1829+ projectService . openExternalProject ( {
1830+ projectFileName : projectName ,
1831+ rootFiles : toExternalFiles ( [ f1 . path ] ) ,
1832+ options : { }
1833+ } ) ;
1834+
1835+ projectService . checkNumberOfProjects ( { externalProjects : 1 } ) ;
1836+ checkProjectActualFiles ( projectService . externalProjects [ 0 ] , [ f1 . path ] ) ;
1837+
1838+ // add two config file as root files
1839+ projectService . openExternalProject ( {
1840+ projectFileName : projectName ,
1841+ rootFiles : toExternalFiles ( [ f1 . path , cTsconfig . path , dTsconfig . path ] ) ,
1842+ options : { }
1843+ } ) ;
1844+ projectService . checkNumberOfProjects ( { configuredProjects : 2 } ) ;
1845+ checkProjectActualFiles ( projectService . configuredProjects [ 0 ] , [ cLib . path ] ) ;
1846+ checkProjectActualFiles ( projectService . configuredProjects [ 1 ] , [ dLib . path ] ) ;
1847+
1848+ // remove one config file
1849+ projectService . openExternalProject ( {
1850+ projectFileName : projectName ,
1851+ rootFiles : toExternalFiles ( [ f1 . path , dTsconfig . path ] ) ,
1852+ options : { }
1853+ } ) ;
1854+
1855+ projectService . checkNumberOfProjects ( { configuredProjects : 1 } ) ;
1856+ checkProjectActualFiles ( projectService . configuredProjects [ 0 ] , [ dLib . path ] ) ;
1857+
1858+ // remove second config file
1859+ projectService . openExternalProject ( {
1860+ projectFileName : projectName ,
1861+ rootFiles : toExternalFiles ( [ f1 . path ] ) ,
1862+ options : { }
1863+ } ) ;
1864+
1865+ projectService . checkNumberOfProjects ( { externalProjects : 1 } ) ;
1866+ checkProjectActualFiles ( projectService . externalProjects [ 0 ] , [ f1 . path ] ) ;
1867+
1868+ // open two config files
1869+ // add two config file as root files
1870+ projectService . openExternalProject ( {
1871+ projectFileName : projectName ,
1872+ rootFiles : toExternalFiles ( [ f1 . path , cTsconfig . path , dTsconfig . path ] ) ,
1873+ options : { }
1874+ } ) ;
1875+ projectService . checkNumberOfProjects ( { configuredProjects : 2 } ) ;
1876+ checkProjectActualFiles ( projectService . configuredProjects [ 0 ] , [ cLib . path ] ) ;
1877+ checkProjectActualFiles ( projectService . configuredProjects [ 1 ] , [ dLib . path ] ) ;
1878+
1879+ // close all projects - no projects should be opened
1880+ projectService . closeExternalProject ( projectName ) ;
1881+ projectService . checkNumberOfProjects ( { } ) ;
1882+ } ) ;
1883+ } ) ;
17501884}
0 commit comments