@learnpack/learnpack 2.1.25 → 2.1.27

Sign up to get free protection for your applications and to get access to all the features.
Files changed (187) hide show
  1. package/README.md +16 -16
  2. package/bin/run +17 -17
  3. package/bin/run.cmd +3 -3
  4. package/oclif.manifest.json +1 -1
  5. package/package.json +139 -138
  6. package/src/commands/audit.ts +134 -109
  7. package/src/commands/clean.ts +29 -29
  8. package/src/commands/download.ts +62 -62
  9. package/src/commands/init.ts +39 -39
  10. package/src/commands/login.ts +42 -42
  11. package/src/commands/logout.ts +43 -43
  12. package/src/commands/publish.ts +107 -107
  13. package/src/commands/start.ts +264 -234
  14. package/src/commands/test.ts +85 -85
  15. package/src/index.ts +1 -1
  16. package/src/managers/config/allowed_files.ts +29 -29
  17. package/src/managers/config/defaults.ts +4 -2
  18. package/src/managers/config/exercise.ts +309 -302
  19. package/src/managers/config/index.ts +159 -138
  20. package/src/managers/file.ts +178 -169
  21. package/src/managers/gitpod.ts +84 -84
  22. package/src/managers/server/index.ts +78 -69
  23. package/src/managers/server/routes.ts +139 -90
  24. package/src/managers/session.ts +147 -118
  25. package/src/managers/socket.ts +252 -239
  26. package/src/managers/test.ts +83 -83
  27. package/src/models/action.ts +10 -3
  28. package/src/models/config-manager.ts +23 -23
  29. package/src/models/config.ts +9 -2
  30. package/src/models/counter.ts +11 -11
  31. package/src/models/errors.ts +22 -22
  32. package/src/models/exercise-obj.ts +6 -3
  33. package/src/models/file.ts +5 -5
  34. package/src/models/findings.ts +18 -18
  35. package/src/models/flags.ts +10 -10
  36. package/src/models/front-matter.ts +11 -11
  37. package/src/models/gitpod-data.ts +19 -19
  38. package/src/models/language.ts +4 -4
  39. package/src/models/package.ts +7 -7
  40. package/src/models/plugin-config.ts +17 -17
  41. package/src/models/session.ts +29 -26
  42. package/src/models/socket.ts +54 -48
  43. package/src/models/status.ts +16 -15
  44. package/src/models/success-types.ts +1 -1
  45. package/src/plugin/command/compile.ts +17 -17
  46. package/src/plugin/command/test.ts +30 -30
  47. package/src/plugin/index.ts +6 -6
  48. package/src/plugin/plugin.ts +94 -94
  49. package/src/plugin/utils.ts +87 -87
  50. package/src/types/node-fetch.d.ts +1 -1
  51. package/src/ui/download.ts +71 -71
  52. package/src/utils/BaseCommand.ts +48 -48
  53. package/src/utils/SessionCommand.ts +48 -48
  54. package/src/utils/api.ts +246 -194
  55. package/src/utils/audit.ts +392 -395
  56. package/src/utils/console.ts +24 -24
  57. package/src/utils/errors.ts +117 -117
  58. package/src/utils/exercisesQueue.ts +51 -51
  59. package/src/utils/fileQueue.ts +198 -198
  60. package/src/utils/misc.ts +23 -23
  61. package/src/utils/templates/gitignore.txt +19 -19
  62. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.es.md +24 -24
  63. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.md +24 -24
  64. package/src/utils/templates/incremental/README.ejs +4 -4
  65. package/src/utils/templates/incremental/README.es.ejs +4 -4
  66. package/src/utils/templates/isolated/01-hello-world/README.es.md +26 -26
  67. package/src/utils/templates/isolated/01-hello-world/README.md +26 -26
  68. package/src/utils/templates/isolated/README.ejs +4 -4
  69. package/src/utils/templates/isolated/README.es.ejs +4 -4
  70. package/src/utils/templates/no-grading/README.ejs +4 -4
  71. package/src/utils/templates/no-grading/README.es.ejs +4 -4
  72. package/src/utils/validators.ts +18 -18
  73. package/src/utils/watcher.ts +14 -14
  74. package/lib/commands/audit.d.ts +0 -6
  75. package/lib/commands/audit.js +0 -317
  76. package/lib/commands/clean.d.ts +0 -8
  77. package/lib/commands/clean.js +0 -25
  78. package/lib/commands/download.d.ts +0 -13
  79. package/lib/commands/download.js +0 -55
  80. package/lib/commands/init.d.ts +0 -9
  81. package/lib/commands/init.js +0 -123
  82. package/lib/commands/login.d.ts +0 -14
  83. package/lib/commands/login.js +0 -37
  84. package/lib/commands/logout.d.ts +0 -14
  85. package/lib/commands/logout.js +0 -37
  86. package/lib/commands/publish.d.ts +0 -14
  87. package/lib/commands/publish.js +0 -82
  88. package/lib/commands/start.d.ts +0 -7
  89. package/lib/commands/start.js +0 -165
  90. package/lib/commands/test.d.ts +0 -6
  91. package/lib/commands/test.js +0 -62
  92. package/lib/index.d.ts +0 -1
  93. package/lib/index.js +0 -4
  94. package/lib/managers/config/allowed_files.d.ts +0 -5
  95. package/lib/managers/config/allowed_files.js +0 -30
  96. package/lib/managers/config/defaults.d.ts +0 -37
  97. package/lib/managers/config/defaults.js +0 -38
  98. package/lib/managers/config/exercise.d.ts +0 -36
  99. package/lib/managers/config/exercise.js +0 -230
  100. package/lib/managers/config/index.d.ts +0 -3
  101. package/lib/managers/config/index.js +0 -302
  102. package/lib/managers/file.d.ts +0 -13
  103. package/lib/managers/file.js +0 -134
  104. package/lib/managers/gitpod.d.ts +0 -3
  105. package/lib/managers/gitpod.js +0 -67
  106. package/lib/managers/server/index.d.ts +0 -6
  107. package/lib/managers/server/index.js +0 -51
  108. package/lib/managers/server/routes.d.ts +0 -4
  109. package/lib/managers/server/routes.js +0 -167
  110. package/lib/managers/session.d.ts +0 -3
  111. package/lib/managers/session.js +0 -104
  112. package/lib/managers/socket.d.ts +0 -3
  113. package/lib/managers/socket.js +0 -164
  114. package/lib/managers/test.d.ts +0 -0
  115. package/lib/managers/test.js +0 -84
  116. package/lib/models/action.d.ts +0 -2
  117. package/lib/models/action.js +0 -2
  118. package/lib/models/audit.d.ts +0 -15
  119. package/lib/models/audit.js +0 -2
  120. package/lib/models/config-manager.d.ts +0 -21
  121. package/lib/models/config-manager.js +0 -2
  122. package/lib/models/config.d.ts +0 -60
  123. package/lib/models/config.js +0 -2
  124. package/lib/models/counter.d.ts +0 -11
  125. package/lib/models/counter.js +0 -2
  126. package/lib/models/errors.d.ts +0 -15
  127. package/lib/models/errors.js +0 -2
  128. package/lib/models/exercise-obj.d.ts +0 -27
  129. package/lib/models/exercise-obj.js +0 -2
  130. package/lib/models/file.d.ts +0 -5
  131. package/lib/models/file.js +0 -2
  132. package/lib/models/findings.d.ts +0 -17
  133. package/lib/models/findings.js +0 -2
  134. package/lib/models/flags.d.ts +0 -10
  135. package/lib/models/flags.js +0 -2
  136. package/lib/models/front-matter.d.ts +0 -11
  137. package/lib/models/front-matter.js +0 -2
  138. package/lib/models/gitpod-data.d.ts +0 -16
  139. package/lib/models/gitpod-data.js +0 -2
  140. package/lib/models/language.d.ts +0 -4
  141. package/lib/models/language.js +0 -2
  142. package/lib/models/package.d.ts +0 -7
  143. package/lib/models/package.js +0 -2
  144. package/lib/models/plugin-config.d.ts +0 -16
  145. package/lib/models/plugin-config.js +0 -2
  146. package/lib/models/session.d.ts +0 -23
  147. package/lib/models/session.js +0 -2
  148. package/lib/models/socket.d.ts +0 -31
  149. package/lib/models/socket.js +0 -2
  150. package/lib/models/status.d.ts +0 -1
  151. package/lib/models/status.js +0 -2
  152. package/lib/models/success-types.d.ts +0 -1
  153. package/lib/models/success-types.js +0 -2
  154. package/lib/plugin/command/compile.d.ts +0 -6
  155. package/lib/plugin/command/compile.js +0 -18
  156. package/lib/plugin/command/test.d.ts +0 -6
  157. package/lib/plugin/command/test.js +0 -25
  158. package/lib/plugin/index.d.ts +0 -27
  159. package/lib/plugin/index.js +0 -7
  160. package/lib/plugin/plugin.d.ts +0 -8
  161. package/lib/plugin/plugin.js +0 -68
  162. package/lib/plugin/utils.d.ts +0 -16
  163. package/lib/plugin/utils.js +0 -58
  164. package/lib/ui/download.d.ts +0 -5
  165. package/lib/ui/download.js +0 -61
  166. package/lib/utils/BaseCommand.d.ts +0 -8
  167. package/lib/utils/BaseCommand.js +0 -41
  168. package/lib/utils/SessionCommand.d.ts +0 -10
  169. package/lib/utils/SessionCommand.js +0 -47
  170. package/lib/utils/api.d.ts +0 -12
  171. package/lib/utils/api.js +0 -173
  172. package/lib/utils/audit.d.ts +0 -16
  173. package/lib/utils/audit.js +0 -302
  174. package/lib/utils/console.d.ts +0 -12
  175. package/lib/utils/console.js +0 -19
  176. package/lib/utils/errors.d.ts +0 -17
  177. package/lib/utils/errors.js +0 -100
  178. package/lib/utils/exercisesQueue.d.ts +0 -9
  179. package/lib/utils/exercisesQueue.js +0 -38
  180. package/lib/utils/fileQueue.d.ts +0 -40
  181. package/lib/utils/fileQueue.js +0 -168
  182. package/lib/utils/misc.d.ts +0 -1
  183. package/lib/utils/misc.js +0 -23
  184. package/lib/utils/validators.d.ts +0 -5
  185. package/lib/utils/validators.js +0 -17
  186. package/lib/utils/watcher.d.ts +0 -2
  187. package/lib/utils/watcher.js +0 -23
