@learnpack/learnpack 2.1.26 → 2.1.28

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 (56) hide show
  1. package/README.md +10 -10
  2. package/lib/commands/start.js +15 -4
  3. package/lib/managers/file.d.ts +1 -0
  4. package/lib/managers/file.js +8 -1
  5. package/lib/managers/server/routes.js +48 -14
  6. package/lib/managers/session.d.ts +1 -1
  7. package/lib/managers/session.js +39 -12
  8. package/lib/managers/socket.d.ts +1 -1
  9. package/lib/managers/socket.js +57 -43
  10. package/lib/models/action.d.ts +1 -1
  11. package/lib/models/config.d.ts +1 -1
  12. package/lib/models/exercise-obj.d.ts +3 -0
  13. package/lib/models/session.d.ts +4 -1
  14. package/lib/models/socket.d.ts +7 -6
  15. package/lib/models/status.d.ts +1 -1
  16. package/lib/utils/api.d.ts +2 -0
  17. package/lib/utils/api.js +51 -6
  18. package/oclif.manifest.json +1 -1
  19. package/package.json +3 -1
  20. package/src/commands/audit.ts +113 -113
  21. package/src/commands/clean.ts +10 -10
  22. package/src/commands/download.ts +18 -18
  23. package/src/commands/init.ts +39 -39
  24. package/src/commands/login.ts +13 -13
  25. package/src/commands/logout.ts +9 -9
  26. package/src/commands/publish.ts +25 -25
  27. package/src/commands/start.ts +101 -75
  28. package/src/commands/test.ts +34 -34
  29. package/src/managers/config/allowed_files.ts +2 -2
  30. package/src/managers/config/defaults.ts +2 -2
  31. package/src/managers/config/exercise.ts +79 -79
  32. package/src/managers/config/index.ts +145 -145
  33. package/src/managers/file.ts +74 -65
  34. package/src/managers/server/index.ts +32 -31
  35. package/src/managers/server/routes.ts +139 -90
  36. package/src/managers/session.ts +53 -24
  37. package/src/managers/socket.ts +92 -79
  38. package/src/models/action.ts +8 -1
  39. package/src/models/config-manager.ts +2 -2
  40. package/src/models/config.ts +7 -2
  41. package/src/models/exercise-obj.ts +6 -3
  42. package/src/models/plugin-config.ts +2 -2
  43. package/src/models/session.ts +5 -2
  44. package/src/models/socket.ts +12 -6
  45. package/src/models/status.ts +15 -14
  46. package/src/plugin/command/compile.ts +10 -10
  47. package/src/plugin/command/test.ts +14 -14
  48. package/src/plugin/index.ts +5 -5
  49. package/src/plugin/plugin.ts +26 -26
  50. package/src/plugin/utils.ts +23 -23
  51. package/src/utils/BaseCommand.ts +16 -16
  52. package/src/utils/api.ts +143 -91
  53. package/src/utils/audit.ts +93 -96
  54. package/src/utils/exercisesQueue.ts +15 -15
  55. package/src/utils/fileQueue.ts +85 -85
  56. package/src/utils/watcher.ts +14 -14
@@ -1,31 +1,31 @@
1
- import { flags } from "@oclif/command";
2
- import BaseCommand from "../utils/BaseCommand";
1
+ import { flags } from "@oclif/command"
2
+ import BaseCommand from "../utils/BaseCommand"
3
3
 
4
4
  // eslint-disable-next-line
5
5
  import * as fs from "fs-extra";
6
- import * as prompts from "prompts";
7
- import cli from "cli-ux";
8
- import * as eta from "eta";
6
+ import * as prompts from "prompts"
7
+ import cli from "cli-ux"
8
+ import * as eta from "eta"
9
9
 
10
- import Console from "../utils/console";
11
- import { ValidationError } from "../utils/errors";
10
+ import Console from "../utils/console"
11
+ import { ValidationError } from "../utils/errors"
12
12
 
13
- import * as path from "path";
13
+ import * as path from "path"
14
14
 
15
15
  class InitComand extends BaseCommand {
16
16
  static description =
17
- "Create a new learning package: Book, Tutorial or Exercise";
17
+ "Create a new learning package: Book, Tutorial or Exercise"
18
18
 
19
19
  static flags = {
20
20
  ...BaseCommand.flags,
21
21
  grading: flags.help({ char: "h" }),
22
- };
22
+ }
23
23
 
