@learnpack/learnpack 4.0.10 → 4.0.13

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 (126) hide show
  1. package/README.md +16 -20
  2. package/lib/commands/audit.d.ts +6 -6
  3. package/lib/commands/audit.js +327 -327
  4. package/lib/commands/clean.d.ts +8 -8
  5. package/lib/commands/clean.js +22 -22
  6. package/lib/commands/download.d.ts +13 -13
  7. package/lib/commands/download.js +52 -52
  8. package/lib/commands/init.d.ts +9 -9
  9. package/lib/commands/init.js +127 -127
  10. package/lib/commands/login.d.ts +14 -14
  11. package/lib/commands/login.js +34 -34
  12. package/lib/commands/logout.d.ts +14 -14
  13. package/lib/commands/logout.js +34 -34
  14. package/lib/commands/publish.d.ts +11 -14
  15. package/lib/commands/publish.js +160 -82
  16. package/lib/commands/start.d.ts +7 -7
  17. package/lib/commands/start.js +252 -250
  18. package/lib/commands/test.d.ts +6 -6
  19. package/lib/commands/test.js +62 -62
  20. package/lib/index.d.ts +1 -1
  21. package/lib/index.js +4 -4
  22. package/lib/managers/config/allowed_files.d.ts +5 -5
  23. package/lib/managers/config/allowed_files.js +30 -30
  24. package/lib/managers/config/defaults.d.ts +47 -48
  25. package/lib/managers/config/defaults.js +51 -51
  26. package/lib/managers/config/exercise.d.ts +36 -36
  27. package/lib/managers/config/exercise.js +243 -236
  28. package/lib/managers/config/index.d.ts +3 -3
  29. package/lib/managers/config/index.js +464 -459
  30. package/lib/managers/file.d.ts +14 -14
  31. package/lib/managers/file.js +190 -184
  32. package/lib/managers/gitpod.d.ts +3 -3
  33. package/lib/managers/gitpod.js +67 -67
  34. package/lib/managers/server/index.d.ts +5 -6
  35. package/lib/managers/server/index.js +58 -58
  36. package/lib/managers/server/routes.d.ts +4 -4
  37. package/lib/managers/server/routes.js +228 -220
  38. package/lib/managers/session.d.ts +3 -3
  39. package/lib/managers/session.js +125 -125
  40. package/lib/managers/socket.d.ts +3 -3
  41. package/lib/managers/socket.js +188 -186
  42. package/lib/managers/telemetry.d.ts +74 -74
  43. package/lib/managers/telemetry.js +215 -214
  44. package/lib/managers/test.js +84 -84
  45. package/lib/models/action.d.ts +2 -2
  46. package/lib/models/action.js +2 -2
  47. package/lib/models/audit.d.ts +15 -15
  48. package/lib/models/audit.js +2 -2
  49. package/lib/models/config-manager.d.ts +21 -21
  50. package/lib/models/config-manager.js +2 -2
  51. package/lib/models/config.d.ts +86 -86
  52. package/lib/models/config.js +2 -2
  53. package/lib/models/counter.d.ts +11 -11
  54. package/lib/models/counter.js +2 -2
  55. package/lib/models/errors.d.ts +15 -15
  56. package/lib/models/errors.js +2 -2
  57. package/lib/models/exercise-obj.d.ts +29 -30
  58. package/lib/models/exercise-obj.js +2 -2
  59. package/lib/models/file.d.ts +5 -5
  60. package/lib/models/file.js +2 -2
  61. package/lib/models/findings.d.ts +17 -17
  62. package/lib/models/findings.js +2 -2
  63. package/lib/models/flags.d.ts +10 -10
  64. package/lib/models/flags.js +2 -2
  65. package/lib/models/front-matter.d.ts +11 -11
  66. package/lib/models/front-matter.js +2 -2
  67. package/lib/models/gitpod-data.d.ts +16 -16
  68. package/lib/models/gitpod-data.js +2 -2
  69. package/lib/models/language.d.ts +4 -4
  70. package/lib/models/language.js +2 -2
  71. package/lib/models/package.d.ts +7 -7
  72. package/lib/models/package.js +2 -2
  73. package/lib/models/plugin-config.d.ts +16 -16
  74. package/lib/models/plugin-config.js +2 -2
  75. package/lib/models/session.d.ts +31 -31
  76. package/lib/models/session.js +2 -2
  77. package/lib/models/socket.d.ts +37 -37
  78. package/lib/models/socket.js +2 -2
  79. package/lib/models/status.d.ts +1 -1
  80. package/lib/models/status.js +2 -2
  81. package/lib/models/success-types.d.ts +1 -1
  82. package/lib/models/success-types.js +2 -2
  83. package/lib/plugin/command/compile.d.ts +6 -6
  84. package/lib/plugin/command/compile.js +18 -18
  85. package/lib/plugin/command/test.d.ts +6 -6
  86. package/lib/plugin/command/test.js +25 -25
  87. package/lib/plugin/index.d.ts +27 -27
  88. package/lib/plugin/index.js +7 -7
  89. package/lib/plugin/plugin.d.ts +8 -8
  90. package/lib/plugin/plugin.js +68 -68
  91. package/lib/plugin/utils.d.ts +16 -16
  92. package/lib/plugin/utils.js +58 -58
  93. package/lib/ui/download.d.ts +5 -5
  94. package/lib/ui/download.js +62 -61
  95. package/lib/utils/BaseCommand.d.ts +8 -8
  96. package/lib/utils/BaseCommand.js +41 -41
  97. package/lib/utils/SessionCommand.d.ts +10 -10
  98. package/lib/utils/SessionCommand.js +43 -43
  99. package/lib/utils/api.d.ts +14 -14
  100. package/lib/utils/api.js +255 -255
  101. package/lib/utils/audit.d.ts +16 -16
  102. package/lib/utils/audit.js +303 -303
  103. package/lib/utils/checkNotInstalled.d.ts +8 -8
  104. package/lib/utils/checkNotInstalled.js +185 -181
  105. package/lib/utils/console.d.ts +12 -12
  106. package/lib/utils/console.js +19 -19
  107. package/lib/utils/errors.d.ts +17 -17
  108. package/lib/utils/errors.js +107 -100
  109. package/lib/utils/exercisesQueue.d.ts +9 -9
  110. package/lib/utils/exercisesQueue.js +38 -38
  111. package/lib/utils/fileQueue.d.ts +43 -43
  112. package/lib/utils/fileQueue.js +169 -169
  113. package/lib/utils/misc.d.ts +1 -1
  114. package/lib/utils/misc.js +24 -23
  115. package/lib/utils/osOperations.d.ts +5 -5
  116. package/lib/utils/osOperations.js +72 -72
  117. package/lib/utils/validators.d.ts +5 -5
  118. package/lib/utils/validators.js +16 -17
  119. package/lib/utils/watcher.d.ts +2 -2
  120. package/lib/utils/watcher.js +25 -25
  121. package/oclif.manifest.json +1 -1
  122. package/package.json +6 -4
  123. package/src/commands/publish.ts +181 -107
  124. package/src/managers/config/index.ts +5 -0
  125. package/src/managers/server/routes.ts +10 -0
  126. package/src/managers/session.ts +145 -145
