@learnpack/learnpack 2.1.26 → 2.1.27

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 (154) hide show
  1. package/README.md +10 -10
  2. package/oclif.manifest.json +1 -1
  3. package/package.json +2 -1
  4. package/src/commands/audit.ts +113 -113
  5. package/src/commands/clean.ts +10 -10
  6. package/src/commands/download.ts +18 -18
  7. package/src/commands/init.ts +39 -39
  8. package/src/commands/login.ts +13 -13
  9. package/src/commands/logout.ts +9 -9
  10. package/src/commands/publish.ts +25 -25
  11. package/src/commands/start.ts +101 -75
  12. package/src/commands/test.ts +34 -34
  13. package/src/managers/config/allowed_files.ts +2 -2
  14. package/src/managers/config/defaults.ts +2 -2
  15. package/src/managers/config/exercise.ts +79 -79
  16. package/src/managers/config/index.ts +145 -145
  17. package/src/managers/file.ts +74 -65
  18. package/src/managers/server/index.ts +32 -31
  19. package/src/managers/server/routes.ts +139 -90
  20. package/src/managers/session.ts +53 -24
  21. package/src/managers/socket.ts +92 -79
  22. package/src/models/action.ts +8 -1
  23. package/src/models/config-manager.ts +2 -2
  24. package/src/models/config.ts +7 -2
  25. package/src/models/exercise-obj.ts +6 -3
  26. package/src/models/plugin-config.ts +2 -2
  27. package/src/models/session.ts +5 -2
  28. package/src/models/socket.ts +12 -6
  29. package/src/models/status.ts +15 -14
  30. package/src/plugin/command/compile.ts +10 -10
  31. package/src/plugin/command/test.ts +14 -14
  32. package/src/plugin/index.ts +5 -5
  33. package/src/plugin/plugin.ts +26 -26
  34. package/src/plugin/utils.ts +23 -23
  35. package/src/utils/BaseCommand.ts +16 -16
  36. package/src/utils/api.ts +143 -91
  37. package/src/utils/audit.ts +93 -96
  38. package/src/utils/exercisesQueue.ts +15 -15
  39. package/src/utils/fileQueue.ts +85 -85
  40. package/src/utils/watcher.ts +14 -14
  41. package/lib/commands/audit.d.ts +0 -6
  42. package/lib/commands/audit.js +0 -342
  43. package/lib/commands/clean.d.ts +0 -8
  44. package/lib/commands/clean.js +0 -25
  45. package/lib/commands/download.d.ts +0 -13
  46. package/lib/commands/download.js +0 -55
  47. package/lib/commands/init.d.ts +0 -9
  48. package/lib/commands/init.js +0 -123
  49. package/lib/commands/login.d.ts +0 -14
  50. package/lib/commands/login.js +0 -37
  51. package/lib/commands/logout.d.ts +0 -14
  52. package/lib/commands/logout.js +0 -37
  53. package/lib/commands/publish.d.ts +0 -14
  54. package/lib/commands/publish.js +0 -82
  55. package/lib/commands/start.d.ts +0 -7
  56. package/lib/commands/start.js +0 -165
  57. package/lib/commands/test.d.ts +0 -6
  58. package/lib/commands/test.js +0 -62
  59. package/lib/index.d.ts +0 -1
  60. package/lib/index.js +0 -4
  61. package/lib/managers/config/allowed_files.d.ts +0 -5
  62. package/lib/managers/config/allowed_files.js +0 -30
  63. package/lib/managers/config/defaults.d.ts +0 -39
  64. package/lib/managers/config/defaults.js +0 -40
  65. package/lib/managers/config/exercise.d.ts +0 -36
  66. package/lib/managers/config/exercise.js +0 -233
  67. package/lib/managers/config/index.d.ts +0 -3
  68. package/lib/managers/config/index.js +0 -320
  69. package/lib/managers/file.d.ts +0 -13
  70. package/lib/managers/file.js +0 -134
  71. package/lib/managers/gitpod.d.ts +0 -3
  72. package/lib/managers/gitpod.js +0 -67
  73. package/lib/managers/server/index.d.ts +0 -6
  74. package/lib/managers/server/index.js +0 -58
  75. package/lib/managers/server/routes.d.ts +0 -4
  76. package/lib/managers/server/routes.js +0 -167
  77. package/lib/managers/session.d.ts +0 -3
  78. package/lib/managers/session.js +0 -104
  79. package/lib/managers/socket.d.ts +0 -3
  80. package/lib/managers/socket.js +0 -164
  81. package/lib/managers/test.d.ts +0 -0
  82. package/lib/managers/test.js +0 -84
  83. package/lib/models/action.d.ts +0 -2
  84. package/lib/models/action.js +0 -2
  85. package/lib/models/audit.d.ts +0 -15
  86. package/lib/models/audit.js +0 -2
  87. package/lib/models/config-manager.d.ts +0 -21
  88. package/lib/models/config-manager.js +0 -2
  89. package/lib/models/config.d.ts +0 -62
  90. package/lib/models/config.js +0 -2
  91. package/lib/models/counter.d.ts +0 -11
  92. package/lib/models/counter.js +0 -2
  93. package/lib/models/errors.d.ts +0 -15
  94. package/lib/models/errors.js +0 -2
  95. package/lib/models/exercise-obj.d.ts +0 -27
  96. package/lib/models/exercise-obj.js +0 -2
  97. package/lib/models/file.d.ts +0 -5
  98. package/lib/models/file.js +0 -2
  99. package/lib/models/findings.d.ts +0 -17
  100. package/lib/models/findings.js +0 -2
  101. package/lib/models/flags.d.ts +0 -10
  102. package/lib/models/flags.js +0 -2
  103. package/lib/models/front-matter.d.ts +0 -11
  104. package/lib/models/front-matter.js +0 -2
  105. package/lib/models/gitpod-data.d.ts +0 -16
  106. package/lib/models/gitpod-data.js +0 -2
  107. package/lib/models/language.d.ts +0 -4
  108. package/lib/models/language.js +0 -2
  109. package/lib/models/package.d.ts +0 -7
  110. package/lib/models/package.js +0 -2
  111. package/lib/models/plugin-config.d.ts +0 -16
  112. package/lib/models/plugin-config.js +0 -2
  113. package/lib/models/session.d.ts +0 -23
  114. package/lib/models/session.js +0 -2
  115. package/lib/models/socket.d.ts +0 -31
  116. package/lib/models/socket.js +0 -2
  117. package/lib/models/status.d.ts +0 -1
  118. package/lib/models/status.js +0 -2
  119. package/lib/models/success-types.d.ts +0 -1
  120. package/lib/models/success-types.js +0 -2
  121. package/lib/plugin/command/compile.d.ts +0 -6
  122. package/lib/plugin/command/compile.js +0 -18
  123. package/lib/plugin/command/test.d.ts +0 -6
  124. package/lib/plugin/command/test.js +0 -25
  125. package/lib/plugin/index.d.ts +0 -27
  126. package/lib/plugin/index.js +0 -7
  127. package/lib/plugin/plugin.d.ts +0 -8
  128. package/lib/plugin/plugin.js +0 -68
  129. package/lib/plugin/utils.d.ts +0 -16
  130. package/lib/plugin/utils.js +0 -58
  131. package/lib/ui/download.d.ts +0 -5
  132. package/lib/ui/download.js +0 -61
  133. package/lib/utils/BaseCommand.d.ts +0 -8
  134. package/lib/utils/BaseCommand.js +0 -41
  135. package/lib/utils/SessionCommand.d.ts +0 -10
  136. package/lib/utils/SessionCommand.js +0 -47
  137. package/lib/utils/api.d.ts +0 -12
  138. package/lib/utils/api.js +0 -173
  139. package/lib/utils/audit.d.ts +0 -16
  140. package/lib/utils/audit.js +0 -302
  141. package/lib/utils/console.d.ts +0 -12
  142. package/lib/utils/console.js +0 -19
  143. package/lib/utils/errors.d.ts +0 -17
  144. package/lib/utils/errors.js +0 -100
  145. package/lib/utils/exercisesQueue.d.ts +0 -9
  146. package/lib/utils/exercisesQueue.js +0 -38
  147. package/lib/utils/fileQueue.d.ts +0 -40
  148. package/lib/utils/fileQueue.js +0 -168
  149. package/lib/utils/misc.d.ts +0 -1
  150. package/lib/utils/misc.js +0 -23
  151. package/lib/utils/validators.d.ts +0 -5
  152. package/lib/utils/validators.js +0 -17
  153. package/lib/utils/watcher.d.ts +0 -2
  154. package/lib/utils/watcher.js +0 -23
