@learnpack/learnpack 2.1.24 → 2.1.26

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. package/README.md +16 -16
  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 -317
  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 +165 -165
  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 +39 -37
  27. package/lib/managers/config/defaults.js +40 -38
  28. package/lib/managers/config/exercise.d.ts +36 -36
  29. package/lib/managers/config/exercise.js +233 -230
  30. package/lib/managers/config/index.d.ts +3 -3
  31. package/lib/managers/config/index.js +320 -302
  32. package/lib/managers/file.d.ts +13 -13
  33. package/lib/managers/file.js +134 -134
  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 -51
  38. package/lib/managers/server/routes.d.ts +4 -4
  39. package/lib/managers/server/routes.js +167 -167
  40. package/lib/managers/session.d.ts +3 -3
  41. package/lib/managers/session.js +104 -104
  42. package/lib/managers/socket.d.ts +3 -3
  43. package/lib/managers/socket.js +164 -164
  44. package/lib/managers/test.js +84 -84
  45. package/lib/models/action.d.ts +2 -2
  46. package/lib/models/action.js +2 -2
  47. package/lib/models/audit.d.ts +15 -15
  48. package/lib/models/audit.js +2 -2
  49. package/lib/models/config-manager.d.ts +21 -21
  50. package/lib/models/config-manager.js +2 -2
  51. package/lib/models/config.d.ts +62 -60
  52. package/lib/models/config.js +2 -2
  53. package/lib/models/counter.d.ts +11 -11
  54. package/lib/models/counter.js +2 -2
  55. package/lib/models/errors.d.ts +15 -15
  56. package/lib/models/errors.js +2 -2
  57. package/lib/models/exercise-obj.d.ts +27 -27
  58. package/lib/models/exercise-obj.js +2 -2
  59. package/lib/models/file.d.ts +5 -5
  60. package/lib/models/file.js +2 -2
  61. package/lib/models/findings.d.ts +17 -17
  62. package/lib/models/findings.js +2 -2
  63. package/lib/models/flags.d.ts +10 -10
  64. package/lib/models/flags.js +2 -2
  65. package/lib/models/front-matter.d.ts +11 -11
  66. package/lib/models/front-matter.js +2 -2
  67. package/lib/models/gitpod-data.d.ts +16 -16
  68. package/lib/models/gitpod-data.js +2 -2
  69. package/lib/models/language.d.ts +4 -4
  70. package/lib/models/language.js +2 -2
  71. package/lib/models/package.d.ts +7 -7
  72. package/lib/models/package.js +2 -2
  73. package/lib/models/plugin-config.d.ts +16 -16
  74. package/lib/models/plugin-config.js +2 -2
  75. package/lib/models/session.d.ts +23 -23
  76. package/lib/models/session.js +2 -2
  77. package/lib/models/socket.d.ts +31 -31
  78. package/lib/models/socket.js +2 -2
  79. package/lib/models/status.d.ts +1 -1
  80. package/lib/models/status.js +2 -2
  81. package/lib/models/success-types.d.ts +1 -1
  82. package/lib/models/success-types.js +2 -2
  83. package/lib/plugin/command/compile.d.ts +6 -6
  84. package/lib/plugin/command/compile.js +18 -18
  85. package/lib/plugin/command/test.d.ts +6 -6
  86. package/lib/plugin/command/test.js +25 -25
  87. package/lib/plugin/index.d.ts +27 -27
  88. package/lib/plugin/index.js +7 -7
  89. package/lib/plugin/plugin.d.ts +8 -8
  90. package/lib/plugin/plugin.js +68 -68
  91. package/lib/plugin/utils.d.ts +16 -16
  92. package/lib/plugin/utils.js +58 -58
  93. package/lib/ui/download.d.ts +5 -5
  94. package/lib/ui/download.js +61 -61
  95. package/lib/utils/BaseCommand.d.ts +8 -8
  96. package/lib/utils/BaseCommand.js +41 -41
  97. package/lib/utils/SessionCommand.d.ts +10 -10
  98. package/lib/utils/SessionCommand.js +47 -47
  99. package/lib/utils/api.d.ts +12 -12
  100. package/lib/utils/api.js +173 -173
  101. package/lib/utils/audit.d.ts +16 -16
  102. package/lib/utils/audit.js +302 -302
  103. package/lib/utils/console.d.ts +12 -12
  104. package/lib/utils/console.js +19 -19
  105. package/lib/utils/errors.d.ts +17 -17
  106. package/lib/utils/errors.js +100 -100
  107. package/lib/utils/exercisesQueue.d.ts +9 -9
  108. package/lib/utils/exercisesQueue.js +38 -38
  109. package/lib/utils/fileQueue.d.ts +40 -40
  110. package/lib/utils/fileQueue.js +168 -168
  111. package/lib/utils/misc.d.ts +1 -1
  112. package/lib/utils/misc.js +23 -23
  113. package/lib/utils/validators.d.ts +5 -5
  114. package/lib/utils/validators.js +17 -17
  115. package/lib/utils/watcher.d.ts +2 -2
  116. package/lib/utils/watcher.js +23 -23
  117. package/oclif.manifest.json +1 -1
  118. package/package.json +138 -138
  119. package/src/commands/audit.ts +443 -418
  120. package/src/commands/clean.ts +29 -29
  121. package/src/commands/download.ts +62 -62
  122. package/src/commands/login.ts +42 -42
  123. package/src/commands/logout.ts +43 -43
  124. package/src/commands/publish.ts +107 -107
  125. package/src/commands/start.ts +238 -234
  126. package/src/commands/test.ts +85 -85
  127. package/src/index.ts +1 -1
  128. package/src/managers/config/allowed_files.ts +29 -29
  129. package/src/managers/config/defaults.ts +2 -0
  130. package/src/managers/config/exercise.ts +309 -302
  131. package/src/managers/config/index.ts +22 -1
  132. package/src/managers/file.ts +169 -169
  133. package/src/managers/gitpod.ts +84 -84
  134. package/src/managers/server/index.ts +77 -69
  135. package/src/managers/session.ts +118 -118
  136. package/src/managers/socket.ts +239 -239
  137. package/src/managers/test.ts +83 -83
  138. package/src/models/action.ts +3 -3
  139. package/src/models/config-manager.ts +23 -23
  140. package/src/models/config.ts +2 -0
  141. package/src/models/counter.ts +11 -11
  142. package/src/models/errors.ts +22 -22
  143. package/src/models/file.ts +5 -5
  144. package/src/models/findings.ts +18 -18
  145. package/src/models/flags.ts +10 -10
  146. package/src/models/front-matter.ts +11 -11
  147. package/src/models/gitpod-data.ts +19 -19
  148. package/src/models/language.ts +4 -4
  149. package/src/models/package.ts +7 -7
  150. package/src/models/plugin-config.ts +17 -17
  151. package/src/models/session.ts +26 -26
  152. package/src/models/socket.ts +48 -48
  153. package/src/models/status.ts +15 -15
  154. package/src/models/success-types.ts +1 -1
  155. package/src/plugin/command/compile.ts +17 -17
  156. package/src/plugin/command/test.ts +30 -30
  157. package/src/plugin/index.ts +6 -6
  158. package/src/plugin/plugin.ts +94 -94
  159. package/src/plugin/utils.ts +87 -87
  160. package/src/types/node-fetch.d.ts +1 -1
  161. package/src/ui/download.ts +71 -71
  162. package/src/utils/BaseCommand.ts +48 -48
  163. package/src/utils/SessionCommand.ts +48 -48
  164. package/src/utils/api.ts +194 -194
  165. package/src/utils/audit.ts +395 -395
  166. package/src/utils/console.ts +24 -24
  167. package/src/utils/errors.ts +117 -117
  168. package/src/utils/exercisesQueue.ts +51 -51
  169. package/src/utils/fileQueue.ts +198 -198
  170. package/src/utils/misc.ts +23 -23
  171. package/src/utils/templates/gitignore.txt +19 -19
  172. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.es.md +24 -24
  173. package/src/utils/templates/incremental/.learn/exercises/01-hello-world/README.md +24 -24
  174. package/src/utils/templates/incremental/README.ejs +4 -4
  175. package/src/utils/templates/incremental/README.es.ejs +4 -4
  176. package/src/utils/templates/isolated/01-hello-world/README.es.md +26 -26
  177. package/src/utils/templates/isolated/01-hello-world/README.md +26 -26
  178. package/src/utils/templates/isolated/README.ejs +4 -4
  179. package/src/utils/templates/isolated/README.es.ejs +4 -4
  180. package/src/utils/templates/no-grading/README.ejs +4 -4
  181. package/src/utils/templates/no-grading/README.es.ejs +4 -4
  182. package/src/utils/validators.ts +18 -18