@@ -1,37 +1,37 @@
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
- }
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
22
  LogoutCommand.description = `Describe the command here
23
23
  ...
24
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;
25
+ `;
26
+ LogoutCommand.flags = {
27
+ // name: flags.string({char: 'n', description: 'name to print'}),
28
+ };
29
+ LogoutCommand.args = [
30
+ {
31
+ name: "package", // name of arg to show in help and reference with args[name]
32
+ required: false, // make the arg required with `required: true`
33
+ description: "The unique string that identifies this package on learnpack", // help description
34
+ hidden: false, // hide this arg from help
35
+ },
36
+ ];
37
+ exports.default = LogoutCommand;
@@ -1,14 +1,11 @@
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
+ import SessionCommand from "../utils/SessionCommand";
2
+ export default class BuildCommand extends SessionCommand {
3
+ static description: string;
4
+ static flags: {
5
+ help: import("@oclif/parser/lib/flags").IBooleanFlag<void>;
6
+ };
7
+ init(): Promise<void>;
8
+ run(): Promise<void>;
9
+ copyDirectory(src: string, dest: string): void;
10
+ removeDirectory(dir: string): void;
11
+ }
@@ -1,82 +1,160 @@
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
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable arrow-parens */
4
+ /* eslint-disable unicorn/no-array-for-each */
5
+ const command_1 = require("@oclif/command");
6
+ const SessionCommand_1 = require("../utils/SessionCommand");
7
+ const session_1 = require("../managers/session");
8
+ const fs = require("fs");
9
+ const path = require("path");
10
+ const archiver = require("archiver");
11
+ const axios_1 = require("axios");
12
+ const FormData = require("form-data");
13
+ const console_1 = require("../utils/console");
14
+ // const RIGOBOT_HOST = "https://rigobot-test-cca7d841c9d8.herokuapp.com"
15
+ const RIGOBOT_HOST =
16
+ // "https://8000-charlytoc-rigobot-bmwdeam7cev.ws-us116.gitpod.io"
17
+ "https://rigobot.herokuapp.com";
18
+ const uploadZipEndpont = RIGOBOT_HOST + "/v1/learnpack/upload";
19
+ class BuildCommand extends SessionCommand_1.default {
20
+ async init() {
21
+ const { flags } = this.parse(BuildCommand);
22
+ await this.initSession(flags);
23
+ }
24
+ async run() {
25
+ const buildDir = path.join(process.cwd(), "build");
26
+ const sessionPayload = await session_1.default.getPayload();
27
+ if (!sessionPayload || !sessionPayload.rigobot) {
28
+ console_1.default.error("You must be logged in to upload a LearnPack packge, please run: \n$ learnpack login");
29
+ return;
30
+ }
31
+ const rigoToken = sessionPayload.rigobot.key;
32
+ // const rigoToken = "417d612d226a1606ad3a4e94b1881a9f0124b667"
33
+ // Read learn.json to get the slug
34
+ const learnJsonPath = path.join(process.cwd(), "learn.json");
35
+ if (!fs.existsSync(learnJsonPath)) {
36
+ this.error("learn.json not found");
37
+ }
38
+ const learnJson = JSON.parse(fs.readFileSync(learnJsonPath, "utf-8"));
39
+ const zipFilePath = path.join(process.cwd(), `${learnJson.slug}.zip`);
40
+ // Ensure build directory exists
41
+ if (!fs.existsSync(buildDir)) {
42
+ fs.mkdirSync(buildDir);
43
+ }
44
+ // Copy config.json
45
+ const configPath = path.join(process.cwd(), ".learn", "config.json");
46
+ if (fs.existsSync(configPath)) {
47
+ fs.copyFileSync(configPath, path.join(buildDir, "config.json"));
48
+ }
49
+ else {
50
+ this.error("config.json not found");
51
+ }
52
+ // Copy .learn/assets directory
53
+ const assetsDir = path.join(process.cwd(), ".learn", "assets");
54
+ if (fs.existsSync(assetsDir)) {
55
+ this.copyDirectory(assetsDir, path.join(buildDir, ".learn", "assets"));
56
+ }
57
+ else {
58
+ this.error(".learn/assets directory not found");
59
+ }
60
+ // Copy .learn/_app directory files to the same level as config.json
61
+ const appDir = path.join(process.cwd(), ".learn", "_app");
62
+ if (fs.existsSync(appDir)) {
63
+ this.copyDirectory(appDir, buildDir);
64
+ }
65
+ else {
66
+ this.error(".learn/_app directory not found");
67
+ }
68
+ // Copy exercises directory
69
+ const exercisesDir = path.join(process.cwd(), "exercises");
70
+ const learnExercisesDir = path.join(process.cwd(), ".learn", "exercises");
71
+ if (fs.existsSync(exercisesDir)) {
72
+ this.copyDirectory(exercisesDir, path.join(buildDir, "exercises"));
73
+ }
74
+ else if (fs.existsSync(learnExercisesDir)) {
75
+ this.copyDirectory(learnExercisesDir, path.join(buildDir, "exercises"));
76
+ }
77
+ else {
78
+ this.error("exercises directory not found in either location");
79
+ }
80
+ // Copy learn.json
81
+ fs.copyFileSync(learnJsonPath, path.join(buildDir, "learn.json"));
82
+ // Create zip file
83
+ const output = fs.createWriteStream(zipFilePath);
84
+ const archive = archiver("zip", {
85
+ zlib: { level: 9 },
86
+ });
87
+ output.on("close", async () => {
88
+ this.log(`Build completed: ${zipFilePath} (${archive.pointer()} total bytes)`);
89
+ // Remove build directory after zip is created
90
+ this.removeDirectory(buildDir);
91
+ console.log("Zip file saved in project root");
92
+ const formData = new FormData();
93
+ formData.append("file", fs.createReadStream(zipFilePath));
94
+ formData.append("config", JSON.stringify(learnJson));
95
+ try {
96
+ const res = await axios_1.default.post(uploadZipEndpont, formData, {
97
+ headers: Object.assign(Object.assign({}, formData.getHeaders()), { Authorization: `Token ${rigoToken}` }),
98
+ });
99
+ console.log(res.data);
100
+ }
101
+ catch (error) {
102
+ if (axios_1.default.isAxiosError(error)) {
103
+ if (error.response && error.response.status === 403) {
104
+ console.error("Error 403:", error.response.data.error);
105
+ }
106
+ else if (error.response && error.response.status === 400) {
107
+ console.error(error.response.data.error);
108
+ }
109
+ else {
110
+ console.error("Error uploading file:", error.message);
111
+ }
112
+ }
113
+ else {
114
+ console.error("Error uploading file:", error);
115
+ }
116
+ }
117
+ });
118
+ archive.on("error", (err) => {
119
+ throw err;
120
+ });
121
+ archive.pipe(output);
122
+ archive.directory(buildDir, false);
123
+ await archive.finalize();
124
+ }
125
+ copyDirectory(src, dest) {
126
+ if (!fs.existsSync(dest)) {
127
+ fs.mkdirSync(dest, { recursive: true });
128
+ }
129
+ const entries = fs.readdirSync(src, { withFileTypes: true });
130
+ for (const entry of entries) {
131
+ const srcPath = path.join(src, entry.name);
132
+ const destPath = path.join(dest, entry.name);
133
+ if (entry.isDirectory()) {
134
+ this.copyDirectory(srcPath, destPath);
135
+ }
136
+ else {
137
+ fs.copyFileSync(srcPath, destPath);
138
+ }
139
+ }
140
+ }
141
+ removeDirectory(dir) {
142
+ if (fs.existsSync(dir)) {
143
+ fs.readdirSync(dir).forEach((file) => {
144
+ const currentPath = path.join(dir, file);
145
+ if (fs.lstatSync(currentPath).isDirectory()) {
146
+ this.removeDirectory(currentPath);
147
+ }
148
+ else {
149
+ fs.unlinkSync(currentPath);
150
+ }
151
+ });
152
+ fs.rmdirSync(dir);
153
+ }
154
+ }
155
+ }
156
+ BuildCommand.description = "Builds the project by copying necessary files and directories into a zip file";
157
+ BuildCommand.flags = {
158
+ help: command_1.flags.help({ char: "h" }),
159
+ };
160
+ exports.default = BuildCommand;
@@ -1,7 +1,7 @@
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
+ 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
+ }