@learnpack/learnpack 2.1.39 → 2.1.40

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 (196) hide show
  1. package/README.md +370 -35
  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 -342
  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 +239 -208
  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 +41 -41
  27. package/lib/managers/config/defaults.js +44 -44
  28. package/lib/managers/config/exercise.d.ts +36 -36
  29. package/lib/managers/config/exercise.js +236 -236
  30. package/lib/managers/config/index.d.ts +3 -3
  31. package/lib/managers/config/index.js +337 -337
  32. package/lib/managers/file.d.ts +14 -14
  33. package/lib/managers/file.js +153 -153
  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 -58
  38. package/lib/managers/server/routes.d.ts +4 -4
  39. package/lib/managers/server/routes.js +219 -219
  40. package/lib/managers/session.d.ts +3 -3
  41. package/lib/managers/session.js +125 -125
  42. package/lib/managers/socket.d.ts +3 -3
  43. package/lib/managers/socket.js +176 -176
  44. package/lib/managers/telemetry.d.ts +74 -74
  45. package/lib/managers/telemetry.js +206 -206
  46. package/lib/managers/test.js +84 -84
  47. package/lib/models/action.d.ts +2 -2
  48. package/lib/models/action.js +2 -2
  49. package/lib/models/audit.d.ts +15 -15
  50. package/lib/models/audit.js +2 -2
  51. package/lib/models/config-manager.d.ts +21 -21
  52. package/lib/models/config-manager.js +2 -2
  53. package/lib/models/config.d.ts +68 -67
  54. package/lib/models/config.js +2 -2
  55. package/lib/models/counter.d.ts +11 -11
  56. package/lib/models/counter.js +2 -2
  57. package/lib/models/errors.d.ts +15 -15
  58. package/lib/models/errors.js +2 -2
  59. package/lib/models/exercise-obj.d.ts +30 -30
  60. package/lib/models/exercise-obj.js +2 -2
  61. package/lib/models/file.d.ts +5 -5
  62. package/lib/models/file.js +2 -2
  63. package/lib/models/findings.d.ts +17 -17
  64. package/lib/models/findings.js +2 -2
  65. package/lib/models/flags.d.ts +10 -10
  66. package/lib/models/flags.js +2 -2
  67. package/lib/models/front-matter.d.ts +11 -11
  68. package/lib/models/front-matter.js +2 -2
  69. package/lib/models/gitpod-data.d.ts +16 -16
  70. package/lib/models/gitpod-data.js +2 -2
  71. package/lib/models/language.d.ts +4 -4
  72. package/lib/models/language.js +2 -2
  73. package/lib/models/package.d.ts +7 -7
  74. package/lib/models/package.js +2 -2
  75. package/lib/models/plugin-config.d.ts +16 -16
  76. package/lib/models/plugin-config.js +2 -2
  77. package/lib/models/session.d.ts +31 -31
  78. package/lib/models/session.js +2 -2
  79. package/lib/models/socket.d.ts +36 -32
  80. package/lib/models/socket.js +2 -2
  81. package/lib/models/status.d.ts +1 -1
  82. package/lib/models/status.js +2 -2
  83. package/lib/models/success-types.d.ts +1 -1
  84. package/lib/models/success-types.js +2 -2
  85. package/lib/plugin/command/compile.d.ts +6 -6
  86. package/lib/plugin/command/compile.js +18 -18
  87. package/lib/plugin/command/test.d.ts +6 -6
  88. package/lib/plugin/command/test.js +25 -25
  89. package/lib/plugin/index.d.ts +27 -27
  90. package/lib/plugin/index.js +7 -7
  91. package/lib/plugin/plugin.d.ts +8 -8
  92. package/lib/plugin/plugin.js +68 -68
  93. package/lib/plugin/utils.d.ts +16 -16
  94. package/lib/plugin/utils.js +58 -58
  95. package/lib/ui/download.d.ts +5 -5
  96. package/lib/ui/download.js +61 -61
  97. package/lib/utils/BaseCommand.d.ts +8 -8
  98. package/lib/utils/BaseCommand.js +41 -41
  99. package/lib/utils/SessionCommand.d.ts +10 -10
  100. package/lib/utils/SessionCommand.js +43 -43
  101. package/lib/utils/api.d.ts +14 -14
  102. package/lib/utils/api.js +255 -255
  103. package/lib/utils/audit.d.ts +16 -16
  104. package/lib/utils/audit.js +303 -303
  105. package/lib/utils/checkNotInstalled.d.ts +2 -0
  106. package/lib/utils/checkNotInstalled.js +36 -0
  107. package/lib/utils/console.d.ts +12 -12
  108. package/lib/utils/console.js +19 -19
  109. package/lib/utils/errors.d.ts +17 -17
  110. package/lib/utils/errors.js +100 -100
  111. package/lib/utils/exercisesQueue.d.ts +9 -9
  112. package/lib/utils/exercisesQueue.js +38 -38
  113. package/lib/utils/fileQueue.d.ts +40 -40
  114. package/lib/utils/fileQueue.js +168 -168
  115. package/lib/utils/misc.d.ts +1 -1
  116. package/lib/utils/misc.js +23 -23
  117. package/lib/utils/osOperations.d.ts +5 -5
  118. package/lib/utils/osOperations.js +72 -72
  119. package/lib/utils/validators.d.ts +5 -5
  120. package/lib/utils/validators.js +17 -17
  121. package/lib/utils/watcher.d.ts +2 -2
  122. package/lib/utils/watcher.js +25 -25
  123. package/oclif.manifest.json +1 -1
  124. package/package.json +139 -139
  125. package/src/commands/audit.ts +443 -443
  126. package/src/commands/clean.ts +29 -29
  127. package/src/commands/download.ts +61 -61
  128. package/src/commands/init.ts +170 -170
  129. package/src/commands/login.ts +42 -42
  130. package/src/commands/logout.ts +43 -43
  131. package/src/commands/publish.ts +107 -107
  132. package/src/commands/start.ts +53 -23
  133. package/src/commands/test.ts +85 -85
  134. package/src/index.ts +1 -1
  135. package/src/managers/config/allowed_files.ts +29 -29
  136. package/src/managers/config/defaults.ts +42 -42
  137. package/src/managers/config/exercise.ts +311 -311
  138. package/src/managers/config/index.ts +455 -455
  139. package/src/managers/file.ts +196 -196
  140. package/src/managers/gitpod.ts +84 -84
  141. package/src/managers/server/index.ts +78 -78
  142. package/src/managers/server/routes.ts +330 -330
  143. package/src/managers/session.ts +145 -145
  144. package/src/managers/socket.ts +250 -250
  145. package/src/managers/telemetry.ts +346 -346
  146. package/src/managers/test.ts +83 -83
  147. package/src/models/action.ts +10 -10
  148. package/src/models/audit.ts +16 -16
  149. package/src/models/config-manager.ts +23 -23
  150. package/src/models/config.ts +5 -3
  151. package/src/models/counter.ts +11 -11
  152. package/src/models/errors.ts +22 -22
  153. package/src/models/exercise-obj.ts +29 -29
  154. package/src/models/file.ts +5 -5
  155. package/src/models/findings.ts +18 -18
  156. package/src/models/flags.ts +10 -10
  157. package/src/models/front-matter.ts +11 -11
  158. package/src/models/gitpod-data.ts +19 -19
  159. package/src/models/language.ts +4 -4
  160. package/src/models/package.ts +7 -7
  161. package/src/models/plugin-config.ts +17 -17
  162. package/src/models/session.ts +34 -34
  163. package/src/models/socket.ts +5 -0
  164. package/src/models/status.ts +16 -16
  165. package/src/models/success-types.ts +1 -1
  166. package/src/plugin/command/compile.ts +17 -17
  167. package/src/plugin/command/test.ts +30 -30
  168. package/src/plugin/index.ts +6 -6
  169. package/src/plugin/plugin.ts +94 -94
  170. package/src/plugin/utils.ts +87 -87
  171. package/src/types/node-fetch.d.ts +1 -1
  172. package/src/ui/download.ts +71 -71
  173. package/src/utils/BaseCommand.ts +48 -48
  174. package/src/utils/SessionCommand.ts +43 -43
  175. package/src/utils/api.ts +303 -303
  176. package/src/utils/audit.ts +393 -393
  177. package/src/utils/checkNotInstalled.ts +46 -0
  178. package/src/utils/console.ts +24 -24
  179. package/src/utils/errors.ts +117 -117
  180. package/src/utils/exercisesQueue.ts +51 -51
  181. package/src/utils/fileQueue.ts +198 -198
  182. package/src/utils/misc.ts +23 -23
  183. package/src/utils/osOperations.ts +79 -79
  184. package/src/utils/templates/gitignore.txt +19 -19
  185. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.es.md +24 -24
  186. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.md +24 -24
  187. package/src/utils/templates/incremental/README.ejs +4 -4
  188. package/src/utils/templates/incremental/README.es.ejs +4 -4
  189. package/src/utils/templates/isolated/01-hello-world/README.es.md +26 -26
  190. package/src/utils/templates/isolated/01-hello-world/README.md +26 -26
  191. package/src/utils/templates/isolated/README.ejs +4 -4
  192. package/src/utils/templates/isolated/README.es.ejs +4 -4
  193. package/src/utils/templates/no-grading/README.ejs +4 -4
  194. package/src/utils/templates/no-grading/README.es.ejs +4 -4
  195. package/src/utils/validators.ts +18 -18
  196. package/src/utils/watcher.ts +27 -27