24
24
  async run() {
25
- const { flags } = this.parse(InitComand);
25
+ const { flags } = this.parse(InitComand)
26
26
 
27
27
  // if the folder/file .learn or .breathecode aleady exists
28
- await alreadyInitialized();
28
+ await alreadyInitialized()
29
29
 
30
30
  const choices = await prompts([
31
31
  {
@@ -76,13 +76,13 @@ class InitComand extends BaseCommand {
76
76
  initial: "1",
77
77
  message: "How many hours avg it takes to complete (number)?",
78
78
  validate: (value: string) => {
79
- const n = Math.floor(Number(value));
79
+ const n = Math.floor(Number(value))
80
80
  return (
81
81
  n !== Number.POSITIVE_INFINITY && String(n) === value && n >= 0
82
- );
82
+ )
83
83
  },
84
84
  },
85
- ]);
85
+ ])
86
86
 
87
87
  const packageInfo = {
88
88
  grading: choices.grading,
@@ -94,24 +94,24 @@ class InitComand extends BaseCommand {
94
94
  .toLowerCase()
95
95
  .replace(/ /g, "-")
96
96
  .replace(/[^\w-]+/g, ""),
97
- };
97
+ }
98
98
 
99
- cli.action.start("Initializing package");
99
+ cli.action.start("Initializing package")
100
100
 
101
- const languages = ["en", "es"];
101
+ const languages = ["en", "es"]
102
102
 
103
103
  const templatesDir = path.resolve(
104
104
  __dirname,
105
105
  "../../src/utils/templates/" + choices.grading || "no-grading"
106
- );
106
+ )
107
107
  if (!fs.existsSync(templatesDir))
108
- throw ValidationError(`Template ${templatesDir} does not exists`);
109
- await fs.copySync(templatesDir, "./");
108
+ throw ValidationError(`Template ${templatesDir} does not exists`)
109
+ await fs.copySync(templatesDir, "./")
110
110
 
111
111
  // Creating README files
112
112
  // eslint-disable-next-line
113
113
  languages.forEach((language) => {
114
- const readmeFilename = `README${language !== "en" ? `.${language}` : ""}`;
114
+ const readmeFilename = `README${language !== "en" ? `.${language}` : ""}`
115
115
  fs.writeFileSync(
116
116
  `./${readmeFilename}.md`,
117
117
  eta.render(
@@ -121,23 +121,23 @@ class InitComand extends BaseCommand {
121
121
  ),
122
122
  packageInfo
123
123
  )
124
- );
124
+ )
125
125
  if (fs.existsSync(`./${readmeFilename}.ejs`))
126
- fs.removeSync(`./${readmeFilename}.ejs`);
127
- });
126
+ fs.removeSync(`./${readmeFilename}.ejs`)
127
+ })
128
128
 
129
129
  if (!fs.existsSync("./.gitignore"))
130
130
  fs.copyFile(
131
131
  path.resolve(__dirname, "../../src/utils/templates/gitignore.txt"),
132
132
  "./.gitignore"
133
- );
134
- fs.writeFileSync("./learn.json", JSON.stringify(packageInfo, null, 2));
133
+ )
134
+ fs.writeFileSync("./learn.json", JSON.stringify(packageInfo, null, 2))
135
135
 
136
- cli.action.stop();
137
- Console.success(`😋 Package initialized successfully`);
136
+ cli.action.stop()
137
+ Console.success(`😋 Package initialized successfully`)
138
138
  Console.help(
139
139
  `Start the exercises by running the following command on your terminal: $ learnpack start`
140
- );
140
+ )
141
141
  }
142
142
  }
143
143
 
@@ -146,25 +146,25 @@ const alreadyInitialized = () =>
146
146
  fs.readdir("./", function (err: any, files: any) {
147
147
  files = files.filter((f: any) =>
148
148
  [".learn", "learn.json", "bc.json", ".breathecode"].includes(f)
149
- );
149
+ )
150
150
  if (err) {
151
- reject(ValidationError(err.message));
152
- throw ValidationError(err.message);
151
+ reject(ValidationError(err.message))
152
+ throw ValidationError(err.message)
153
153
  } else if (files.length > 0) {
154
154
  reject(
155
155
  ValidationError(
156
156
  "It seems the package is already initialized because we've found the following files: " +
157
157
  files.join(",")
158
158
  )
159
- );
159
+ )
160
160
  throw ValidationError(
161
161
  "It seems the package is already initialized because we've found the following files: " +
162
162
  files.join(",")
163
- );
163
+ )
164
164
  }
