@learnpack/learnpack 2.1.39 → 2.1.40

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) hide show
  1. package/README.md +370 -35
  2. package/bin/run +17 -17
  3. package/bin/run.cmd +3 -3
  4. package/lib/commands/audit.d.ts +6 -6
  5. package/lib/commands/audit.js +342 -342
  6. package/lib/commands/clean.d.ts +8 -8
  7. package/lib/commands/clean.js +25 -25
  8. package/lib/commands/download.d.ts +13 -13
  9. package/lib/commands/download.js +55 -55
  10. package/lib/commands/init.d.ts +9 -9
  11. package/lib/commands/init.js +123 -123
  12. package/lib/commands/login.d.ts +14 -14
  13. package/lib/commands/login.js +37 -37
  14. package/lib/commands/logout.d.ts +14 -14
  15. package/lib/commands/logout.js +37 -37
  16. package/lib/commands/publish.d.ts +14 -14
  17. package/lib/commands/publish.js +82 -82
  18. package/lib/commands/start.d.ts +7 -7
  19. package/lib/commands/start.js +239 -208
  20. package/lib/commands/test.d.ts +6 -6
  21. package/lib/commands/test.js +62 -62
  22. package/lib/index.d.ts +1 -1
  23. package/lib/index.js +4 -4
  24. package/lib/managers/config/allowed_files.d.ts +5 -5
  25. package/lib/managers/config/allowed_files.js +30 -30
  26. package/lib/managers/config/defaults.d.ts +41 -41
  27. package/lib/managers/config/defaults.js +44 -44
  28. package/lib/managers/config/exercise.d.ts +36 -36
  29. package/lib/managers/config/exercise.js +236 -236
  30. package/lib/managers/config/index.d.ts +3 -3
  31. package/lib/managers/config/index.js +337 -337
  32. package/lib/managers/file.d.ts +14 -14
  33. package/lib/managers/file.js +153 -153
  34. package/lib/managers/gitpod.d.ts +3 -3
  35. package/lib/managers/gitpod.js +67 -67
  36. package/lib/managers/server/index.d.ts +6 -6
  37. package/lib/managers/server/index.js +58 -58
  38. package/lib/managers/server/routes.d.ts +4 -4
  39. package/lib/managers/server/routes.js +219 -219
  40. package/lib/managers/session.d.ts +3 -3
  41. package/lib/managers/session.js +125 -125
  42. package/lib/managers/socket.d.ts +3 -3
  43. package/lib/managers/socket.js +176 -176
  44. package/lib/managers/telemetry.d.ts +74 -74
  45. package/lib/managers/telemetry.js +206 -206
  46. package/lib/managers/test.js +84 -84
  47. package/lib/models/action.d.ts +2 -2
  48. package/lib/models/action.js +2 -2
  49. package/lib/models/audit.d.ts +15 -15
  50. package/lib/models/audit.js +2 -2
  51. package/lib/models/config-manager.d.ts +21 -21
  52. package/lib/models/config-manager.js +2 -2
  53. package/lib/models/config.d.ts +68 -67
  54. package/lib/models/config.js +2 -2
  55. package/lib/models/counter.d.ts +11 -11
  56. package/lib/models/counter.js +2 -2
  57. package/lib/models/errors.d.ts +15 -15
  58. package/lib/models/errors.js +2 -2
  59. package/lib/models/exercise-obj.d.ts +30 -30
  60. package/lib/models/exercise-obj.js +2 -2
  61. package/lib/models/file.d.ts +5 -5
  62. package/lib/models/file.js +2 -2
  63. package/lib/models/findings.d.ts +17 -17
  64. package/lib/models/findings.js +2 -2
  65. package/lib/models/flags.d.ts +10 -10
  66. package/lib/models/flags.js +2 -2
  67. package/lib/models/front-matter.d.ts +11 -11
  68. package/lib/models/front-matter.js +2 -2
  69. package/lib/models/gitpod-data.d.ts +16 -16
  70. package/lib/models/gitpod-data.js +2 -2
  71. package/lib/models/language.d.ts +4 -4
  72. package/lib/models/language.js +2 -2
  73. package/lib/models/package.d.ts +7 -7
  74. package/lib/models/package.js +2 -2
  75. package/lib/models/plugin-config.d.ts +16 -16
  76. package/lib/models/plugin-config.js +2 -2
  77. package/lib/models/session.d.ts +31 -31
  78. package/lib/models/session.js +2 -2
  79. package/lib/models/socket.d.ts +36 -32
  80. package/lib/models/socket.js +2 -2
  81. package/lib/models/status.d.ts +1 -1
  82. package/lib/models/status.js +2 -2
  83. package/lib/models/success-types.d.ts +1 -1
  84. package/lib/models/success-types.js +2 -2
  85. package/lib/plugin/command/compile.d.ts +6 -6
  86. package/lib/plugin/command/compile.js +18 -18
  87. package/lib/plugin/command/test.d.ts +6 -6
  88. package/lib/plugin/command/test.js +25 -25
  89. package/lib/plugin/index.d.ts +27 -27
  90. package/lib/plugin/index.js +7 -7
  91. package/lib/plugin/plugin.d.ts +8 -8
  92. package/lib/plugin/plugin.js +68 -68
  93. package/lib/plugin/utils.d.ts +16 -16
  94. package/lib/plugin/utils.js +58 -58
  95. package/lib/ui/download.d.ts +5 -5
  96. package/lib/ui/download.js +61 -61
  97. package/lib/utils/BaseCommand.d.ts +8 -8
  98. package/lib/utils/BaseCommand.js +41 -41
  99. package/lib/utils/SessionCommand.d.ts +10 -10
  100. package/lib/utils/SessionCommand.js +43 -43
  101. package/lib/utils/api.d.ts +14 -14
  102. package/lib/utils/api.js +255 -255
  103. package/lib/utils/audit.d.ts +16 -16
  104. package/lib/utils/audit.js +303 -303
  105. package/lib/utils/checkNotInstalled.d.ts +2 -0
  106. package/lib/utils/checkNotInstalled.js +36 -0
  107. package/lib/utils/console.d.ts +12 -12
  108. package/lib/utils/console.js +19 -19
  109. package/lib/utils/errors.d.ts +17 -17
  110. package/lib/utils/errors.js +100 -100
  111. package/lib/utils/exercisesQueue.d.ts +9 -9
  112. package/lib/utils/exercisesQueue.js +38 -38
  113. package/lib/utils/fileQueue.d.ts +40 -40
  114. package/lib/utils/fileQueue.js +168 -168
  115. package/lib/utils/misc.d.ts +1 -1
  116. package/lib/utils/misc.js +23 -23
  117. package/lib/utils/osOperations.d.ts +5 -5
  118. package/lib/utils/osOperations.js +72 -72
  119. package/lib/utils/validators.d.ts +5 -5
  120. package/lib/utils/validators.js +17 -17
  121. package/lib/utils/watcher.d.ts +2 -2
  122. package/lib/utils/watcher.js +25 -25
  123. package/oclif.manifest.json +1 -1
  124. package/package.json +139 -139
  125. package/src/commands/audit.ts +443 -443
  126. package/src/commands/clean.ts +29 -29
  127. package/src/commands/download.ts +61 -61
  128. package/src/commands/init.ts +170 -170
  129. package/src/commands/login.ts +42 -42
  130. package/src/commands/logout.ts +43 -43
  131. package/src/commands/publish.ts +107 -107
  132. package/src/commands/start.ts +53 -23
  133. package/src/commands/test.ts +85 -85
  134. package/src/index.ts +1 -1
  135. package/src/managers/config/allowed_files.ts +29 -29
  136. package/src/managers/config/defaults.ts +42 -42
  137. package/src/managers/config/exercise.ts +311 -311
  138. package/src/managers/config/index.ts +455 -455
  139. package/src/managers/file.ts +196 -196
  140. package/src/managers/gitpod.ts +84 -84
  141. package/src/managers/server/index.ts +78 -78
  142. package/src/managers/server/routes.ts +330 -330
  143. package/src/managers/session.ts +145 -145
  144. package/src/managers/socket.ts +250 -250
  145. package/src/managers/telemetry.ts +346 -346
  146. package/src/managers/test.ts +83 -83
  147. package/src/models/action.ts +10 -10
  148. package/src/models/audit.ts +16 -16
  149. package/src/models/config-manager.ts +23 -23
  150. package/src/models/config.ts +5 -3
  151. package/src/models/counter.ts +11 -11
  152. package/src/models/errors.ts +22 -22
  153. package/src/models/exercise-obj.ts +29 -29
  154. package/src/models/file.ts +5 -5
  155. package/src/models/findings.ts +18 -18
  156. package/src/models/flags.ts +10 -10
  157. package/src/models/front-matter.ts +11 -11
  158. package/src/models/gitpod-data.ts +19 -19
  159. package/src/models/language.ts +4 -4
  160. package/src/models/package.ts +7 -7
  161. package/src/models/plugin-config.ts +17 -17
  162. package/src/models/session.ts +34 -34
  163. package/src/models/socket.ts +5 -0
  164. package/src/models/status.ts +16 -16
  165. package/src/models/success-types.ts +1 -1
  166. package/src/plugin/command/compile.ts +17 -17
  167. package/src/plugin/command/test.ts +30 -30
  168. package/src/plugin/index.ts +6 -6
  169. package/src/plugin/plugin.ts +94 -94
  170. package/src/plugin/utils.ts +87 -87
  171. package/src/types/node-fetch.d.ts +1 -1
  172. package/src/ui/download.ts +71 -71
  173. package/src/utils/BaseCommand.ts +48 -48
  174. package/src/utils/SessionCommand.ts +43 -43
  175. package/src/utils/api.ts +303 -303
  176. package/src/utils/audit.ts +393 -393
  177. package/src/utils/checkNotInstalled.ts +46 -0
  178. package/src/utils/console.ts +24 -24
  179. package/src/utils/errors.ts +117 -117
  180. package/src/utils/exercisesQueue.ts +51 -51
  181. package/src/utils/fileQueue.ts +198 -198
  182. package/src/utils/misc.ts +23 -23
  183. package/src/utils/osOperations.ts +79 -79
  184. package/src/utils/templates/gitignore.txt +19 -19
  185. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.es.md +24 -24
  186. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.md +24 -24
  187. package/src/utils/templates/incremental/README.ejs +4 -4
  188. package/src/utils/templates/incremental/README.es.ejs +4 -4
  189. package/src/utils/templates/isolated/01-hello-world/README.es.md +26 -26
  190. package/src/utils/templates/isolated/01-hello-world/README.md +26 -26
  191. package/src/utils/templates/isolated/README.ejs +4 -4
  192. package/src/utils/templates/isolated/README.es.ejs +4 -4
  193. package/src/utils/templates/no-grading/README.ejs +4 -4
  194. package/src/utils/templates/no-grading/README.es.ejs +4 -4
  195. package/src/utils/validators.ts +18 -18
  196. package/src/utils/watcher.ts +27 -27
