@@ -49,49 +49,57 @@ class Channel implements Channel {
4949
5050 switch ( actionType ) {
5151 case 'EDITOR_STARTUP' :
52- // check if a workspace is open, otherwise nothing works
53- const noActiveWorksapce = ! WORKSPACE_ROOT . length
54- if ( noActiveWorksapce ) {
55- const error : E . ErrorMessage = {
56- type : 'NoWorkspaceFound' ,
57- message : '' ,
58- actions : [
59- {
60- label : 'Open Workspace' ,
61- transition : 'REQUEST_WORKSPACE' ,
62- } ,
63- ] ,
52+ try {
53+ // check if a workspace is open, otherwise nothing works
54+ const noActiveWorksapce = ! WORKSPACE_ROOT . length
55+ if ( noActiveWorksapce ) {
56+ const error : E . ErrorMessage = {
57+ type : 'NoWorkspaceFound' ,
58+ message : '' ,
59+ actions : [
60+ {
61+ label : 'Open Workspace' ,
62+ transition : 'REQUEST_WORKSPACE' ,
63+ } ,
64+ ] ,
65+ }
66+ this . send ( { type : 'NO_WORKSPACE' , payload : { error } } )
67+ return
6468 }
65- this . send ( { type : 'NO_WORKSPACE' , payload : { error } } )
66- return
67- }
6869
69- const env = {
70- machineId : vscode . env . machineId ,
71- sessionId : vscode . env . sessionId ,
72- }
70+ const env = {
71+ machineId : vscode . env . machineId ,
72+ sessionId : vscode . env . sessionId ,
73+ }
7374
74- // continue from tutorial from local storage
75- const tutorial : TT . Tutorial | null = this . context . tutorial . get ( )
75+ // continue from tutorial from local storage
76+ const tutorial : TT . Tutorial | null = this . context . tutorial . get ( )
7677
77- // new tutorial
78- if ( ! tutorial || ! tutorial . id ) {
79- this . send ( { type : 'START_NEW_TUTORIAL' , payload : { env } } )
80- return
81- }
78+ // new tutorial
79+ if ( ! tutorial || ! tutorial . id ) {
80+ this . send ( { type : 'START_NEW_TUTORIAL' , payload : { env } } )
81+ return
82+ }
8283
83- // set tutorial
84- const { position, progress } = await this . context . setTutorial ( this . workspaceState , tutorial )
84+ // set tutorial
85+ const { position, progress } = await this . context . setTutorial ( this . workspaceState , tutorial )
86+
87+ if ( progress . complete ) {
88+ // tutorial is already complete
89+ this . send ( { type : 'TUTORIAL_ALREADY_COMPLETE' , payload : { env } } )
90+ return
91+ }
92+ // communicate to client the tutorial & stepProgress state
93+ this . send ( { type : 'LOAD_STORED_TUTORIAL' , payload : { env, tutorial, progress, position } } )
8594
86- if ( progress . complete ) {
87- // tutorial is already complete
88- this . send ( { type : 'TUTORIAL_ALREADY_COMPLETE' , payload : { env } } )
8995 return
96+ } catch ( e ) {
97+ const error = {
98+ type : 'UnknownError' ,
99+ message : `Location: Editor startup\n\n${ e . message } ` ,
100+ }
101+ this . send ( { type : 'EDITOR_STARTUP_FAILED' , payload : { error } } )
90102 }
91- // communicate to client the tutorial & stepProgress state
92- this . send ( { type : 'LOAD_STORED_TUTORIAL' , payload : { env, tutorial, progress, position } } )
93-
94- return
95103
96104 // clear tutorial local storage
97105 case 'TUTORIAL_CLEAR' :
@@ -100,134 +108,159 @@ class Channel implements Channel {
100108 return
101109 // configure test runner, language, git
102110 case 'EDITOR_TUTORIAL_CONFIG' :
103- const data : TT . Tutorial = action . payload . tutorial
104- // setup tutorial config (save watcher, test runner, etc)
105- await this . context . setTutorial ( this . workspaceState , data )
111+ try {
112+ const data : TT . Tutorial = action . payload . tutorial
113+ // setup tutorial config (save watcher, test runner, etc)
114+ await this . context . setTutorial ( this . workspaceState , data )
106115
107- // validate dependencies
108- const dependencies = data . config . dependencies
109- if ( dependencies && dependencies . length ) {
110- for ( const dep of dependencies ) {
111- // check dependency is installed
112- const currentVersion : string | null = await version ( dep . name )
113- if ( ! currentVersion ) {
114- // use a custom error message
115- const error = {
116- type : 'MissingTutorialDependency' ,
117- message : dep . message || `Process "${ dep . name } " is required but not found. It may need to be installed` ,
118- actions : [
119- {
120- label : 'Check Again' ,
121- transition : 'TRY_AGAIN' ,
122- } ,
123- ] ,
116+ // validate dependencies
117+ const dependencies = data . config . dependencies
118+ if ( dependencies && dependencies . length ) {
119+ for ( const dep of dependencies ) {
120+ // check dependency is installed
121+ const currentVersion : string | null = await version ( dep . name )
122+ if ( ! currentVersion ) {
123+ // use a custom error message
124+ const error = {
125+ type : 'MissingTutorialDependency' ,
126+ message :
127+ dep . message || `Process "${ dep . name } " is required but not found. It may need to be installed` ,
128+ actions : [
129+ {
130+ label : 'Check Again' ,
131+ transition : 'TRY_AGAIN' ,
132+ } ,
133+ ] ,
134+ }
135+ this . send ( { type : 'TUTORIAL_CONFIGURE_FAIL' , payload : { error } } )
136+ return
124137 }
125- this . send ( { type : 'TUTORIAL_CONFIGURE_FAIL' , payload : { error } } )
126- return
127- }
128138
129- // check dependency version
130- const satisfiedDependency = await compareVersions ( currentVersion , dep . version )
139+ // check dependency version
140+ const satisfiedDependency = await compareVersions ( currentVersion , dep . version )
131141
132- if ( ! satisfiedDependency ) {
133- const error = {
134- type : 'UnmetTutorialDependency' ,
135- message : `Expected ${ dep . name } to have version ${ dep . version } , but found version ${ currentVersion } ` ,
136- actions : [
137- {
138- label : 'Check Again' ,
139- transition : 'TRY_AGAIN' ,
140- } ,
141- ] ,
142+ if ( ! satisfiedDependency ) {
143+ const error = {
144+ type : 'UnmetTutorialDependency' ,
145+ message : `Expected ${ dep . name } to have version ${ dep . version } , but found version ${ currentVersion } ` ,
146+ actions : [
147+ {
148+ label : 'Check Again' ,
149+ transition : 'TRY_AGAIN' ,
150+ } ,
151+ ] ,
152+ }
153+ this . send ( { type : 'TUTORIAL_CONFIGURE_FAIL' , payload : { error } } )
154+ return
142155 }
143- this . send ( { type : 'TUTORIAL_CONFIGURE_FAIL' , payload : { error } } )
144- return
145- }
146156
147- if ( satisfiedDependency !== true ) {
148- const error = satisfiedDependency || {
149- type : 'UnknownError' ,
150- message : `Something went wrong comparing dependency for ${ name } ` ,
151- actions : [
152- {
153- label : 'Try Again' ,
154- transition : 'TRY_AGAIN' ,
155- } ,
156- ] ,
157+ if ( satisfiedDependency !== true ) {
158+ const error = satisfiedDependency || {
159+ type : 'UnknownError' ,
160+ message : `Something went wrong comparing dependency for ${ name } ` ,
161+ actions : [
162+ {
163+ label : 'Try Again' ,
164+ transition : 'TRY_AGAIN' ,
165+ } ,
166+ ] ,
167+ }
168+ this . send ( { type : 'TUTORIAL_CONFIGURE_FAIL' , payload : { error } } )
169+ return
157170 }
158- this . send ( { type : 'TUTORIAL_CONFIGURE_FAIL' , payload : { error } } )
159- return
160171 }
161172 }
162- }
163173
164- const error : E . ErrorMessage | void = await tutorialConfig ( { config : data . config } ) . catch ( ( error : Error ) => ( {
165- type : 'UnknownError' ,
166- message : `Location: tutorial config.\n\n${ error . message } ` ,
167- } ) )
174+ const error : E . ErrorMessage | void = await tutorialConfig ( { config : data . config } ) . catch ( ( error : Error ) => ( {
175+ type : 'UnknownError' ,
176+ message : `Location: tutorial config.\n\n${ error . message } ` ,
177+ } ) )
168178
169- // has error
170- if ( error && error . type ) {
171- this . send ( { type : 'TUTORIAL_CONFIGURE_FAIL' , payload : { error } } )
179+ // has error
180+ if ( error && error . type ) {
181+ this . send ( { type : 'TUTORIAL_CONFIGURE_FAIL' , payload : { error } } )
182+ return
183+ }
184+
185+ // report back to the webview that setup is complete
186+ this . send ( { type : 'TUTORIAL_CONFIGURED' } )
172187 return
188+ } catch ( e ) {
189+ const error = {
190+ type : 'UnknownError' ,
191+ message : `Location: EditorTutorialConfig.\n\n ${ e . message } ` ,
192+ }
193+ this . send ( { type : 'TUTORIAL_CONFIGURE_FAIL' , payload : { error } } )
173194 }
174-
175- // report back to the webview that setup is complete
176- this . send ( { type : 'TUTORIAL_CONFIGURED' } )
177- return
178195 case 'EDITOR_TUTORIAL_CONTINUE_CONFIG' :
179- const tutorialContinue : TT . Tutorial | null = this . context . tutorial . get ( )
180- if ( ! tutorialContinue ) {
181- throw new Error ( 'Invalid tutorial to continue' )
196+ try {
197+ const tutorialContinue : TT . Tutorial | null = this . context . tutorial . get ( )
198+ if ( ! tutorialContinue ) {
199+ throw new Error ( 'Invalid tutorial to continue' )
200+ }
201+ const continueConfig : TT . TutorialConfig = tutorialContinue . config
202+ await tutorialConfig ( {
203+ config : continueConfig ,
204+ alreadyConfigured : true ,
205+ } )
206+ // update the current stepId on startup
207+ vscode . commands . executeCommand ( COMMANDS . SET_CURRENT_STEP , action . payload )
208+ return
209+ } catch ( e ) {
210+ const error = {
211+ type : 'UnknownError' ,
212+ message : `Location: Editor tutorial continue config.\n\n ${ e . message } ` ,
213+ }
214+ this . send ( { type : 'CONTINUE_FAILED' , payload : { error } } )
182215 }
183- const continueConfig : TT . TutorialConfig = tutorialContinue . config
184- await tutorialConfig ( {
185- config : continueConfig ,
186- alreadyConfigured : true ,
187- } )
188- // update the current stepId on startup
189- vscode . commands . executeCommand ( COMMANDS . SET_CURRENT_STEP , action . payload )
190- return
191216 case 'EDITOR_VALIDATE_SETUP' :
192- // check workspace is selected
193- const isEmptyWorkspace = await checkWorkspaceEmpty ( )
194- if ( ! isEmptyWorkspace ) {
195- const error : E . ErrorMessage = {
196- type : 'WorkspaceNotEmpty' ,
197- message : '' ,
198- actions : [
199- {
200- label : 'Open Workspace' ,
201- transition : 'REQUEST_WORKSPACE' ,
202- } ,
203- {
204- label : 'Check Again' ,
205- transition : 'RETRY' ,
206- } ,
207- ] ,
217+ try {
218+ // check workspace is selected
219+ const isEmptyWorkspace = await checkWorkspaceEmpty ( )
220+ if ( ! isEmptyWorkspace ) {
221+ const error : E . ErrorMessage = {
222+ type : 'WorkspaceNotEmpty' ,
223+ message : '' ,
224+ actions : [
225+ {
226+ label : 'Open Workspace' ,
227+ transition : 'REQUEST_WORKSPACE' ,
228+ } ,
229+ {
230+ label : 'Check Again' ,
231+ transition : 'RETRY' ,
232+ } ,
233+ ] ,
234+ }
235+ this . send ( { type : 'VALIDATE_SETUP_FAILED' , payload : { error } } )
236+ return
208237 }
209- this . send ( { type : 'VALIDATE_SETUP_FAILED' , payload : { error } } )
238+ // check Git is installed.
239+ // Should wait for workspace before running otherwise requires access to root folder
240+ const isGitInstalled = await version ( 'git' )
241+ if ( ! isGitInstalled ) {
242+ const error : E . ErrorMessage = {
243+ type : 'GitNotFound' ,
244+ message : '' ,
245+ actions : [
246+ {
247+ label : 'Check Again' ,
248+ transition : 'RETRY' ,
249+ } ,
250+ ] ,
251+ }
252+ this . send ( { type : 'VALIDATE_SETUP_FAILED' , payload : { error } } )
253+ return
254+ }
255+ this . send ( { type : 'SETUP_VALIDATED' } )
210256 return
211- }
212- // check Git is installed.
213- // Should wait for workspace before running otherwise requires access to root folder
214- const isGitInstalled = await version ( 'git' )
215- if ( ! isGitInstalled ) {
216- const error : E . ErrorMessage = {
217- type : 'GitNotFound' ,
218- message : '' ,
219- actions : [
220- {
221- label : 'Check Again' ,
222- transition : 'RETRY' ,
223- } ,
224- ] ,
257+ } catch ( e ) {
258+ const error = {
259+ type : 'UknownError' ,
260+ message : e . message ,
225261 }
226262 this . send ( { type : 'VALIDATE_SETUP_FAILED' , payload : { error } } )
227- return
228263 }
229- this . send ( { type : 'SETUP_VALIDATED' } )
230- return
231264 case 'EDITOR_REQUEST_WORKSPACE' :
232265 openWorkspace ( )
233266 return
0 commit comments