@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.
- package/README.md +10 -10
- package/lib/commands/start.js +15 -4
- package/lib/managers/file.d.ts +1 -0
- package/lib/managers/file.js +8 -1
- package/lib/managers/server/routes.js +48 -14
- package/lib/managers/session.d.ts +1 -1
- package/lib/managers/session.js +39 -12
- package/lib/managers/socket.d.ts +1 -1
- package/lib/managers/socket.js +57 -43
- package/lib/models/action.d.ts +1 -1
- package/lib/models/config.d.ts +1 -1
- package/lib/models/exercise-obj.d.ts +3 -0
- package/lib/models/session.d.ts +4 -1
- package/lib/models/socket.d.ts +7 -6
- package/lib/models/status.d.ts +1 -1
- package/lib/utils/api.d.ts +2 -0
- package/lib/utils/api.js +51 -6
- package/oclif.manifest.json +1 -1
- package/package.json +3 -1
- package/src/commands/audit.ts +113 -113
- package/src/commands/clean.ts +10 -10
- package/src/commands/download.ts +18 -18
- package/src/commands/init.ts +39 -39
- package/src/commands/login.ts +13 -13
- package/src/commands/logout.ts +9 -9
- package/src/commands/publish.ts +25 -25
- package/src/commands/start.ts +101 -75
- package/src/commands/test.ts +34 -34
- package/src/managers/config/allowed_files.ts +2 -2
- package/src/managers/config/defaults.ts +2 -2
- package/src/managers/config/exercise.ts +79 -79
- package/src/managers/config/index.ts +145 -145
- package/src/managers/file.ts +74 -65
- package/src/managers/server/index.ts +32 -31
- package/src/managers/server/routes.ts +139 -90
- package/src/managers/session.ts +53 -24
- package/src/managers/socket.ts +92 -79
- package/src/models/action.ts +8 -1
- package/src/models/config-manager.ts +2 -2
- package/src/models/config.ts +7 -2
- package/src/models/exercise-obj.ts +6 -3
- package/src/models/plugin-config.ts +2 -2
- package/src/models/session.ts +5 -2
- package/src/models/socket.ts +12 -6
- package/src/models/status.ts +15 -14
- package/src/plugin/command/compile.ts +10 -10
- package/src/plugin/command/test.ts +14 -14
- package/src/plugin/index.ts +5 -5
- package/src/plugin/plugin.ts +26 -26
- package/src/plugin/utils.ts +23 -23
- package/src/utils/BaseCommand.ts +16 -16
- package/src/utils/api.ts +143 -91
- package/src/utils/audit.ts +93 -96
- package/src/utils/exercisesQueue.ts +15 -15
- package/src/utils/fileQueue.ts +85 -85
- package/src/utils/watcher.ts +14 -14
package/src/commands/init.ts
CHANGED
@@ -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
|
package/src/commands/login.ts
CHANGED
@@ -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
|
package/src/commands/logout.ts
CHANGED
@@ -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
|
package/src/commands/publish.ts
CHANGED
@@ -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
|