@@ -1,169 +1,169 @@
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
- const resp2 = await fetch(
40
- `https://github.com/learnpack/coding-ide/blob/${version}/dist`,
41
- { method: "HEAD" }
42
- );
43
- if (!resp2.ok)
44
- throw InternalError(
45
- `Coding Editor ${version} was not found on learnpack repository, check the config.editor.version property on learn.json`
46
- );
47
-
48
- Console.info(
49
- "Downloading the LearnPack coding UI, this may take a minute..."
50
- );
51
- return download(
52
- `https://github.com/learnpack/coding-ide/blob/${version}/dist/app.tar.gz?raw=true`,
53
- destination
54
- );
55
- };
56
-
57
- export const download = (url: string, dest: string) => {
58
- Console.debug("Downloading " + url);
59
- return new Promise((resolve, reject) => {
60
- const request = https.get(url, response => {
61
- if (response.statusCode === 200) {
62
- const file = fs.createWriteStream(dest, { flags: "wx" });
63
- file.on("finish", () => {
64
- resolve(true);
65
- });
66
- file.on("error", err => {
67
- file.close();
68
- if (err.code === "EEXIST") {
69
- Console.debug("File already exists");
70
- resolve("File already exists");
71
- } else {
72
- Console.debug("Error ", err.message);
73
- fs.unlink(dest, () => reject(err.message)); // Delete temp file
74
- }
75
- });
76
- response.pipe(file);
77
- } else if (response.statusCode === 302 || response.statusCode === 301) {
78
- // Console.debug("Servers redirected to "+response.headers.location)
79
- // Recursively follow redirects, only a 200 will resolve.
80
- if (response.headers.location) {
81
- download(response.headers.location, dest)
82
- .then(() => resolve(/* */ ""))
83
- .catch(error => {
84
- Console.error(error);
85
- reject(error);
86
- });
87
- }
88
- } else {
89
- Console.debug(
90
- `Server responded with ${response.statusCode}: ${response.statusMessage}`
91
- );
92
- reject(
93
- `Server responded with ${response.statusCode}: ${response.statusMessage}`
94
- );
95
- }
96
- });
97
-
98
- request.on("error", err => {
99
- reject(err.message);
100
- });
101
- });
102
- };
103
-
104
- export const clone = (repository = "", folder = "./") =>
105
- new Promise((resolve, reject) => {
106
- if (!repository) {
107
- reject("Missing repository url for this package");
108
- // return false
109
- }
110
-
111
- cli.action.start("Verifying GIT...");
112
- if (!shell.which("git")) {
113
- reject("Sorry, this script requires git");
114
- // return false
115
- }
116
-
117
- cli.action.stop();
118
-
119
- let fileName = p.basename(repository);
120
- if (!fileName) {
121
- reject("Invalid repository information on package: " + repository);
122
- // return false
123
- }
124
-
125
- fileName = fileName.split(".")[0];
126
- if (fs.existsSync("./" + fileName)) {
127
- reject(
128
- `Directory ${fileName} already exists; Did you download this package already?`
129
- );
130
- // return false
131
- }
132
-
133
- cli.action.start(`Cloning repository ${repository}...`);
134
- if (shell.exec(`git clone ${repository}`).code !== 0) {
135
- reject("Error: Installation failed");
136
- }
137
-
138
- cli.action.stop();
139
-
140
- cli.action.start("Cleaning installation...");
141
- if (shell.exec(`rm -R -f ${folder}${fileName}/.git`).code !== 0) {
142
- reject("Error: removing .git directory");
143
- }
144
-
145
- cli.action.stop();
146
-
147
- resolve("Done");
148
- });
149
-
150
- export const rmSync = function (path: string) {
151
- let files = [];
152
- if (fs.existsSync(path)) {
153
- files = fs.readdirSync(path);
154
- for (const [, file] of files.entries()) {
155
- const curPath = path + "/" + file;
156
- if (fs.lstatSync(curPath).isDirectory()) {
157
- // recurse
158
- rmSync(curPath);
159
- } else {
160
- // delete file
161
- fs.unlinkSync(curPath);
162
- }
163
- }
164
-
165
- fs.rmdirSync(path);
166
- }
167
- };
168
-
169
- 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
+ const resp2 = await fetch(
40
+ `https://github.com/learnpack/coding-ide/blob/${version}/dist`,
41
+ { method: "HEAD" }
42
+ );
43
+ if (!resp2.ok)
44
+ throw InternalError(
45
+ `Coding Editor ${version} was not found on learnpack repository, check the config.editor.version property on learn.json`
46
+ );
47
+
48
+ Console.info(
49
+ "Downloading the LearnPack coding UI, this may take a minute..."
50
+ );
51
+ return download(
52
+ `https://github.com/learnpack/coding-ide/blob/${version}/dist/app.tar.gz?raw=true`,
53
+ destination
54
+ );
55
+ };
56
+
57
+ export const download = (url: string, dest: string) => {
58
+ Console.debug("Downloading " + url);
59
+ return new Promise((resolve, reject) => {
60
+ const request = https.get(url, response => {
61
+ if (response.statusCode === 200) {
62
+ const file = fs.createWriteStream(dest, { flags: "wx" });
63
+ file.on("finish", () => {
64
+ resolve(true);
65
+ });
66
+ file.on("error", err => {
67
+ file.close();
68
+ if (err.code === "EEXIST") {
69
+ Console.debug("File already exists");
70
+ resolve("File already exists");
71
+ } else {
72
+ Console.debug("Error ", err.message);
73
+ fs.unlink(dest, () => reject(err.message)); // Delete temp file
74
+ }
75
+ });
76
+ response.pipe(file);
77
+ } else if (response.statusCode === 302 || response.statusCode === 301) {
78
+ // Console.debug("Servers redirected to "+response.headers.location)
79
+ // Recursively follow redirects, only a 200 will resolve.
80
+ if (response.headers.location) {
81
+ download(response.headers.location, dest)
82
+ .then(() => resolve(/* */ ""))
83
+ .catch(error => {
84
+ Console.error(error);
85
+ reject(error);
86
+ });
87
+ }
88
+ } else {
89
+ Console.debug(
90
+ `Server responded with ${response.statusCode}: ${response.statusMessage}`
91
+ );
92
+ reject(
93
+ `Server responded with ${response.statusCode}: ${response.statusMessage}`
94
+ );
95
+ }
96
+ });
97
+
98
+ request.on("error", err => {
99
+ reject(err.message);
100
+ });
101
+ });
102
+ };
103
+
104
+ export const clone = (repository = "", folder = "./") =>
105
+ new Promise((resolve, reject) => {
106
+ if (!repository) {
107
+ reject("Missing repository url for this package");
108
+ // return false
109
+ }
110
+
111
+ cli.action.start("Verifying GIT...");
112
+ if (!shell.which("git")) {
113
+ reject("Sorry, this script requires git");
114
+ // return false
115
+ }
116
+
117
+ cli.action.stop();
118
+
119
+ let fileName = p.basename(repository);
120
+ if (!fileName) {
121
+ reject("Invalid repository information on package: " + repository);
122
+ // return false
123
+ }
124
+
125
+ fileName = fileName.split(".")[0];
126
+ if (fs.existsSync("./" + fileName)) {
127
+ reject(
128
+ `Directory ${fileName} already exists; Did you download this package already?`
129
+ );
130
+ // return false
131
+ }
132
+
133
+ cli.action.start(`Cloning repository ${repository}...`);
134
+ if (shell.exec(`git clone ${repository}`).code !== 0) {
135
+ reject("Error: Installation failed");
136
+ }
137
+
138
+ cli.action.stop();
139
+
140
+ cli.action.start("Cleaning installation...");
141
+ if (shell.exec(`rm -R -f ${folder}${fileName}/.git`).code !== 0) {
142
+ reject("Error: removing .git directory");
143
+ }
144
+
145
+ cli.action.stop();
146
+
147
+ resolve("Done");
148
+ });
149
+
150
+ export const rmSync = function (path: string) {
151
+ let files = [];
152
+ if (fs.existsSync(path)) {
153
+ files = fs.readdirSync(path);
154
+ for (const [, file] of files.entries()) {
155
+ const curPath = path + "/" + file;
156
+ if (fs.lstatSync(curPath).isDirectory()) {
157
+ // recurse
158
+ rmSync(curPath);
159
+ } else {
160
+ // delete file
161
+ fs.unlinkSync(curPath);
162
+ }
163
+ }
164
+
165
+ fs.rmdirSync(path);
166
+ }
167
+ };
168
+
169
+ 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
@@ -1,69 +1,77 @@
1
- import * as express from "express";
2
- // eslint-disable-next-line
3
- import * as cors from "cors";
4
- import * as http from "http";
5
- import Console from "../../utils/console";
6
- import addRoutes from "./routes";
7
- import cli from "cli-ux";
8
- import { IConfigObj } from "../../models/config";
9
- import { IConfigManager } from "../../models/config-manager";
10
-
11
- export let TEST_SERVER: http.Server;
12
-
13
- export default async function (
14
- configObj: IConfigObj,
15
- configManager: IConfigManager,
16
- isTestingEnvironment = false
17
- ) {
18
- const { config } = configObj;
19
- const app = express();
20
- const server = require("http").Server(app);
21
- app.use(cors());
22
-
23
- // app.use(function(req, res, next) {
24
- // res.header("Access-Control-Allow-Origin", "*")
25
- // res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
26
- // res.header("Access-Control-Allow-Methods", "GET,PUT")
27
- // next()
28
- // })
29
-
30
- // add all needed endpoints
31
- await addRoutes(app, configObj, configManager);
32
-
33
- server.listen(isTestingEnvironment ? 5000 : config?.port, function () {
34
- if (!isTestingEnvironment) {
35
- Console.success(
36
- `Exercises are running 😃 Open your browser to start practicing!`
37
- );
38
- Console.success(`\n Open the exercise on this link:`);
39
- Console.log(` ${config?.publicUrl}`);
40
- if (config?.editor.mode === "standalone")
41
- cli.open(`${config.publicUrl}`);
42
- }
43
- });
44
-
45
- const sockets: any = new Set();
46
-
47
- server.on("connection", (socket: any) => {
48
- sockets.add(socket);
49
-
50
- server.once("close", () => {
51
- sockets.delete(socket);
52
- });
53
- });
54
-
55
- /**
56
- * Forcefully terminates HTTP server.
57
- */
58
- server.terminate = (callback: void) => {
59
- for (const socket of sockets) {
60
- socket.destroy();
61
-
62
- sockets.delete(socket);
63
- }
64
-
65
- server.close(callback);
66
- };
67
-
68
- return server;
69
- }
1
+ import * as express from "express";
2
+ // eslint-disable-next-line
3
+ import * as cors from "cors";
4
+ import * as http from "http";
5
+ import Console from "../../utils/console";
6
+ import addRoutes from "./routes";
7
+ import cli from "cli-ux";
8
+ import { IConfigObj } from "../../models/config";
9
+ import { IConfigManager } from "../../models/config-manager";
10
+
11
+ export let TEST_SERVER: http.Server;
12
+
13
+ export default async function (
14
+ configObj: IConfigObj,
15
+ configManager: IConfigManager,
16
+ isTestingEnvironment = false
17
+ ) {
18
+ const { config } = configObj;
19
+ const app = express();
20
+ let server: any;
21
+
22
+ if (isTestingEnvironment) {
23
+ if (TEST_SERVER === undefined)
24
+ TEST_SERVER = require("http").Server(app);
25
+ server = TEST_SERVER;
26
+ } else
27
+ server = require("http").Server(app);
28
+
29
+ app.use(cors());
30
+
31
+ // app.use(function(req, res, next) {
32
+ // res.header("Access-Control-Allow-Origin", "*")
33
+ // res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
34
+ // res.header("Access-Control-Allow-Methods", "GET,PUT")
35
+ // next()
36
+ // })
37
+
38
+ // add all needed endpoints
39
+ await addRoutes(app, configObj, configManager);
40
+
41
+ server.listen(isTestingEnvironment ? 5000 : config?.port, function () {
42
+ if (!isTestingEnvironment) {
43
+ Console.success(
44
+ `Exercises are running 😃 Open your browser to start practicing!`
45
+ );
46
+ Console.success(`\n Open the exercise on this link:`);
47
+ Console.log(` ${config?.publicUrl}`);
48
+ if (config?.editor.mode === "standalone")
49
+ cli.open(`${config.publicUrl}`);
50
+ }
51
+ });
52
+
53
+ const sockets: any = new Set();
54
+
55
+ server.on("connection", (socket: any) => {
56
+ sockets.add(socket);
57
+
58
+ server.once("close", () => {
59
+ sockets.delete(socket);
60
+ });
61
+ });
62
+
63
+ /**
64
+ * Forcefully terminates HTTP server.
65
+ */
66
+ server.terminate = (callback: void) => {
67
+ for (const socket of sockets) {
68
+ socket.destroy();
69
+
70
+ sockets.delete(socket);
71
+ }
72
+
73
+ server.close(callback);
74
+ };
75
+
76
+ return server;
77
+ }