@learnpack/learnpack 2.1.25 → 2.1.27

Sign up to get free protection for your applications and to get access to all the features.
Files changed (187) hide show
  1. package/README.md +16 -16
  2. package/bin/run +17 -17
  3. package/bin/run.cmd +3 -3
  4. package/oclif.manifest.json +1 -1
  5. package/package.json +139 -138
  6. package/src/commands/audit.ts +134 -109
  7. package/src/commands/clean.ts +29 -29
  8. package/src/commands/download.ts +62 -62
  9. package/src/commands/init.ts +39 -39
  10. package/src/commands/login.ts +42 -42
  11. package/src/commands/logout.ts +43 -43
  12. package/src/commands/publish.ts +107 -107
  13. package/src/commands/start.ts +264 -234
  14. package/src/commands/test.ts +85 -85
  15. package/src/index.ts +1 -1
  16. package/src/managers/config/allowed_files.ts +29 -29
  17. package/src/managers/config/defaults.ts +4 -2
  18. package/src/managers/config/exercise.ts +309 -302
  19. package/src/managers/config/index.ts +159 -138
  20. package/src/managers/file.ts +178 -169
  21. package/src/managers/gitpod.ts +84 -84
  22. package/src/managers/server/index.ts +78 -69
  23. package/src/managers/server/routes.ts +139 -90
  24. package/src/managers/session.ts +147 -118
  25. package/src/managers/socket.ts +252 -239
  26. package/src/managers/test.ts +83 -83
  27. package/src/models/action.ts +10 -3
  28. package/src/models/config-manager.ts +23 -23
  29. package/src/models/config.ts +9 -2
  30. package/src/models/counter.ts +11 -11
  31. package/src/models/errors.ts +22 -22
  32. package/src/models/exercise-obj.ts +6 -3
  33. package/src/models/file.ts +5 -5
  34. package/src/models/findings.ts +18 -18
  35. package/src/models/flags.ts +10 -10
  36. package/src/models/front-matter.ts +11 -11
  37. package/src/models/gitpod-data.ts +19 -19
  38. package/src/models/language.ts +4 -4
  39. package/src/models/package.ts +7 -7
  40. package/src/models/plugin-config.ts +17 -17
  41. package/src/models/session.ts +29 -26
  42. package/src/models/socket.ts +54 -48
  43. package/src/models/status.ts +16 -15
  44. package/src/models/success-types.ts +1 -1
  45. package/src/plugin/command/compile.ts +17 -17
  46. package/src/plugin/command/test.ts +30 -30
  47. package/src/plugin/index.ts +6 -6
  48. package/src/plugin/plugin.ts +94 -94
  49. package/src/plugin/utils.ts +87 -87
  50. package/src/types/node-fetch.d.ts +1 -1
  51. package/src/ui/download.ts +71 -71
  52. package/src/utils/BaseCommand.ts +48 -48
  53. package/src/utils/SessionCommand.ts +48 -48
  54. package/src/utils/api.ts +246 -194
  55. package/src/utils/audit.ts +392 -395
  56. package/src/utils/console.ts +24 -24
  57. package/src/utils/errors.ts +117 -117
  58. package/src/utils/exercisesQueue.ts +51 -51
  59. package/src/utils/fileQueue.ts +198 -198
  60. package/src/utils/misc.ts +23 -23
  61. package/src/utils/templates/gitignore.txt +19 -19
  62. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.es.md +24 -24
  63. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.md +24 -24
  64. package/src/utils/templates/incremental/README.ejs +4 -4
  65. package/src/utils/templates/incremental/README.es.ejs +4 -4
  66. package/src/utils/templates/isolated/01-hello-world/README.es.md +26 -26
  67. package/src/utils/templates/isolated/01-hello-world/README.md +26 -26
  68. package/src/utils/templates/isolated/README.ejs +4 -4
  69. package/src/utils/templates/isolated/README.es.ejs +4 -4
  70. package/src/utils/templates/no-grading/README.ejs +4 -4
  71. package/src/utils/templates/no-grading/README.es.ejs +4 -4
  72. package/src/utils/validators.ts +18 -18
  73. package/src/utils/watcher.ts +14 -14
  74. package/lib/commands/audit.d.ts +0 -6
  75. package/lib/commands/audit.js +0 -317
  76. package/lib/commands/clean.d.ts +0 -8
  77. package/lib/commands/clean.js +0 -25
  78. package/lib/commands/download.d.ts +0 -13
  79. package/lib/commands/download.js +0 -55
  80. package/lib/commands/init.d.ts +0 -9
  81. package/lib/commands/init.js +0 -123
  82. package/lib/commands/login.d.ts +0 -14
  83. package/lib/commands/login.js +0 -37
  84. package/lib/commands/logout.d.ts +0 -14
  85. package/lib/commands/logout.js +0 -37
  86. package/lib/commands/publish.d.ts +0 -14
  87. package/lib/commands/publish.js +0 -82
  88. package/lib/commands/start.d.ts +0 -7
  89. package/lib/commands/start.js +0 -165
  90. package/lib/commands/test.d.ts +0 -6
  91. package/lib/commands/test.js +0 -62
  92. package/lib/index.d.ts +0 -1
  93. package/lib/index.js +0 -4
  94. package/lib/managers/config/allowed_files.d.ts +0 -5
  95. package/lib/managers/config/allowed_files.js +0 -30
  96. package/lib/managers/config/defaults.d.ts +0 -37
  97. package/lib/managers/config/defaults.js +0 -38
  98. package/lib/managers/config/exercise.d.ts +0 -36
  99. package/lib/managers/config/exercise.js +0 -230
  100. package/lib/managers/config/index.d.ts +0 -3
  101. package/lib/managers/config/index.js +0 -302
  102. package/lib/managers/file.d.ts +0 -13
  103. package/lib/managers/file.js +0 -134
  104. package/lib/managers/gitpod.d.ts +0 -3
  105. package/lib/managers/gitpod.js +0 -67
  106. package/lib/managers/server/index.d.ts +0 -6
  107. package/lib/managers/server/index.js +0 -51
  108. package/lib/managers/server/routes.d.ts +0 -4
  109. package/lib/managers/server/routes.js +0 -167
  110. package/lib/managers/session.d.ts +0 -3
  111. package/lib/managers/session.js +0 -104
  112. package/lib/managers/socket.d.ts +0 -3
  113. package/lib/managers/socket.js +0 -164
  114. package/lib/managers/test.d.ts +0 -0
  115. package/lib/managers/test.js +0 -84
  116. package/lib/models/action.d.ts +0 -2
  117. package/lib/models/action.js +0 -2
  118. package/lib/models/audit.d.ts +0 -15
  119. package/lib/models/audit.js +0 -2
  120. package/lib/models/config-manager.d.ts +0 -21
  121. package/lib/models/config-manager.js +0 -2
  122. package/lib/models/config.d.ts +0 -60
  123. package/lib/models/config.js +0 -2
  124. package/lib/models/counter.d.ts +0 -11
  125. package/lib/models/counter.js +0 -2
  126. package/lib/models/errors.d.ts +0 -15
  127. package/lib/models/errors.js +0 -2
  128. package/lib/models/exercise-obj.d.ts +0 -27
  129. package/lib/models/exercise-obj.js +0 -2
  130. package/lib/models/file.d.ts +0 -5
  131. package/lib/models/file.js +0 -2
  132. package/lib/models/findings.d.ts +0 -17
  133. package/lib/models/findings.js +0 -2
  134. package/lib/models/flags.d.ts +0 -10
  135. package/lib/models/flags.js +0 -2
  136. package/lib/models/front-matter.d.ts +0 -11
  137. package/lib/models/front-matter.js +0 -2
  138. package/lib/models/gitpod-data.d.ts +0 -16
  139. package/lib/models/gitpod-data.js +0 -2
  140. package/lib/models/language.d.ts +0 -4
  141. package/lib/models/language.js +0 -2
  142. package/lib/models/package.d.ts +0 -7
  143. package/lib/models/package.js +0 -2
  144. package/lib/models/plugin-config.d.ts +0 -16
  145. package/lib/models/plugin-config.js +0 -2
  146. package/lib/models/session.d.ts +0 -23
  147. package/lib/models/session.js +0 -2
  148. package/lib/models/socket.d.ts +0 -31
  149. package/lib/models/socket.js +0 -2
  150. package/lib/models/status.d.ts +0 -1
  151. package/lib/models/status.js +0 -2
  152. package/lib/models/success-types.d.ts +0 -1
  153. package/lib/models/success-types.js +0 -2
  154. package/lib/plugin/command/compile.d.ts +0 -6
  155. package/lib/plugin/command/compile.js +0 -18
  156. package/lib/plugin/command/test.d.ts +0 -6
  157. package/lib/plugin/command/test.js +0 -25
  158. package/lib/plugin/index.d.ts +0 -27
  159. package/lib/plugin/index.js +0 -7
  160. package/lib/plugin/plugin.d.ts +0 -8
  161. package/lib/plugin/plugin.js +0 -68
  162. package/lib/plugin/utils.d.ts +0 -16
  163. package/lib/plugin/utils.js +0 -58
  164. package/lib/ui/download.d.ts +0 -5
  165. package/lib/ui/download.js +0 -61
  166. package/lib/utils/BaseCommand.d.ts +0 -8
  167. package/lib/utils/BaseCommand.js +0 -41
  168. package/lib/utils/SessionCommand.d.ts +0 -10
  169. package/lib/utils/SessionCommand.js +0 -47
  170. package/lib/utils/api.d.ts +0 -12
  171. package/lib/utils/api.js +0 -173
  172. package/lib/utils/audit.d.ts +0 -16
  173. package/lib/utils/audit.js +0 -302
  174. package/lib/utils/console.d.ts +0 -12
  175. package/lib/utils/console.js +0 -19
  176. package/lib/utils/errors.d.ts +0 -17
  177. package/lib/utils/errors.js +0 -100
  178. package/lib/utils/exercisesQueue.d.ts +0 -9
  179. package/lib/utils/exercisesQueue.js +0 -38
  180. package/lib/utils/fileQueue.d.ts +0 -40
  181. package/lib/utils/fileQueue.js +0 -168
  182. package/lib/utils/misc.d.ts +0 -1
  183. package/lib/utils/misc.js +0 -23
  184. package/lib/utils/validators.d.ts +0 -5
  185. package/lib/utils/validators.js +0 -17
  186. package/lib/utils/watcher.d.ts +0 -2
  187. package/lib/utils/watcher.js +0 -23
