@@ -3,6 +3,7 @@ import * as cp from "child_process"
33import { promises as fs } from "fs"
44import * as path from "path"
55import { Page } from "playwright"
6+ import util from "util"
67import { logError , plural } from "../../../src/common/util"
78import { onLine } from "../../../src/node/util"
89import { PASSWORD , workspaceDir } from "../../utils/constants"
@@ -39,7 +40,11 @@ export class CodeServer {
3940 private closed = false
4041 private _workspaceDir : Promise < string > | undefined
4142
42- constructor ( name : string , private readonly codeServerArgs : string [ ] ) {
43+ constructor (
44+ name : string ,
45+ private readonly codeServerArgs : string [ ] ,
46+ private readonly codeServerEnv : NodeJS . ProcessEnv ,
47+ ) {
4348 this . logger = logger . named ( name )
4449 }
4550
@@ -96,6 +101,8 @@ export class CodeServer {
96101 "node" ,
97102 [
98103 process . env . CODE_SERVER_TEST_ENTRY || "." ,
104+ "--extensions-dir" ,
105+ path . join ( dir , "extensions" ) ,
99106 ...this . codeServerArgs ,
100107 // Using port zero will spawn on a random port.
101108 "--bind-addr" ,
@@ -107,15 +114,14 @@ export class CodeServer {
107114 path . join ( dir , "config.yaml" ) ,
108115 "--user-data-dir" ,
109116 dir ,
110- "--extensions-dir" ,
111- path . join ( __dirname , "../extensions" ) ,
112117 // The last argument is the workspace to open.
113118 dir ,
114119 ] ,
115120 {
116121 cwd : path . join ( __dirname , "../../.." ) ,
117122 env : {
118123 ...process . env ,
124+ ...this . codeServerEnv ,
119125 PASSWORD ,
120126 } ,
121127 } ,
@@ -462,4 +468,24 @@ export class CodeServerPage {
462468 await this . reloadUntilEditorIsReady ( )
463469 }
464470 }
471+
472+ /**
473+ * Execute a command in t root of the instance's workspace directory.
474+ */
475+ async exec ( command : string ) : Promise < void > {
476+ await util . promisify ( cp . exec ) ( command , {
477+ cwd : await this . workspaceDir ,
478+ } )
479+ }
480+
481+ /**
482+ * Install an extension by ID to the instance's temporary extension
483+ * directory.
484+ */
485+ async installExtension ( id : string ) : Promise < void > {
486+ const dir = path . join ( await this . workspaceDir , "extensions" )
487+ await util . promisify ( cp . exec ) ( `node . --install-extension ${ id } --extensions-dir ${ dir } ` , {
488+ cwd : path . join ( __dirname , "../../.." ) ,
489+ } )
490+ }
465491}
0 commit comments