@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,196 +1,196 @@
1
- import * as fs from "fs"
2
- import * as p from "path"
3
- import * as shell from "shelljs"
4
- import { cli } from "cli-ux"
5
- import * as targz from "targz"
6
- import Console from "../utils/console"
7
- import * as https from "https"
8
- import { InternalError } from "../utils/errors"
9
-
10
- // eslint-disable-next-line
11
- const fetch = require("node-fetch");
12
-
13
- export const decompress = (sourcePath: string, destinationPath: string) =>
14
- new Promise((resolve, reject) => {
15
- Console.debug("Decompressing " + sourcePath)
16
- targz.decompress(
17
- {
18
- src: sourcePath,
19
- dest: destinationPath,
20
- },
21
- function (err: string | Error | null) {
22
- if (err) {
23
- Console.error("Error when trying to decompress")
24
- reject(err)
25
- } else {
26
- Console.info("Decompression finished successfully")
27
- resolve(/* */ "")
28
- }
29
- }
30
- )
31
- })
32
-
33
- export const downloadEditor = async (
34
- version: string | undefined,
35
- destination: string
36
- ) => {
37
- // https://raw.githubusercontent.com/learnpack/coding-ide/master/dist/app.tar.gz
38
- // if(versions[version] === undefined) throw new Error(`Invalid editor version ${version}`)
39
-
40
- if (!version) {
41
- const res = await fetch(
42
- "https://raw.githubusercontent.com/learnpack/ide/master/package.json"
43
- )
44
- const json = await res.json()
45
- version = json.version
46
-
47
- if (!version)
48
- throw InternalError(
49
- `Coding Editor version was not found on learnpack repository, check the config.editor.version property on learn.json`
50
- )
51
- }
52
-
53
- const versionNumber = parseInt(version.split(".")[0])
54
-
55
- let url = `https://github.com/learnpack/coding-ide/blob/${version}/dist`
56
-
57
- if (versionNumber > 2)
58
- url = `https://github.com/learnpack/ide/blob/master/bin/learnpack-${version}.tar.gz`
59
-
60
- const resp2 = await fetch(url, { method: "HEAD" })
61
- if (!resp2.ok)
62
- throw InternalError(
63
- `Coding Editor ${version} was not found on learnpack repository, check the config.editor.version property on learn.json`
64
- )
65
-
66
- Console.info(
67
- "Downloading the LearnPack coding UI, this may take a minute..."
68
- )
69
-
70
- url += versionNumber > 2 ? `?raw=true` : `/app.tar.gz?raw=true`
71
-
72
- return download(url, destination)
73
- }
74
-
75
- export const download = (url: string, dest: string) => {
76
- Console.debug("Downloading " + url)
77
- return new Promise((resolve, reject) => {
78
- const request = https.get(url, response => {
79
- if (response.statusCode === 200) {
80
- const file = fs.createWriteStream(dest, { flags: "wx" })
81
- file.on("finish", () => {
82
- resolve(true)
83
- })
84
- file.on("error", err => {
85
- file.close()
86
- if (err.code === "EEXIST") {
87
- Console.debug("File already exists")
88
- resolve("File already exists")
89
- } else {
90
- Console.debug("Error ", err.message)
91
- fs.unlink(dest, () => reject(err.message)) // Delete temp file
92
- }
93
- })
94
- response.pipe(file)
95
- } else if (response.statusCode === 302 || response.statusCode === 301) {
96
- // Console.debug("Servers redirected to "+response.headers.location)
97
- // Recursively follow redirects, only a 200 will resolve.
98
- if (response.headers.location) {
99
- download(response.headers.location, dest)
100
- .then(() => resolve(/* */ ""))
101
- .catch(error => {
102
- Console.error(error)
103
- reject(error)
104
- })
105
- }
106
- } else {
107
- Console.debug(
108
- `Server responded with ${response.statusCode}: ${response.statusMessage}`
109
- )
110
- reject(
111
- `Server responded with ${response.statusCode}: ${response.statusMessage}`
112
- )
113
- }
114
- })
115
-
116
- request.on("error", err => {
117
- reject(err.message)
118
- })
119
- })
120
- }
121
-
122
- export const clone = (repository = "", folder = "./") =>
123
- new Promise((resolve, reject) => {
124
- if (!repository) {
125
- reject("Missing repository url for this package")
126
- // return false
127
- }
128
-
129
- cli.action.start("Verifying GIT...")
130
- if (!shell.which("git")) {
131
- reject("Sorry, this script requires git")
132
- // return false
133
- }
134
-
135
- cli.action.stop()
136
-
137
- let fileName = p.basename(repository)
138
- if (!fileName) {
139
- reject("Invalid repository information on package: " + repository)
140
- // return false
141
- }
142
-
143
- fileName = fileName.split(".")[0]
144
- if (fs.existsSync("./" + fileName)) {
145
- reject(
146
- `Directory ${fileName} already exists; Did you download this package already?`
147
- )
148
- // return false
149
- }
150
-
151
- cli.action.start(`Cloning repository ${repository}...`)
152
- if (shell.exec(`git clone ${repository}`).code !== 0) {
153
- reject("Error: Installation failed")
154
- }
155
-
156
- cli.action.stop()
157
-
158
- cli.action.start("Cleaning installation...")
159
- if (shell.exec(`rm -R -f ${folder}${fileName}/.git`).code !== 0) {
160
- reject("Error: removing .git directory")
161
- }
162
-
163
- cli.action.stop()
164
-
165
- resolve("Done")
166
- })
167
-
168
- export const rmSync = function (path: string) {
169
- let files = []
170
- if (fs.existsSync(path)) {
171
- files = fs.readdirSync(path)
172
- for (const [, file] of files.entries()) {
173
- const curPath = path + "/" + file
174
- if (fs.lstatSync(curPath).isDirectory()) {
175
- // recurse
176
- rmSync(curPath)
177
- } else {
178
- // delete file
179
- fs.unlinkSync(curPath)
180
- }
181
- }
182
-
183
- fs.rmdirSync(path)
184
- }
185
- }
186
-
187
- export const checkIfDirectoryExists = (path: string) => {
188
- const fs = require("fs")
189
- if (fs.existsSync(path)) {
190
- return true
191
- }
192
-
193
- return false
194
- }
195
-
196
- export default { download, decompress, downloadEditor, clone, rmSync }
1
+ import * as fs from "fs"
2
+ import * as p from "path"
3
+ import * as shell from "shelljs"
4
+ import { cli } from "cli-ux"
5
+ import * as targz from "targz"
6
+ import Console from "../utils/console"
7
+ import * as https from "https"
8
+ import { InternalError } from "../utils/errors"
9
+
10
+ // eslint-disable-next-line
11
+ const fetch = require("node-fetch");
12
+
13
+ export const decompress = (sourcePath: string, destinationPath: string) =>
14
+ new Promise((resolve, reject) => {
15
+ Console.debug("Decompressing " + sourcePath)
16
+ targz.decompress(
17
+ {
18
+ src: sourcePath,
19
+ dest: destinationPath,
20
+ },
21
+ function (err: string | Error | null) {
22
+ if (err) {
23
+ Console.error("Error when trying to decompress")
24
+ reject(err)
25
+ } else {
26
+ Console.info("Decompression finished successfully")
27
+ resolve(/* */ "")
28
+ }
29
+ }
30
+ )
31
+ })
32
+
33
+ export const downloadEditor = async (
34
+ version: string | undefined,
35
+ destination: string
36
+ ) => {
37
+ // https://raw.githubusercontent.com/learnpack/coding-ide/master/dist/app.tar.gz
38
+ // if(versions[version] === undefined) throw new Error(`Invalid editor version ${version}`)
39
+
40
+ if (!version) {
41
+ const res = await fetch(
42
+ "https://raw.githubusercontent.com/learnpack/ide/master/package.json"
43
+ )
44
+ const json = await res.json()
45
+ version = json.version
46
+
47
+ if (!version)
48
+ throw InternalError(
49
+ `Coding Editor version was not found on learnpack repository, check the config.editor.version property on learn.json`
50
+ )
51
+ }
52
+
53
+ const versionNumber = parseInt(version.split(".")[0])
54
+
55
+ let url = `https://github.com/learnpack/coding-ide/blob/${version}/dist`
56
+
57
+ if (versionNumber > 2)
58
+ url = `https://github.com/learnpack/ide/blob/master/bin/learnpack-${version}.tar.gz`
59
+
60
+ const resp2 = await fetch(url, { method: "HEAD" })
61
+ if (!resp2.ok)
62
+ throw InternalError(
63
+ `Coding Editor ${version} was not found on learnpack repository, check the config.editor.version property on learn.json`
64
+ )
65
+
66
+ Console.info(
67
+ "Downloading the LearnPack coding UI, this may take a minute..."
68
+ )
69
+
70
+ url += versionNumber > 2 ? `?raw=true` : `/app.tar.gz?raw=true`
71
+
72
+ return download(url, destination)
73
+ }
74
+
75
+ export const download = (url: string, dest: string) => {
76
+ Console.debug("Downloading " + url)
77
+ return new Promise((resolve, reject) => {
78
+ const request = https.get(url, response => {
79
+ if (response.statusCode === 200) {
80
+ const file = fs.createWriteStream(dest, { flags: "wx" })
81
+ file.on("finish", () => {
82
+ resolve(true)
83
+ })
84
+ file.on("error", err => {
85
+ file.close()
86
+ if (err.code === "EEXIST") {
87
+ Console.debug("File already exists")
88
+ resolve("File already exists")
89
+ } else {
90
+ Console.debug("Error ", err.message)
91
+ fs.unlink(dest, () => reject(err.message)) // Delete temp file
92
+ }
93
+ })
94
+ response.pipe(file)
95
+ } else if (response.statusCode === 302 || response.statusCode === 301) {
96
+ // Console.debug("Servers redirected to "+response.headers.location)
97
+ // Recursively follow redirects, only a 200 will resolve.
98
+ if (response.headers.location) {
99
+ download(response.headers.location, dest)
100
+ .then(() => resolve(/* */ ""))
101
+ .catch(error => {
102
+ Console.error(error)
103
+ reject(error)
104
+ })
105
+ }
106
+ } else {
107
+ Console.debug(
108
+ `Server responded with ${response.statusCode}: ${response.statusMessage}`
109
+ )
110
+ reject(
111
+ `Server responded with ${response.statusCode}: ${response.statusMessage}`
112
+ )
113
+ }
114
+ })
115
+
116
+ request.on("error", err => {
117
+ reject(err.message)
118
+ })
119
+ })
120
+ }
121
+
122
+ export const clone = (repository = "", folder = "./") =>
123
+ new Promise((resolve, reject) => {
124
+ if (!repository) {
125
+ reject("Missing repository url for this package")
126
+ // return false
127
+ }
128
+
129
+ cli.action.start("Verifying GIT...")
130
+ if (!shell.which("git")) {
131
+ reject("Sorry, this script requires git")
132
+ // return false
133
+ }
134
+
135
+ cli.action.stop()
136
+
137
+ let fileName = p.basename(repository)
138
+ if (!fileName) {
139
+ reject("Invalid repository information on package: " + repository)
140
+ // return false
141
+ }
142
+
143
+ fileName = fileName.split(".")[0]
144
+ if (fs.existsSync("./" + fileName)) {
145
+ reject(
146
+ `Directory ${fileName} already exists; Did you download this package already?`
147
+ )
148
+ // return false
149
+ }
150
+
151
+ cli.action.start(`Cloning repository ${repository}...`)
152
+ if (shell.exec(`git clone ${repository}`).code !== 0) {
153
+ reject("Error: Installation failed")
154
+ }
155
+
156
+ cli.action.stop()
157
+
158
+ cli.action.start("Cleaning installation...")
159
+ if (shell.exec(`rm -R -f ${folder}${fileName}/.git`).code !== 0) {
160
+ reject("Error: removing .git directory")
161
+ }
162
+
163
+ cli.action.stop()
164
+
165
+ resolve("Done")
166
+ })
167
+
168
+ export const rmSync = function (path: string) {
169
+ let files = []
170
+ if (fs.existsSync(path)) {
171
+ files = fs.readdirSync(path)
172
+ for (const [, file] of files.entries()) {
173
+ const curPath = path + "/" + file
174
+ if (fs.lstatSync(curPath).isDirectory()) {
175
+ // recurse
176
+ rmSync(curPath)
177
+ } else {
178
+ // delete file
179
+ fs.unlinkSync(curPath)
180
+ }
181
+ }
182
+
183
+ fs.rmdirSync(path)
184
+ }
185
+ }
186
+
187
+ export const checkIfDirectoryExists = (path: string) => {
188
+ const fs = require("fs")
189
+ if (fs.existsSync(path)) {
190
+ return true
191
+ }
192
+
193
+ return false
194
+ }
195
+
196
+ export default { download, decompress, downloadEditor, clone, rmSync }
@@ -1,84 +1,84 @@
1
- import Console from '../utils/console'
2
- import * as shell from 'shelljs'
3
- import socket from './socket'
4
- import * as fs from 'fs'
5
-
6
- import {TFile, IGitpod} from '../models/gitpod-data'
7
- import {IConfigObj} from '../models/config'
8
-
9
- const Gitpod: IGitpod = {
10
- socket: null,
11
- config: null,
12
- initialized: false,
13
- hasGPCommand: false,
14
- init: function (config?: IConfigObj) {
15
- if (this.initialized) {
16
- return
17
- }
18
-
19
- this.initialized = true
20
-
21
- if (config) {
22
- this.config = config
23
- }
24
-
25
- if (shell.exec('gp -h', {silent: true}).code === 0) {
26
- this.hasGPCommand = true
27
- if (config) {
28
- config.address = shell
29
- .exec('gp url', {silent: true})
30
- .stdout.replace(/(\r\n|\n|\r)/gm, '')
31
- }
32
- } else {
33
- Console.debug('Gitpod command line tool not found')
34
- }
35
- },
36
- openFiles: async function (files: Array<TFile>) {
37
- Console.debug('Attempting to open files in gitpod mode', files)
38
- this.init() // initilize gitpod config
39
-
40
- // gitpod will open files only on isolated mode
41
- if (!this.config || this.config.config?.grading !== 'isolated') {
42
- Console.debug(
43
- 'Files cannot be automatically opened because we are not on isolated grading (only for isolated)',
44
- )
45
- socket.log('ready', ['Ready to compile or test...'])
46
- return true
47
- }
48
-
49
- if (this.hasGPCommand)
50
- for (const f of files.reverse()) {
51
- if (shell.exec(`gp open ${f}`).code > 0) {
52
- Console.debug(`Error opening file ${f} on gitpod`)
53
- }
54
- }
55
-
56
- socket.log('ready', ['Ready to compile or test...'])
57
- },
58
- setup(config?: IConfigObj) {
59
- this.init(config) // initilize gitpod config
60
- this.autosave('on')
61
- },
62
- autosave: async function (value = 'on') {
63
- this.init() // initilize gitpod config
64
-
65
- if (this.hasGPCommand) {
66
- if (!fs.existsSync('./.theia'))
67
- fs.mkdirSync('./.theia')
68
- if (!fs.existsSync('./.theia/settings.json')) {
69
- fs.writeFileSync(
70
- './.theia/settings.json',
71
- JSON.stringify(
72
- {
73
- 'editor.autoSave': value,
74
- },
75
- null,
76
- 4,
77
- ),
78
- )
79
- }
80
- }
81
- },
82
- }
83
-
84
- export default Gitpod
1
+ import Console from '../utils/console'
2
+ import * as shell from 'shelljs'
3
+ import socket from './socket'
4
+ import * as fs from 'fs'
5
+
6
+ import {TFile, IGitpod} from '../models/gitpod-data'
7
+ import {IConfigObj} from '../models/config'
8
+
9
+ const Gitpod: IGitpod = {
10
+ socket: null,
11
+ config: null,
12
+ initialized: false,
13
+ hasGPCommand: false,
14
+ init: function (config?: IConfigObj) {
15
+ if (this.initialized) {
16
+ return
17
+ }
18
+
19
+ this.initialized = true
20
+
21
+ if (config) {
22
+ this.config = config
23
+ }
24
+
25
+ if (shell.exec('gp -h', {silent: true}).code === 0) {
26
+ this.hasGPCommand = true
27
+ if (config) {
28
+ config.address = shell
29
+ .exec('gp url', {silent: true})
30
+ .stdout.replace(/(\r\n|\n|\r)/gm, '')
31
+ }
32
+ } else {
33
+ Console.debug('Gitpod command line tool not found')
34
+ }
35
+ },
36
+ openFiles: async function (files: Array<TFile>) {
37
+ Console.debug('Attempting to open files in gitpod mode', files)
38
+ this.init() // initilize gitpod config
39
+
40
+ // gitpod will open files only on isolated mode
41
+ if (!this.config || this.config.config?.grading !== 'isolated') {
42
+ Console.debug(
43
+ 'Files cannot be automatically opened because we are not on isolated grading (only for isolated)',
44
+ )
45
+ socket.log('ready', ['Ready to compile or test...'])
46
+ return true
47
+ }
48
+
49
+ if (this.hasGPCommand)
50
+ for (const f of files.reverse()) {
51
+ if (shell.exec(`gp open ${f}`).code > 0) {
52
+ Console.debug(`Error opening file ${f} on gitpod`)
53
+ }
54
+ }
55
+
56
+ socket.log('ready', ['Ready to compile or test...'])
57
+ },
58
+ setup(config?: IConfigObj) {
59
+ this.init(config) // initilize gitpod config
60
+ this.autosave('on')
61
+ },
62
+ autosave: async function (value = 'on') {
63
+ this.init() // initilize gitpod config
64
+
65
+ if (this.hasGPCommand) {
66
+ if (!fs.existsSync('./.theia'))
67
+ fs.mkdirSync('./.theia')
68
+ if (!fs.existsSync('./.theia/settings.json')) {
69
+ fs.writeFileSync(
70
+ './.theia/settings.json',
71
+ JSON.stringify(
72
+ {
73
+ 'editor.autoSave': value,
74
+ },
75
+ null,
76
+ 4,
77
+ ),
78
+ )
79
+ }
80
+ }
81
+ },
82
+ }
83
+
84
+ export default Gitpod