@@ -29,33 +29,53 @@ export async function anyWorkspaceFoldersNeedServer({ folders, token }: SearchOp
29
29
if ( typeof configFilePath === 'object' && Object . values ( configFilePath ) . length > 0 ) return true
30
30
}
31
31
32
- let configs : Array < ( ) => Thenable < Uri [ ] > > = [ ]
33
- let stylesheets : Array < ( ) => Thenable < Uri [ ] > > = [ ]
32
+ // If any search returns that it needs a workspace then the server needs to be started
33
+ // and the remainder of the searches will be cancelled
34
+ let searches = folders . map ( ( folder ) =>
35
+ workspaceFoldersNeedServer ( { folder, token } ) . then ( ( found ) => {
36
+ if ( found ) return true
34
37
35
- for ( let folder of folders ) {
36
- let exclusions = getExcludePatterns ( folder ) . flatMap ( ( pattern ) => braces . expand ( pattern ) )
37
- let exclude = `{${ exclusions . join ( ',' ) . replace ( / { / g, '%7B' ) . replace ( / } / g, '%7D' ) } }`
38
-
39
- configs . push ( ( ) =>
40
- workspace . findFiles (
41
- new RelativePattern ( folder , `**/${ CONFIG_GLOB } ` ) ,
42
- exclude ,
43
- undefined ,
44
- token ,
45
- ) ,
46
- )
47
-
48
- stylesheets . push ( ( ) =>
49
- workspace . findFiles ( new RelativePattern ( folder , `**/${ CSS_GLOB } ` ) , exclude , undefined , token ) ,
50
- )
38
+ // We use `throw` so we can use Promise.any(…)
39
+ throw new Error ( DUMMY_ERROR_MESSAGE )
40
+ } ) ,
41
+ )
42
+
43
+ const DUMMY_ERROR_MESSAGE = 'Workspace folder not needed'
44
+
45
+ try {
46
+ return await Promise . any ( searches )
47
+ } catch ( err ) {
48
+ for ( let anErr of ( err as AggregateError ) . errors ?? [ ] ) {
49
+ if ( typeof anErr === 'object' && err . message === DUMMY_ERROR_MESSAGE ) {
50
+ continue
51
+ }
52
+
53
+ console . error ( anErr )
54
+ }
55
+
56
+ return false
51
57
}
58
+ }
59
+
60
+ export interface FolderSearchOptions {
61
+ folder : WorkspaceFolder
62
+ token : CancellationToken
63
+ }
64
+
65
+ async function workspaceFoldersNeedServer ( { folder, token } : FolderSearchOptions ) {
66
+ let exclusions = getExcludePatterns ( folder ) . flatMap ( ( pattern ) => braces . expand ( pattern ) )
67
+ let exclude = `{${ exclusions . join ( ',' ) . replace ( / { / g, '%7B' ) . replace ( / } / g, '%7D' ) } }`
52
68
53
69
// If we find a config file then we need the server
54
- let configUrls = await Promise . all ( configs . map ( ( fn ) => fn ( ) ) )
55
- for ( let group of configUrls ) {
56
- if ( group . length > 0 ) {
57
- return true
58
- }
70
+ let configs = await workspace . findFiles (
71
+ new RelativePattern ( folder , `**/${ CONFIG_GLOB } ` ) ,
72
+ exclude ,
73
+ undefined ,
74
+ token ,
75
+ )
76
+
77
+ if ( configs . length > 0 ) {
78
+ return true
59
79
}
60
80
61
81
// If we find a possibly-related stylesheet then we need the server
@@ -65,12 +85,16 @@ export async function anyWorkspaceFoldersNeedServer({ folders, token }: SearchOp
65
85
// This is also, unfortunately, prone to starting the server unncessarily
66
86
// in projects that don't use TailwindCSS so we do this one-by-one instead
67
87
// of all at once to keep disk I/O low.
68
- let stylesheetUrls = await Promise . all ( stylesheets . map ( ( fn ) => fn ( ) ) )
69
- for ( let group of stylesheetUrls ) {
70
- for ( let file of group ) {
71
- if ( await fileMayBeTailwindRelated ( file ) ) {
72
- return true
73
- }
88
+ let stylesheets = await workspace . findFiles (
89
+ new RelativePattern ( folder , `**/${ CSS_GLOB } ` ) ,
90
+ exclude ,
91
+ undefined ,
92
+ token ,
93
+ )
94
+
95
+ for ( let file of stylesheets ) {
96
+ if ( await fileMayBeTailwindRelated ( file ) ) {
97
+ return true
74
98
}
75
99
}
76
100
}
0 commit comments