165
165
 
166
- resolve(false);
167
- });
168
- });
166
+ resolve(false)
167
+ })
168
+ })
169
169
 
170
- export default InitComand;
170
+ export default InitComand
@@ -1,16 +1,16 @@
1
- import SessionCommand from "../utils/SessionCommand";
2
- import SessionManager from "../managers/session";
3
- import Console from "../utils/console";
1
+ import SessionCommand from "../utils/SessionCommand"
2
+ import SessionManager from "../managers/session"
3
+ import Console from "../utils/console"
4
4
 
5
5
  class LoginCommand extends SessionCommand {
6
6
  static description = `Describe the command here
7
7
  ...
8
8
  Extra documentation goes here
9
- `;
9
+ `
10
10
 
11
11
  static flags: any = {
12
12
  // name: flags.string({char: 'n', description: 'name to print'}),
13
- };
13
+ }
14
14
 
15
15
  static args = [
16
16
  {
@@ -20,23 +20,23 @@ class LoginCommand extends SessionCommand {
20
20
  "The unique string that identifies this package on learnpack", // help description
21
21
  hidden: false, // hide this arg from help
22
22
  },
23
- ];
23
+ ]
24
24
 
25
25
  async init() {
26
- const { flags } = this.parse(LoginCommand);
27
- await this.initSession(flags);
26
+ const { flags } = this.parse(LoginCommand)
27
+ await this.initSession(flags)
28
28
  }
29
29
 
30
30
  async run() {
31
- /* const {flags, args} = */ this.parse(LoginCommand);
31
+ /* const {flags, args} = */ this.parse(LoginCommand)
32
32
 
33
33
  try {
34
- await SessionManager.login();
34
+ await SessionManager.login()
35
35
  } catch (error) {
36
- Console.error("Error trying to authenticate");
37
- Console.error((error as TypeError).message || (error as string));
36
+ Console.error("Error trying to authenticate")
37
+ Console.error((error as TypeError).message || (error as string))
38
38
  }
39
39
  }
40
40
  }
41
41
 
42
- export default LoginCommand;
42
+ export default LoginCommand
@@ -1,8 +1,8 @@
1
1
  // import {Command, flags} from '@oclif/command'
2
2
  // import { prompt } from "enquirer"
3
3
  // import fetch from 'node-fetch'
4
- import SessionCommand from "../utils/SessionCommand";
5
- import SessionManager from "../managers/session";
4
+ import SessionCommand from "../utils/SessionCommand"
5
+ import SessionManager from "../managers/session"
6
6
  // import Console from '../utils/console'
7
7
  // import { replace } from 'node-emoji'
8
8
  // import { validURL } from "../utils/validators"
@@ -12,11 +12,11 @@ class LogoutCommand extends SessionCommand {
12
12
  static description = `Describe the command here
13
13
  ...
14
14
  Extra documentation goes here
15
- `;
15
+ `
16
16
 
17
17
  static flags: any = {
18
18
  // name: flags.string({char: 'n', description: 'name to print'}),
19
- };
19
+ }
20
20
 
21
21
  static args = [
22
22
  {
@@ -26,18 +26,18 @@ class LogoutCommand extends SessionCommand {
26
26
  "The unique string that identifies this package on learnpack", // help description
27
27
  hidden: false, // hide this arg from help
28
28
  },
29
- ];
29
+ ]
30
30
 
31
31
  async init() {
32
- const { flags } = this.parse(LogoutCommand);
33
- await this.initSession(flags);
32
+ const { flags } = this.parse(LogoutCommand)
33
+ await this.initSession(flags)
34
34
  }
35
35
 
36
36
  async run() {
37
37
  // const {flags, args} = this.parse(LogoutCommand)
38
38
 
39
- SessionManager.destroy();
39
+ SessionManager.destroy()
40
40
  }
41
41
  }
42
42
 
43
- export default LogoutCommand;
43
+ export default LogoutCommand
@@ -1,8 +1,8 @@
1
- import { prompt } from "enquirer";
2
- import SessionCommand from "../utils/SessionCommand";
3
- import Console from "../utils/console";
4
- import api from "../utils/api";
5
- import { validURL } from "../utils/validators";
1
+ import { prompt } from "enquirer"
2
+ import SessionCommand from "../utils/SessionCommand"
3
+ import Console from "../utils/console"
4
+ import api from "../utils/api"
5
+ import { validURL } from "../utils/validators"
6
6
 
