@@ -3,12 +3,35 @@ const { Project } = require("../Project");
33const { writable } = require ( "../utils/store" ) ;
44
55/**
6- * @param {PyMakr } pymakr
6+ * @param {import('../PyMakr').PyMakr } pymakr
7+ * @returns {(configFile: import('vscode').Uri)=>Project }
78 */
8- const getProjects = async ( pymakr ) => {
9- const configFiles = await workspace . findFiles ( "**/pymakr.conf" ) ;
10- return configFiles . map ( ( configFile ) => new Project ( configFile , pymakr ) ) ;
11- } ;
9+ const convertToProject = ( pymakr ) => ( configFile ) => new Project ( configFile , pymakr ) ;
10+
11+ /** @param {Project[] } projects */
12+ const isNotIn = ( projects ) => ( configFile ) => ! projects . find ( ( p ) => p . configFile . path === configFile . path ) ;
13+
14+ /**
15+ * @param {Project } p1
16+ * @param {Project } p2
17+ */
18+ const byName = ( p1 , p2 ) => ( p1 . name < p2 . name ? 1 : p1 . name > p2 . name ? - 1 : 0 ) ;
19+
20+ /**
21+ * @param {import('vscode').Uri[] } configFiles
22+ * @returns {(project:Project) => Boolean }
23+ */
24+ const hasConfigFile = ( configFiles ) => ( project ) => configFiles . map ( ( cf ) => cf . path ) . includes ( project . configFile . path ) ;
25+
26+ /**
27+ * @param {import('vscode').Uri[] } configFiles
28+ * @returns {(project:Project) => Boolean }
29+ */
30+ const hasNoConfigFile = ( configFiles ) => ( project ) =>
31+ ! configFiles . map ( ( cfg ) => cfg . path ) . includes ( project . configFile . path ) ;
32+
33+ /** @param {Project } project */
34+ const destroy = ( project ) => project . destroy ( ) ;
1235
1336/**
1437 * @param {PyMakr } pymakr
@@ -19,7 +42,15 @@ const createProjectsStore = (pymakr) => {
1942 /** Rescan for projects in workspace. */
2043 const refresh = async ( ) => {
2144 pymakr . log . debug ( "Refreshing projects store..." ) ;
22- store . set ( await getProjects ( pymakr ) ) ;
45+ const configFiles = await workspace . findFiles ( "**/pymakr.conf" ) ;
46+ store . get ( ) . filter ( hasNoConfigFile ( configFiles ) ) . forEach ( destroy ) ;
47+ store . update ( ( oldProjects ) =>
48+ [
49+ ...oldProjects . filter ( hasConfigFile ( configFiles ) ) ,
50+ ...configFiles . filter ( isNotIn ( oldProjects ) ) . map ( convertToProject ( pymakr ) ) ,
51+ ] . sort ( byName )
52+ ) ;
53+ store . get ( ) . forEach ( ( p ) => p . refresh ( ) ) ;
2354 pymakr . log . debug ( "Refreshing projects store. Complete!" ) ;
2455 } ;
2556
0 commit comments