@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,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
+ */