@learnpack/learnpack 2.1.26 → 2.1.27

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. package/README.md +10 -10
  2. package/oclif.manifest.json +1 -1
  3. package/package.json +2 -1
  4. package/src/commands/audit.ts +113 -113
  5. package/src/commands/clean.ts +10 -10
  6. package/src/commands/download.ts +18 -18
  7. package/src/commands/init.ts +39 -39
  8. package/src/commands/login.ts +13 -13
  9. package/src/commands/logout.ts +9 -9
  10. package/src/commands/publish.ts +25 -25
  11. package/src/commands/start.ts +101 -75
  12. package/src/commands/test.ts +34 -34
  13. package/src/managers/config/allowed_files.ts +2 -2
  14. package/src/managers/config/defaults.ts +2 -2
  15. package/src/managers/config/exercise.ts +79 -79
  16. package/src/managers/config/index.ts +145 -145
  17. package/src/managers/file.ts +74 -65
  18. package/src/managers/server/index.ts +32 -31
  19. package/src/managers/server/routes.ts +139 -90
  20. package/src/managers/session.ts +53 -24
  21. package/src/managers/socket.ts +92 -79
  22. package/src/models/action.ts +8 -1
  23. package/src/models/config-manager.ts +2 -2
  24. package/src/models/config.ts +7 -2
  25. package/src/models/exercise-obj.ts +6 -3
  26. package/src/models/plugin-config.ts +2 -2
  27. package/src/models/session.ts +5 -2
  28. package/src/models/socket.ts +12 -6
  29. package/src/models/status.ts +15 -14
  30. package/src/plugin/command/compile.ts +10 -10
  31. package/src/plugin/command/test.ts +14 -14
  32. package/src/plugin/index.ts +5 -5
  33. package/src/plugin/plugin.ts +26 -26
  34. package/src/plugin/utils.ts +23 -23
  35. package/src/utils/BaseCommand.ts +16 -16
  36. package/src/utils/api.ts +143 -91
  37. package/src/utils/audit.ts +93 -96
  38. package/src/utils/exercisesQueue.ts +15 -15
  39. package/src/utils/fileQueue.ts +85 -85
  40. package/src/utils/watcher.ts +14 -14
  41. package/lib/commands/audit.d.ts +0 -6
  42. package/lib/commands/audit.js +0 -342
  43. package/lib/commands/clean.d.ts +0 -8
  44. package/lib/commands/clean.js +0 -25
  45. package/lib/commands/download.d.ts +0 -13
  46. package/lib/commands/download.js +0 -55
  47. package/lib/commands/init.d.ts +0 -9
  48. package/lib/commands/init.js +0 -123
  49. package/lib/commands/login.d.ts +0 -14
  50. package/lib/commands/login.js +0 -37
  51. package/lib/commands/logout.d.ts +0 -14
  52. package/lib/commands/logout.js +0 -37
  53. package/lib/commands/publish.d.ts +0 -14
  54. package/lib/commands/publish.js +0 -82
  55. package/lib/commands/start.d.ts +0 -7
  56. package/lib/commands/start.js +0 -165
  57. package/lib/commands/test.d.ts +0 -6
  58. package/lib/commands/test.js +0 -62
  59. package/lib/index.d.ts +0 -1
  60. package/lib/index.js +0 -4
  61. package/lib/managers/config/allowed_files.d.ts +0 -5
  62. package/lib/managers/config/allowed_files.js +0 -30
  63. package/lib/managers/config/defaults.d.ts +0 -39
  64. package/lib/managers/config/defaults.js +0 -40
  65. package/lib/managers/config/exercise.d.ts +0 -36
  66. package/lib/managers/config/exercise.js +0 -233
  67. package/lib/managers/config/index.d.ts +0 -3
  68. package/lib/managers/config/index.js +0 -320
  69. package/lib/managers/file.d.ts +0 -13
  70. package/lib/managers/file.js +0 -134
  71. package/lib/managers/gitpod.d.ts +0 -3
  72. package/lib/managers/gitpod.js +0 -67
  73. package/lib/managers/server/index.d.ts +0 -6
  74. package/lib/managers/server/index.js +0 -58
  75. package/lib/managers/server/routes.d.ts +0 -4
  76. package/lib/managers/server/routes.js +0 -167
  77. package/lib/managers/session.d.ts +0 -3
  78. package/lib/managers/session.js +0 -104
  79. package/lib/managers/socket.d.ts +0 -3
  80. package/lib/managers/socket.js +0 -164
  81. package/lib/managers/test.d.ts +0 -0
  82. package/lib/managers/test.js +0 -84
  83. package/lib/models/action.d.ts +0 -2
  84. package/lib/models/action.js +0 -2
  85. package/lib/models/audit.d.ts +0 -15
  86. package/lib/models/audit.js +0 -2
  87. package/lib/models/config-manager.d.ts +0 -21
  88. package/lib/models/config-manager.js +0 -2
  89. package/lib/models/config.d.ts +0 -62
  90. package/lib/models/config.js +0 -2
  91. package/lib/models/counter.d.ts +0 -11
  92. package/lib/models/counter.js +0 -2
  93. package/lib/models/errors.d.ts +0 -15
  94. package/lib/models/errors.js +0 -2
  95. package/lib/models/exercise-obj.d.ts +0 -27
  96. package/lib/models/exercise-obj.js +0 -2
  97. package/lib/models/file.d.ts +0 -5
  98. package/lib/models/file.js +0 -2
  99. package/lib/models/findings.d.ts +0 -17
  100. package/lib/models/findings.js +0 -2
  101. package/lib/models/flags.d.ts +0 -10
  102. package/lib/models/flags.js +0 -2
  103. package/lib/models/front-matter.d.ts +0 -11
  104. package/lib/models/front-matter.js +0 -2
  105. package/lib/models/gitpod-data.d.ts +0 -16
  106. package/lib/models/gitpod-data.js +0 -2
  107. package/lib/models/language.d.ts +0 -4
  108. package/lib/models/language.js +0 -2
  109. package/lib/models/package.d.ts +0 -7
  110. package/lib/models/package.js +0 -2
  111. package/lib/models/plugin-config.d.ts +0 -16
  112. package/lib/models/plugin-config.js +0 -2
  113. package/lib/models/session.d.ts +0 -23
  114. package/lib/models/session.js +0 -2
  115. package/lib/models/socket.d.ts +0 -31
  116. package/lib/models/socket.js +0 -2
  117. package/lib/models/status.d.ts +0 -1
  118. package/lib/models/status.js +0 -2
  119. package/lib/models/success-types.d.ts +0 -1
  120. package/lib/models/success-types.js +0 -2
  121. package/lib/plugin/command/compile.d.ts +0 -6
  122. package/lib/plugin/command/compile.js +0 -18
  123. package/lib/plugin/command/test.d.ts +0 -6
  124. package/lib/plugin/command/test.js +0 -25
  125. package/lib/plugin/index.d.ts +0 -27
  126. package/lib/plugin/index.js +0 -7
  127. package/lib/plugin/plugin.d.ts +0 -8
  128. package/lib/plugin/plugin.js +0 -68
  129. package/lib/plugin/utils.d.ts +0 -16
  130. package/lib/plugin/utils.js +0 -58
  131. package/lib/ui/download.d.ts +0 -5
  132. package/lib/ui/download.js +0 -61
  133. package/lib/utils/BaseCommand.d.ts +0 -8
  134. package/lib/utils/BaseCommand.js +0 -41
  135. package/lib/utils/SessionCommand.d.ts +0 -10
  136. package/lib/utils/SessionCommand.js +0 -47
  137. package/lib/utils/api.d.ts +0 -12
  138. package/lib/utils/api.js +0 -173
  139. package/lib/utils/audit.d.ts +0 -16
  140. package/lib/utils/audit.js +0 -302
  141. package/lib/utils/console.d.ts +0 -12
  142. package/lib/utils/console.js +0 -19
  143. package/lib/utils/errors.d.ts +0 -17
  144. package/lib/utils/errors.js +0 -100
  145. package/lib/utils/exercisesQueue.d.ts +0 -9
  146. package/lib/utils/exercisesQueue.js +0 -38
  147. package/lib/utils/fileQueue.d.ts +0 -40
  148. package/lib/utils/fileQueue.js +0 -168
  149. package/lib/utils/misc.d.ts +0 -1
  150. package/lib/utils/misc.js +0 -23
  151. package/lib/utils/validators.d.ts +0 -5
  152. package/lib/utils/validators.js +0 -17
  153. package/lib/utils/watcher.d.ts +0 -2
  154. package/lib/utils/watcher.js +0 -23