@@ -1,234 +1,264 @@
1
- // import path from "path";
2
- import { flags } from "@oclif/command";
3
- import SessionCommand from "../utils/SessionCommand";
4
- import Console from "../utils/console";
5
- import socket from "../managers/socket";
6
- import queue from "../utils/fileQueue";
7
- import { decompress, downloadEditor } from "../managers/file";
8
- import { prioritizeHTMLFile } from "../utils/misc";
9
-
10
- import createServer from "../managers/server";
11
-
12
- import { IGitpodData } from "../models/gitpod-data";
13
- import { IExercise, IExerciseData } from "../models/exercise-obj";
14
-
15
- export default class StartCommand extends SessionCommand {
16
- static description = "Runs a small server with all the exercise instructions";
17
-
18
- static flags = {
19
- ...SessionCommand.flags,
20
- port: flags.string({ char: "p", description: "server port" }),
21
- host: flags.string({ char: "h", description: "server host" }),
22
- disableGrading: flags.boolean({
23
- char: "D",
24
- description: "disble grading functionality",
25
- default: false,
26
- }),
27
- // disableGrading: flags.boolean({char: 'dg', description: 'disble grading functionality', default: false }),
28
- watch: flags.boolean({
29
- char: "w",
30
- description: "Watch for file changes",
31
- default: false,
32
- }),
33
- editor: flags.string({
34
- char: "e",
35
- description: "[standalone, gitpod]",
36
- options: ["standalone", "gitpod"],
37
- }),
38
- version: flags.string({
39
- char: "v",
40
- description: "E.g: 1.0.1",
41
- default: undefined,
42
- }),
43
- grading: flags.string({
44
- char: "g",
45
- description: "[isolated, incremental]",
46
- options: ["isolated", "incremental"],
47
- }),
48
- debug: flags.boolean({
49
- char: "d",
50
- description: "debugger mode for more verbage",
51
- default: false,
52
- }),
53
- };
54
-
55
- // 🛑 IMPORTANT
56
- // Every command that will use the configManager needs this init method
57
- async init() {
58
- const { flags } = this.parse(StartCommand);
59
- await this.initSession(flags);
60
- }
61
-
62
- async run() {
63
- // get configuration object
64
- const configObject = this.configManager?.get();
65
- const config = configObject?.config;
66
-
67
- if (configObject) {
68
- const { config } = configObject;
69
-
70
- // build exerises
71
- this.configManager?.buildIndex();
72
-
73
- Console.debug(
74
- `Grading: ${config?.grading} ${
75
- config?.disabledActions?.includes("test") ? "(disabled)" : ""
76
- }, editor: ${config?.editor.mode} ${config?.editor.version}, for ${
77
- Array.isArray(configObject?.exercises) ?
78
- configObject?.exercises.length :
79
- 0
80
- } exercises found`
81
- );
82
-
83
- // download app and decompress
84
- await downloadEditor(
85
- config?.editor.version,
86
- `${config?.dirPath}/app.tar.gz`
87
- );
88
-
89
- Console.info("Decompressing LearnPack UI, this may take a minute...");
90
- await decompress(
91
- `${config?.dirPath}/app.tar.gz`,
92
- `${config?.dirPath}/_app/`
93
- );
94
-
95
- // listen to socket commands
96
- if (config && this.configManager) {
97
- const server = await createServer(configObject, this.configManager);
98
-
99
- const dispatcher = queue.dispatcher({
100
- create: true,
101
- path: `${config.dirPath}/vscode_queue.json`,
102
- });
103
-
104
- socket.start(config, server, false);
105
-
106
- socket.on("open", (data: IGitpodData) => {
107
- Console.debug("Opening these files: ", data);
108
- const files = prioritizeHTMLFile(data.files);
109
- dispatcher.enqueue(dispatcher.events.OPEN_FILES, files);
110
- socket.ready("Ready to compile...");
111
- });
112
-
113
- socket.on("open_window", (data: IGitpodData) => {
114
- Console.debug("Opening window: ", data);
115
- dispatcher.enqueue(dispatcher.events.OPEN_WINDOW, data);
116
- socket.ready("Ready to compile...");
117
- });
118
-
119
- socket.on("reset", (exercise: IExerciseData) => {
120
- try {
121
- this.configManager?.reset(exercise.exerciseSlug);
122
- dispatcher.enqueue(
123
- dispatcher.events.RESET_EXERCISE,
124
- exercise.exerciseSlug
125
- );
126
- socket.ready("Ready to compile...");
127
- } catch (error) {
128
- socket.error(
129
- "compiler-error",
130
- (error as TypeError).message ||
131
- "There was an error reseting the exercise"
132
- );
133
- setTimeout(() => socket.ready("Ready to compile..."), 2000);
134
- }
135
- });
136
- // socket.on("preview", (data) => {
137
- // Console.debug("Preview triggered, removing the 'preview' action ")
138
- // socket.removeAllowed("preview")
139
- // socket.log('ready',['Ready to compile...'])
140
- // })
141
-
142
- socket.on("build", async (data: IExerciseData) => {
143
- const exercise = this.configManager?.getExercise(data.exerciseSlug);
144
-
145
- if (!exercise?.language) {
146
- socket.error(
147
- "compiler-error",
148
- "Impossible to detect language to build for " +
149
- data.exerciseSlug +
150
- "..."
151
- );
152
- return;
153
- }
154
-
155
- socket.log(
156
- "compiling",
157
- "Building exercise " +
158
- data.exerciseSlug +
159
- " with " +
160
- exercise.language +
161
- "..."
162
- );
163
- await this.config.runHook("action", {
164
- action: "compile",
165
- socket,
166
- configuration: config,
167
- exercise,
168
- });
169
- });
170
-
171
- socket.on("test", async (data: IExerciseData) => {
172
- const exercise = this.configManager?.getExercise(data.exerciseSlug);
173
-
174
- if (!exercise?.language) {
175
- socket.error(
176
- "compiler-error",
177
- "Impossible to detect engine language for testing for " +
178
- data.exerciseSlug +
179
- "..."
180
- );
181
- return;
182
- }
183
-
184
- if (
185
- config?.disabledActions!.includes("test") ||
186
- config?.disableGrading
187
- ) {
188
- socket.ready("Grading is disabled on configuration");
189
- return true;
190
- }
191
-
192
- socket.log(
193
- "testing",
194
- "Testing your exercise using the " + exercise.language + " engine."
195
- );
196
-
197
- await this.config.runHook("action", {
198
- action: "test",
199
- socket,
200
- configuration: config,
201
- exercise,
202
- });
203
- this.configManager?.save();
204
-
205
- return true;
206
- });
207
-
208
- const terminate = () => {
209
- Console.debug("Terminating Learnpack...");
210
- server.terminate(() => {
211
- this.configManager?.noCurrentExercise();
212
- dispatcher.enqueue(dispatcher.events.END);
213
- process.exit();
214
- });
215
- };
216
-
217
- server.on("close", terminate);
218
- process.on("SIGINT", terminate);
219
- process.on("SIGTERM", terminate);
220
- process.on("SIGHUP", terminate);
221
-
222
- // finish the server startup
223
- setTimeout(() => dispatcher.enqueue(dispatcher.events.RUNNING), 1000);
224
-
225
- // start watching for file changes
226
-
227
- if (StartCommand.flags.watch)
228
- this.configManager.watchIndex(_exercises =>
229
- socket.reload(null, _exercises)
230
- );
231
- }
232
- }
233
- }
234
- }
1
+ // import path from "path";
2
+ import { flags } from "@oclif/command"
3
+
4
+ import SessionCommand from "../utils/SessionCommand"
5
+ import Console from "../utils/console"
6
+ import socket from "../managers/socket"
7
+ import queue from "../utils/fileQueue"
8
+ import {
9
+ decompress,
10
+ downloadEditor,
11
+ checkIfDirectoryExists,
12
+ } from "../managers/file"
13
+ import { prioritizeHTMLFile } from "../utils/misc"
14
+
15
+ import createServer from "../managers/server"
16
+
17
+ import { IGitpodData } from "../models/gitpod-data"
18
+ import { IExercise, IExerciseData } from "../models/exercise-obj"
19
+
20
+ export default class StartCommand extends SessionCommand {
21
+ static description = "Runs a small server with all the exercise instructions"
22
+
23
+ static flags = {
24
+ ...SessionCommand.flags,
25
+ port: flags.string({ char: "p", description: "server port" }),
26
+ host: flags.string({ char: "h", description: "server host" }),
27
+ disableGrading: flags.boolean({
28
+ char: "D",
29
+ description: "disble grading functionality",
30
+ default: false,
31
+ }),
32
+ // disableGrading: flags.boolean({char: 'dg', description: 'disble grading functionality', default: false }),
33
+ watch: flags.boolean({
34
+ char: "w",
35
+ description: "Watch for file changes",
36
+ default: false,
37
+ }),
38
+ editor: flags.string({
39
+ char: "e",
40
+ description: "[standalone, gitpod]",
41
+ options: ["standalone", "gitpod"],
42
+ }),
43
+ version: flags.string({
44
+ char: "v",
45
+ description: "E.g: 1.0.1",
46
+ default: undefined,
47
+ }),
48
+ grading: flags.string({
49
+ char: "g",
50
+ description: "[isolated, incremental]",
51
+ options: ["isolated", "incremental"],
52
+ }),
53
+ debug: flags.boolean({
54
+ char: "d",
55
+ description: "debugger mode for more verbage",
56
+ default: false,
57
+ }),
58
+ }
59
+
60
+ // 🛑 IMPORTANT
61
+ // Every command that will use the configManager needs this init method
62
+ async init() {
63
+ const { flags } = this.parse(StartCommand)
64
+ await this.initSession(flags)
65
+ }
66
+
67
+ async run() {
68
+ // get configuration object
69
+ const configObject = this.configManager?.get()
70
+ const config = configObject?.config
71
+
72
+ if (configObject) {
73
+ const { config } = configObject
74
+
75
+ // build exerises
76
+ this.configManager?.buildIndex()
77
+
78
+ Console.debug(
79
+ `Grading: ${config?.grading} ${
80
+ config?.disabledActions?.includes("test") ? "(disabled)" : ""
81
+ }, editor: ${config?.editor.mode} ${config?.editor.version}, for ${
82
+ Array.isArray(configObject?.exercises) ?
83
+ configObject?.exercises.length :
84
+ 0
85
+ } exercises found`
86
+ )
87
+
88
+ const appAlreadyExists = checkIfDirectoryExists(
89
+ `${config?.dirPath}/_app`
90
+ )
91
+
92
+ if (!appAlreadyExists) {
93
+ // download app and decompress
94
+ await downloadEditor(
95
+ config?.editor.version,
96
+ `${config?.dirPath}/app.tar.gz`
97
+ )
98
+
99
+ Console.info("Decompressing LearnPack UI, this may take a minute...")
100
+ await decompress(
101
+ `${config?.dirPath}/app.tar.gz`,
102
+ `${config?.dirPath}/_app/`
103
+ )
104
+ }
105
+
106
+ // listen to socket commands
107
+ if (config && this.configManager) {
108
+ const server = await createServer(
109
+ configObject,
110
+ this.configManager,
111
+ process.env.NODE_ENV === "test"
112
+ )
113
+
114
+ const dispatcher = queue.dispatcher({
115
+ create: true,
116
+ path: `${config.dirPath}/vscode_queue.json`,
117
+ })
118
+
119
+ socket.start(config, server, false)
120
+
121
+ socket.on("open", (data: IGitpodData) => {
122
+ Console.debug("Opening these files: ", data)
123
+ console.log("Opening files", data)
124
+
125
+ const files = prioritizeHTMLFile(data.files)
126
+ // console.log("files",files);
127
+
128
+ dispatcher.enqueue(dispatcher.events.OPEN_FILES, files)
129
+ socket.ready("Ready to compile...")
130
+ })
131
+
132
+ socket.on("open_window", (data: IGitpodData) => {
133
+ Console.debug("Opening window: ", data)
134
+ dispatcher.enqueue(dispatcher.events.OPEN_WINDOW, data)
135
+ console.log(data)
136
+
137
+ socket.ready("Ready to compile...")
138
+ })
139
+
140
+ socket.on("reset", (exercise: IExerciseData) => {
141
+ try {
142
+ this.configManager?.reset(exercise.exerciseSlug)
143
+ dispatcher.enqueue(
144
+ dispatcher.events.RESET_EXERCISE,
145
+ exercise.exerciseSlug
146
+ )
147
+ socket.ready("Ready to compile...")
148
+ } catch (error) {
149
+ socket.error(
150
+ "compiler-error",
151
+ (error as TypeError).message ||
152
+ "There was an error reseting the exercise"
153
+ )
154
+ setTimeout(() => socket.ready("Ready to compile..."), 2000)
155
+ }
156
+ })
157
+ // socket.on("preview", (data) => {
158
+ // Console.debug("Preview triggered, removing the 'preview' action ")
159
+ // socket.removeAllowed("preview")
160
+ // socket.log('ready',['Ready to compile...'])
161
+ // })
162
+
163
+ socket.on("build", async (data: IExerciseData) => {
164
+ const exercise = this.configManager?.getExercise(data.exerciseSlug)
165
+
166
+ if (!exercise?.language) {
167
+ socket.error(
168
+ "compiler-error",
169
+ "Impossible to detect language to build for " +
170
+ data.exerciseSlug +
171
+ "..."
172
+ )
173
+ return
174
+ }
175
+
176
+ socket.log(
177
+ "compiling",
178
+ "Building exercise " +
179
+ data.exerciseSlug +
180
+ " with " +
181
+ exercise.language +
182
+ "..."
183
+ )
184
+ await this.config.runHook("action", {
185
+ action: "compile",
186
+ socket,
187
+ configuration: config,
188
+ exercise,
189
+ })
190
+ })
191
+
192
+ socket.on("generate", async (data: IExerciseData) => {
193
+ console.log("data", data)
194
+ })
195
+
196
+ socket.on("test", async (data: IExerciseData) => {
197
+ const exercise = this.configManager?.getExercise(data.exerciseSlug)
198
+
199
+ console.log("data", data)
200
+
201
+ if (!exercise?.language) {
202
+ socket.error(
203
+ "compiler-error",
204
+ "Impossible to detect engine language for testing for " +
205
+ data.exerciseSlug +
206
+ "..."
207
+ )
208
+ return
209
+ }
210
+
211
+ if (
212
+ config?.disabledActions!.includes("test") ||
213
+ config?.disableGrading
214
+ ) {
215
+ socket.ready("Grading is disabled on configuration")
216
+ return true
217
+ }
218
+
219
+ socket.log(
220
+ "testing",
221
+ "Testing your exercise using the " + exercise.language + " engine."
222
+ )
223
+
224
+ console.log("About to call runHook")
225
+
226
+ await this.config.runHook("action", {
227
+ action: "test",
228
+ socket,
229
+ configuration: config,
230
+ exercise,
231
+ })
232
+
233
+ this.configManager?.save()
234
+
235
+ return true
236
+ })
237
+
238
+ const terminate = () => {
239
+ Console.debug("Terminating Learnpack...")
240
+ server.terminate(() => {
241
+ this.configManager?.noCurrentExercise()
242
+ dispatcher.enqueue(dispatcher.events.END)
243
+ process.exit()
244
+ })
245
+ }
246
+
247
+ server.on("close", terminate)
248
+ process.on("SIGINT", terminate)
249
+ process.on("SIGTERM", terminate)
250
+ process.on("SIGHUP", terminate)
251
+
252
+ // finish the server startup
253
+ setTimeout(() => dispatcher.enqueue(dispatcher.events.RUNNING), 1000)
254
+
255
+ // start watching for file changes
256
+
257
+ if (StartCommand.flags.watch)
258
+ this.configManager.watchIndex(_exercises =>
259
+ socket.reload(null, _exercises)
260
+ )
261
+ }
262
+ }
263
+ }
264
+ }