@learnpack/learnpack 4.0.10 → 4.0.13

Sign up to get free protection for your applications and to get access to all the features.
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
+ }