@@ -1,29 +1,29 @@
1
- // import {flags} from '@oclif/command'
2
- import Console from "../utils/console"
3
- import SessionCommand from "../utils/SessionCommand"
4
-
5
- class CleanCommand extends SessionCommand {
6
- static description = `Clean the configuration object
7
- ...
8
- Extra documentation goes here
9
- `
10
-
11
- static flags: any = {
12
- // name: flags.string({char: 'n', description: 'name to print'}),
13
- }
14
-
15
- async init() {
16
- const { flags } = this.parse(CleanCommand)
17
- await this.initSession(flags)
18
- }
19
-
20
- async run() {
21
- const { flags } = this.parse(CleanCommand)
22
-
23
- this.configManager?.clean()
24
-
25
- Console.success("Package cleaned successfully, ready to publish")
26
- }
27
- }
28
-
29
- export default CleanCommand
1
+ // import {flags} from '@oclif/command'
2
+ import Console from "../utils/console"
3
+ import SessionCommand from "../utils/SessionCommand"
4
+
5
+ class CleanCommand extends SessionCommand {
6
+ static description = `Clean the configuration object
7
+ ...
8
+ Extra documentation goes here
9
+ `
10
+
11
+ static flags: any = {
12
+ // name: flags.string({char: 'n', description: 'name to print'}),
13
+ }
14
+
15
+ async init() {
16
+ const { flags } = this.parse(CleanCommand)
17
+ await this.initSession(flags)
18
+ }
19
+
20
+ async run() {
21
+ const { flags } = this.parse(CleanCommand)
22
+
23
+ this.configManager?.clean()
24
+
25
+ Console.success("Package cleaned successfully, ready to publish")
26
+ }
27
+ }
28
+
29
+ export default CleanCommand
@@ -1,61 +1,61 @@
1
- import { Command /* , flags */ } from "@oclif/command"
2
- // import fetch from 'node-fetch'
3
- import { clone } from "../managers/file"
4
- import Console from "../utils/console"
5
- import api from "../utils/api"
6
- import { askPackage } from "../ui/download"
7
- // const BaseCommand = require('../utils/BaseCommand');
8
-
9
- class DownloadCommand extends Command {
10
- static description = `Describe the command here
11
- ...
12
- Extra documentation goes here
13
- `
14
- static flags: any = {
15
- // name: flags.string({char: 'n', description: 'name to print'}),
16
- }
17
-
18
- static args = [
19
- {
20
- name: "package", // name of arg to show in help and reference with args[name]
21
- required: false, // make the arg required with `required: true`
22
- description:
23
- "The unique string that identifies this package on learnpack", // help description
24
- hidden: false, // hide this arg from help
25
- },
26
- ]
27
- // async init() {
28
- // const {flags} = this.parse(DownloadCommand)
29
- // await this.initSession(flags)
30
- // }
31
-
32
- async run() {
33
- const { /* flags, */ args } = this.parse(DownloadCommand)
34
- // start watching for file changes
35
- let _package: string = args.package
36
- if (!_package) {
37
- _package = (await askPackage()) as string
38
- }
39
-
40
- if (!_package) {
41
- return null
42
- }
43
-
44
- try {
45
- const packageInfo = await api.getAllPackages({ slug: _package })
46
- if (packageInfo.results.length === 0)
47
- Console.error(`Package ${_package} not found`)
48
- else
49
- clone(packageInfo.results[0].repository)
50
- .then(_result => {
51
- Console.success("Successfully downloaded")
52
- Console.info(
53
- `You can now CD into the folder like this: $ cd ${_package}`
54
- )
55
- })
56
- .catch(error => Console.error(error.message || error))
57
- } catch {}
58
- }
59
- }
60
-
61
- export default DownloadCommand
1
+ import { Command /* , flags */ } from "@oclif/command"
2
+ // import fetch from 'node-fetch'
3
+ import { clone } from "../managers/file"
4
+ import Console from "../utils/console"
5
+ import api from "../utils/api"
6
+ import { askPackage } from "../ui/download"
7
+ // const BaseCommand = require('../utils/BaseCommand');
8
+
9
+ class DownloadCommand extends Command {
10
+ static description = `Describe the command here
11
+ ...
12
+ Extra documentation goes here
13
+ `
14
+ static flags: any = {
15
+ // name: flags.string({char: 'n', description: 'name to print'}),
16
+ }
17
+
18
+ static args = [
19
+ {
20
+ name: "package", // name of arg to show in help and reference with args[name]
21
+ required: false, // make the arg required with `required: true`
22
+ description:
23
+ "The unique string that identifies this package on learnpack", // help description
24
+ hidden: false, // hide this arg from help
25
+ },
26
+ ]
27
+ // async init() {
28
+ // const {flags} = this.parse(DownloadCommand)
29
+ // await this.initSession(flags)
30
+ // }
31
+
32
+ async run() {
33
+ const { /* flags, */ args } = this.parse(DownloadCommand)
34
+ // start watching for file changes
35
+ let _package: string = args.package
36
+ if (!_package) {
37
+ _package = (await askPackage()) as string
38
+ }
39
+
40
+ if (!_package) {
41
+ return null
42
+ }
43
+
44
+ try {
45
+ const packageInfo = await api.getAllPackages({ slug: _package })
46
+ if (packageInfo.results.length === 0)
47
+ Console.error(`Package ${_package} not found`)
48
+ else
49
+ clone(packageInfo.results[0].repository)
50
+ .then(_result => {
51
+ Console.success("Successfully downloaded")
52
+ Console.info(
53
+ `You can now CD into the folder like this: $ cd ${_package}`
54
+ )
55
+ })
56
+ .catch(error => Console.error(error.message || error))
57
+ } catch {}
58
+ }
59
+ }
60
+
61
+ export default DownloadCommand
@@ -1,170 +1,170 @@
1
- import { flags } from "@oclif/command"
2
- import BaseCommand from "../utils/BaseCommand"
3
-
4
- // eslint-disable-next-line
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"
9
-
10
- import Console from "../utils/console"
11
- import { ValidationError } from "../utils/errors"
12
-
13
- import * as path from "path"
14
-
15
- class InitComand extends BaseCommand {
16
- static description =
17
- "Create a new learning package: Book, Tutorial or Exercise"
18
-
19
- static flags = {
20
- ...BaseCommand.flags,
21
- grading: flags.help({ char: "h" }),
22
- }
23
-
24
- async run() {
25
- const { flags } = this.parse(InitComand)
26
-
27
- // if the folder/file .learn or .breathecode aleady exists
28
- await alreadyInitialized()
29
-
30
- const choices = await prompts([
31
- {
32
- type: "select",
33
- name: "grading",
34
- message: "Is the auto-grading going to be isolated or incremental?",
35
- choices: [
36
- {
37
- title: "Incremental: Build on top of each other like a tutorial",
38
- value: "incremental",
39
- },
40
- { title: "Isolated: Small separated exercises", value: "isolated" },
41
- {
42
- title: "No grading: No feedback or testing whatsoever",
43
- value: null,
44
- },
45
- ],
46
- },
47
- {
48
- type: "text",
49
- name: "title",
50
- initial: "My Interactive Tutorial",
51
- message: "Title for your tutorial? Press enter to leave as it is",
52
- },
53
- {
54
- type: "text",
55
- name: "description",
56
- initial: "",
57
- message: "Description for your tutorial? Press enter to leave blank",
58
- },
59
- {
60
- type: "select",
61
- name: "difficulty",
62
- message: "How difficulty will be to complete the tutorial?",
63
- choices: [
64
- { title: "Begginer (no previous experience)", value: "beginner" },
65
- { title: "Easy (just a bit of experience required)", value: "easy" },
66
- {
67
- title: "Intermediate (you need experience)",
68
- value: "intermediate",
69
- },
70
- { title: "Hard (master the topic)", value: "hard" },
71
- ],
72
- },
73
- {
74
- type: "text",
75
- name: "duration",
76
- initial: "1",
77
- message: "How many hours avg it takes to complete (number)?",
78
- validate: (value: string) => {
79
- const n = Math.floor(Number(value))
80
- return (
81
- n !== Number.POSITIVE_INFINITY && String(n) === value && n >= 0
82
- )
83
- },
84
- },
85
- ])
86
-
87
- const packageInfo = {
88
- grading: choices.grading,
89
- difficulty: choices.difficulty,
90
- duration: parseInt(choices.duration),
91
- description: choices.description,
92
- title: choices.title,
93
- slug: choices.title
94
- .toLowerCase()
95
- .replace(/ /g, "-")
96
- .replace(/[^\w-]+/g, ""),
97
- }
98
-
99
- cli.action.start("Initializing package")
100
-
101
- const languages = ["en", "es"]
102
-
103
- const templatesDir = path.resolve(
104
- __dirname,
105
- "../../src/utils/templates/" + choices.grading || "no-grading"
106
- )
107
- if (!fs.existsSync(templatesDir))
108
- throw ValidationError(`Template ${templatesDir} does not exists`)
109
- await fs.copySync(templatesDir, "./")
110
-
111
- // Creating README files
112
- // eslint-disable-next-line
113
- languages.forEach((language) => {
114
- const readmeFilename = `README${language !== "en" ? `.${language}` : ""}`
115
- fs.writeFileSync(
116
- `./${readmeFilename}.md`,
117
- eta.render(
118
- fs.readFileSync(
119
- path.resolve(__dirname, `${templatesDir}/${readmeFilename}.ejs`),
120
- "utf-8"
121
- ),
122
- packageInfo
123
- )
124
- )
125
- if (fs.existsSync(`./${readmeFilename}.ejs`))
126
- fs.removeSync(`./${readmeFilename}.ejs`)
127
- })
128
-
129
- if (!fs.existsSync("./.gitignore"))
130
- fs.copyFile(
131
- path.resolve(__dirname, "../../src/utils/templates/gitignore.txt"),
132
- "./.gitignore"
133
- )
134
- fs.writeFileSync("./learn.json", JSON.stringify(packageInfo, null, 2))
135
-
136
- cli.action.stop()
137
- Console.success(`😋 Package initialized successfully`)
138
- Console.help(
139
- `Start the exercises by running the following command on your terminal: $ learnpack start`
140
- )
141
- }
142
- }
143
-
144
- const alreadyInitialized = () =>
145
- new Promise((resolve, reject) => {
146
- fs.readdir("./", function (err: any, files: any) {
147
- files = files.filter((f: any) =>
148
- [".learn", "learn.json", "bc.json", ".breathecode"].includes(f)
149
- )
150
- if (err) {
151
- reject(ValidationError(err.message))
152
- throw ValidationError(err.message)
153
- } else if (files.length > 0) {
154
- reject(
155
- ValidationError(
156
- "It seems the package is already initialized because we've found the following files: " +
157
- files.join(",")
158
- )
159
- )
160
- throw ValidationError(
161
- "It seems the package is already initialized because we've found the following files: " +
162
- files.join(",")
163
- )
164
- }
165
-
166
- resolve(false)
167
- })
168
- })
169
-
170
- export default InitComand
1
+ import { flags } from "@oclif/command"
2
+ import BaseCommand from "../utils/BaseCommand"
3
+
4
+ // eslint-disable-next-line
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"
9
+
10
+ import Console from "../utils/console"
11
+ import { ValidationError } from "../utils/errors"
12
+
13
+ import * as path from "path"
14
+
15
+ class InitComand extends BaseCommand {
16
+ static description =
17
+ "Create a new learning package: Book, Tutorial or Exercise"
18
+
19
+ static flags = {
20
+ ...BaseCommand.flags,
21
+ grading: flags.help({ char: "h" }),
22
+ }
23
+
24
+ async run() {
25
+ const { flags } = this.parse(InitComand)
26
+
27
+ // if the folder/file .learn or .breathecode aleady exists
28
+ await alreadyInitialized()
29
+
30
+ const choices = await prompts([
31
+ {
32
+ type: "select",
33
+ name: "grading",
34
+ message: "Is the auto-grading going to be isolated or incremental?",
35
+ choices: [
36
+ {
37
+ title: "Incremental: Build on top of each other like a tutorial",
38
+ value: "incremental",
39
+ },
40
+ { title: "Isolated: Small separated exercises", value: "isolated" },
41
+ {
42
+ title: "No grading: No feedback or testing whatsoever",
43
+ value: null,
44
+ },
45
+ ],
46
+ },
47
+ {
48
+ type: "text",
49
+ name: "title",
50
+ initial: "My Interactive Tutorial",
51
+ message: "Title for your tutorial? Press enter to leave as it is",
52
+ },
53
+ {
54
+ type: "text",
55
+ name: "description",
56
+ initial: "",
57
+ message: "Description for your tutorial? Press enter to leave blank",
58
+ },
59
+ {
60
+ type: "select",
61
+ name: "difficulty",
62
+ message: "How difficulty will be to complete the tutorial?",
63
+ choices: [
64
+ { title: "Begginer (no previous experience)", value: "beginner" },
65
+ { title: "Easy (just a bit of experience required)", value: "easy" },
66
+ {
67
+ title: "Intermediate (you need experience)",
68
+ value: "intermediate",
69
+ },
70
+ { title: "Hard (master the topic)", value: "hard" },
71
+ ],
72
+ },
73
+ {
74
+ type: "text",
75
+ name: "duration",
76
+ initial: "1",
77
+ message: "How many hours avg it takes to complete (number)?",
78
+ validate: (value: string) => {
79
+ const n = Math.floor(Number(value))
80
+ return (
81
+ n !== Number.POSITIVE_INFINITY && String(n) === value && n >= 0
82
+ )
83
+ },
84
+ },
85
+ ])
86
+
87
+ const packageInfo = {
88
+ grading: choices.grading,
89
+ difficulty: choices.difficulty,
90
+ duration: parseInt(choices.duration),
91
+ description: choices.description,
92
+ title: choices.title,
93
+ slug: choices.title
94
+ .toLowerCase()
95
+ .replace(/ /g, "-")
96
+ .replace(/[^\w-]+/g, ""),
97
+ }
98
+
99
+ cli.action.start("Initializing package")
100
+
101
+ const languages = ["en", "es"]
102
+
103
+ const templatesDir = path.resolve(
104
+ __dirname,
105
+ "../../src/utils/templates/" + choices.grading || "no-grading"
106
+ )
107
+ if (!fs.existsSync(templatesDir))
108
+ throw ValidationError(`Template ${templatesDir} does not exists`)
109
+ await fs.copySync(templatesDir, "./")
110
+
111
+ // Creating README files
112
+ // eslint-disable-next-line
113
+ languages.forEach((language) => {
114
+ const readmeFilename = `README${language !== "en" ? `.${language}` : ""}`
115
+ fs.writeFileSync(
116
+ `./${readmeFilename}.md`,
117
+ eta.render(
118
+ fs.readFileSync(
119
+ path.resolve(__dirname, `${templatesDir}/${readmeFilename}.ejs`),
120
+ "utf-8"
121
+ ),
122
+ packageInfo
123
+ )
124
+ )
125
+ if (fs.existsSync(`./${readmeFilename}.ejs`))
126
+ fs.removeSync(`./${readmeFilename}.ejs`)
127
+ })
128
+
129
+ if (!fs.existsSync("./.gitignore"))
130
+ fs.copyFile(
131
+ path.resolve(__dirname, "../../src/utils/templates/gitignore.txt"),
132
+ "./.gitignore"
133
+ )
134
+ fs.writeFileSync("./learn.json", JSON.stringify(packageInfo, null, 2))
135
+
136
+ cli.action.stop()
137
+ Console.success(`😋 Package initialized successfully`)
138
+ Console.help(
139
+ `Start the exercises by running the following command on your terminal: $ learnpack start`
140
+ )
141
+ }
142
+ }
143
+
144
+ const alreadyInitialized = () =>
145
+ new Promise((resolve, reject) => {
146
+ fs.readdir("./", function (err: any, files: any) {
147
+ files = files.filter((f: any) =>
148
+ [".learn", "learn.json", "bc.json", ".breathecode"].includes(f)
149
+ )
150
+ if (err) {
151
+ reject(ValidationError(err.message))
152
+ throw ValidationError(err.message)
153
+ } else if (files.length > 0) {
154
+ reject(
155
+ ValidationError(
156
+ "It seems the package is already initialized because we've found the following files: " +
157
+ files.join(",")
158
+ )
159
+ )
160
+ throw ValidationError(
161
+ "It seems the package is already initialized because we've found the following files: " +
162
+ files.join(",")
163
+ )
164
+ }
165
+
166
+ resolve(false)
167
+ })
168
+ })
169
+
170
+ export default InitComand
@@ -1,42 +1,42 @@
1
- import SessionCommand from "../utils/SessionCommand"
2
- import SessionManager from "../managers/session"
3
- import Console from "../utils/console"
4
-
5
- class LoginCommand extends SessionCommand {
6
- static description = `Describe the command here
7
- ...
8
- Extra documentation goes here
9
- `
10
-
11
- static flags: any = {
12
- // name: flags.string({char: 'n', description: 'name to print'}),
13
- }
14
-
15
- static args = [
16
- {
17
- name: "package", // name of arg to show in help and reference with args[name]
18
- required: false, // make the arg required with `required: true`
19
- description:
20
- "The unique string that identifies this package on learnpack", // help description
21
- hidden: false, // hide this arg from help
22
- },
23
- ]
24
-
25
- async init() {
26
- const { flags } = this.parse(LoginCommand)
27
- await this.initSession(flags)
28
- }
29
-
30
- async run() {
31
- /* const {flags, args} = */ this.parse(LoginCommand)
32
-
33
- try {
34
- await SessionManager.login()
35
- } catch (error) {
36
- Console.error("Error trying to authenticate")
37
- Console.error((error as TypeError).message || (error as string))
38
- }
39
- }
40
- }
41
-
42
- export default LoginCommand
1
+ import SessionCommand from "../utils/SessionCommand"
2
+ import SessionManager from "../managers/session"
3
+ import Console from "../utils/console"
4
+
5
+ class LoginCommand extends SessionCommand {
6
+ static description = `Describe the command here
7
+ ...
8
+ Extra documentation goes here
9
+ `
10
+
11
+ static flags: any = {
12
+ // name: flags.string({char: 'n', description: 'name to print'}),
13
+ }
14
+
15
+ static args = [
16
+ {
17
+ name: "package", // name of arg to show in help and reference with args[name]
18
+ required: false, // make the arg required with `required: true`
19
+ description:
20
+ "The unique string that identifies this package on learnpack", // help description
21
+ hidden: false, // hide this arg from help
22
+ },
23
+ ]
24
+
25
+ async init() {
26
+ const { flags } = this.parse(LoginCommand)
27
+ await this.initSession(flags)
28
+ }
29
+
30
+ async run() {
31
+ /* const {flags, args} = */ this.parse(LoginCommand)
32
+
33
+ try {
34
+ await SessionManager.login()
35
+ } catch (error) {
36
+ Console.error("Error trying to authenticate")
37
+ Console.error((error as TypeError).message || (error as string))
38
+ }
39
+ }
40
+ }
41
+
42
+ export default LoginCommand