@learnpack/learnpack 2.1.24 → 2.1.26

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. package/README.md +16 -16
  2. package/bin/run +17 -17
  3. package/bin/run.cmd +3 -3
  4. package/lib/commands/audit.d.ts +6 -6
  5. package/lib/commands/audit.js +342 -317
  6. package/lib/commands/clean.d.ts +8 -8
  7. package/lib/commands/clean.js +25 -25
  8. package/lib/commands/download.d.ts +13 -13
  9. package/lib/commands/download.js +55 -55
  10. package/lib/commands/init.d.ts +9 -9
  11. package/lib/commands/init.js +123 -123
  12. package/lib/commands/login.d.ts +14 -14
  13. package/lib/commands/login.js +37 -37
  14. package/lib/commands/logout.d.ts +14 -14
  15. package/lib/commands/logout.js +37 -37
  16. package/lib/commands/publish.d.ts +14 -14
  17. package/lib/commands/publish.js +82 -82
  18. package/lib/commands/start.d.ts +7 -7
  19. package/lib/commands/start.js +165 -165
  20. package/lib/commands/test.d.ts +6 -6
  21. package/lib/commands/test.js +62 -62
  22. package/lib/index.d.ts +1 -1
  23. package/lib/index.js +4 -4
  24. package/lib/managers/config/allowed_files.d.ts +5 -5
  25. package/lib/managers/config/allowed_files.js +30 -30
  26. package/lib/managers/config/defaults.d.ts +39 -37
  27. package/lib/managers/config/defaults.js +40 -38
  28. package/lib/managers/config/exercise.d.ts +36 -36
  29. package/lib/managers/config/exercise.js +233 -230
  30. package/lib/managers/config/index.d.ts +3 -3
  31. package/lib/managers/config/index.js +320 -302
  32. package/lib/managers/file.d.ts +13 -13
  33. package/lib/managers/file.js +134 -134
  34. package/lib/managers/gitpod.d.ts +3 -3
  35. package/lib/managers/gitpod.js +67 -67
  36. package/lib/managers/server/index.d.ts +6 -6
  37. package/lib/managers/server/index.js +58 -51
  38. package/lib/managers/server/routes.d.ts +4 -4
  39. package/lib/managers/server/routes.js +167 -167
  40. package/lib/managers/session.d.ts +3 -3
  41. package/lib/managers/session.js +104 -104
  42. package/lib/managers/socket.d.ts +3 -3
  43. package/lib/managers/socket.js +164 -164
  44. package/lib/managers/test.js +84 -84
  45. package/lib/models/action.d.ts +2 -2
  46. package/lib/models/action.js +2 -2
  47. package/lib/models/audit.d.ts +15 -15
  48. package/lib/models/audit.js +2 -2
  49. package/lib/models/config-manager.d.ts +21 -21
  50. package/lib/models/config-manager.js +2 -2
  51. package/lib/models/config.d.ts +62 -60
  52. package/lib/models/config.js +2 -2
  53. package/lib/models/counter.d.ts +11 -11
  54. package/lib/models/counter.js +2 -2
  55. package/lib/models/errors.d.ts +15 -15
  56. package/lib/models/errors.js +2 -2
  57. package/lib/models/exercise-obj.d.ts +27 -27
  58. package/lib/models/exercise-obj.js +2 -2
  59. package/lib/models/file.d.ts +5 -5
  60. package/lib/models/file.js +2 -2
  61. package/lib/models/findings.d.ts +17 -17
  62. package/lib/models/findings.js +2 -2
  63. package/lib/models/flags.d.ts +10 -10
  64. package/lib/models/flags.js +2 -2
  65. package/lib/models/front-matter.d.ts +11 -11
  66. package/lib/models/front-matter.js +2 -2
  67. package/lib/models/gitpod-data.d.ts +16 -16
  68. package/lib/models/gitpod-data.js +2 -2
  69. package/lib/models/language.d.ts +4 -4
  70. package/lib/models/language.js +2 -2
  71. package/lib/models/package.d.ts +7 -7
  72. package/lib/models/package.js +2 -2
  73. package/lib/models/plugin-config.d.ts +16 -16
  74. package/lib/models/plugin-config.js +2 -2
  75. package/lib/models/session.d.ts +23 -23
  76. package/lib/models/session.js +2 -2
  77. package/lib/models/socket.d.ts +31 -31
  78. package/lib/models/socket.js +2 -2
  79. package/lib/models/status.d.ts +1 -1
  80. package/lib/models/status.js +2 -2
  81. package/lib/models/success-types.d.ts +1 -1
  82. package/lib/models/success-types.js +2 -2
  83. package/lib/plugin/command/compile.d.ts +6 -6
  84. package/lib/plugin/command/compile.js +18 -18
  85. package/lib/plugin/command/test.d.ts +6 -6
  86. package/lib/plugin/command/test.js +25 -25
  87. package/lib/plugin/index.d.ts +27 -27
  88. package/lib/plugin/index.js +7 -7
  89. package/lib/plugin/plugin.d.ts +8 -8
  90. package/lib/plugin/plugin.js +68 -68
  91. package/lib/plugin/utils.d.ts +16 -16
  92. package/lib/plugin/utils.js +58 -58
  93. package/lib/ui/download.d.ts +5 -5
  94. package/lib/ui/download.js +61 -61
  95. package/lib/utils/BaseCommand.d.ts +8 -8
  96. package/lib/utils/BaseCommand.js +41 -41
  97. package/lib/utils/SessionCommand.d.ts +10 -10
  98. package/lib/utils/SessionCommand.js +47 -47
  99. package/lib/utils/api.d.ts +12 -12
  100. package/lib/utils/api.js +173 -173
  101. package/lib/utils/audit.d.ts +16 -16
  102. package/lib/utils/audit.js +302 -302
  103. package/lib/utils/console.d.ts +12 -12
  104. package/lib/utils/console.js +19 -19
  105. package/lib/utils/errors.d.ts +17 -17
  106. package/lib/utils/errors.js +100 -100
  107. package/lib/utils/exercisesQueue.d.ts +9 -9
  108. package/lib/utils/exercisesQueue.js +38 -38
  109. package/lib/utils/fileQueue.d.ts +40 -40
  110. package/lib/utils/fileQueue.js +168 -168
  111. package/lib/utils/misc.d.ts +1 -1
  112. package/lib/utils/misc.js +23 -23
  113. package/lib/utils/validators.d.ts +5 -5
  114. package/lib/utils/validators.js +17 -17
  115. package/lib/utils/watcher.d.ts +2 -2
  116. package/lib/utils/watcher.js +23 -23
  117. package/oclif.manifest.json +1 -1
  118. package/package.json +138 -138
  119. package/src/commands/audit.ts +443 -418
  120. package/src/commands/clean.ts +29 -29
  121. package/src/commands/download.ts +62 -62
  122. package/src/commands/login.ts +42 -42
  123. package/src/commands/logout.ts +43 -43
  124. package/src/commands/publish.ts +107 -107
  125. package/src/commands/start.ts +238 -234
  126. package/src/commands/test.ts +85 -85
  127. package/src/index.ts +1 -1
  128. package/src/managers/config/allowed_files.ts +29 -29
  129. package/src/managers/config/defaults.ts +2 -0
  130. package/src/managers/config/exercise.ts +309 -302
  131. package/src/managers/config/index.ts +22 -1
  132. package/src/managers/file.ts +169 -169
  133. package/src/managers/gitpod.ts +84 -84
  134. package/src/managers/server/index.ts +77 -69
  135. package/src/managers/session.ts +118 -118
  136. package/src/managers/socket.ts +239 -239
  137. package/src/managers/test.ts +83 -83
  138. package/src/models/action.ts +3 -3
  139. package/src/models/config-manager.ts +23 -23
  140. package/src/models/config.ts +2 -0
  141. package/src/models/counter.ts +11 -11
  142. package/src/models/errors.ts +22 -22
  143. package/src/models/file.ts +5 -5
  144. package/src/models/findings.ts +18 -18
  145. package/src/models/flags.ts +10 -10
  146. package/src/models/front-matter.ts +11 -11
  147. package/src/models/gitpod-data.ts +19 -19
  148. package/src/models/language.ts +4 -4
  149. package/src/models/package.ts +7 -7
  150. package/src/models/plugin-config.ts +17 -17
  151. package/src/models/session.ts +26 -26
  152. package/src/models/socket.ts +48 -48
  153. package/src/models/status.ts +15 -15
  154. package/src/models/success-types.ts +1 -1
  155. package/src/plugin/command/compile.ts +17 -17
  156. package/src/plugin/command/test.ts +30 -30
  157. package/src/plugin/index.ts +6 -6
  158. package/src/plugin/plugin.ts +94 -94
  159. package/src/plugin/utils.ts +87 -87
  160. package/src/types/node-fetch.d.ts +1 -1
  161. package/src/ui/download.ts +71 -71
  162. package/src/utils/BaseCommand.ts +48 -48
  163. package/src/utils/SessionCommand.ts +48 -48
  164. package/src/utils/api.ts +194 -194
  165. package/src/utils/audit.ts +395 -395
  166. package/src/utils/console.ts +24 -24
  167. package/src/utils/errors.ts +117 -117
  168. package/src/utils/exercisesQueue.ts +51 -51
  169. package/src/utils/fileQueue.ts +198 -198
  170. package/src/utils/misc.ts +23 -23
  171. package/src/utils/templates/gitignore.txt +19 -19
  172. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.es.md +24 -24
  173. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.md +24 -24
  174. package/src/utils/templates/incremental/README.ejs +4 -4
  175. package/src/utils/templates/incremental/README.es.ejs +4 -4
  176. package/src/utils/templates/isolated/01-hello-world/README.es.md +26 -26
  177. package/src/utils/templates/isolated/01-hello-world/README.md +26 -26
  178. package/src/utils/templates/isolated/README.ejs +4 -4
  179. package/src/utils/templates/isolated/README.es.ejs +4 -4
  180. package/src/utils/templates/no-grading/README.ejs +4 -4
  181. package/src/utils/templates/no-grading/README.es.ejs +4 -4
  182. package/src/utils/validators.ts +18 -18
@@ -1,239 +1,239 @@
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
+
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,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
+ */
@@ -1,3 +1,3 @@
1
- export type TAction = 'test' | 'log' | 'reload' | 'ready' | 'clean' | 'ask';
2
-
3
- export type ICallback = (...agrs: any[]) => any;
1
+ export type TAction = 'test' | 'log' | 'reload' | 'ready' | 'clean' | 'ask';
2
+
3
+ export type ICallback = (...agrs: any[]) => any;