@@ -1,47 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- // import { flags } from "@oclif/command";
4
- const BaseCommand_1 = require("./BaseCommand");
5
- const console_1 = require("./console");
6
- const session_1 = require("../managers/session");
7
- const index_1 = require("../managers/config/index");
8
- const errors_1 = require("./errors");
9
- class SessionCommand extends BaseCommand_1.default {
10
- constructor() {
11
- super(...arguments);
12
- this.session = null;
13
- this.configManager = null;
14
- }
15
- async initSession(flags, _private = false) {
16
- var _a;
17
- try {
18
- if (!this.configManager) {
19
- await this.buildConfig(flags);
20
- }
21
- this.session = await session_1.default.get((_a = this.configManager) === null || _a === void 0 ? void 0 : _a.get());
22
- if (this.session) {
23
- console_1.default.debug(`Session open for ${this.session.payload.email}.`);
24
- }
25
- else {
26
- if (_private)
27
- throw errors_1.AuthError('You need to log in, run the following command to continue: $ learnpack login');
28
- console_1.default.debug('No active session available', _private);
29
- }
30
- }
31
- catch (error) {
32
- console_1.default.error(error.message);
33
- }
34
- }
35
- async buildConfig(flags) {
36
- this.configManager = await index_1.default(flags);
37
- }
38
- async catch(err) {
39
- console_1.default.debug('COMMAND CATCH', err);
40
- throw err;
41
- }
42
- }
43
- exports.default = SessionCommand;
44
- // SessionCommand.description = `Describe the command here
45
- // ...
46
- // Extra documentation goes here
47
- // `
@@ -1,12 +0,0 @@
1
- declare const _default: {
2
- login: (identification: string, password: string) => Promise<any>;
3
- publish: (config: any) => Promise<any>;
4
- update: (config: any) => Promise<any>;
5
- getPackage: (slug: string) => Promise<any>;
6
- getLangs: () => Promise<any>;
7
- getAllPackages: ({ lang, slug, }: {
8
- lang?: string | undefined;
9
- slug?: string | undefined;
10
- }) => Promise<any>;
11
- };
12
- export default _default;
package/lib/utils/api.js DELETED
@@ -1,173 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const console_1 = require("../utils/console");
4
- const storage = require("node-persist");
5
- const cli_ux_1 = require("cli-ux");
6
- const HOST = "https://learnpack.herokuapp.com";
7
- // eslint-disable-next-line
8
- const _fetch = require("node-fetch");
9
- const fetch = async (url, options = {}) => {
10
- const headers = { "Content-Type": "application/json" };
11
- let session = null;
12
- try {
13
- session = await storage.getItem("bc-payload");
14
- if (session.token && session.token !== "" && !url.includes("/token"))
15
- headers.Authorization = "Token " + session.token;
16
- }
17
- catch (_a) { }
18
- try {
19
- const resp = await _fetch(url, Object.assign(Object.assign({}, options), { headers: Object.assign(Object.assign({}, headers), options.headers) }));
20
- if (resp.status >= 200 && resp.status < 300)
21
- return await resp.json();
22
- if (resp.status === 401)
23
- throw APIError("Invalid authentication credentials", 401);
24
- else if (resp.status === 404)
25
- throw APIError("Package not found", 404);
26
- else if (resp.status >= 500)
27
- throw APIError("Impossible to connect with the server", 500);
28
- else if (resp.status >= 400) {
29
- const error = await resp.json();
30
- if (error.detail || error.error) {
31
- throw APIError(error.detail || error.error);
32
- }
33
- else if (error.nonFieldErrors) {
34
- throw APIError(error.nonFieldErrors[0], error);
35
- }
36
- else if (typeof error === "object") {
37
- if (Object.keys(error).length > 0) {
38
- const key = error[Object.keys(error)[0]];
39
- throw APIError(`${key}: ${error[key][0]}`, error);
40
- }
41
- }
42
- else {
43
- throw APIError("Uknown error");
44
- }
45
- }
46
- else
47
- throw APIError("Uknown error");
48
- }
49
- catch (error) {
50
- console_1.default.error(error.message);
51
- throw error;
52
- }
53
- };
54
- const login = async (identification, password) => {
55
- try {
56
- cli_ux_1.default.action.start("Looking for credentials...");
57
- await cli_ux_1.default.wait(1000);
58
- const data = await fetch(`${HOST}/v1/auth/token/`, {
59
- body: JSON.stringify({ identification, password }),
60
- method: "post",
61
- });
62
- cli_ux_1.default.action.stop("ready");
63
- return data;
64
- }
65
- catch (error) {
66
- console_1.default.error(error.message);
67
- console_1.default.debug(error);
68
- }
69
- };
70
- const publish = async (config) => {
71
- const keys = [
72
- "difficulty",
73
- "language",
74
- "skills",
75
- "technologies",
76
- "slug",
77
- "repository",
78
- "author",
79
- "title",
80
- ];
81
- const payload = {};
82
- for (const k of keys)
83
- config[k] ? (payload[k] = config[k]) : null;
84
- try {
85
- console.log("Package to publish:", payload);
86
- cli_ux_1.default.action.start("Updating package information...");
87
- await cli_ux_1.default.wait(1000);
88
- const data = await fetch(`${HOST}/v1/package/${config.slug}`, {
89
- method: "PUT",
90
- body: JSON.stringify(payload),
91
- });
92
- cli_ux_1.default.action.stop("ready");
93
- return data;
94
- }
95
- catch (error) {
96
- console.log("payload", payload);
97
- console_1.default.error(error.message);
98
- console_1.default.debug(error);
99
- throw error;
100
- }
101
- };
102
- const update = async (config) => {
103
- try {
104
- cli_ux_1.default.action.start("Updating package information...");
105
- await cli_ux_1.default.wait(1000);
106
- const data = await fetch(`${HOST}/v1/package/`, {
107
- method: "POST",
108
- body: JSON.stringify(config),
109
- });
110
- cli_ux_1.default.action.stop("ready");
111
- return data;
112
- }
113
- catch (error) {
114
- console_1.default.error(error.message);
115
- console_1.default.debug(error);
116
- throw error;
117
- }
118
- };
119
- const getPackage = async (slug) => {
120
- try {
121
- cli_ux_1.default.action.start("Downloading package information...");
122
- await cli_ux_1.default.wait(1000);
123
- const data = await fetch(`${HOST}/v1/package/${slug}`);
124
- cli_ux_1.default.action.stop("ready");
125
- return data;
126
- }
127
- catch (error) {
128
- if (error.status === 404)
129
- console_1.default.error(`Package ${slug} does not exist`);
130
- else
131
- console_1.default.error(`Package ${slug} does not exist`);
132
- console_1.default.debug(error);
133
- throw error;
134
- }
135
- };
136
- const getLangs = async () => {
137
- try {
138
- cli_ux_1.default.action.start("Downloading language options...");
139
- await cli_ux_1.default.wait(1000);
140
- const data = await fetch(`${HOST}/v1/package/language`);
141
- cli_ux_1.default.action.stop("ready");
142
- return data;
143
- }
144
- catch (error) {
145
- if (error.status === 404)
146
- console_1.default.error("Package slug does not exist");
147
- else
148
- console_1.default.error("Package slug does not exist");
149
- console_1.default.debug(error);
150
- throw error;
151
- }
152
- };
153
- const getAllPackages = async ({ lang = "", slug = "", }) => {
154
- try {
155
- cli_ux_1.default.action.start("Downloading packages...");
156
- await cli_ux_1.default.wait(1000);
157
- const data = await fetch(`${HOST}/v1/package/all?limit=100&language=${lang}&slug=${slug}`);
158
- cli_ux_1.default.action.stop("ready");
159
- return data;
160
- }
161
- catch (error) {
162
- console_1.default.error(`Package ${slug} does not exist`);
163
- console_1.default.debug(error);
164
- throw error;
165
- }
166
- };
167
- const APIError = (error, code) => {
168
- const message = error.message || error;
169
- const _err = new Error(message);
170
- _err.status = code || 400;
171
- return _err;
172
- };
173
- exports.default = { login, publish, update, getPackage, getLangs, getAllPackages };
@@ -1,16 +0,0 @@
1
- import { IAuditErrors } from "../models/audit";
2
- import { IConfigObj } from "../models/config";
3
- import { ICounter } from "../models/counter";
4
- import { IFindings } from "../models/findings";
5
- import { IExercise } from "../models/exercise-obj";
6
- declare const _default: {
7
- isUrl: (url: string, errors: IAuditErrors[], counter: ICounter) => Promise<boolean>;
8
- checkForEmptySpaces: (str: string) => boolean;
9
- checkLearnpackClean: (configObj: IConfigObj, errors: IAuditErrors[]) => void;
10
- findInFile: (types: string[], content: string) => IFindings;
11
- checkUrl: (config: IConfigObj, filePath: string, fileName: string, exercise: IExercise | undefined, errors: IAuditErrors[], warnings: IAuditErrors[], counter: ICounter | undefined) => Promise<boolean>;
12
- writeFile: (content: string, filePath: string) => Promise<void>;
13
- showErrors: (errors: IAuditErrors[], counter: ICounter | undefined) => Promise<unknown>;
14
- showWarnings: (warnings: IAuditErrors[]) => Promise<unknown>;
15
- };
16
- export default _default;
@@ -1,302 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const console_1 = require("./console");
4
- const fs = require("fs");
5
- const path = require("path");
6
- // eslint-disable-next-line
7
- const fetch = require("node-fetch");
8
- // eslint-disable-next-line
9
- const fm = require("front-matter");
10
- // This function checks if a url is valid.
11
- const isUrl = async (url, errors, counter) => {
12
- const regexUrl = /(https?:\/\/[\w./-]+)/gm;
13
- counter.links.total++;
14
- if (!regexUrl.test(url)) {
15
- counter.links.error++;
16
- errors.push({
17
- exercise: undefined,
18
- msg: `The repository value of the configuration file is not a link: ${url}`,
19
- });
20
- return false;
21
- }
22
- const res = await fetch(url, { method: "HEAD" });
23
- if (!res.ok) {
24
- counter.links.error++;
25
- errors.push({
26
- exercise: undefined,
27
- msg: `The link of the repository is broken: ${url}`,
28
- });
29
- }
30
- return true;
31
- };
32
- const checkForEmptySpaces = (str) => {
33
- const isEmpty = true;
34
- for (const letter of str) {
35
- if (letter !== " ") {
36
- return false;
37
- }
38
- }
39
- return isEmpty;
40
- };
41
- const checkLearnpackClean = (configObj, errors) => {
42
- var _a, _b, _c, _d, _e, _f, _g, _h;
43
- if ((((_a = configObj.config) === null || _a === void 0 ? void 0 : _a.outputPath) &&
44
- fs.existsSync((_b = configObj.config) === null || _b === void 0 ? void 0 : _b.outputPath)) ||
45
- fs.existsSync(`${(_c = configObj.config) === null || _c === void 0 ? void 0 : _c.dirPath}/_app`) ||
46
- fs.existsSync(`${(_d = configObj.config) === null || _d === void 0 ? void 0 : _d.dirPath}/reports`) ||
47
- fs.existsSync(`${(_e = configObj.config) === null || _e === void 0 ? void 0 : _e.dirPath}/resets`) ||
48
- fs.existsSync(`${(_f = configObj.config) === null || _f === void 0 ? void 0 : _f.dirPath}/app.tar.gz`) ||
49
- fs.existsSync(`${(_g = configObj.config) === null || _g === void 0 ? void 0 : _g.dirPath}/config.json`) ||
50
- fs.existsSync(`${(_h = configObj.config) === null || _h === void 0 ? void 0 : _h.dirPath}/vscode_queue.json`)) {
51
- errors.push({
52
- exercise: undefined,
53
- msg: "You have to run learnpack clean command",
54
- });
55
- }
56
- };
57
- const findInFile = (types, content) => {
58
- const regex = {
59
- relativeImages: /!\[.*]\s*\((((\.\/)?(\.{2}\/){1,5})(.*\/)*(.[^\s/]*\.[A-Za-z]{2,4})\S*)\)/gm,
60
- externalImages: /!\[.*]\((https?:\/(\/[^)/]+)+\/?)\)/gm,
61
- markdownLinks: /(\s)+\[.*]\((https?:\/(\/[^)/]+)+\/?)\)/gm,
62
- url: /(https?:\/\/[\w./-]+)/gm,
63
- uploadcare: /https:\/\/ucarecdn.com\/(?:.*\/)*([\w./-]+)/gm,
64
- };
65
- const validTypes = Object.keys(regex);
66
- if (!Array.isArray(types))
67
- types = [types];
68
- const findings = {};
69
- for (const type of types) {
70
- if (!validTypes.includes(type))
71
- throw new Error("Invalid type: " + type);
72
- else
73
- findings[type] = {};
74
- }
75
- for (const type of types) {
76
- let m;
77
- while ((m = regex[type].exec(content)) !== null) {
78
- // This is necessary to avoid infinite loops with zero-width matches
79
- if (m.index === regex.lastIndex) {
80
- regex.lastIndex++;
81
- }
82
- // The result can be accessed through the `m`-variable.
83
- // m.forEach((match, groupIndex) => values.push(match));
84
- findings[type][m[0]] = {
85
- content: m[0],
86
- absUrl: m[1],
87
- mdUrl: m[2],
88
- relUrl: m[6],
89
- };
90
- }
91
- }
92
- return findings;
93
- };
94
- // This function checks that each of the url's are working.
95
- const checkUrl = async (config, filePath, fileName, exercise, errors, warnings, counter) => {
96
- var _a, _b, _c, _d;
97
- if (!fs.existsSync(filePath))
98
- return false;
99
- const content = fs.readFileSync(filePath).toString();
100
- const isEmpty = checkForEmptySpaces(content);
101
- if (isEmpty || !content)
102
- errors.push({
103
- exercise: exercise === null || exercise === void 0 ? void 0 : exercise.title,
104
- msg: `This file (${fileName}) doesn't have any content inside.`,
105
- });
106
- const frontmatter = fm(content);
107
- for (const attribute in frontmatter.attributes) {
108
- if (Object.prototype.hasOwnProperty.call(frontmatter.attributes, attribute) &&
109
- (attribute === "intro" || attribute === "tutorial")) {
110
- counter && counter.links.total++;
111
- try {
112
- // eslint-disable-next-line
113
- let res = await fetch(frontmatter.attributes[attribute], {
114
- method: "HEAD",
115
- });
116
- if (!res.ok) {
117
- counter && counter.links.error++;
118
- errors.push({
119
- exercise: exercise === null || exercise === void 0 ? void 0 : exercise.title,
120
- msg: `This link is broken (${res.ok}): ${frontmatter.attributes[attribute]}`,
121
- });
122
- }
123
- }
124
- catch (_e) {
125
- counter && counter.links.error++;
126
- errors.push({
127
- exercise: exercise === null || exercise === void 0 ? void 0 : exercise.title,
128
- msg: `This link is broken: ${frontmatter.attributes[attribute]}`,
129
- });
130
- }
131
- }
132
- }
133
- // Check url's of each README file.
134
- const findings = findInFile(["relativeImages", "externalImages", "markdownLinks"], content);
135
- for (const finding in findings) {
136
- if (Object.prototype.hasOwnProperty.call(findings, finding)) {
137
- const obj = findings[finding];
138
- // Valdites all the relative path images.
139
- if (finding === "relativeImages" && Object.keys(obj).length > 0) {
140
- for (const img in obj) {
141
- if (Object.prototype.hasOwnProperty.call(obj, img)) {
142
- // Validates if the image is in the assets folder.
143
- counter && counter.images.total++;
144
- const relativePath = path
145
- .relative(exercise ? exercise.path.replace(/\\/gm, "/") : "./", `${(_a = config.config) === null || _a === void 0 ? void 0 : _a.dirPath}/assets/${obj[img].relUrl}`)
146
- .replace(/\\/gm, "/");
147
- if (relativePath !== obj[img].absUrl.split("?").shift()) {
148
- counter && counter.images.error++;
149
- errors.push({
150
- exercise: exercise === null || exercise === void 0 ? void 0 : exercise.title,
151
- msg: `This relative path (${obj[img].relUrl}) is not pointing to the assets folder.`,
152
- });
153
- }
154
- if (!fs.existsSync(`${(_b = config.config) === null || _b === void 0 ? void 0 : _b.dirPath}/assets/${obj[img].relUrl}`)) {
155
- counter && counter.images.error++;
156
- errors.push({
157
- exercise: exercise === null || exercise === void 0 ? void 0 : exercise.title,
158
- msg: `The file ${obj[img].relUrl} doesn't exist in the assets folder.`,
159
- });
160
- }
161
- }
162
- }
163
- }
164
- else if (finding === "externalImages" && Object.keys(obj).length > 0) {
165
- // Valdites all the aboslute path images.
166
- for (const img in obj) {
167
- if (Object.prototype.hasOwnProperty.call(obj, img)) {
168
- counter && counter.images.total++;
169
- if (fs.existsSync(`${(_c = config.config) === null || _c === void 0 ? void 0 : _c.dirPath}/assets${obj[img].mdUrl
170
- .split("?")
171
- .shift()}`)) {
172
- const relativePath = path
173
- .relative(exercise ? exercise.path.replace(/\\/gm, "/") : "./", `${(_d = config.config) === null || _d === void 0 ? void 0 : _d.dirPath}/assets/${obj[img].mdUrl}`)
174
- .replace(/\\/gm, "/");
175
- warnings.push({
176
- exercise: exercise === null || exercise === void 0 ? void 0 : exercise.title,
177
- msg: `On this exercise you have an image with an absolute path "${obj[img].absUrl}". We recommend you to replace it by the relative path: "${relativePath}".`,
178
- });
179
- }
180
- try {
181
- // eslint-disable-next-line
182
- let res = await fetch(obj[img].absUrl, {
183
- method: "HEAD",
184
- });
185
- if (!res.ok) {
186
- counter && counter.images.error++;
187
- errors.push({
188
- exercise: exercise === null || exercise === void 0 ? void 0 : exercise.title,
189
- msg: `This link is broken: ${obj[img].absUrl}`,
190
- });
191
- }
192
- }
193
- catch (_f) {
194
- counter && counter.images.error++;
195
- errors.push({
196
- exercise: exercise === null || exercise === void 0 ? void 0 : exercise.title,
197
- msg: `This link is broken: ${obj[img].absUrl}`,
198
- });
199
- }
200
- }
201
- }
202
- }
203
- else if (finding === "markdownLinks" && Object.keys(obj).length > 0) {
204
- for (const link in obj) {
205
- if (Object.prototype.hasOwnProperty.call(obj, link)) {
206
- counter && counter.links.total++;
207
- if (!obj[link].mdUrl.includes("twitter")) {
208
- try {
209
- // eslint-disable-next-line
210
- let res = await fetch(obj[link].mdUrl, {
211
- method: "HEAD",
212
- });
213
- if (res.status > 399 && res.status < 500) {
214
- counter && counter.links.error++;
215
- errors.push({
216
- exercise: exercise === null || exercise === void 0 ? void 0 : exercise.title,
217
- msg: `This link is broken: ${obj[link].mdUrl}`,
218
- });
219
- }
220
- }
221
- catch (_g) {
222
- counter && counter.links.error++;
223
- errors.push({
224
- exercise: exercise === null || exercise === void 0 ? void 0 : exercise.title,
225
- msg: `This link is broken: ${obj[link].mdUrl}`,
226
- });
227
- }
228
- }
229
- }
230
- }
231
- }
232
- }
233
- }
234
- return true;
235
- };
236
- // This function writes a given file with the given content.
237
- const writeFile = async (content, filePath) => {
238
- try {
239
- await fs.promises.writeFile(filePath, content);
240
- }
241
- catch (error) {
242
- if (error)
243
- console_1.default.error(`We weren't able to write the file in this path "${filePath}".`, error);
244
- }
245
- };
246
- // This function checks if there are errors, and show them in the console at the end.
247
- const showErrors = (errors, counter) => {
248
- return new Promise((resolve, reject) => {
249
- if (errors) {
250
- if (errors.length > 0) {
251
- console_1.default.log("Checking for errors...");
252
- for (const [i, error] of errors.entries())
253
- console_1.default.error(`${i + 1}) ${error.msg} ${error.exercise ? `(Exercise: ${error.exercise})` : ""}`);
254
- if (counter) {
255
- console_1.default.error(` We found ${errors.length} error${errors.length > 1 ? "s" : ""} among ${counter.images.total} images, ${counter.links.total} link, ${counter.readmeFiles} README files and ${counter.exercises} exercises.`);
256
- }
257
- else {
258
- console_1.default.error(` We found ${errors.length} error${errors.length > 1 ? "s" : ""} related with the project integrity.`);
259
- }
260
- process.exit(1);
261
- }
262
- else {
263
- if (counter) {
264
- console_1.default.success(`We didn't find any errors in this repository among ${counter.images.total} images, ${counter.links.total} link, ${counter.readmeFiles} README files and ${counter.exercises} exercises.`);
265
- }
266
- else {
267
- console_1.default.success(`We didn't find any errors in this repository.`);
268
- }
269
- process.exit(0);
270
- }
271
- }
272
- else {
273
- reject("Failed");
274
- }
275
- });
276
- };
277
- // This function checks if there are warnings, and show them in the console at the end.
278
- const showWarnings = (warnings) => {
279
- return new Promise((resolve, reject) => {
280
- if (warnings) {
281
- if (warnings.length > 0) {
282
- console_1.default.log("Checking for warnings...");
283
- for (const [i, warning] of warnings.entries())
284
- console_1.default.warning(`${i + 1}) ${warning.msg} ${warning.exercise ? `File: ${warning.exercise}` : ""}`);
285
- }
286
- resolve("SUCCESS");
287
- }
288
- else {
289
- reject("Failed");
290
- }
291
- });
292
- };
293
- exports.default = {
294
- isUrl,
295
- checkForEmptySpaces,
296
- checkLearnpackClean,
297
- findInFile,
298
- checkUrl,
299
- writeFile,
300
- showErrors,
301
- showWarnings,
302
- };
@@ -1,12 +0,0 @@
1
- declare const _default: {
2
- _debug: boolean;
3
- startDebug: () => void;
4
- log: (msg: string | Array<string>, ...args: Array<any>) => void;
5
- error: (msg: string, ...args: Array<any>) => void;
6
- success: (msg: string, ...args: Array<any>) => void;
7
- info: (msg: string, ...args: Array<any>) => void;
8
- help: (msg: string) => void;
9
- debug(...args: Array<any>): void;
10
- warning: (msg: string) => void;
11
- };
12
- export default _default;
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const chalk = require("chalk");
4
- exports.default = {
5
- // _debug: true,
6
- _debug: process.env.DEBUG === 'true',
7
- startDebug: function () {
8
- this._debug = true;
9
- },
10
- log: (msg, ...args) => console.log(chalk.gray(msg), ...args),
11
- error: (msg, ...args) => console.log(chalk.red('⨉ ' + msg), ...args),
12
- success: (msg, ...args) => console.log(chalk.green('✓ ' + msg), ...args),
13
- info: (msg, ...args) => console.log(chalk.blue('ⓘ ' + msg), ...args),
14
- help: (msg) => console.log(`${chalk.white.bold('⚠ help:')} ${chalk.white(msg)}`),
15
- debug(...args) {
16
- this._debug && console.log(chalk.magentaBright('⚠ debug: '), args);
17
- },
18
- warning: (msg) => console.log(`${chalk.yellow('⚠ warning:')} ${chalk.yellow(msg)}`),
19
- };
@@ -1,17 +0,0 @@
1
- import { ISolution, IError } from '../models/errors';
2
- export declare const getSolution: (slug?: string | undefined) => ISolution;
3
- export declare const ValidationError: (error: IError | string) => IError;
4
- export declare const NotFoundError: (error: IError | string) => IError;
5
- export declare const CompilerError: (error: IError | string) => IError;
6
- export declare const TestingError: (error: IError | string) => IError;
7
- export declare const AuthError: (error: IError | string) => IError;
8
- export declare const InternalError: (error: IError | string) => IError;
9
- declare const _default: {
10
- ValidationError: (error: string | IError) => IError;
11
- CompilerError: (error: string | IError) => IError;
12
- TestingError: (error: string | IError) => IError;
13
- NotFoundError: (error: string | IError) => IError;
14
- InternalError: (error: string | IError) => IError;
15
- AuthError: (error: string | IError) => IError;
16
- };
17
- export default _default;