@@ -1,123 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const command_1 = require("@oclif/command");
4
- const BaseCommand_1 = require("../utils/BaseCommand");
5
- // eslint-disable-next-line
6
- const fs = require("fs-extra");
7
- const prompts = require("prompts");
8
- const cli_ux_1 = require("cli-ux");
9
- const eta = require("eta");
10
- const console_1 = require("../utils/console");
11
- const errors_1 = require("../utils/errors");
12
- const path = require("path");
13
- class InitComand extends BaseCommand_1.default {
14
- async run() {
15
- const { flags } = this.parse(InitComand);
16
- // if the folder/file .learn or .breathecode aleady exists
17
- await alreadyInitialized();
18
- const choices = await prompts([
19
- {
20
- type: "select",
21
- name: "grading",
22
- message: "Is the auto-grading going to be isolated or incremental?",
23
- choices: [
24
- {
25
- title: "Incremental: Build on top of each other like a tutorial",
26
- value: "incremental",
27
- },
28
- { title: "Isolated: Small separated exercises", value: "isolated" },
29
- {
30
- title: "No grading: No feedback or testing whatsoever",
31
- value: null,
32
- },
33
- ],
34
- },
35
- {
36
- type: "text",
37
- name: "title",
38
- initial: "My Interactive Tutorial",
39
- message: "Title for your tutorial? Press enter to leave as it is",
40
- },
41
- {
42
- type: "text",
43
- name: "description",
44
- initial: "",
45
- message: "Description for your tutorial? Press enter to leave blank",
46
- },
47
- {
48
- type: "select",
49
- name: "difficulty",
50
- message: "How difficulty will be to complete the tutorial?",
51
- choices: [
52
- { title: "Begginer (no previous experience)", value: "beginner" },
53
- { title: "Easy (just a bit of experience required)", value: "easy" },
54
- {
55
- title: "Intermediate (you need experience)",
56
- value: "intermediate",
57
- },
58
- { title: "Hard (master the topic)", value: "hard" },
59
- ],
60
- },
61
- {
62
- type: "text",
63
- name: "duration",
64
- initial: "1",
65
- message: "How many hours avg it takes to complete (number)?",
66
- validate: (value) => {
67
- const n = Math.floor(Number(value));
68
- return (n !== Number.POSITIVE_INFINITY && String(n) === value && n >= 0);
69
- },
70
- },
71
- ]);
72
- const packageInfo = {
73
- grading: choices.grading,
74
- difficulty: choices.difficulty,
75
- duration: parseInt(choices.duration),
76
- description: choices.description,
77
- title: choices.title,
78
- slug: choices.title
79
- .toLowerCase()
80
- .replace(/ /g, "-")
81
- .replace(/[^\w-]+/g, ""),
82
- };
83
- cli_ux_1.default.action.start("Initializing package");
84
- const languages = ["en", "es"];
85
- const templatesDir = path.resolve(__dirname, "../../src/utils/templates/" + choices.grading || "no-grading");
86
- if (!fs.existsSync(templatesDir))
87
- throw errors_1.ValidationError(`Template ${templatesDir} does not exists`);
88
- await fs.copySync(templatesDir, "./");
89
- // Creating README files
90
- // eslint-disable-next-line
91
- languages.forEach((language) => {
92
- const readmeFilename = `README${language !== "en" ? `.${language}` : ""}`;
93
- fs.writeFileSync(`./${readmeFilename}.md`, eta.render(fs.readFileSync(path.resolve(__dirname, `${templatesDir}/${readmeFilename}.ejs`), "utf-8"), packageInfo));
94
- if (fs.existsSync(`./${readmeFilename}.ejs`))
95
- fs.removeSync(`./${readmeFilename}.ejs`);
96
- });
97
- if (!fs.existsSync("./.gitignore"))
98
- fs.copyFile(path.resolve(__dirname, "../../src/utils/templates/gitignore.txt"), "./.gitignore");
99
- fs.writeFileSync("./learn.json", JSON.stringify(packageInfo, null, 2));
100
- cli_ux_1.default.action.stop();
101
- console_1.default.success(`😋 Package initialized successfully`);
102
- console_1.default.help(`Start the exercises by running the following command on your terminal: $ learnpack start`);
103
- }
104
- }
105
- InitComand.description = "Create a new learning package: Book, Tutorial or Exercise";
106
- InitComand.flags = Object.assign(Object.assign({}, BaseCommand_1.default.flags), { grading: command_1.flags.help({ char: "h" }) });
107
- const alreadyInitialized = () => new Promise((resolve, reject) => {
108
- fs.readdir("./", function (err, files) {
109
- files = files.filter((f) => [".learn", "learn.json", "bc.json", ".breathecode"].includes(f));
110
- if (err) {
111
- reject(errors_1.ValidationError(err.message));
112
- throw errors_1.ValidationError(err.message);
113
- }
114
- else if (files.length > 0) {
115
- reject(errors_1.ValidationError("It seems the package is already initialized because we've found the following files: " +
116
- files.join(",")));
117
- throw errors_1.ValidationError("It seems the package is already initialized because we've found the following files: " +
118
- files.join(","));
119
- }
120
- resolve(false);
121
- });
122
- });
123
- exports.default = InitComand;
@@ -1,14 +0,0 @@
1
- import SessionCommand from "../utils/SessionCommand";
2
- declare class LoginCommand extends SessionCommand {
3
- static description: string;
4
- static flags: any;
5
- static args: {
6
- name: string;
7
- required: boolean;
8
- description: string;
9
- hidden: boolean;
10
- }[];
11
- init(): Promise<void>;
12
- run(): Promise<void>;
13
- }
14
- export default LoginCommand;
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const SessionCommand_1 = require("../utils/SessionCommand");
4
- const session_1 = require("../managers/session");
5
- const console_1 = require("../utils/console");
6
- class LoginCommand extends SessionCommand_1.default {
7
- async init() {
8
- const { flags } = this.parse(LoginCommand);
9
- await this.initSession(flags);
10
- }
11
- async run() {
12
- /* const {flags, args} = */ this.parse(LoginCommand);
13
- try {
14
- await session_1.default.login();
15
- }
16
- catch (error) {
17
- console_1.default.error("Error trying to authenticate");
18
- console_1.default.error(error.message || error);
19
- }
20
- }
21
- }
22
- LoginCommand.description = `Describe the command here
23
- ...
24
- Extra documentation goes here
25
- `;
26
- LoginCommand.flags = {
27
- // name: flags.string({char: 'n', description: 'name to print'}),
28
- };
29
- LoginCommand.args = [
30
- {
31
- name: "package",
32
- required: false,
33
- description: "The unique string that identifies this package on learnpack",
34
- hidden: false,
35
- },
36
- ];
37
- exports.default = LoginCommand;
@@ -1,14 +0,0 @@
1
- import SessionCommand from "../utils/SessionCommand";
2
- declare class LogoutCommand extends SessionCommand {
3
- static description: string;
4
- static flags: any;
5
- static args: {
6
- name: string;
7
- required: boolean;
8
- description: string;
9
- hidden: boolean;
10
- }[];
11
- init(): Promise<void>;
12
- run(): Promise<void>;
13
- }
14
- export default LogoutCommand;
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- // import {Command, flags} from '@oclif/command'
4
- // import { prompt } from "enquirer"
5
- // import fetch from 'node-fetch'
6
- const SessionCommand_1 = require("../utils/SessionCommand");
7
- const session_1 = require("../managers/session");
8
- // import Console from '../utils/console'
9
- // import { replace } from 'node-emoji'
10
- // import { validURL } from "../utils/validators"
11
- // const BaseCommand from '../utils/BaseCommand');
12
- class LogoutCommand extends SessionCommand_1.default {
13
- async init() {
14
- const { flags } = this.parse(LogoutCommand);
15
- await this.initSession(flags);
16
- }
17
- async run() {
18
- // const {flags, args} = this.parse(LogoutCommand)
19
- session_1.default.destroy();
20
- }
21
- }
22
- LogoutCommand.description = `Describe the command here
23
- ...
24
- Extra documentation goes here
25
- `;
26
- LogoutCommand.flags = {
27
- // name: flags.string({char: 'n', description: 'name to print'}),
28
- };
29
- LogoutCommand.args = [
30
- {
31
- name: "package",
32
- required: false,
33
- description: "The unique string that identifies this package on learnpack",
34
- hidden: false,
35
- },
36
- ];
37
- exports.default = LogoutCommand;
@@ -1,14 +0,0 @@
1
- import SessionCommand from "../utils/SessionCommand";
2
- declare class PublishCommand extends SessionCommand {
3
- static description: string;
4
- static flags: any;
5
- static args: {
6
- name: string;
7
- required: boolean;
8
- description: string;
9
- hidden: boolean;
10
- }[];
11
- init(): Promise<void>;
12
- run(): Promise<void>;
13
- }
14
- export default PublishCommand;
@@ -1,82 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const enquirer_1 = require("enquirer");
4
- const SessionCommand_1 = require("../utils/SessionCommand");
5
- const console_1 = require("../utils/console");
6
- const api_1 = require("../utils/api");
7
- const validators_1 = require("../utils/validators");
8
- // eslint-disable-next-line
9
- const fetch = require("node-fetch");
10
- class PublishCommand extends SessionCommand_1.default {
11
- async init() {
12
- const { flags } = this.parse(PublishCommand);
13
- await this.initSession(flags, true);
14
- }
15
- async run() {
16
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
17
- const { flags, args } = this.parse(PublishCommand);
18
- // avoid annonymus sessions
19
- // eslint-disable-next-line
20
- if (!this.session)
21
- return;
22
- console_1.default.info(`Session found for ${this.session.payload.email}, publishing the package...`);
23
- const configObject = (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.get();
24
- if (((_b = configObject === null || configObject === void 0 ? void 0 : configObject.config) === null || _b === void 0 ? void 0 : _b.slug) === undefined ||
25
- !((_c = configObject.config) === null || _c === void 0 ? void 0 : _c.slug)) {
26
- throw new Error("The package is missing a slug (unique name identifier), please check your learn.json file and make sure it has a 'slug'");
27
- }
28
- if (!validators_1.validURL((_e = (_d = configObject === null || configObject === void 0 ? void 0 : configObject.config) === null || _d === void 0 ? void 0 : _d.repository) !== null && _e !== void 0 ? _e : "")) {
29
- throw new Error("The package has a missing or invalid 'repository' on the configuration file, it needs to be a Github URL");
30
- }
31
- else {
32
- const validateResp = await fetch((_f = configObject.config) === null || _f === void 0 ? void 0 : _f.repository, {
33
- method: "HEAD",
34
- });
35
- if (!validateResp.ok || validateResp.status !== 200) {
36
- throw new Error(`The specified repository URL on the configuration file does not exist or its private, only public repositories are allowed at the moment: ${(_g = configObject.config) === null || _g === void 0 ? void 0 : _g.repository}`);
37
- }
38
- }
39
- // start watching for file changes
40
- try {
41
- await api_1.default.publish(Object.assign(Object.assign({}, configObject), { author: this.session.payload.user_id }));
42
- console_1.default.success(`Package updated and published successfully: ${(_h = configObject.config) === null || _h === void 0 ? void 0 : _h.slug}`);
43
- }
44
- catch (error) {
45
- if (error.status === 404) {
46
- const answer = await enquirer_1.prompt([
47
- {
48
- type: "confirm",
49
- name: "create",
50
- message: `Package with slug ${(_j = configObject.config) === null || _j === void 0 ? void 0 : _j.slug} does not exist, do you want to create it?`,
51
- },
52
- ]);
53
- if (answer) {
54
- await api_1.default.update(Object.assign(Object.assign({}, configObject), { author: this.session.payload.user_id }));
55
- console_1.default.success(`Package created and published successfully: ${(_k = configObject.config) === null || _k === void 0 ? void 0 : _k.slug}`);
56
- }
57
- else {
58
- console_1.default.error("No answer from server");
59
- }
60
- }
61
- else {
62
- console_1.default.error(error.message);
63
- }
64
- }
65
- }
66
- }
67
- PublishCommand.description = `Describe the command here
68
- ...
69
- Extra documentation goes here
70
- `;
71
- PublishCommand.flags = {
72
- // name: flags.string({char: 'n', description: 'name to print'}),
73
- };
74
- PublishCommand.args = [
75
- {
76
- name: "package",
77
- required: false,
78
- description: "The unique string that identifies this package on learnpack",
79
- hidden: false,
80
- },
81
- ];
82
- exports.default = PublishCommand;
@@ -1,7 +0,0 @@
1
- import SessionCommand from "../utils/SessionCommand";
2
- export default class StartCommand extends SessionCommand {
3
- static description: string;
4
- static flags: any;
5
- init(): Promise<void>;
6
- run(): Promise<void>;
7
- }
@@ -1,165 +0,0 @@
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 fileQueue_1 = require("../utils/fileQueue");
9
- const file_1 = require("../managers/file");
10
- const misc_1 = require("../utils/misc");
11
- const server_1 = require("../managers/server");
12
- class StartCommand extends SessionCommand_1.default {
13
- // 🛑 IMPORTANT
14
- // Every command that will use the configManager needs this init method
15
- async init() {
16
- const { flags } = this.parse(StartCommand);
17
- await this.initSession(flags);
18
- }
19
- async run() {
20
- var _a, _b, _c;
21
- // get configuration object
22
- const configObject = (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.get();
23
- const config = configObject === null || configObject === void 0 ? void 0 : configObject.config;
24
- if (configObject) {
25
- const { config } = configObject;
26
- // build exerises
27
- (_b = this.configManager) === null || _b === void 0 ? void 0 : _b.buildIndex();
28
- 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 :
29
- 0} exercises found`);
30
- // download app and decompress
31
- 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`);
32
- console_1.default.info("Decompressing LearnPack UI, this may take a minute...");
33
- 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/`);
34
- // listen to socket commands
35
- if (config && this.configManager) {
36
- const server = await server_1.default(configObject, this.configManager);
37
- const dispatcher = fileQueue_1.default.dispatcher({
38
- create: true,
39
- path: `${config.dirPath}/vscode_queue.json`,
40
- });
41
- socket_1.default.start(config, server, false);
42
- socket_1.default.on("open", (data) => {
43
- console_1.default.debug("Opening these files: ", data);
44
- const files = misc_1.prioritizeHTMLFile(data.files);
45
- dispatcher.enqueue(dispatcher.events.OPEN_FILES, files);
46
- socket_1.default.ready("Ready to compile...");
47
- });
48
- socket_1.default.on("open_window", (data) => {
49
- console_1.default.debug("Opening window: ", data);
50
- dispatcher.enqueue(dispatcher.events.OPEN_WINDOW, data);
51
- socket_1.default.ready("Ready to compile...");
52
- });
53
- socket_1.default.on("reset", (exercise) => {
54
- var _a;
55
- try {
56
- (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.reset(exercise.exerciseSlug);
57
- dispatcher.enqueue(dispatcher.events.RESET_EXERCISE, exercise.exerciseSlug);
58
- socket_1.default.ready("Ready to compile...");
59
- }
60
- catch (error) {
61
- socket_1.default.error("compiler-error", error.message ||
62
- "There was an error reseting the exercise");
63
- setTimeout(() => socket_1.default.ready("Ready to compile..."), 2000);
64
- }
65
- });
66
- // socket.on("preview", (data) => {
67
- // Console.debug("Preview triggered, removing the 'preview' action ")
68
- // socket.removeAllowed("preview")
69
- // socket.log('ready',['Ready to compile...'])
70
- // })
71
- socket_1.default.on("build", async (data) => {
72
- var _a;
73
- const exercise = (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.getExercise(data.exerciseSlug);
74
- if (!(exercise === null || exercise === void 0 ? void 0 : exercise.language)) {
75
- socket_1.default.error("compiler-error", "Impossible to detect language to build for " +
76
- data.exerciseSlug +
77
- "...");
78
- return;
79
- }
80
- socket_1.default.log("compiling", "Building exercise " +
81
- data.exerciseSlug +
82
- " with " +
83
- exercise.language +
84
- "...");
85
- await this.config.runHook("action", {
86
- action: "compile",
87
- socket: socket_1.default,
88
- configuration: config,
89
- exercise,
90
- });
91
- });
92
- socket_1.default.on("test", async (data) => {
93
- var _a, _b;
94
- const exercise = (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.getExercise(data.exerciseSlug);
95
- if (!(exercise === null || exercise === void 0 ? void 0 : exercise.language)) {
96
- socket_1.default.error("compiler-error", "Impossible to detect engine language for testing for " +
97
- data.exerciseSlug +
98
- "...");
99
- return;
100
- }
101
- if ((config === null || config === void 0 ? void 0 : config.disabledActions.includes("test")) || (config === null || config === void 0 ? void 0 : config.disableGrading)) {
102
- socket_1.default.ready("Grading is disabled on configuration");
103
- return true;
104
- }
105
- socket_1.default.log("testing", "Testing your exercise using the " + exercise.language + " engine.");
106
- await this.config.runHook("action", {
107
- action: "test",
108
- socket: socket_1.default,
109
- configuration: config,
110
- exercise,
111
- });
112
- (_b = this.configManager) === null || _b === void 0 ? void 0 : _b.save();
113
- return true;
114
- });
115
- const terminate = () => {
116
- console_1.default.debug("Terminating Learnpack...");
117
- server.terminate(() => {
118
- var _a;
119
- (_a = this.configManager) === null || _a === void 0 ? void 0 : _a.noCurrentExercise();
120
- dispatcher.enqueue(dispatcher.events.END);
121
- process.exit();
122
- });
123
- };
124
- server.on("close", terminate);
125
- process.on("SIGINT", terminate);
126
- process.on("SIGTERM", terminate);
127
- process.on("SIGHUP", terminate);
128
- // finish the server startup
129
- setTimeout(() => dispatcher.enqueue(dispatcher.events.RUNNING), 1000);
130
- // start watching for file changes
131
- if (StartCommand.flags.watch)
132
- this.configManager.watchIndex(_exercises => socket_1.default.reload(null, _exercises));
133
- }
134
- }
135
- }
136
- }
137
- exports.default = StartCommand;
138
- StartCommand.description = "Runs a small server with all the exercise instructions";
139
- 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({
140
- char: "D",
141
- description: "disble grading functionality",
142
- default: false,
143
- }),
144
- // disableGrading: flags.boolean({char: 'dg', description: 'disble grading functionality', default: false }),
145
- watch: command_1.flags.boolean({
146
- char: "w",
147
- description: "Watch for file changes",
148
- default: false,
149
- }), editor: command_1.flags.string({
150
- char: "e",
151
- description: "[standalone, gitpod]",
152
- options: ["standalone", "gitpod"],
153
- }), version: command_1.flags.string({
154
- char: "v",
155
- description: "E.g: 1.0.1",
156
- default: undefined,
157
- }), grading: command_1.flags.string({
158
- char: "g",
159
- description: "[isolated, incremental]",
160
- options: ["isolated", "incremental"],
161
- }), debug: command_1.flags.boolean({
162
- char: "d",
163
- description: "debugger mode for more verbage",
164
- default: false,
165
- }) });
@@ -1,6 +0,0 @@
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 +0,0 @@
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 DELETED
@@ -1 +0,0 @@
1
- export * from '@oclif/command';
package/lib/index.js DELETED
@@ -1,4 +0,0 @@
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,5 +0,0 @@
1
- declare const extensions: {
2
- extensions: string[];
3
- names: string[];
4
- };
5
- export default extensions;
@@ -1,30 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const extensions = {
4
- extensions: [
5
- "py",
6
- "java",
7
- "py",
8
- "ruby",
9
- "html",
10
- "css",
11
- "htm",
12
- "php",
13
- "js",
14
- "jsx",
15
- "ts",
16
- "sh",
17
- "bash",
18
- "json",
19
- "yml",
20
- "yaml",
21
- "csv",
22
- "xml",
23
- "txt",
24
- "text",
25
- "markdown",
26
- "readme",
27
- ],
28
- names: ["package.json", "package-lock.json"],
29
- };
30
- exports.default = extensions;
@@ -1,37 +0,0 @@
1
- declare const _default: {
2
- config: {
3
- port: number;
4
- editor: {
5
- mode: null;
6
- agent: null;
7
- version: null;
8
- };
9
- dirPath: string;
10
- configPath: string;
11
- outputPath: string;
12
- publicPath: string;
13
- publicUrl: null;
14
- contact: string;
15
- language: string;
16
- autoPlay: boolean;
17
- projectType: string;
18
- grading: string;
19
- exercisesPath: string;
20
- webpackTemplate: null;
21
- disableGrading: boolean;
22
- disabledActions: never[];
23
- actions: never[];
24
- entries: {
25
- html: string;
26
- vanillajs: string;
27
- react: string;
28
- node: string;
29
- python3: string;
30
- java: string;
31
- };
32
- };
33
- address: string;
34
- currentExercise: null;
35
- exercises: never[];
36
- };
37
- export default _default;