@@ -1,208 +1,239 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- // import path from "path";
4
- const command_1 = require("@oclif/command");
5
- const SessionCommand_1 = require("../utils/SessionCommand");
6
- const console_1 = require("../utils/console");
7
- const socket_1 = require("../managers/socket");
8
- const telemetry_1 = require("../managers/telemetry");
9
- const server_1 = require("../managers/server");
10
- const fileQueue_1 = require("../utils/fileQueue");
11
- const file_1 = require("../managers/file");
12
- const misc_1 = require("../utils/misc");
13
- const osOperations_1 = require("../utils/osOperations");
14
- class StartCommand extends SessionCommand_1.default {
15
- // 🛑 IMPORTANT
16
- // Every command that will use the configManager needs this init method
17
- async init() {
18
- const { flags } = this.parse(StartCommand);
19
- await this.initSession(flags);
20
- }
21
- async run() {
22
- var _a, _b, _c, _d, _e, _f;
23
- // get configuration object
24
- const configObject = (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.get();
25
- const config = configObject === null || configObject === void 0 ? void 0 : configObject.config;
26
- const hasXDG = await osOperations_1.eventManager.checkXDGInstalled();
27
- if (configObject) {
28
- const { config } = configObject;
29
- // build exerises
30
- (_b = this.configManager) === null || _b === void 0 ? void 0 : _b.buildIndex();
31
- console_1.default.debug(`Grading: ${config === null || config === void 0 ? void 0 : config.grading} ${((_c = config === null || config === void 0 ? void 0 : config.disabledActions) === null || _c === void 0 ? void 0 : _c.includes("test")) ? "(disabled)" : ""}, editor: ${config === null || config === void 0 ? void 0 : config.editor.mode} ${config === null || config === void 0 ? void 0 : config.editor.version}, for ${Array.isArray(configObject === null || configObject === void 0 ? void 0 : configObject.exercises) ? configObject === null || configObject === void 0 ? void 0 : configObject.exercises.length :
32
- 0} exercises found`);
33
- const appAlreadyExists = file_1.checkIfDirectoryExists(`${config === null || config === void 0 ? void 0 : config.dirPath}/_app`);
34
- if (!appAlreadyExists) {
35
- // download app and decompress
36
- await file_1.downloadEditor(config === null || config === void 0 ? void 0 : config.editor.version, `${config === null || config === void 0 ? void 0 : config.dirPath}/app.tar.gz`);
37
- console_1.default.info("Decompressing LearnPack UI, this may take a minute...");
38
- await file_1.decompress(`${config === null || config === void 0 ? void 0 : config.dirPath}/app.tar.gz`, `${config === null || config === void 0 ? void 0 : config.dirPath}/_app/`);
39
- }
40
- // listen to socket commands
41
- if (config && this.configManager) {
42
- const server = await server_1.default(configObject, this.configManager, process.env.NODE_ENV === "test");
43
- server.setMaxListeners(20);
44
- // console.log(config, "this is the f*!shell.which("code")!shell.which("code")cking config");
45
- // I should call a method to get the EventListener
46
- const dispatcher = fileQueue_1.default.dispatcher({
47
- create: true,
48
- path: `${config.dirPath}/vscode_queue.json`,
49
- });
50
- if (configObject.exercises) {
51
- const agent = ((_d = configObject.config) === null || _d === void 0 ? void 0 : _d.editor.agent) || "";
52
- const path = ((_e = configObject.config) === null || _e === void 0 ? void 0 : _e.dirPath) || "";
53
- const tutorialSlug = ((_f = configObject.config) === null || _f === void 0 ? void 0 : _f.slug) || "";
54
- const steps = configObject.exercises.map((e, index) => ({
55
- slug: e.slug,
56
- position: e.position || index,
57
- files: e.files,
58
- ai_interactions: [],
59
- compilations: [],
60
- tests: [],
61
- is_testeable: e.graded || false,
62
- }));
63
- if (path && steps.length > 0) {
64
- telemetry_1.default.start(agent, steps, path, tutorialSlug);
65
- }
66
- if (config.telemetry) {
67
- telemetry_1.default.urls = config.telemetry;
68
- }
69
- }
70
- socket_1.default.start(config, server, false);
71
- socket_1.default.on("open", (data) => {
72
- console_1.default.debug("Opening these files: ", data);
73
- const files = misc_1.prioritizeHTMLFile(data.files);
74
- if (config.editor.agent === "os") {
75
- osOperations_1.eventManager.enqueue(dispatcher.events.OPEN_FILES, files);
76
- }
77
- else {
78
- dispatcher.enqueue(dispatcher.events.OPEN_FILES, files);
79
- }
80
- socket_1.default.ready("Ready to compile...");
81
- });
82
- socket_1.default.on("open_window", (data) => {
83
- console_1.default.debug("Opening window: ", data);
84
- if (config.editor.agent === "os" &&
85
- ((config.os === "linux" && hasXDG) || config.os !== "linux")) {
86
- osOperations_1.eventManager.enqueue(dispatcher.events.OPEN_WINDOW, data);
87
- }
88
- else {
89
- dispatcher.enqueue(dispatcher.events.OPEN_WINDOW, data);
90
- }
91
- socket_1.default.ready("Ready to compile...");
92
- });
93
- socket_1.default.on("reset", (exercise) => {
94
- var _a;
95
- try {
96
- (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.reset(exercise.exerciseSlug);
97
- dispatcher.enqueue(dispatcher.events.RESET_EXERCISE, exercise.exerciseSlug);
98
- socket_1.default.ready("Ready to compile...");
99
- }
100
- catch (error) {
101
- socket_1.default.error("compiler-error", error.message ||
102
- "There was an error reseting the exercise");
103
- setTimeout(() => socket_1.default.ready("Ready to compile..."), 2000);
104
- }
105
- });
106
- socket_1.default.on("build", async (data) => {
107
- var _a;
108
- const exercise = (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.getExercise(data.exerciseSlug);
109
- if (!(exercise === null || exercise === void 0 ? void 0 : exercise.language)) {
110
- socket_1.default.error("compiler-error", "Impossible to detect language to build for " +
111
- data.exerciseSlug +
112
- "...");
113
- return;
114
- }
115
- socket_1.default.log("compiling", "Building exercise " +
116
- data.exerciseSlug +
117
- " with " +
118
- exercise.language +
119
- "...");
120
- await this.config.runHook("action", {
121
- action: "compile",
122
- socket: socket_1.default,
123
- configuration: config,
124
- exercise,
125
- telemetry: telemetry_1.default,
126
- });
127
- });
128
- socket_1.default.on("ai_interaction", (data) => {
129
- const { stepPosition, event, eventData } = data;
130
- telemetry_1.default.registerStepEvent(stepPosition, event, eventData);
131
- });
132
- socket_1.default.on("test", async (data) => {
133
- var _a, _b;
134
- const exercise = (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.getExercise(data.exerciseSlug);
135
- if (!(exercise === null || exercise === void 0 ? void 0 : exercise.language)) {
136
- socket_1.default.error("compiler-error", "Impossible to detect engine language for testing for " +
137
- data.exerciseSlug +
138
- "...");
139
- return;
140
- }
141
- if ((config === null || config === void 0 ? void 0 : config.disabledActions.includes("test")) || (config === null || config === void 0 ? void 0 : config.disableGrading)) {
142
- socket_1.default.ready("Grading is disabled on configuration");
143
- return true;
144
- }
145
- socket_1.default.log("testing", "Testing your exercise using the " + exercise.language + " engine.");
146
- await this.config.runHook("action", {
147
- action: "test",
148
- socket: socket_1.default,
149
- configuration: config,
150
- exercise,
151
- telemetry: telemetry_1.default,
152
- });
153
- (_b = this.configManager) === null || _b === void 0 ? void 0 : _b.save();
154
- return true;
155
- });
156
- const terminate = () => {
157
- var _a;
158
- console_1.default.error("Terminating Learnpack...");
159
- telemetry_1.default.submit();
160
- (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.noCurrentExercise();
161
- dispatcher.enqueue(dispatcher.events.END);
162
- process.exit();
163
- };
164
- server.on("close", terminate);
165
- process.on("SIGINT", terminate);
166
- process.on("SIGTERM", terminate);
167
- process.on("SIGHUP", terminate);
168
- // finish the server startup
169
- setTimeout(() => dispatcher.enqueue(dispatcher.events.RUNNING), 1000);
170
- // start watching for file changes
171
- if (StartCommand.flags.watch)
172
- this.configManager.watchIndex(_filename => {
173
- // Instead of reloading with socket.reload(), I just notify the frontend for the file change
174
- socket_1.default.emit("file_change", "ready", _filename);
175
- });
176
- }
177
- }
178
- }
179
- }
180
- exports.default = StartCommand;
181
- StartCommand.description = "Runs a small server with all the exercise instructions";
182
- StartCommand.flags = Object.assign(Object.assign({}, SessionCommand_1.default.flags), { port: command_1.flags.string({ char: "p", description: "server port" }), host: command_1.flags.string({ char: "h", description: "server host" }), disableGrading: command_1.flags.boolean({
183
- char: "D",
184
- description: "disble grading functionality",
185
- default: false,
186
- }),
187
- // disableGrading: flags.boolean({char: 'dg', description: 'disble grading functionality', default: false }),
188
- watch: command_1.flags.boolean({
189
- char: "w",
190
- description: "Watch for file changes",
191
- default: false,
192
- }), editor: command_1.flags.string({
193
- char: "e",
194
- description: "[preview, extension]",
195
- options: ["extension", "preview"],
196
- }), version: command_1.flags.string({
197
- char: "v",
198
- description: "E.g: 1.0.1",
199
- default: undefined,
200
- }), grading: command_1.flags.string({
201
- char: "g",
202
- description: "[isolated, incremental]",
203
- options: ["isolated", "incremental"],
204
- }), debug: command_1.flags.boolean({
205
- char: "d",
206
- description: "debugger mode for more verbage",
207
- default: false,
208
- }) });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ // import path from "path";
5
+ const command_1 = require("@oclif/command");
6
+ const SessionCommand_1 = require("../utils/SessionCommand");
7
+ const console_1 = require("../utils/console");
8
+ const socket_1 = require("../managers/socket");
9
+ const telemetry_1 = require("../managers/telemetry");
10
+ const server_1 = require("../managers/server");
11
+ const fileQueue_1 = require("../utils/fileQueue");
12
+ const file_1 = require("../managers/file");
13
+ const misc_1 = require("../utils/misc");
14
+ const osOperations_1 = require("../utils/osOperations");
15
+ const cli_ux_1 = require("cli-ux");
16
+ const checkNotInstalled_1 = require("../utils/checkNotInstalled");
17
+ class StartCommand extends SessionCommand_1.default {
18
+ // 🛑 IMPORTANT
19
+ // Every command that will use the configManager needs this init method
20
+ async init() {
21
+ const { flags } = this.parse(StartCommand);
22
+ await this.initSession(flags);
23
+ }
24
+ async run() {
25
+ var e_1, _a;
26
+ var _b, _c, _d, _e, _f, _g;
27
+ // get configuration object
28
+ const configObject = (_b = this.configManager) === null || _b === void 0 ? void 0 : _b.get();
29
+ // TODO: console.log(this.config.platform); get the platfrom from Oclif
30
+ const installedPlugins = this.config.plugins.map(plugin => {
31
+ return `${plugin.pjson.name}`;
32
+ });
33
+ const neededToInstallPlugins = checkNotInstalled_1.checkNotInstalledPlugins((configObject === null || configObject === void 0 ? void 0 : configObject.exercises) || [], installedPlugins);
34
+ if (neededToInstallPlugins.length > 0) {
35
+ console_1.default.error("These plugins are not installed but required: ", neededToInstallPlugins);
36
+ const confirmInstall = await cli_ux_1.cli.confirm("Do you want to install the needed plugins? (y/n)");
37
+ if (confirmInstall) {
38
+ console_1.default.info("Installing the needed plugins...");
39
+ try {
40
+ for (var neededToInstallPlugins_1 = tslib_1.__asyncValues(neededToInstallPlugins), neededToInstallPlugins_1_1; neededToInstallPlugins_1_1 = await neededToInstallPlugins_1.next(), !neededToInstallPlugins_1_1.done;) {
41
+ const p = neededToInstallPlugins_1_1.value;
42
+ await this.config.runCommand(`plugins:install`, [p]);
43
+ console_1.default.log(`Plugin ${p} installed`);
44
+ }
45
+ }
46
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
47
+ finally {
48
+ try {
49
+ if (neededToInstallPlugins_1_1 && !neededToInstallPlugins_1_1.done && (_a = neededToInstallPlugins_1.return)) await _a.call(neededToInstallPlugins_1);
50
+ }
51
+ finally { if (e_1) throw e_1.error; }
52
+ }
53
+ console_1.default.log("All needed plugins installed, please restart LearnPack to load them.");
54
+ console_1.default.info("Run: $ learnpack start");
55
+ this.exit(0);
56
+ }
57
+ else {
58
+ console_1.default.error("You need to install the plugins to complete this exercise");
59
+ console_1.default.info("To install the plugins run each of the following commands: ");
60
+ for (const p of neededToInstallPlugins) {
61
+ console_1.default.log(`learnpack plugins:install ${p}`);
62
+ }
63
+ this.exit(1);
64
+ }
65
+ }
66
+ if (configObject) {
67
+ const { config } = configObject;
68
+ // build exerises
69
+ (_c = this.configManager) === null || _c === void 0 ? void 0 : _c.buildIndex();
70
+ console_1.default.debug(`Grading: ${config === null || config === void 0 ? void 0 : config.grading} ${((_d = config === null || config === void 0 ? void 0 : config.disabledActions) === null || _d === void 0 ? void 0 : _d.includes("test")) ? "(disabled)" : ""}, editor: ${config === null || config === void 0 ? void 0 : config.editor.mode} ${config === null || config === void 0 ? void 0 : config.editor.version}, for ${Array.isArray(configObject === null || configObject === void 0 ? void 0 : configObject.exercises) ? configObject === null || configObject === void 0 ? void 0 : configObject.exercises.length :
71
+ 0} exercises found`);
72
+ const appAlreadyExists = file_1.checkIfDirectoryExists(`${config === null || config === void 0 ? void 0 : config.dirPath}/_app`);
73
+ if (!appAlreadyExists) {
74
+ // download app and decompress
75
+ await file_1.downloadEditor(config === null || config === void 0 ? void 0 : config.editor.version, `${config === null || config === void 0 ? void 0 : config.dirPath}/app.tar.gz`);
76
+ console_1.default.info("Decompressing LearnPack UI, this may take a minute...");
77
+ await file_1.decompress(`${config === null || config === void 0 ? void 0 : config.dirPath}/app.tar.gz`, `${config === null || config === void 0 ? void 0 : config.dirPath}/_app/`);
78
+ }
79
+ // listen to socket commands
80
+ if (config && this.configManager) {
81
+ const server = await server_1.default(configObject, this.configManager, process.env.NODE_ENV === "test");
82
+ server.setMaxListeners(25);
83
+ // I should call a method to get the EventListener
84
+ const dispatcher = fileQueue_1.default.dispatcher({
85
+ create: true,
86
+ path: `${config.dirPath}/vscode_queue.json`,
87
+ });
88
+ if (configObject.exercises) {
89
+ const agent = ((_e = configObject.config) === null || _e === void 0 ? void 0 : _e.editor.agent) || "";
90
+ const path = ((_f = configObject.config) === null || _f === void 0 ? void 0 : _f.dirPath) || "";
91
+ const tutorialSlug = ((_g = configObject.config) === null || _g === void 0 ? void 0 : _g.slug) || "";
92
+ const steps = configObject.exercises.map((e, index) => ({
93
+ slug: e.slug,
94
+ position: e.position || index,
95
+ files: e.files,
96
+ ai_interactions: [],
97
+ compilations: [],
98
+ tests: [],
99
+ is_testeable: e.graded || false,
100
+ }));
101
+ if (path && steps.length > 0) {
102
+ telemetry_1.default.start(agent, steps, path, tutorialSlug);
103
+ }
104
+ if (config.telemetry) {
105
+ telemetry_1.default.urls = config.telemetry;
106
+ }
107
+ }
108
+ socket_1.default.start(config, server, false);
109
+ socket_1.default.on("open", (data) => {
110
+ console_1.default.debug("Opening these files: ", data);
111
+ const files = misc_1.prioritizeHTMLFile(data.files);
112
+ if (config.editor.agent === "os") {
113
+ osOperations_1.eventManager.enqueue(dispatcher.events.OPEN_FILES, files);
114
+ }
115
+ else {
116
+ dispatcher.enqueue(dispatcher.events.OPEN_FILES, files);
117
+ }
118
+ socket_1.default.ready("Ready to compile...");
119
+ });
120
+ socket_1.default.on("open_window", (data) => {
121
+ console_1.default.debug("Opening window: ", data);
122
+ cli_ux_1.cli.open(data.url);
123
+ socket_1.default.log("open_window", `URL ${data.url} opened in the browser`);
124
+ });
125
+ socket_1.default.on("reset", (exercise) => {
126
+ var _a;
127
+ try {
128
+ (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.reset(exercise.exerciseSlug);
129
+ socket_1.default.ready("Ready to compile...");
130
+ }
131
+ catch (error) {
132
+ socket_1.default.error("compiler-error", error.message ||
133
+ "There was an error reseting the exercise");
134
+ setTimeout(() => socket_1.default.ready("Ready to compile..."), 2000);
135
+ }
136
+ });
137
+ socket_1.default.on("build", async (data) => {
138
+ var _a;
139
+ const exercise = (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.getExercise(data.exerciseSlug);
140
+ if (!(exercise === null || exercise === void 0 ? void 0 : exercise.language)) {
141
+ socket_1.default.error("compiler-error", "Impossible to detect language to build for " +
142
+ data.exerciseSlug +
143
+ "...");
144
+ return;
145
+ }
146
+ socket_1.default.log("compiling", "Building exercise " +
147
+ data.exerciseSlug +
148
+ " with " +
149
+ exercise.language +
150
+ "...");
151
+ await this.config.runHook("action", {
152
+ action: "compile",
153
+ socket: socket_1.default,
154
+ configuration: config,
155
+ exercise,
156
+ telemetry: telemetry_1.default,
157
+ });
158
+ });
159
+ socket_1.default.on("ai_interaction", (data) => {
160
+ const { stepPosition, event, eventData } = data;
161
+ telemetry_1.default.registerStepEvent(stepPosition, event, eventData);
162
+ });
163
+ socket_1.default.on("test", async (data) => {
164
+ var _a, _b;
165
+ const exercise = (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.getExercise(data.exerciseSlug);
166
+ if (!(exercise === null || exercise === void 0 ? void 0 : exercise.language)) {
167
+ socket_1.default.error("compiler-error", "Impossible to detect engine language for testing for " +
168
+ data.exerciseSlug +
169
+ "...");
170
+ return;
171
+ }
172
+ if ((config === null || config === void 0 ? void 0 : config.disabledActions.includes("test")) || (config === null || config === void 0 ? void 0 : config.disableGrading)) {
173
+ socket_1.default.ready("Grading is disabled on configuration");
174
+ return true;
175
+ }
176
+ socket_1.default.log("testing", "Testing your exercise using the " + exercise.language + " engine.");
177
+ await this.config.runHook("action", {
178
+ action: "test",
179
+ socket: socket_1.default,
180
+ configuration: config,
181
+ exercise,
182
+ telemetry: telemetry_1.default,
183
+ });
184
+ (_b = this.configManager) === null || _b === void 0 ? void 0 : _b.save();
185
+ return true;
186
+ });
187
+ const terminate = async () => {
188
+ var _a;
189
+ console_1.default.error("Terminating Learnpack...");
190
+ await telemetry_1.default.submit();
191
+ (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.noCurrentExercise();
192
+ dispatcher.enqueue(dispatcher.events.END);
193
+ process.exit();
194
+ };
195
+ server.on("close", terminate);
196
+ process.on("SIGINT", terminate);
197
+ process.on("SIGTERM", terminate);
198
+ process.on("SIGHUP", terminate);
199
+ // finish the server startup
200
+ setTimeout(() => dispatcher.enqueue(dispatcher.events.RUNNING), 1000);
201
+ // start watching for file changes
202
+ if (StartCommand.flags.watch)
203
+ this.configManager.watchIndex(_filename => {
204
+ // Instead of reloading with socket.reload(), I just notify the frontend for the file change
205
+ socket_1.default.emit("file_change", "ready", _filename);
206
+ });
207
+ }
208
+ }
209
+ }
210
+ }
211
+ exports.default = StartCommand;
212
+ StartCommand.description = "Runs a small server with all the exercise instructions";
213
+ StartCommand.flags = Object.assign(Object.assign({}, SessionCommand_1.default.flags), { port: command_1.flags.string({ char: "p", description: "server port" }), host: command_1.flags.string({ char: "h", description: "server host" }), disableGrading: command_1.flags.boolean({
214
+ char: "D",
215
+ description: "disble grading functionality",
216
+ default: false,
217
+ }),
218
+ // disableGrading: flags.boolean({char: 'dg', description: 'disble grading functionality', default: false }),
219
+ watch: command_1.flags.boolean({
220
+ char: "w",
221
+ description: "Watch for file changes",
222
+ default: false,
223
+ }), editor: command_1.flags.string({
224
+ char: "e",
225
+ description: "[preview, extension]",
226
+ options: ["extension", "preview"],
227
+ }), version: command_1.flags.string({
228
+ char: "v",
229
+ description: "E.g: 1.0.1",
230
+ default: undefined,
231
+ }), grading: command_1.flags.string({
232
+ char: "g",
233
+ description: "[isolated, incremental]",
234
+ options: ["isolated", "incremental"],
235
+ }), debug: command_1.flags.boolean({
236
+ char: "d",
237
+ description: "debugger mode for more verbage",
238
+ default: false,
239
+ }) });
@@ -1,6 +1,6 @@
1
- import SessionCommand from "../utils/SessionCommand";
2
- declare class TestCommand extends SessionCommand {
3
- init(): Promise<void>;
4
- run(): Promise<void>;
5
- }
6
- export default TestCommand;
1
+ import SessionCommand from "../utils/SessionCommand";
2
+ declare class TestCommand extends SessionCommand {
3
+ init(): Promise<void>;
4
+ run(): Promise<void>;
5
+ }
6
+ export default TestCommand;
@@ -1,62 +1,62 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const console_1 = require("../utils/console");
4
- const SessionCommand_1 = require("../utils/SessionCommand");
5
- const socket_1 = require("../managers/socket");
6
- const server_1 = require("../managers/server");
7
- const exercisesQueue_1 = require("../utils/exercisesQueue");
8
- class TestCommand extends SessionCommand_1.default {
9
- async init() {
10
- const { flags } = this.parse(TestCommand);
11
- await this.initSession(flags);
12
- }
13
- async run() {
14
- var _a, _b, _c;
15
- const { args: { exerciseSlug }, } = this.parse(TestCommand);
16
- // Build exercises index
17
- (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.buildIndex();
18
- let exercises = [];
19
- // test all exercises
20
- !exerciseSlug ?
21
- (exercises = (_b = this.configManager) === null || _b === void 0 ? void 0 : _b.getAllExercises()) :
22
- (exercises = [this.configManager.getExercise(exerciseSlug)]);
23
- const exercisesQueue = new exercisesQueue_1.default(exercises);
24
- const configObject = (_c = this.configManager) === null || _c === void 0 ? void 0 : _c.get();
25
- let hasFailed = false;
26
- let failedTestsCount = 0;
27
- let successTestsCount = 0;
28
- const testsToRunCount = exercisesQueue.size();
29
- configObject.config.testingFinishedCallback = ({ result }) => {
30
- if (result === "failed") {
31
- hasFailed = true;
32
- failedTestsCount++;
33
- }
34
- else {
35
- successTestsCount++;
36
- }
37
- if (exercisesQueue.isEmpty()) {
38
- console_1.default.info(`${testsToRunCount} test${testsToRunCount > 1 ? "s" : ""} runned`);
39
- console_1.default.success(`${successTestsCount} test${successTestsCount > 1 ? "s" : ""} passed`);
40
- console_1.default.error(`${failedTestsCount} test${failedTestsCount > 1 ? "s" : ""} failed`);
41
- process.exit(hasFailed ? 1 : 0);
42
- }
43
- else {
44
- exercisesQueue.pop().test(this.config, config, socket_1.default);
45
- }
46
- };
47
- const config = configObject === null || configObject === void 0 ? void 0 : configObject.config;
48
- const server = await server_1.default(configObject, this.configManager, true);
49
- socket_1.default.start(config, server, true);
50
- exercisesQueue.pop().test(this.config, config, socket_1.default);
51
- }
52
- }
53
- TestCommand.description = `Test exercises`;
54
- TestCommand.args = [
55
- {
56
- name: "exerciseSlug",
57
- required: false,
58
- description: "The name of the exercise to test",
59
- hidden: false,
60
- },
61
- ];
62
- exports.default = TestCommand;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const console_1 = require("../utils/console");
4
+ const SessionCommand_1 = require("../utils/SessionCommand");
5
+ const socket_1 = require("../managers/socket");
6
+ const server_1 = require("../managers/server");
7
+ const exercisesQueue_1 = require("../utils/exercisesQueue");
8
+ class TestCommand extends SessionCommand_1.default {
9
+ async init() {
10
+ const { flags } = this.parse(TestCommand);
11
+ await this.initSession(flags);
12
+ }
13
+ async run() {
14
+ var _a, _b, _c;
15
+ const { args: { exerciseSlug }, } = this.parse(TestCommand);
16
+ // Build exercises index
17
+ (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.buildIndex();
18
+ let exercises = [];
19
+ // test all exercises
20
+ !exerciseSlug ?
21
+ (exercises = (_b = this.configManager) === null || _b === void 0 ? void 0 : _b.getAllExercises()) :
22
+ (exercises = [this.configManager.getExercise(exerciseSlug)]);
23
+ const exercisesQueue = new exercisesQueue_1.default(exercises);
24
+ const configObject = (_c = this.configManager) === null || _c === void 0 ? void 0 : _c.get();
25
+ let hasFailed = false;
26
+ let failedTestsCount = 0;
27
+ let successTestsCount = 0;
28
+ const testsToRunCount = exercisesQueue.size();
29
+ configObject.config.testingFinishedCallback = ({ result }) => {
30
+ if (result === "failed") {
31
+ hasFailed = true;
32
+ failedTestsCount++;
33
+ }
34
+ else {
35
+ successTestsCount++;
36
+ }
37
+ if (exercisesQueue.isEmpty()) {
38
+ console_1.default.info(`${testsToRunCount} test${testsToRunCount > 1 ? "s" : ""} runned`);
39
+ console_1.default.success(`${successTestsCount} test${successTestsCount > 1 ? "s" : ""} passed`);
40
+ console_1.default.error(`${failedTestsCount} test${failedTestsCount > 1 ? "s" : ""} failed`);
41
+ process.exit(hasFailed ? 1 : 0);
42
+ }
43
+ else {
44
+ exercisesQueue.pop().test(this.config, config, socket_1.default);
45
+ }
46
+ };
47
+ const config = configObject === null || configObject === void 0 ? void 0 : configObject.config;
48
+ const server = await server_1.default(configObject, this.configManager, true);
49
+ socket_1.default.start(config, server, true);
50
+ exercisesQueue.pop().test(this.config, config, socket_1.default);
51
+ }
52
+ }
53
+ TestCommand.description = `Test exercises`;
54
+ TestCommand.args = [
55
+ {
56
+ name: "exerciseSlug",
57
+ required: false,
58
+ description: "The name of the exercise to test",
59
+ hidden: false,
60
+ },
61
+ ];
62
+ exports.default = TestCommand;
package/lib/index.d.ts CHANGED
@@ -1 +1 @@
1
- export * from '@oclif/command';
1
+ export * from '@oclif/command';
package/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("@oclif/command"), exports);
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("@oclif/command"), exports);