@learnpack/learnpack 2.1.25 → 2.1.26

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 (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 +327 -302
  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 +25 -0
  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;