7
7
  // eslint-disable-next-line
8
8
  const fetch = require("node-fetch");
@@ -11,11 +11,11 @@ class PublishCommand extends SessionCommand {
11
11
  static description = `Describe the command here
12
12
  ...
13
13
  Extra documentation goes here
14
- `;
14
+ `
15
15
 
16
16
  static flags: any = {
17
17
  // name: flags.string({char: 'n', description: 'name to print'}),
18
- };
18
+ }
19
19
 
20
20
  static args = [
21
21
  {
@@ -25,15 +25,15 @@ class PublishCommand extends SessionCommand {
25
25
  "The unique string that identifies this package on learnpack", // help description
26
26
  hidden: false, // hide this arg from help
27
27
  },
28
- ];
28
+ ]
29
29
 
30
30
  async init() {
31
- const { flags } = this.parse(PublishCommand);
32
- await this.initSession(flags, true);
31
+ const { flags } = this.parse(PublishCommand)
32
+ await this.initSession(flags, true)
33
33
  }
34
34
 
35
35
  async run() {
36
- const { flags, args } = this.parse(PublishCommand);
36
+ const { flags, args } = this.parse(PublishCommand)
37
37
 
38
38
  // avoid annonymus sessions
39
39
  // eslint-disable-next-line
@@ -41,30 +41,30 @@ class PublishCommand extends SessionCommand {
41
41
 
42
42
  Console.info(
43
43
  `Session found for ${this.session.payload.email}, publishing the package...`
44
- );
44
+ )
45
45
 
46
- const configObject = this.configManager?.get();
46
+ const configObject = this.configManager?.get()
47
47
  if (
48
48
  configObject?.config?.slug === undefined ||
49
49
  !configObject.config?.slug
50
50
  ) {
51
51
  throw new Error(
52
52
  "The package is missing a slug (unique name identifier), please check your learn.json file and make sure it has a 'slug'"
53
- );
53
+ )
54
54
  }
55
55
 
56
56
  if (!validURL(configObject?.config?.repository ?? "")) {
57
57
  throw new Error(
58
58
  "The package has a missing or invalid 'repository' on the configuration file, it needs to be a Github URL"
59
- );
59
+ )
60
60
  } else {
61
61
  const validateResp = await fetch(configObject.config?.repository, {
62
62
  method: "HEAD",
63
- });
63
+ })
64
64
  if (!validateResp.ok || validateResp.status !== 200) {
65
65
  throw new Error(
66
66
  `The specified repository URL on the configuration file does not exist or its private, only public repositories are allowed at the moment: ${configObject.config?.repository}`
67
- );
67
+ )
68
68
  }
69
69
  }
70
70
 
@@ -73,10 +73,10 @@ class PublishCommand extends SessionCommand {
73
73
  await api.publish({
74
74
  ...configObject,
75
75
  author: this.session.payload.user_id,
76
- });
76
+ })
77
77
  Console.success(
78
78
  `Package updated and published successfully: ${configObject.config?.slug}`
79
- );
79
+ )
80
80
  } catch (error) {
81
81
  if ((error as any).status === 404) {
82
82
  const answer = await prompt([
@@ -85,23 +85,23 @@ class PublishCommand extends SessionCommand {
85
85
  name: "create",
86
86
  message: `Package with slug ${configObject.config?.slug} does not exist, do you want to create it?`,
87
87
  },
88
- ]);
88
+ ])
89
89
  if (answer) {
90
90
  await api.update({
91
91
  ...configObject,
92
92
  author: this.session.payload.user_id,
93
- });
93
+ })
94
94
  Console.success(
95
95
  `Package created and published successfully: ${configObject.config?.slug}`
96
- );
96
+ )
97
97
  } else {
98
- Console.error("No answer from server");
98
+ Console.error("No answer from server")
99
99
  }
100
100
  } else {
101
- Console.error((error as TypeError).message);
101
+ Console.error((error as TypeError).message)
102
102
  }
103
103
  }
104
104
  }
105
105
  }
106
106
 
107
- export default PublishCommand;
107
+ export default PublishCommand