@@ -94,59 +94,33 @@ export async function run(options: CommandFixOptions, positionals: string[]) {
9494 }
9595
9696 // Collect rule files that match the ecosystem.
97- const ecosystems : string [ ] = [ ]
98- {
99- if ( await fileExists ( 'package.json' ) ) {
100- await collect ( `400-ecosystem/nodejs/*` )
101- ecosystems . push ( 'nodejs' )
102-
103- const content : PackageJson = JSON . parse (
104- await fs . readFile ( 'package.json' , 'utf-8' ) ,
105- )
106- if ( content . displayName ) {
97+ const ecosystems = await getEcosystems ( Deno . cwd ( ) ) // TODO
98+ for ( const ecosystem of ecosystems ) {
99+ switch ( ecosystem ) {
100+ case 'nodejs' :
101+ await collect ( `400-ecosystem/nodejs/*` )
102+ break
103+ case 'vscode-extension' :
107104 await collect ( `400-ecosystem/vscode-extension/*` )
108- ecosystems . push ( 'vscode-extension' )
109- }
110- }
111-
112- if ( ( await fileExists ( 'deno.jsonc' ) ) || ( await fileExists ( 'deno.json' ) ) ) {
113- await collect ( `400-ecosystem/deno/*` )
114- ecosystems . push ( 'deno' )
115- }
116-
117- if ( ( await globby ( '*.c' ) ) . length > 0 ) {
118- await collect ( `400-ecosystem/c/*` )
119- ecosystems . push ( 'c' )
120- }
121-
122- // https://cmake.org/cmake/help/latest/command/project.html
123- if ( await fileExists ( 'CMakeLists.txt' ) ) {
124- const content = await fs . readFile ( 'CMakeLists.txt' , 'utf-8' )
125- const language : { groups ?: { lang ?: string } } = content . match (
126- / p r o j e c t \( (?: .* ? (?< lang > [ a - z A - Z ] + ) \) | .* ?L A N G U A G E S [ \t ] + (?< lang > [ a - z A - Z ] + ) ) / ,
127- ) as any
128- if ( language . groups ?. lang === 'C' ) {
105+ break
106+ case 'deno' :
107+ await collect ( `400-ecosystem/deno/*` )
108+ break
109+ case 'c' :
129110 await collect ( `400-ecosystem/c/*` )
130- ecosystems . push ( 'c' )
131- } else if ( language . groups ?. lang === 'CXX' ) {
111+ break
112+ case 'cpp' :
132113 await collect ( `400-ecosystem/cpp/*` )
133- ecosystems . push ( 'cpp' )
134- }
135- }
136-
137- if ( await fileExists ( 'basalt.toml' ) ) {
138- await collect ( `400-ecosystem/bash/*` )
139- ecosystems . push ( 'bash' )
140- }
141-
142- // https://zed.dev/docs/extensions/developing-extensions
143- if ( await fileExists ( 'extension.toml' ) ) {
144- await collect ( `400-ecosystem/zed-extension/*` )
145- ecosystems . push ( 'zed-extension' )
114+ break
115+ case 'bash' :
116+ await collect ( `400-ecosystem/bash/*` )
117+ break
118+ case 'zed-extension' :
119+ await collect ( `400-ecosystem/zed-extension/*` )
120+ break
146121 }
147-
148- await collect ( `400-ecosystem/_/*` )
149122 }
123+ await collect ( `400-ecosystem/_/*` )
150124
151125 // Collect rule files that match the name.
152126 {
@@ -177,7 +151,9 @@ export async function run(options: CommandFixOptions, positionals: string[]) {
177151 let str = ''
178152 str += `${ styleText ( [ 'blue' , 'bold' ] , 'Directory:' ) } ${ project . rootDir } \n`
179153 str += `${ styleText ( [ 'blue' , 'bold' ] , 'Ecosystems:' ) } ${
180- new Intl . ListFormat ( ) . format ( ecosystems )
154+ new Intl . ListFormat ( ) . format (
155+ ecosystems ,
156+ )
181157 } \n`
182158 if ( project . type === 'with-remote-url' ) {
183159 str += `${ styleText ( [ 'blue' , 'bold' ] , 'Project:' ) } ${
@@ -375,6 +351,64 @@ async function getProject(): Promise<Project> {
375351 }
376352}
377353
354+ export async function getEcosystems ( rootDir : string ) : Promise < string [ ] > {
355+ using _ = ( ( origDir : string ) => ( {
356+ [ Symbol . dispose ] : ( ) => Deno . chdir ( origDir ) ,
357+ } ) ) ( Deno . cwd ( ) )
358+ Deno . chdir ( rootDir )
359+
360+ const ecosystems : string [ ] = [ ]
361+
362+ if ( await fileExists ( 'package.json' ) ) {
363+ ecosystems . push ( 'nodejs' )
364+
365+ const content : PackageJson = JSON . parse (
366+ await fs . readFile ( 'package.json' , 'utf-8' ) ,
367+ )
368+ if ( content . displayName ) {
369+ ecosystems . push ( 'vscode-extension' )
370+ }
371+ }
372+
373+ if ( ( await fileExists ( 'deno.jsonc' ) ) || ( await fileExists ( 'deno.json' ) ) ) {
374+ ecosystems . push ( 'deno' )
375+ }
376+
377+ if ( ( await globby ( '*.c' ) ) . length > 0 ) {
378+ ecosystems . push ( 'c' )
379+ }
380+
381+ // https://cmake.org/cmake/help/latest/command/project.html
382+ if ( await fileExists ( 'CMakeLists.txt' ) ) {
383+ const content = await fs . readFile ( 'CMakeLists.txt' , 'utf-8' )
384+ const language = content . match (
385+ / p r o j e c t \( (?: .* ? (?< lang > [ a - z A - Z ] + ) \) | .* ?L A N G U A G E S [ \t ] + (?< lang > [ a - z A - Z ] + ) ) / ,
386+ )
387+ if ( language ?. groups ?. lang === 'C' ) {
388+ ecosystems . push ( 'c' )
389+ } else if ( language ?. groups ?. lang === 'CXX' ) {
390+ ecosystems . push ( 'cpp' )
391+ } else {
392+ // TODO
393+ console . error (
394+ `CMAkeLists.txt should have language defined in project()` ,
395+ )
396+ process . exit ( 1 )
397+ }
398+ }
399+
400+ if ( await fileExists ( 'basalt.toml' ) ) {
401+ ecosystems . push ( 'bash' )
402+ }
403+
404+ // https://zed.dev/docs/extensions/developing-extensions
405+ if ( await fileExists ( 'extension.toml' ) ) {
406+ ecosystems . push ( 'zed-extension' )
407+ }
408+
409+ return ecosystems
410+ }
411+
378412function printWithTips ( str : string , tips : string [ ] ) {
379413 console . info ( str )
380414 for ( const tip of tips ) {
0 commit comments