@learnpack/learnpack 2.1.25 → 2.1.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }