@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,239 +1,252 @@
1
- import {Socket, Server} from 'socket.io'
2
- import Console from '../utils/console'
3
- import queue from '../utils/fileQueue'
4
-
5
- import {ISocket, TPossibleActions} from '../models/socket'
6
- import {IConfig} from '../models/config'
7
- import {ICallback, TAction} from '../models/action'
8
- import {IExercise, IExerciseData} from '../models/exercise-obj'
9
- import {TStatus} from '../models/status'
10
- import {TSuccessType} from '../models/success-types'
11
- import * as http from 'http'
12
-
13
- const SocketManager: ISocket = {
14
- socket: null,
15
- config: null,
16
- allowedActions: [],
17
- possibleActions: ['build', 'reset', 'test', 'tutorial'],
18
- isTestingEnvironment: false,
19
- actionCallBacks: {
20
- clean: (_, s: { logs: Array<string> }) => {
21
- s.logs = []
22
- },
23
- },
24
- addAllowed: function (actions: Array<TPossibleActions> | TPossibleActions) {
25
- if (!Array.isArray(actions))
26
- actions = [actions]
27
-
28
- // avoid adding the "test" action if grading is disabled
29
- if (
30
- actions.includes('test') &&
31
- this.config?.disabledActions?.includes('test')
32
- ) {
33
- actions = actions.filter((a: TPossibleActions) => a !== 'test')
34
- }
35
-
36
- this.allowedActions = [
37
- ...(this.allowedActions || []).filter(
38
- (a: TPossibleActions) => !actions.includes(a),
39
- ),
40
- ...actions,
41
- ]
42
- },
43
- removeAllowed: function (
44
- actions: Array<TPossibleActions> | TPossibleActions,
45
- ) {
46
- if (!Array.isArray(actions)) {
47
- actions = [actions]
48
- }
49
-
50
- this.allowedActions = (this.allowedActions || []).filter(
51
- (a: TPossibleActions) => !actions.includes(a),
52
- )
53
- },
54
- start: function (
55
- config: IConfig,
56
- server: http.Server,
57
- isTestingEnvironment = false,
58
- ) {
59
- this.config = config
60
- this.isTestingEnvironment = isTestingEnvironment
61
-
62
- this.socket = new Server(server, {allowEIO3: true})
63
-
64
- this.allowedActions = this.config?.disabledActions?.includes('test') ||
65
- this.config?.disableGrading ? this.possibleActions.filter(
66
- a => !this.config?.disabledActions?.includes(a) && a !== 'test',
67
- ) : this.possibleActions.filter(
68
- a => !this.allowedActions?.includes(a),
69
- )
70
-
71
- if (this.config?.grading === 'incremental') {
72
- this.removeAllowed('reset')
73
- }
74
-
75
- if (this.socket) {
76
- this.socket.on('connection', (socket: Socket) => {
77
- Console.debug(
78
- 'Connection with client successfully established',
79
- this.allowedActions,
80
- )
81
- if (!this.isTestingEnvironment) {
82
- this.log('ready', ['Ready to compile or test...'])
83
- }
84
-
85
- socket.on(
86
- 'compiler',
87
- ({action, data}: { action: string; data: IExerciseData }) => {
88
- this.emit('clean', 'pending', ['Working...'])
89
-
90
- if (typeof data.exerciseSlug === 'undefined') {
91
- this.log('internal-error', ['No exercise slug specified'])
92
- Console.error('No exercise slug especified')
93
- return
94
- }
95
-
96
- if (
97
- this.actionCallBacks &&
98
- typeof this.actionCallBacks[action] === 'function'
99
- ) {
100
- this.actionCallBacks[action](data)
101
- } else {
102
- this.log('internal-error', ['Uknown action ' + action])
103
- }
104
- },
105
- )
106
- })
107
- }
108
- },
109
- on: function (action: TAction, callBack: ICallback) {
110
- if (this.actionCallBacks) {
111
- this.actionCallBacks[action] = callBack
112
- }
113
- },
114
- clean: function (_ = 'pending', logs = []) {
115
- this.emit('clean', 'pending', logs)
116
- },
117
- ask: function (questions = []) {
118
- return new Promise((resolve, _) => {
119
- this.emit('ask', 'pending', ['Waiting for input...'], questions)
120
- this.on('input', ({inputs}: any) => {
121
- // Workaround to fix issue because null inputs
122
- let isNull = false
123
- // eslint-disable-next-line
124
- inputs.forEach((input: any) => {
125
- if (input === null) {
126
- isNull = true
127
- }
128
- })
129
-
130
- if (!isNull) {
131
- resolve(inputs)
132
- }
133
- })
134
- })
135
- },
136
- reload: function (
137
- files: Array<string> | null = null,
138
- exercises: Array<string> | null = null,
139
- ) {
140
- this.emit(
141
- 'reload',
142
- files?.join('') || '' /* TODO: Check it out this */,
143
- exercises!,
144
- )
145
- },
146
- openWindow: function (url = '') {
147
- queue.dispatcher().enqueue(queue.events.OPEN_WINDOW, url)
148
- this.emit(
149
- queue.events.OPEN_WINDOW as TAction,
150
- 'ready',
151
- [`Opening ${url}`],
152
- [],
153
- [],
154
- url,
155
- )
156
- },
157
- log: function (
158
- status: TStatus,
159
- messages: string | Array<string> = [],
160
- report: Array<string> = [],
161
- data: any = null,
162
- ) {
163
- this.emit('log', status, messages, [], report, data)
164
- Console.log(messages)
165
- },
166
- emit: function (
167
- action: TAction,
168
- status: TStatus | string = 'ready',
169
- logs: string | Array<string> = [],
170
- inputs: Array<string> = [],
171
- report: Array<string> = [],
172
- data: any = null,
173
- ) {
174
- if (
175
- this.config?.compiler &&
176
- ['webpack', 'vanillajs', 'vue', 'react', 'css', 'html'].includes(
177
- this.config?.compiler,
178
- )
179
- ) {
180
- if (['compiler-success', 'compiler-warning'].includes(status))
181
- this.addAllowed('preview')
182
- if (['compiler-error'].includes(status) || action === 'ready')
183
- this.removeAllowed('preview')
184
- }
185
-
186
- if (this.config?.grading === 'incremental') {
187
- this.removeAllowed('reset')
188
- }
189
-
190
- // eslint-disable-next-line
191
- this.config?.disabledActions?.forEach((a) => this.removeAllowed(a));
192
-
193
- this.socket?.emit('compiler', {
194
- action,
195
- status,
196
- logs,
197
- allowed: this.allowedActions,
198
- inputs,
199
- report,
200
- data,
201
- })
202
- },
203
-
204
- ready: function (message: string) {
205
- this.log('ready', [message])
206
- },
207
- success: function (type: TSuccessType, stdout: string) {
208
- const types = ['compiler', 'testing']
209
- if (!types.includes(type))
210
- this.fatal(`Invalid socket success type "${type}" on socket`)
211
- else if (stdout === '')
212
- this.log((type + '-success') as TSuccessType, [
213
- 'No stdout to display on the console',
214
- ])
215
- else
216
- this.log((type + '-success') as TSuccessType, [stdout])
217
- },
218
- error: function (type: TStatus, stdout: string) {
219
- console.error('Socket error: ' + type, stdout)
220
- this.log(type, [stdout])
221
-
222
- if (this.isTestingEnvironment) {
223
- this.onTestingFinished({
224
- result: 'failed',
225
- })
226
- }
227
- },
228
- fatal: function (msg: string) {
229
- this.log('internal-error', [msg])
230
- throw msg
231
- },
232
- onTestingFinished: function (result: any) {
233
- if (this.config?.testingFinishedCallback) {
234
- this.config.testingFinishedCallback(result)
235
- }
236
- },
237
- }
238
-
239
- export default SocketManager
1
+ import { Socket, Server } from "socket.io"
2
+ import Console from "../utils/console"
3
+ import queue from "../utils/fileQueue"
4
+
5
+ import { ISocket, TPossibleActions } from "../models/socket"
6
+ import { IConfig } from "../models/config"
7
+ import { ICallback, TAction } from "../models/action"
8
+ import { IExercise, IExerciseData } from "../models/exercise-obj"
9
+ import { TStatus } from "../models/status"
10
+ import { TSuccessType } from "../models/success-types"
11
+ import * as http from "http"
12
+
13
+ const SocketManager: ISocket = {
14
+ socket: null,
15
+ config: null,
16
+ allowedActions: [],
17
+ possibleActions: ["build", "reset", "test", "tutorial"],
18
+ isTestingEnvironment: false,
19
+ actionCallBacks: {
20
+ clean: (_, s: { logs: Array<string> }) => {
21
+ s.logs = []
22
+ },
23
+ },
24
+ addAllowed: function (actions: Array<TPossibleActions> | TPossibleActions) {
25
+ if (!Array.isArray(actions))
26
+ actions = [actions]
27
+
28
+ // avoid adding the "test" action if grading is disabled
29
+ if (
30
+ actions.includes("test") &&
31
+ this.config?.disabledActions?.includes("test")
32
+ ) {
33
+ actions = actions.filter((a: TPossibleActions) => a !== "test")
34
+ }
35
+
36
+ this.allowedActions = [
37
+ ...(this.allowedActions || []).filter(
38
+ (a: TPossibleActions) => !actions.includes(a)
39
+ ),
40
+ ...actions,
41
+ ]
42
+ },
43
+ removeAllowed: function (
44
+ actions: Array<TPossibleActions> | TPossibleActions
45
+ ) {
46
+ if (!Array.isArray(actions)) {
47
+ actions = [actions]
48
+ }
49
+
50
+ this.allowedActions = (this.allowedActions || []).filter(
51
+ (a: TPossibleActions) => !actions.includes(a)
52
+ )
53
+ },
54
+ start: function (
55
+ config: IConfig,
56
+ server: http.Server,
57
+ isTestingEnvironment = false
58
+ ) {
59
+ this.config = config
60
+ this.isTestingEnvironment = isTestingEnvironment
61
+ this.socket = new Server(server, {
62
+ allowEIO3: true,
63
+ cors: {
64
+ origin: "http://localhost:5173",
65
+ methods: ["GET", "POST"],
66
+ },
67
+ })
68
+
69
+ this.allowedActions =
70
+ this.config?.disabledActions?.includes("test") ||
71
+ this.config?.disableGrading ?
72
+ this.possibleActions.filter(
73
+ a => !this.config?.disabledActions?.includes(a) && a !== "test"
74
+ ) :
75
+ this.possibleActions.filter(a => !this.allowedActions?.includes(a))
76
+
77
+ if (this.config?.grading === "incremental") {
78
+ this.removeAllowed("reset")
79
+ }
80
+
81
+ if (this.socket) {
82
+ this.socket.on("connection", (socket: Socket) => {
83
+ Console.debug(
84
+ "Connection with client successfully established",
85
+ this.allowedActions
86
+ )
87
+ if (!this.isTestingEnvironment) {
88
+ this.log("ready", ["Ready to compile or test..."])
89
+ }
90
+
91
+ socket.on(
92
+ "compiler",
93
+ ({ action, data }: { action: string; data: IExerciseData }) => {
94
+ this.emit("clean", "pending", ["Working..."])
95
+ if (typeof data.exerciseSlug === "undefined") {
96
+ this.log("internal-error", ["No exercise slug specified"])
97
+ Console.error("No exercise slug especified")
98
+ return
99
+ }
100
+
101
+ if (
102
+ this.actionCallBacks &&
103
+ typeof this.actionCallBacks[action] === "function"
104
+ ) {
105
+ this.actionCallBacks[action](data)
106
+ } else {
107
+ this.log("internal-error", ["Uknown action " + action])
108
+ }
109
+ }
110
+ )
111
+ })
112
+ }
113
+ },
114
+ on: function (action: TAction, callBack: ICallback) {
115
+ if (this.actionCallBacks) {
116
+ this.actionCallBacks[action] = callBack
117
+ }
118
+ },
119
+ clean: function (_ = "pending", logs = []) {
120
+ this.emit("clean", "pending", logs)
121
+ },
122
+ ask: function (questions = []) {
123
+ return new Promise((resolve, _) => {
124
+ this.emit("ask", "pending", ["Waiting for input..."], questions)
125
+ console.log("Setting up listeners")
126
+ this.on("input", ({ inputs }: any) => {
127
+ // Workaround to fix issue because null inputs
128
+
129
+ console.log("inputs", inputs)
130
+
131
+ let isNull = false
132
+ // eslint-disable-next-line
133
+ inputs.forEach((input: any) => {
134
+ if (input === null) {
135
+ isNull = true
136
+ }
137
+ })
138
+
139
+ if (!isNull) {
140
+ resolve(inputs)
141
+ }
142
+ })
143
+ })
144
+ },
145
+ reload: function (
146
+ files: Array<string> | null = null,
147
+ exercises: Array<string> | null = null
148
+ ) {
149
+ this.emit(
150
+ "reload",
151
+ files?.join("") || "" /* TODO: Check it out this */,
152
+ exercises!
153
+ )
154
+ },
155
+ openWindow: function (url = "") {
156
+ queue.dispatcher().enqueue(queue.events.OPEN_WINDOW, url)
157
+ this.emit(
158
+ queue.events.OPEN_WINDOW as TAction,
159
+ "ready",
160
+ [`Opening ${url}`],
161
+ [],
162
+ [],
163
+ url
164
+ )
165
+ },
166
+ log: function (
167
+ status: TStatus,
168
+ messages: string | Array<string> = [],
169
+ report: Array<string> = [],
170
+ data: any = null
171
+ ) {
172
+ this.emit("log", status, messages, [], report, data)
173
+ Console.log(messages)
174
+ },
175
+ emit: function (
176
+ action: TAction,
177
+ status: TStatus | string = "ready",
178
+ logs: string | Array<string> = [],
179
+ inputs: Array<string> = [],
180
+ report: Array<string> = [],
181
+ data: any = null
182
+ ) {
183
+ if (
184
+ this.config?.compiler &&
185
+ ["webpack", "vanillajs", "vue", "react", "css", "html"].includes(
186
+ this.config?.compiler
187
+ )
188
+ ) {
189
+ if (["compiler-success", "compiler-warning"].includes(status))
190
+ this.addAllowed("preview")
191
+ if (["compiler-error"].includes(status) || action === "ready")
192
+ this.removeAllowed("preview")
193
+ }
194
+
195
+ if (this.config?.grading === "incremental") {
196
+ this.removeAllowed("reset")
197
+ }
198
+
199
+ // eslint-disable-next-line
200
+ this.config?.disabledActions?.forEach((a) => this.removeAllowed(a));
201
+
202
+ this.socket?.emit("compiler", {
203
+ action,
204
+ status,
205
+ logs,
206
+ allowed: this.allowedActions,
207
+ inputs,
208
+ report,
209
+ data,
210
+ })
211
+ },
212
+
213
+ ready: function (message: string) {
214
+ this.log("ready", [message])
215
+ },
216
+ success: function (type: TSuccessType, stdout: string) {
217
+ const types = ["compiler", "testing"]
218
+ if (!types.includes(type))
219
+ this.fatal(`Invalid socket success type "${type}" on socket`)
220
+ else if (stdout === "")
221
+ this.log((type + "-success") as TSuccessType, [
222
+ "No stdout to display on the console",
223
+ ])
224
+ else
225
+ this.log((type + "-success") as TSuccessType, [stdout])
226
+ },
227
+ error: function (type: TStatus, stdout: string) {
228
+ console.error("Socket error: " + type, stdout)
229
+ this.log(type, [stdout])
230
+
231
+ if (this.isTestingEnvironment) {
232
+ this.onTestingFinished({
233
+ result: "failed",
234
+ })
235
+ }
236
+ },
237
+ complete: function () {
238
+ console.log("complete")
239
+ },
240
+
241
+ fatal: function (msg: string) {
242
+ this.log("internal-error", [msg])
243
+ throw msg
244
+ },
245
+ onTestingFinished: function (result: any) {
246
+ if (this.config?.testingFinishedCallback) {
247
+ this.config.testingFinishedCallback(result)
248
+ }
249
+ },
250
+ }
251
+
252
+ export default SocketManager
@@ -1,83 +1,83 @@
1
- /*
2
-
3
- import * as path from 'path'
4
- import * as shell from 'shelljs'
5
- import * as fs from 'fs'
6
- import { TestingError } from './errors'
7
- import Console from '../utils/console'
8
- import * as color from 'colors'
9
- import bcActivity from './bcActivity.js'
10
- import { CompilerError } from '../utils/errors'
11
- import { ISocket } from '../models/socket'
12
- import { IFile } from '../models/file'
13
- import { IConfig } from '@oclif/config'
14
-
15
- module.exports = async function ({ socket, files, config, slug }: {socket: ISocket, files: IFile[], config: IConfig, slug: string}) {
16
-
17
- const configPath = path.resolve(__dirname, `./config/tester/${config.tester}/${config.language}.config.js`);
18
- if (!fs.existsSync(configPath)) throw CompilerError(`Uknown testing engine for compiler: '${config.language}'`);
19
-
20
- const testingConfig = require(configPath)(files, config, slug);
21
- testingConfig.validate();
22
-
23
- if (config.ignoreTests) throw TestingError('Grading is disabled on learn.json file.');
24
-
25
- if (!fs.existsSync(`${config.dirPath}/reports`)) {
26
- fs.mkdirSync(`${config.dirPath}/reports`);
27
- Console.debug(`Creating the ${config.dirPath}/reports directory`);
28
- }
29
-
30
- Console.info('Running tests...');
31
-
32
- const command = await testingConfig.getCommand(socket)
33
- const { stdout, stderr, code } = shell.exec(command);
34
-
35
- if (code != 0) {
36
- const errors = typeof (testingConfig.getErrors === 'function') ? testingConfig.getErrors(stdout || stderr) : [];
37
- socket.log('testing-error', errors);
38
- console.log(errors.join('\n'))
39
-
40
- Console.error("There was an error while testing");
41
- bcActivity.error('exercise_error', {
42
- message: errors,
43
- name: `${config.tester}-error`,
44
- framework: config.tester,
45
- language: config.language,
46
- data: slug,
47
- compiler: config.compiler
48
- });
49
- }
50
- else {
51
- socket.log('testing-success', [stdout || stderr].concat(["😁Everything is amazing!"]));
52
- Console.success("Everything is amazing!");
53
-
54
- bcActivity.activity('exercise_success', {
55
- language: config.language,
56
- slug: slug,
57
- editor: config.editor,
58
- compiler: config.compiler
59
- });
60
- config.exercises = config.exercises.map(e => {
61
- if (e.slug === slug) e.done = true;
62
- return e;
63
- });
64
- }
65
-
66
- if (typeof testingConfig.cleanup !== "undefined") {
67
- if (typeof testingConfig.cleanup === 'function' || typeof testingConfig.cleanup === 'object') {
68
- const clean = await testingConfig.cleanup(socket);
69
- if (clean) {
70
- const { stdout, stderr, code } = shell.exec(clean);
71
- if (code == 0) {
72
- Console.debug("The cleanup command runned successfully");
73
- }
74
- else Console.warning("There is an error on the cleanup command for the test");
75
- }
76
-
77
- }
78
- }
79
-
80
- return true;
81
- };
82
-
83
- */
1
+ /*
2
+
3
+ import * as path from 'path'
4
+ import * as shell from 'shelljs'
5
+ import * as fs from 'fs'
6
+ import { TestingError } from './errors'
7
+ import Console from '../utils/console'
8
+ import * as color from 'colors'
9
+ import bcActivity from './bcActivity.js'
10
+ import { CompilerError } from '../utils/errors'
11
+ import { ISocket } from '../models/socket'
12
+ import { IFile } from '../models/file'
13
+ import { IConfig } from '@oclif/config'
14
+
15
+ module.exports = async function ({ socket, files, config, slug }: {socket: ISocket, files: IFile[], config: IConfig, slug: string}) {
16
+
17
+ const configPath = path.resolve(__dirname, `./config/tester/${config.tester}/${config.language}.config.js`);
18
+ if (!fs.existsSync(configPath)) throw CompilerError(`Uknown testing engine for compiler: '${config.language}'`);
19
+
20
+ const testingConfig = require(configPath)(files, config, slug);
21
+ testingConfig.validate();
22
+
23
+ if (config.ignoreTests) throw TestingError('Grading is disabled on learn.json file.');
24
+
25
+ if (!fs.existsSync(`${config.dirPath}/reports`)) {
26
+ fs.mkdirSync(`${config.dirPath}/reports`);
27
+ Console.debug(`Creating the ${config.dirPath}/reports directory`);
28
+ }
29
+
30
+ Console.info('Running tests...');
31
+
32
+ const command = await testingConfig.getCommand(socket)
33
+ const { stdout, stderr, code } = shell.exec(command);
34
+
35
+ if (code != 0) {
36
+ const errors = typeof (testingConfig.getErrors === 'function') ? testingConfig.getErrors(stdout || stderr) : [];
37
+ socket.log('testing-error', errors);
38
+ console.log(errors.join('\n'))
39
+
40
+ Console.error("There was an error while testing");
41
+ bcActivity.error('exercise_error', {
42
+ message: errors,
43
+ name: `${config.tester}-error`,
44
+ framework: config.tester,
45
+ language: config.language,
46
+ data: slug,
47
+ compiler: config.compiler
48
+ });
49
+ }
50
+ else {
51
+ socket.log('testing-success', [stdout || stderr].concat(["😁Everything is amazing!"]));
52
+ Console.success("Everything is amazing!");
53
+
54
+ bcActivity.activity('exercise_success', {
55
+ language: config.language,
56
+ slug: slug,
57
+ editor: config.editor,
58
+ compiler: config.compiler
59
+ });
60
+ config.exercises = config.exercises.map(e => {
61
+ if (e.slug === slug) e.done = true;
62
+ return e;
63
+ });
64
+ }
65
+
66
+ if (typeof testingConfig.cleanup !== "undefined") {
67
+ if (typeof testingConfig.cleanup === 'function' || typeof testingConfig.cleanup === 'object') {
68
+ const clean = await testingConfig.cleanup(socket);
69
+ if (clean) {
70
+ const { stdout, stderr, code } = shell.exec(clean);
71
+ if (code == 0) {
72
+ Console.debug("The cleanup command runned successfully");
73
+ }
74
+ else Console.warning("There is an error on the cleanup command for the test");
75
+ }
76
+
77
+ }
78
+ }
79
+
80
+ return true;
81
+ };
82
+
83
+ */