@@ -65,7 +65,7 @@ import {
6565} from "./providers/toolsProvider" ;
6666import { VsCodeTaskProvider } from "./providers/vsCodeTaskProvider" ;
6767import { WorkspaceDecorationProvider } from "./providers/WorkspaceDecorationProvider" ;
68- import { displayPathRelativeTo } from "./utils/fileUtils" ;
68+ import { displayPathRelativeTo , expandPath } from "./utils/fileUtils" ;
6969import { truncateStr } from "./utils/fn" ;
7070import { logger } from "./utils/logger" ;
7171import { allowedFileTaskDirs } from "./utils/miseUtilts" ;
@@ -83,6 +83,10 @@ export class MiseExtension {
8383 vscode . StatusBarAlignment . Left ,
8484 0 ,
8585 ) ;
86+ private invalidMiseConfigStatusBarItem = vscode . window . createStatusBarItem (
87+ vscode . StatusBarAlignment . Left ,
88+ 0 ,
89+ ) ;
8690
8791 private miseFileWatcher : MiseFileWatcher | undefined ;
8892
@@ -245,6 +249,7 @@ export class MiseExtension {
245249 } ) ;
246250 }
247251
252+ void this . checkForInvalidMiseConfigFiles ( ) ;
248253 await this . updateStatusBarTooltip ( ) ;
249254 } ) ;
250255
@@ -650,6 +655,7 @@ export class MiseExtension {
650655 }
651656
652657 const icon = state === "loading" ? "$(sync~spin)" : "$(terminal)" ;
658+ this . statusBarItem . color = undefined ;
653659
654660 this . statusBarItem . text = `${ icon } Mise` ;
655661 if ( state === "disabled" ) {
@@ -705,6 +711,63 @@ export class MiseExtension {
705711 this . statusBarItem . tooltip = errorMsg ;
706712 }
707713
714+ private async checkForInvalidMiseConfigFiles ( ) {
715+ const resetStatusBar = ( ) => {
716+ this . invalidMiseConfigStatusBarItem . hide ( ) ;
717+ this . invalidMiseConfigStatusBarItem . command = undefined ;
718+ this . invalidMiseConfigStatusBarItem . tooltip = undefined ;
719+ this . invalidMiseConfigStatusBarItem . text = "" ;
720+ } ;
721+
722+ try {
723+ await this . miseService . getMiseConfigFiles ( ) ;
724+ resetStatusBar ( ) ;
725+ } catch ( error ) {
726+ if ( ! ( error instanceof Error ) ) {
727+ resetStatusBar ( ) ;
728+ return ;
729+ }
730+
731+ if ( error . message . includes ( "mise ERROR error parsing config file" ) ) {
732+ const filePathMatch = error . message . match (
733+ / e r r o r p a r s i n g c o n f i g f i l e : ( .* ?\. t o m l ) / ,
734+ ) ;
735+ const invalidMiseCfgFile = filePathMatch ?. [ 1 ] ;
736+ if ( invalidMiseCfgFile ) {
737+ const filePath = expandPath ( invalidMiseCfgFile ) ;
738+ this . invalidMiseConfigStatusBarItem . text = `Invalid Mise config: ${ filePath } ` ;
739+ this . invalidMiseConfigStatusBarItem . color = new vscode . ThemeColor (
740+ "errorForeground" ,
741+ ) ;
742+ const errorParts = error . message . split (
743+ "mise ERROR error parsing config file:" ,
744+ 2 ,
745+ ) ;
746+ const mainError = errorParts [ 1 ]
747+ ? `Error parsing config file: ${ errorParts [ 1 ] } `
748+ : error . message ;
749+
750+ const cleanedError = mainError . split (
751+ "mise ERROR Run with --verbose or MISE_VERBOSE=1 for more information" ,
752+ ) [ 0 ] ;
753+
754+ this . invalidMiseConfigStatusBarItem . tooltip =
755+ cleanedError ?. replace ( / m i s e E R R O R / g, "" ) . trim ( ) || error . message ;
756+
757+ this . invalidMiseConfigStatusBarItem . command = {
758+ title : "Open Invalid Mise Config File" ,
759+ command : MISE_OPEN_FILE ,
760+ arguments : [ filePath ] ,
761+ } ;
762+ this . invalidMiseConfigStatusBarItem . show ( ) ;
763+ this . setErrorState (
764+ `Mise configuration file is invalid: ${ filePath } . Please fix or remove this file.` ,
765+ ) ;
766+ }
767+ }
768+ }
769+ }
770+
708771 private checkForMissingMiseTools ( ) {
709772 if ( ! isMiseExtensionEnabled ( ) ) {
710773 return ;
0 commit comments