@learnpack/learnpack 2.1.39 → 2.1.40

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 (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