@@ -1,167 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const console_1 = require("../../utils/console");
4
- const express = require("express");
5
- const fs = require("fs");
6
- const bodyParser = require("body-parser");
7
- const socket_1 = require("../socket");
8
- const fileQueue_1 = require("../../utils/fileQueue");
9
- // import gitpod from '../gitpod'
10
- const exercise_1 = require("../config/exercise");
11
- const withHandler = (func) => (req, res) => {
12
- try {
13
- func(req, res);
14
- }
15
- catch (error) {
16
- console_1.default.debug(error);
17
- const _err = {
18
- message: error.message || "There has been an error",
19
- status: error.status || 500,
20
- type: error.type || null,
21
- };
22
- console_1.default.error(_err.message);
23
- // send rep to the server
24
- res.status(_err.status);
25
- res.json(_err);
26
- }
27
- };
28
- async function default_1(app, configObject, configManager) {
29
- const { config, exercises } = configObject;
30
- const dispatcher = fileQueue_1.default.dispatcher({
31
- create: true,
32
- path: `${config === null || config === void 0 ? void 0 : config.dirPath}/vscode_queue.json`,
33
- });
34
- app.get("/config", withHandler((_, res) => {
35
- res.json(configObject);
36
- }));
37
- /**
38
- * TODO: replicate a socket action, the request payload must be passed to the socket as well
39
-
40
- const jsonBodyParser = bodyParser.json()
41
-
42
- type ISocketActions = "addAllowed" | "removeAllowed" | "start" | "on" | "clean" | "ask" | "reload" | "openWindow" | "log" | "emit" | "ready" | "error" | "fatal" | "success" | "onTestingFinished";
43
-
44
- app.post('/socket/:actionName', jsonBodyParser, withHandler((req, res) => {
45
- if (socket[req.params.actionName as ISocketActions] instanceof Function) {
46
- socket[req.params.actionName as ISocketActions](req.body ? req.body.data : null)
47
- res.json({ "details": "Socket call executed sucessfully" })
48
- } else res.status(400).json({ "details": `Socket action ${req.params.actionName} not found` })
49
- }))
50
- */
51
- // symbolic link to maintain path compatiblity
52
- const fetchStaticAsset = withHandler((req, res) => {
53
- const filePath = `${config === null || config === void 0 ? void 0 : config.dirPath}/assets/${req.params.filePath}`;
54
- if (!fs.existsSync(filePath))
55
- throw new Error("File not found: " + filePath);
56
- const content = fs.readFileSync(filePath);
57
- res.write(content);
58
- res.end();
59
- });
60
- app.get(`${(config === null || config === void 0 ? void 0 : config.dirPath.indexOf("./")) === 0 ?
61
- config.dirPath.slice(1) : config === null || config === void 0 ? void 0 : config.dirPath}/assets/:filePath`, fetchStaticAsset);
62
- app.get("/assets/:filePath", fetchStaticAsset);
63
- app.get("/exercise", withHandler((_, res) => {
64
- res.json(exercises);
65
- }));
66
- app.get("/exercise/:slug/readme", withHandler(({ params: { slug }, query: { lang } }, res) => {
67
- const exercise = configManager.getExercise(slug);
68
- if (exercise && exercise.getReadme) {
69
- const readme = exercise.getReadme(lang || null);
70
- res.json(readme);
71
- }
72
- else {
73
- res.status(400);
74
- }
75
- }));
76
- app.get("/exercise/:slug/report", withHandler(({ params: { slug } }, res) => {
77
- const exercise = configManager.getExercise(slug);
78
- if (exercise && exercise.getTestReport) {
79
- const report = exercise.getTestReport();
80
- res.json(JSON.stringify(report));
81
- }
82
- }));
83
- app.get("/exercise/:slug", withHandler((req, res) => {
84
- var _a, _b, _c, _d;
85
- // no need to re-start exercise if it's already started
86
- if (configObject.currentExercise &&
87
- req.params.slug === configObject.currentExercise) {
88
- const exercise = configManager.getExercise(req.params.slug);
89
- res.json(exercise);
90
- return;
91
- }
92
- const exercise = configManager.startExercise(req.params.slug);
93
- dispatcher.enqueue(dispatcher.events.START_EXERCISE, req.params.slug);
94
- const entries = new Set(Object.keys(config === null || config === void 0 ? void 0 : config.entries).map(lang => config === null || config === void 0 ? void 0 : config.entries[lang]));
95
- // if we are in incremental grading, the entry file can by dinamically detected
96
- // based on the changes the student is making during the exercise
97
- if ((config === null || config === void 0 ? void 0 : config.grading) === "incremental") {
98
- const scanedFiles = fs.readdirSync("./");
99
- // update the file hierarchy with updates
100
- exercise.files = [
101
- ...exercise.files.filter(f => f.name.includes("test.")),
102
- ...exercise_1.filterFiles(scanedFiles),
103
- ];
104
- console_1.default.debug(`Exercise updated files: `, exercise.files);
105
- }
106
- const detected = exercise_1.detect(configObject, exercise.files
107
- .filter(fileName => entries.has(fileName.name))
108
- .map(f => f.name || f));
109
- // if a new language for the testing engine is detected, we replace it
110
- // if not we leave it as it was before
111
- if ((config === null || config === void 0 ? void 0 : config.language) && !["", "auto"].includes(config === null || config === void 0 ? void 0 : config.language)) {
112
- console_1.default.debug(`Exercise language ignored, instead imported from configuration ${config === null || config === void 0 ? void 0 : config.language}`);
113
- exercise.language = detected === null || detected === void 0 ? void 0 : detected.language;
114
- }
115
- else if ((detected === null || detected === void 0 ? void 0 : detected.language) &&
116
- (!(config === null || config === void 0 ? void 0 : config.language) || (config === null || config === void 0 ? void 0 : config.language) === "auto")) {
117
- console_1.default.debug(`Switching to ${detected.language} engine in this exercise`);
118
- exercise.language = detected.language;
119
- }
120
- // WARNING: has to be the FULL PATH to the entry path
121
- // We need to detect entry in both gradings: Incremental and Isolate
122
- exercise.entry = detected === null || detected === void 0 ? void 0 : detected.entry;
123
- console_1.default.debug(`Exercise detected entry: ${detected === null || detected === void 0 ? void 0 : detected.entry} and language ${exercise.language}`);
124
- // exercises.graded and exercises.disableGrading deprecated.
125
- if (!exercise.graded || (config === null || config === void 0 ? void 0 : config.disableGrading) || ((_a = config === null || config === void 0 ? void 0 : config.disabledActions) === null || _a === void 0 ? void 0 : _a.includes("test"))) {
126
- socket_1.default.removeAllowed("test");
127
- }
128
- else {
129
- socket_1.default.addAllowed("test");
130
- }
131
- if (!exercise.entry || ((_b = config === null || config === void 0 ? void 0 : config.disabledActions) === null || _b === void 0 ? void 0 : _b.includes("build"))) {
132
- socket_1.default.removeAllowed("build");
133
- }
134
- else {
135
- socket_1.default.addAllowed("build");
136
- }
137
- if (exercise.files.filter((f) => !f.name.toLowerCase().includes("readme.") &&
138
- !f.name.toLowerCase().includes("test.")).length === 0 || ((_c = config === null || config === void 0 ? void 0 : config.disabledActions) === null || _c === void 0 ? void 0 : _c.includes("reset"))) {
139
- socket_1.default.removeAllowed("reset");
140
- }
141
- else if (!((_d = config === null || config === void 0 ? void 0 : config.disabledActions) === null || _d === void 0 ? void 0 : _d.includes("reset"))) {
142
- socket_1.default.addAllowed("reset");
143
- }
144
- socket_1.default.log("ready");
145
- res.json(exercise);
146
- }));
147
- app.get("/exercise/:slug/file/:fileName", withHandler((req, res) => {
148
- const exercise = configManager.getExercise(req.params.slug);
149
- if (exercise && exercise.getFile) {
150
- res.write(exercise.getFile(req.params.fileName));
151
- res.end();
152
- }
153
- }));
154
- const textBodyParser = bodyParser.text();
155
- app.put("/exercise/:slug/file/:fileName", textBodyParser, withHandler((req, res) => {
156
- const exercise = configManager.getExercise(req.params.slug);
157
- if (exercise && exercise.saveFile) {
158
- exercise.saveFile(req.params.fileName, req.body);
159
- res.end();
160
- }
161
- }));
162
- if (config === null || config === void 0 ? void 0 : config.outputPath) {
163
- app.use("/preview", express.static(config.outputPath));
164
- }
165
- app.use("/", express.static(`${config === null || config === void 0 ? void 0 : config.dirPath}/_app`));
166
- }
167
- exports.default = default_1;
@@ -1,3 +0,0 @@
1
- import { ISession } from '../models/session';
2
- declare const Session: ISession;
3
- export default Session;
@@ -1,104 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const console_1 = require("../utils/console");
4
- const api_1 = require("../utils/api");
5
- const validator_1 = require("validator");
6
- const errors_1 = require("../utils/errors");
7
- // import moment from 'moment'
8
- const fs = require("fs");
9
- const cli_ux_1 = require("cli-ux");
10
- const storage = require("node-persist");
11
- const Session = {
12
- sessionStarted: false,
13
- token: null,
14
- config: null,
15
- currentCohort: null,
16
- initialize: async function () {
17
- if (!this.sessionStarted) {
18
- if (!this.config) {
19
- throw errors_1.InternalError('Configuration not found');
20
- }
21
- if (!fs.existsSync(this.config.dirPath)) {
22
- fs.mkdirSync(this.config.dirPath);
23
- }
24
- await storage.init({ dir: `${this.config.dirPath}/.session` });
25
- this.sessionStarted = true;
26
- }
27
- return true;
28
- },
29
- setPayload: async function (value) {
30
- await this.initialize();
31
- await storage.setItem('bc-payload', Object.assign({ token: this.token }, value));
32
- console_1.default.debug('Payload successfuly found and set for ' + value.email);
33
- return true;
34
- },
35
- getPayload: async function () {
36
- await this.initialize();
37
- let payload = null;
38
- try {
39
- payload = await storage.getItem('bc-payload');
40
- }
41
- catch (error) {
42
- // TODO: Remove it
43
- console.log(error);
44
- console_1.default.debug('Error retriving session payload');
45
- }
46
- return payload;
47
- },
48
- isActive: function () {
49
- /* if (this.token) {
50
- return true
51
- } else {
52
- return false
53
- } */
54
- return !!this.token;
55
- },
56
- get: async function (configObj) {
57
- if (configObj && configObj.config) {
58
- this.config = configObj.config;
59
- }
60
- await this.sync();
61
- if (!this.isActive()) {
62
- return null;
63
- }
64
- const payload = await this.getPayload();
65
- return {
66
- payload,
67
- token: this.token,
68
- };
69
- },
70
- login: async function () {
71
- const email = await cli_ux_1.default.prompt('What is your email?');
72
- if (!validator_1.default.isEmail(email)) {
73
- throw errors_1.ValidationError('Invalid email');
74
- }
75
- const password = await cli_ux_1.default.prompt('What is your password?', {
76
- type: 'hide',
77
- });
78
- const data = await api_1.default.login(email, password);
79
- if (data) {
80
- this.start({ token: data.token, payload: data });
81
- }
82
- },
83
- sync: async function () {
84
- const payload = await this.getPayload();
85
- if (payload) {
86
- this.token = payload.token;
87
- }
88
- },
89
- start: async function ({ token, payload = null }) {
90
- if (!token) {
91
- throw new Error('A token and email is needed to start a session');
92
- }
93
- this.token = token;
94
- if (payload && (await this.setPayload(payload))) {
95
- console_1.default.success(`Successfully logged in as ${payload.email}`);
96
- }
97
- },
98
- destroy: async function () {
99
- await storage.clear();
100
- this.token = null;
101
- console_1.default.success('You have logged out');
102
- },
103
- };
104
- exports.default = Session;
@@ -1,3 +0,0 @@
1
- import { ISocket } from '../models/socket';
2
- declare const SocketManager: ISocket;
3
- export default SocketManager;
@@ -1,164 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const socket_io_1 = require("socket.io");
4
- const console_1 = require("../utils/console");
5
- const fileQueue_1 = require("../utils/fileQueue");
6
- const SocketManager = {
7
- socket: null,
8
- config: null,
9
- allowedActions: [],
10
- possibleActions: ['build', 'reset', 'test', 'tutorial'],
11
- isTestingEnvironment: false,
12
- actionCallBacks: {
13
- clean: (_, s) => {
14
- s.logs = [];
15
- },
16
- },
17
- addAllowed: function (actions) {
18
- var _a, _b;
19
- if (!Array.isArray(actions))
20
- actions = [actions];
21
- // avoid adding the "test" action if grading is disabled
22
- if (actions.includes('test') && ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.disabledActions) === null || _b === void 0 ? void 0 : _b.includes('test'))) {
23
- actions = actions.filter((a) => a !== 'test');
24
- }
25
- this.allowedActions = [
26
- ...(this.allowedActions || []).filter((a) => !actions.includes(a)),
27
- ...actions,
28
- ];
29
- },
30
- removeAllowed: function (actions) {
31
- if (!Array.isArray(actions)) {
32
- actions = [actions];
33
- }
34
- this.allowedActions = (this.allowedActions || []).filter((a) => !actions.includes(a));
35
- },
36
- start: function (config, server, isTestingEnvironment = false) {
37
- var _a, _b, _c, _d;
38
- this.config = config;
39
- this.isTestingEnvironment = isTestingEnvironment;
40
- this.socket = new socket_io_1.Server(server, { allowEIO3: true });
41
- this.allowedActions = ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.disabledActions) === null || _b === void 0 ? void 0 : _b.includes('test')) || ((_c = this.config) === null || _c === void 0 ? void 0 : _c.disableGrading) ? this.possibleActions.filter(a => { var _a, _b; return !((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.disabledActions) === null || _b === void 0 ? void 0 : _b.includes(a)) && a !== 'test'; }) : this.possibleActions.filter(a => { var _a; return !((_a = this.allowedActions) === null || _a === void 0 ? void 0 : _a.includes(a)); });
42
- if (((_d = this.config) === null || _d === void 0 ? void 0 : _d.grading) === 'incremental') {
43
- this.removeAllowed('reset');
44
- }
45
- if (this.socket) {
46
- this.socket.on('connection', (socket) => {
47
- console_1.default.debug('Connection with client successfully established', this.allowedActions);
48
- if (!this.isTestingEnvironment) {
49
- this.log('ready', ['Ready to compile or test...']);
50
- }
51
- socket.on('compiler', ({ action, data }) => {
52
- this.emit('clean', 'pending', ['Working...']);
53
- if (typeof data.exerciseSlug === 'undefined') {
54
- this.log('internal-error', ['No exercise slug specified']);
55
- console_1.default.error('No exercise slug especified');
56
- return;
57
- }
58
- if (this.actionCallBacks &&
59
- typeof this.actionCallBacks[action] === 'function') {
60
- this.actionCallBacks[action](data);
61
- }
62
- else {
63
- this.log('internal-error', ['Uknown action ' + action]);
64
- }
65
- });
66
- });
67
- }
68
- },
69
- on: function (action, callBack) {
70
- if (this.actionCallBacks) {
71
- this.actionCallBacks[action] = callBack;
72
- }
73
- },
74
- clean: function (_ = 'pending', logs = []) {
75
- this.emit('clean', 'pending', logs);
76
- },
77
- ask: function (questions = []) {
78
- return new Promise((resolve, _) => {
79
- this.emit('ask', 'pending', ['Waiting for input...'], questions);
80
- this.on('input', ({ inputs }) => {
81
- // Workaround to fix issue because null inputs
82
- let isNull = false;
83
- // eslint-disable-next-line
84
- inputs.forEach((input) => {
85
- if (input === null) {
86
- isNull = true;
87
- }
88
- });
89
- if (!isNull) {
90
- resolve(inputs);
91
- }
92
- });
93
- });
94
- },
95
- reload: function (files = null, exercises = null) {
96
- this.emit('reload', (files === null || files === void 0 ? void 0 : files.join('')) || '' /* TODO: Check it out this */, exercises);
97
- },
98
- openWindow: function (url = '') {
99
- fileQueue_1.default.dispatcher().enqueue(fileQueue_1.default.events.OPEN_WINDOW, url);
100
- this.emit(fileQueue_1.default.events.OPEN_WINDOW, 'ready', [`Opening ${url}`], [], [], url);
101
- },
102
- log: function (status, messages = [], report = [], data = null) {
103
- this.emit('log', status, messages, [], report, data);
104
- console_1.default.log(messages);
105
- },
106
- emit: function (action, status = 'ready', logs = [], inputs = [], report = [], data = null) {
107
- var _a, _b, _c, _d, _e, _f;
108
- if (((_a = this.config) === null || _a === void 0 ? void 0 : _a.compiler) &&
109
- ['webpack', 'vanillajs', 'vue', 'react', 'css', 'html'].includes((_b = this.config) === null || _b === void 0 ? void 0 : _b.compiler)) {
110
- if (['compiler-success', 'compiler-warning'].includes(status))
111
- this.addAllowed('preview');
112
- if (['compiler-error'].includes(status) || action === 'ready')
113
- this.removeAllowed('preview');
114
- }
115
- if (((_c = this.config) === null || _c === void 0 ? void 0 : _c.grading) === 'incremental') {
116
- this.removeAllowed('reset');
117
- }
118
- // eslint-disable-next-line
119
- (_e = (_d = this.config) === null || _d === void 0 ? void 0 : _d.disabledActions) === null || _e === void 0 ? void 0 : _e.forEach((a) => this.removeAllowed(a));
120
- (_f = this.socket) === null || _f === void 0 ? void 0 : _f.emit('compiler', {
121
- action,
122
- status,
123
- logs,
124
- allowed: this.allowedActions,
125
- inputs,
126
- report,
127
- data,
128
- });
129
- },
130
- ready: function (message) {
131
- this.log('ready', [message]);
132
- },
133
- success: function (type, stdout) {
134
- const types = ['compiler', 'testing'];
135
- if (!types.includes(type))
136
- this.fatal(`Invalid socket success type "${type}" on socket`);
137
- else if (stdout === '')
138
- this.log((type + '-success'), [
139
- 'No stdout to display on the console',
140
- ]);
141
- else
142
- this.log((type + '-success'), [stdout]);
143
- },
144
- error: function (type, stdout) {
145
- console.error('Socket error: ' + type, stdout);
146
- this.log(type, [stdout]);
147
- if (this.isTestingEnvironment) {
148
- this.onTestingFinished({
149
- result: 'failed',
150
- });
151
- }
152
- },
153
- fatal: function (msg) {
154
- this.log('internal-error', [msg]);
155
- throw msg;
156
- },
157
- onTestingFinished: function (result) {
158
- var _a;
159
- if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.testingFinishedCallback) {
160
- this.config.testingFinishedCallback(result);
161
- }
162
- },
163
- };
164
- exports.default = SocketManager;
File without changes
@@ -1,84 +0,0 @@
1
- "use strict";
2
- /*
3
-
4
- import * as path from 'path'
5
- import * as shell from 'shelljs'
6
- import * as fs from 'fs'
7
- import { TestingError } from './errors'
8
- import Console from '../utils/console'
9
- import * as color from 'colors'
10
- import bcActivity from './bcActivity.js'
11
- import { CompilerError } from '../utils/errors'
12
- import { ISocket } from '../models/socket'
13
- import { IFile } from '../models/file'
14
- import { IConfig } from '@oclif/config'
15
-
16
- module.exports = async function ({ socket, files, config, slug }: {socket: ISocket, files: IFile[], config: IConfig, slug: string}) {
17
-
18
- const configPath = path.resolve(__dirname, `./config/tester/${config.tester}/${config.language}.config.js`);
19
- if (!fs.existsSync(configPath)) throw CompilerError(`Uknown testing engine for compiler: '${config.language}'`);
20
-
21
- const testingConfig = require(configPath)(files, config, slug);
22
- testingConfig.validate();
23
-
24
- if (config.ignoreTests) throw TestingError('Grading is disabled on learn.json file.');
25
-
26
- if (!fs.existsSync(`${config.dirPath}/reports`)) {
27
- fs.mkdirSync(`${config.dirPath}/reports`);
28
- Console.debug(`Creating the ${config.dirPath}/reports directory`);
29
- }
30
-
31
- Console.info('Running tests...');
32
-
33
- const command = await testingConfig.getCommand(socket)
34
- const { stdout, stderr, code } = shell.exec(command);
35
-
36
- if (code != 0) {
37
- const errors = typeof (testingConfig.getErrors === 'function') ? testingConfig.getErrors(stdout || stderr) : [];
38
- socket.log('testing-error', errors);
39
- console.log(errors.join('\n'))
40
-
41
- Console.error("There was an error while testing");
42
- bcActivity.error('exercise_error', {
43
- message: errors,
44
- name: `${config.tester}-error`,
45
- framework: config.tester,
46
- language: config.language,
47
- data: slug,
48
- compiler: config.compiler
49
- });
50
- }
51
- else {
52
- socket.log('testing-success', [stdout || stderr].concat(["😁Everything is amazing!"]));
53
- Console.success("Everything is amazing!");
54
-
55
- bcActivity.activity('exercise_success', {
56
- language: config.language,
57
- slug: slug,
58
- editor: config.editor,
59
- compiler: config.compiler
60
- });
61
- config.exercises = config.exercises.map(e => {
62
- if (e.slug === slug) e.done = true;
63
- return e;
64
- });
65
- }
66
-
67
- if (typeof testingConfig.cleanup !== "undefined") {
68
- if (typeof testingConfig.cleanup === 'function' || typeof testingConfig.cleanup === 'object') {
69
- const clean = await testingConfig.cleanup(socket);
70
- if (clean) {
71
- const { stdout, stderr, code } = shell.exec(clean);
72
- if (code == 0) {
73
- Console.debug("The cleanup command runned successfully");
74
- }
75
- else Console.warning("There is an error on the cleanup command for the test");
76
- }
77
-
78
- }
79
- }
80
-
81
- return true;
82
- };
83
-
84
- */
@@ -1,2 +0,0 @@
1
- export declare type TAction = 'test' | 'log' | 'reload' | 'ready' | 'clean' | 'ask';
2
- export declare type ICallback = (...agrs: any[]) => any;
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,15 +0,0 @@
1
- export interface IAuditErrors {
2
- exercise?: string;
3
- msg: string;
4
- }
5
- declare type TType = "string" | "array" | "number" | "url" | "boolean";
6
- export interface ISchemaItem {
7
- key: string;
8
- mandatory: boolean;
9
- type: TType;
10
- max_size?: number;
11
- allowed_extensions?: string[];
12
- enum?: string[];
13
- max_item_size?: number;
14
- }
15
- export {};
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,21 +0,0 @@
1
- import { IConfigObj, TGrading } from "./config";
2
- import { IExercise } from "./exercise-obj";
3
- export interface IConfigManagerAttributes {
4
- grading: TGrading;
5
- disableGrading: boolean;
6
- version: string;
7
- mode?: string;
8
- }
9
- export interface IConfigManager {
10
- validLanguages?: any;
11
- get: () => IConfigObj;
12
- clean: () => void;
13
- getExercise: (slug: string | undefined) => IExercise;
14
- startExercise: (slug: string) => IExercise;
15
- reset: (slug: string) => void;
16
- buildIndex: () => boolean | void;
17
- watchIndex: (onChange: (...args: Array<any>) => void) => void;
18
- save: () => void;
19
- noCurrentExercise: () => void;
20
- getAllExercises: () => IExercise[];
21
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,62 +0,0 @@
1
- import { IExercise } from "./exercise-obj";
2
- export declare type TGrading = "isolated" | "incremental" | "no-grading";
3
- export declare type TMode = "preview" | "standalone";
4
- export declare type TConfigAction = "test" | "build" | "tutorial" | "reset";
5
- export declare type TConfigObjAttributes = "config" | "exercises" | "grading";
6
- export declare type TCompiler = "webpack" | "vanillajs" | "vue" | "react" | "css" | "html";
7
- export interface IConfigPath {
8
- base: string;
9
- }
10
- export interface IEditor {
11
- mode?: TMode;
12
- version: string;
13
- agent?: string;
14
- }
15
- export interface TEntries {
16
- python3?: string;
17
- html?: string;
18
- node?: string;
19
- react?: string;
20
- java?: string;
21
- }
22
- export interface IConfig {
23
- port?: string;
24
- repository?: string;
25
- description?: string;
26
- slug?: string;
27
- dirPath: string;
28
- preview?: string;
29
- entries: TEntries;
30
- grading: TGrading;
31
- configPath: string;
32
- translations: Array<string>;
33
- outputPath?: string;
34
- editor: IEditor;
35
- language: string;
36
- title: string;
37
- duration: number;
38
- difficulty?: string;
39
- exercisesPath: string;
40
- disableGrading: boolean;
41
- actions: Array<string>;
42
- autoPlay: boolean;
43
- projectType?: string;
44
- contact?: string;
45
- disabledActions?: Array<TConfigAction>;
46
- compiler: TCompiler;
47
- publicPath: string;
48
- publicUrl?: string;
49
- bugsLink?: string;
50
- videoSolutions?: boolean;
51
- skills: Array<string>;
52
- runHook: (...agrs: Array<any>) => void;
53
- testingFinishedCallback: (arg: any | undefined) => void;
54
- }
55
- export interface IConfigObj {
56
- session?: number;
57
- currentExercise?: any;
58
- config?: IConfig;
59
- exercises?: Array<IExercise>;
60
- confPath?: IConfigPath;
61
- address?: string;
62
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,11 +0,0 @@
1
- interface ILinks {
2
- error: number;
3
- total: number;
4
- }
5
- export interface ICounter {
6
- images: ILinks;
7
- links: ILinks;
8
- exercises: number;
9
- readmeFiles: number;
10
- }
11
- export {};
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });