gamelet-cli 0.6.2 → 0.6.3

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 (68) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +0 -0
  3. package/assets/common.d.ts +4 -4
  4. package/assets/gitignore.txt +65 -65
  5. package/assets/launch.json +21 -21
  6. package/assets/package.json.twig +22 -22
  7. package/assets/server/greenlock.d/config.json +25 -25
  8. package/assets/server/static/css/style.css +0 -0
  9. package/assets/server/static/js/monitor.js +0 -0
  10. package/assets/server/static/js/test.js +0 -0
  11. package/assets/server/views/error.twig +0 -0
  12. package/assets/server/views/index.twig +0 -0
  13. package/assets/server/views/monitor.twig +0 -0
  14. package/assets/server/views/test.twig +0 -0
  15. package/assets/tsconfig.json.twig +42 -42
  16. package/build/package.json +67 -67
  17. package/build/src/gamelet/download.js +736 -736
  18. package/build/src/gamelet/merges.js +143 -143
  19. package/build/src/gamelet/prepare.js +274 -274
  20. package/build/src/gamelet/upload.js +278 -278
  21. package/build/src/index.js +85 -85
  22. package/build/src/server/Constant.js +9 -9
  23. package/build/src/server/entities/Client.js +77 -77
  24. package/build/src/server/entities/ClientOwner.js +66 -66
  25. package/build/src/server/entities/ClientProject.js +83 -83
  26. package/build/src/server/entities/Gameroom.js +88 -88
  27. package/build/src/server/entities/GameroomBase.js +275 -275
  28. package/build/src/server/entities/Gamezone.js +72 -72
  29. package/build/src/server/entities/ListFilter.js +192 -192
  30. package/build/src/server/entities/Monitor.js +80 -80
  31. package/build/src/server/entities/Player.js +131 -131
  32. package/build/src/server/managers/ApiManager.js +74 -74
  33. package/build/src/server/managers/ClientManager.js +63 -63
  34. package/build/src/server/managers/Database.js +593 -593
  35. package/build/src/server/managers/GameroomManager.js +391 -391
  36. package/build/src/server/managers/ManagerBase.js +16 -16
  37. package/build/src/server/managers/MonitorManager.js +72 -72
  38. package/build/src/server/managers/PlayerManager.js +103 -103
  39. package/build/src/server/managers/SocketManager.js +55 -55
  40. package/build/src/server/managers/UserManager.js +57 -57
  41. package/build/src/server/messages/Message.js +141 -141
  42. package/build/src/server/server.js +109 -109
  43. package/build/src/server/services/ServiceBase.js +24 -24
  44. package/build/src/server/services/clientService.js +23 -23
  45. package/build/src/server/services/gameroomService.js +121 -121
  46. package/build/src/server/services/gltserver.service.js +23 -23
  47. package/build/src/server/services/playerService.js +29 -29
  48. package/build/src/server/startServer.js +32 -32
  49. package/build/src/server/types/BadgeStatus.js +24 -24
  50. package/build/src/server/types/OrderType.js +37 -37
  51. package/build/src/server/types/SubmitType.js +23 -23
  52. package/build/src/server/types/TimeRange.js +25 -25
  53. package/build/src/server/utils/ArrayUtil.js +125 -125
  54. package/build/src/server/utils/IntUtil.js +9 -9
  55. package/build/src/server/utils/ObjectUtil.js +190 -190
  56. package/build/src/server/utils/StringUtil.js +36 -36
  57. package/build/src/server/vo/Database.js +0 -0
  58. package/build/src/server/vo/Gameroom.js +0 -0
  59. package/build/src/server/vo/Gamezone.js +0 -0
  60. package/build/src/server/vo/Player.js +0 -0
  61. package/build/src/server/vo/Response.js +0 -0
  62. package/build/src/server/vo/System.js +0 -0
  63. package/build/src/utils/cli.js +48 -48
  64. package/build/src/utils/file.js +326 -326
  65. package/build/src/utils/init.js +41 -41
  66. package/build/src/utils/log.js +16 -16
  67. package/build/src/utils/net.js +38 -38
  68. package/package.json +2 -2
@@ -1,327 +1,327 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.isEmptyFolder = exports.copyFile = exports.rmdir = exports.getFileZip = exports.downloadFile = exports.renderTwig = exports.unlink = exports.vscodeLink = exports.saveData = exports.isGitCommitted = exports.fileSize = exports.fileStat = exports.moveFile = exports.fileExists = exports.listFiles = exports.getFileJson = exports.getFileString = exports.getFileData = exports.mkdir = exports.wait = exports.setFileCacheFolder = void 0;
7
- const axios_1 = __importDefault(require("axios"));
8
- const path_1 = __importDefault(require("path"));
9
- const mkdirp_1 = __importDefault(require("mkdirp"));
10
- const twig_1 = __importDefault(require("twig"));
11
- const fs_1 = __importDefault(require("fs"));
12
- const jszip_1 = __importDefault(require("jszip"));
13
- const simple_git_1 = __importDefault(require("simple-git"));
14
- const rimraf_1 = __importDefault(require("rimraf"));
15
- const md5_file_1 = __importDefault(require("md5-file"));
16
- const md5_1 = __importDefault(require("md5"));
17
- // const { default: axios } = require("axios");
18
- // const path = require("path");
19
- // const mkdirp = require("mkdirp");
20
- // const Twig = require("twig");
21
- // const fs = require("fs");
22
- // const JSZip = require("jszip");
23
- // const simpleGit = require('simple-git');
24
- // const rimraf = require("rimraf");
25
- // const md5File = require("md5-file");
26
- // const md5 = require('md5');
27
- let fileCacheFolder;
28
- exports.setFileCacheFolder = function (folder) {
29
- fileCacheFolder = folder && `${folder}/.cg/cache`;
30
- };
31
- exports.wait = function (duration) {
32
- return new Promise(resolve => {
33
- setTimeout(resolve, duration);
34
- });
35
- };
36
- exports.mkdir = function (filenameWithPath) {
37
- if (!filenameWithPath.endsWith('/')) {
38
- filenameWithPath = path_1.default.dirname(filenameWithPath);
39
- }
40
- return mkdirp_1.default(filenameWithPath);
41
- };
42
- exports.getFileData = function (filenameWithPath) {
43
- return new Promise((resolve, reject) => {
44
- fs_1.default.readFile(filenameWithPath, (err, data) => {
45
- if (err) {
46
- reject(err);
47
- }
48
- else {
49
- resolve(data);
50
- }
51
- });
52
- });
53
- };
54
- exports.getFileString = function (filenameWithPath, trimContent) {
55
- return exports.getFileData(filenameWithPath)
56
- .then(data => data.toString('utf8'))
57
- .then(str => {
58
- if (trimContent && str) {
59
- str = str.trim();
60
- }
61
- return str;
62
- });
63
- };
64
- exports.getFileJson = function (filenameWithPath, removeComments) {
65
- return exports.getFileString(filenameWithPath)
66
- .then(data => {
67
- if (removeComments) {
68
- data = data.replace(/(^|\n|\r)\s*?\/\/.*?(\n|\r|$)/gm, '');
69
- }
70
- return JSON.parse(data);
71
- });
72
- };
73
- exports.listFiles = function (folderPath) {
74
- return new Promise((resolve, reject) => {
75
- if (fs_1.default.existsSync(folderPath)) {
76
- fs_1.default.readdir(folderPath, (err, files) => {
77
- if (err) {
78
- reject(err);
79
- }
80
- else {
81
- resolve(files);
82
- }
83
- });
84
- }
85
- else {
86
- resolve([]);
87
- }
88
- });
89
- };
90
- exports.fileExists = function (filenameWithPath) {
91
- return fs_1.default.existsSync(filenameWithPath);
92
- };
93
- exports.moveFile = function (filenameWithPath, destFilenameWithPath) {
94
- return exports.mkdir(destFilenameWithPath)
95
- .then(() => {
96
- return new Promise((resolve, reject) => {
97
- fs_1.default.rename(filenameWithPath, destFilenameWithPath, err => {
98
- if (err) {
99
- reject(err);
100
- }
101
- else {
102
- resolve(1);
103
- }
104
- });
105
- });
106
- });
107
- };
108
- exports.fileStat = function (filenameWithPath) {
109
- return new Promise((resolve, reject) => {
110
- fs_1.default.stat(filenameWithPath, (err, stats) => {
111
- if (err) {
112
- reject(err);
113
- }
114
- else {
115
- resolve(stats);
116
- }
117
- });
118
- });
119
- };
120
- exports.fileSize = function (filenameWithPath) {
121
- return exports.fileStat(filenameWithPath).then(state => state.size);
122
- };
123
- exports.isGitCommitted = function (folder) {
124
- if (exports.fileExists(`${folder}/.git`)) {
125
- let git = simple_git_1.default({
126
- baseDir: folder,
127
- binary: 'git',
128
- maxConcurrentProcesses: 6,
129
- });
130
- return git.status()
131
- .then(status => {
132
- return status.files.length == 0;
133
- });
134
- }
135
- else {
136
- return Promise.resolve(true);
137
- }
138
- };
139
- exports.saveData = function (filenameWithPath, data) {
140
- return new Promise((resolve, reject) => {
141
- exports.mkdir(filenameWithPath)
142
- .then(() => {
143
- fs_1.default.writeFile(filenameWithPath, data, err => {
144
- if (err) {
145
- console.error('saveData: writeFile error: ', err);
146
- reject(err);
147
- }
148
- else {
149
- // sometimes the file is locked right after writeFile
150
- setTimeout(resolve, 300);
151
- }
152
- });
153
- });
154
- });
155
- };
156
- function checkCache(url, dest) {
157
- if (exports.fileExists(dest)) {
158
- let cacheFile = `${fileCacheFolder}/${md5_1.default(url.trim())}`;
159
- if (exports.fileExists(cacheFile)) {
160
- return exports.getFileString(cacheFile, true)
161
- .then(cachemd5 => {
162
- return md5_file_1.default(dest)
163
- .then(filemd5 => {
164
- return cachemd5 == filemd5;
165
- });
166
- })
167
- .catch(_err => false);
168
- }
169
- }
170
- return Promise.resolve(false);
171
- }
172
- function saveCache(url, dest) {
173
- let cacheFile = `${fileCacheFolder}/${md5_1.default(url.trim())}`;
174
- return md5_file_1.default(dest)
175
- .then(filemd5 => {
176
- return exports.saveData(cacheFile, filemd5);
177
- });
178
- }
179
- function vscodeLink(link, message) {
180
- if (link.startsWith('/')) {
181
- link = link.substr(1);
182
- }
183
- let line = `vscode://file/${link}`;
184
- if (message) {
185
- line = `${message} ${link}`;
186
- }
187
- return line;
188
- }
189
- exports.vscodeLink = vscodeLink;
190
- function unlink(filenameWithPath) {
191
- return new Promise((resolve, reject) => {
192
- fs_1.default.unlink(filenameWithPath, err => {
193
- if (err && err.code != 'ENOENT') {
194
- reject(err);
195
- }
196
- else {
197
- resolve(true);
198
- }
199
- });
200
- });
201
- }
202
- exports.unlink = unlink;
203
- function renderTwig(twigFile, args) {
204
- return new Promise((resolve, reject) => {
205
- twig_1.default.renderFile(twigFile, args, (err, content) => {
206
- if (err) {
207
- reject(err);
208
- }
209
- else {
210
- resolve(content);
211
- }
212
- });
213
- });
214
- }
215
- exports.renderTwig = renderTwig;
216
- /**
217
- *
218
- * @param {*} url
219
- * @param {*} dest
220
- * @param {*} progressBar
221
- * @param {*} options {dispName: string, tempFile: string}
222
- * @returns
223
- */
224
- function downloadFile(url, dest, progressBar, options) {
225
- options = options || {};
226
- let axiosSource = axios_1.default.CancelToken.source();
227
- return Promise.resolve()
228
- .then(() => options.noCache ? false : checkCache(url, dest))
229
- .then(result => {
230
- if (result) {
231
- return false;
232
- }
233
- return exports.mkdir(dest)
234
- .then(() => options.tempFile && exports.mkdir(options.tempFile))
235
- .then(() => axios_1.default.get(url, {
236
- responseType: 'stream',
237
- cancelToken: axiosSource.token,
238
- }))
239
- .then(response => {
240
- if (response) {
241
- if (progressBar) {
242
- let contentSize = Number(response.headers['content-length']);
243
- progressBar.start(contentSize, 0, { file: options.dispName || url });
244
- response.data.on('data', chunk => progressBar.increment(chunk.length));
245
- }
246
- let writer = fs_1.default.createWriteStream(options.tempFile || dest);
247
- response.data.pipe(writer);
248
- return new Promise((resolve, reject) => {
249
- writer.on('finish', resolve);
250
- writer.on('error', reject);
251
- })
252
- .then(() => {
253
- if (options.tempFile) {
254
- return exports.moveFile(options.tempFile, dest);
255
- }
256
- else {
257
- return Promise.resolve();
258
- }
259
- })
260
- .then(() => {
261
- if (options.modifyContent) {
262
- return exports.getFileString(dest)
263
- .then(content => options.modifyContent(content))
264
- .then(content => exports.saveData(dest, content));
265
- }
266
- else {
267
- return Promise.resolve();
268
- }
269
- })
270
- .then(() => saveCache(url, dest))
271
- .then(() => true);
272
- }
273
- else {
274
- return Promise.reject('File failed to download: ' + url);
275
- }
276
- })
277
- .catch(err => {
278
- if (axios_1.default.isCancel(err)) {
279
- // canceled
280
- }
281
- else {
282
- throw err;
283
- }
284
- });
285
- });
286
- }
287
- exports.downloadFile = downloadFile;
288
- function getFileZip(filename) {
289
- return exports.getFileData(filename)
290
- .then(data => new jszip_1.default().loadAsync(data));
291
- }
292
- exports.getFileZip = getFileZip;
293
- function rmdir(folderPath) {
294
- return new Promise((resolve, reject) => {
295
- rimraf_1.default(folderPath, {}, err => {
296
- if (err && err.code != 'ENOENT') {
297
- reject(err);
298
- }
299
- else {
300
- resolve(true);
301
- }
302
- });
303
- });
304
- }
305
- exports.rmdir = rmdir;
306
- function copyFile(filenameWithPath, destFilenameWithPath) {
307
- return exports.mkdir(destFilenameWithPath)
308
- .then(() => {
309
- return new Promise((resolve, reject) => {
310
- fs_1.default.copyFile(filenameWithPath, destFilenameWithPath, err => {
311
- if (err) {
312
- reject(err);
313
- }
314
- else {
315
- resolve(true);
316
- }
317
- });
318
- });
319
- });
320
- }
321
- exports.copyFile = copyFile;
322
- function isEmptyFolder(folderPath) {
323
- return exports.listFiles(folderPath)
324
- .then(list => !list.length);
325
- }
326
- exports.isEmptyFolder = isEmptyFolder;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isEmptyFolder = exports.copyFile = exports.rmdir = exports.getFileZip = exports.downloadFile = exports.renderTwig = exports.unlink = exports.vscodeLink = exports.saveData = exports.isGitCommitted = exports.fileSize = exports.fileStat = exports.moveFile = exports.fileExists = exports.listFiles = exports.getFileJson = exports.getFileString = exports.getFileData = exports.mkdir = exports.wait = exports.setFileCacheFolder = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const mkdirp_1 = __importDefault(require("mkdirp"));
10
+ const twig_1 = __importDefault(require("twig"));
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const jszip_1 = __importDefault(require("jszip"));
13
+ const simple_git_1 = __importDefault(require("simple-git"));
14
+ const rimraf_1 = __importDefault(require("rimraf"));
15
+ const md5_file_1 = __importDefault(require("md5-file"));
16
+ const md5_1 = __importDefault(require("md5"));
17
+ // const { default: axios } = require("axios");
18
+ // const path = require("path");
19
+ // const mkdirp = require("mkdirp");
20
+ // const Twig = require("twig");
21
+ // const fs = require("fs");
22
+ // const JSZip = require("jszip");
23
+ // const simpleGit = require('simple-git');
24
+ // const rimraf = require("rimraf");
25
+ // const md5File = require("md5-file");
26
+ // const md5 = require('md5');
27
+ let fileCacheFolder;
28
+ exports.setFileCacheFolder = function (folder) {
29
+ fileCacheFolder = folder && `${folder}/.cg/cache`;
30
+ };
31
+ exports.wait = function (duration) {
32
+ return new Promise(resolve => {
33
+ setTimeout(resolve, duration);
34
+ });
35
+ };
36
+ exports.mkdir = function (filenameWithPath) {
37
+ if (!filenameWithPath.endsWith('/')) {
38
+ filenameWithPath = path_1.default.dirname(filenameWithPath);
39
+ }
40
+ return mkdirp_1.default(filenameWithPath);
41
+ };
42
+ exports.getFileData = function (filenameWithPath) {
43
+ return new Promise((resolve, reject) => {
44
+ fs_1.default.readFile(filenameWithPath, (err, data) => {
45
+ if (err) {
46
+ reject(err);
47
+ }
48
+ else {
49
+ resolve(data);
50
+ }
51
+ });
52
+ });
53
+ };
54
+ exports.getFileString = function (filenameWithPath, trimContent) {
55
+ return exports.getFileData(filenameWithPath)
56
+ .then(data => data.toString('utf8'))
57
+ .then(str => {
58
+ if (trimContent && str) {
59
+ str = str.trim();
60
+ }
61
+ return str;
62
+ });
63
+ };
64
+ exports.getFileJson = function (filenameWithPath, removeComments) {
65
+ return exports.getFileString(filenameWithPath)
66
+ .then(data => {
67
+ if (removeComments) {
68
+ data = data.replace(/(^|\n|\r)\s*?\/\/.*?(\n|\r|$)/gm, '');
69
+ }
70
+ return JSON.parse(data);
71
+ });
72
+ };
73
+ exports.listFiles = function (folderPath) {
74
+ return new Promise((resolve, reject) => {
75
+ if (fs_1.default.existsSync(folderPath)) {
76
+ fs_1.default.readdir(folderPath, (err, files) => {
77
+ if (err) {
78
+ reject(err);
79
+ }
80
+ else {
81
+ resolve(files);
82
+ }
83
+ });
84
+ }
85
+ else {
86
+ resolve([]);
87
+ }
88
+ });
89
+ };
90
+ exports.fileExists = function (filenameWithPath) {
91
+ return fs_1.default.existsSync(filenameWithPath);
92
+ };
93
+ exports.moveFile = function (filenameWithPath, destFilenameWithPath) {
94
+ return exports.mkdir(destFilenameWithPath)
95
+ .then(() => {
96
+ return new Promise((resolve, reject) => {
97
+ fs_1.default.rename(filenameWithPath, destFilenameWithPath, err => {
98
+ if (err) {
99
+ reject(err);
100
+ }
101
+ else {
102
+ resolve(1);
103
+ }
104
+ });
105
+ });
106
+ });
107
+ };
108
+ exports.fileStat = function (filenameWithPath) {
109
+ return new Promise((resolve, reject) => {
110
+ fs_1.default.stat(filenameWithPath, (err, stats) => {
111
+ if (err) {
112
+ reject(err);
113
+ }
114
+ else {
115
+ resolve(stats);
116
+ }
117
+ });
118
+ });
119
+ };
120
+ exports.fileSize = function (filenameWithPath) {
121
+ return exports.fileStat(filenameWithPath).then(state => state.size);
122
+ };
123
+ exports.isGitCommitted = function (folder) {
124
+ if (exports.fileExists(`${folder}/.git`)) {
125
+ let git = simple_git_1.default({
126
+ baseDir: folder,
127
+ binary: 'git',
128
+ maxConcurrentProcesses: 6,
129
+ });
130
+ return git.status()
131
+ .then(status => {
132
+ return status.files.length == 0;
133
+ });
134
+ }
135
+ else {
136
+ return Promise.resolve(true);
137
+ }
138
+ };
139
+ exports.saveData = function (filenameWithPath, data) {
140
+ return new Promise((resolve, reject) => {
141
+ exports.mkdir(filenameWithPath)
142
+ .then(() => {
143
+ fs_1.default.writeFile(filenameWithPath, data, err => {
144
+ if (err) {
145
+ console.error('saveData: writeFile error: ', err);
146
+ reject(err);
147
+ }
148
+ else {
149
+ // sometimes the file is locked right after writeFile
150
+ setTimeout(resolve, 300);
151
+ }
152
+ });
153
+ });
154
+ });
155
+ };
156
+ function checkCache(url, dest) {
157
+ if (exports.fileExists(dest)) {
158
+ let cacheFile = `${fileCacheFolder}/${md5_1.default(url.trim())}`;
159
+ if (exports.fileExists(cacheFile)) {
160
+ return exports.getFileString(cacheFile, true)
161
+ .then(cachemd5 => {
162
+ return md5_file_1.default(dest)
163
+ .then(filemd5 => {
164
+ return cachemd5 == filemd5;
165
+ });
166
+ })
167
+ .catch(_err => false);
168
+ }
169
+ }
170
+ return Promise.resolve(false);
171
+ }
172
+ function saveCache(url, dest) {
173
+ let cacheFile = `${fileCacheFolder}/${md5_1.default(url.trim())}`;
174
+ return md5_file_1.default(dest)
175
+ .then(filemd5 => {
176
+ return exports.saveData(cacheFile, filemd5);
177
+ });
178
+ }
179
+ function vscodeLink(link, message) {
180
+ if (link.startsWith('/')) {
181
+ link = link.substr(1);
182
+ }
183
+ let line = `vscode://file/${link}`;
184
+ if (message) {
185
+ line = `${message} ${link}`;
186
+ }
187
+ return line;
188
+ }
189
+ exports.vscodeLink = vscodeLink;
190
+ function unlink(filenameWithPath) {
191
+ return new Promise((resolve, reject) => {
192
+ fs_1.default.unlink(filenameWithPath, err => {
193
+ if (err && err.code != 'ENOENT') {
194
+ reject(err);
195
+ }
196
+ else {
197
+ resolve(true);
198
+ }
199
+ });
200
+ });
201
+ }
202
+ exports.unlink = unlink;
203
+ function renderTwig(twigFile, args) {
204
+ return new Promise((resolve, reject) => {
205
+ twig_1.default.renderFile(twigFile, args, (err, content) => {
206
+ if (err) {
207
+ reject(err);
208
+ }
209
+ else {
210
+ resolve(content);
211
+ }
212
+ });
213
+ });
214
+ }
215
+ exports.renderTwig = renderTwig;
216
+ /**
217
+ *
218
+ * @param {*} url
219
+ * @param {*} dest
220
+ * @param {*} progressBar
221
+ * @param {*} options {dispName: string, tempFile: string}
222
+ * @returns
223
+ */
224
+ function downloadFile(url, dest, progressBar, options) {
225
+ options = options || {};
226
+ let axiosSource = axios_1.default.CancelToken.source();
227
+ return Promise.resolve()
228
+ .then(() => options.noCache ? false : checkCache(url, dest))
229
+ .then(result => {
230
+ if (result) {
231
+ return false;
232
+ }
233
+ return exports.mkdir(dest)
234
+ .then(() => options.tempFile && exports.mkdir(options.tempFile))
235
+ .then(() => axios_1.default.get(url, {
236
+ responseType: 'stream',
237
+ cancelToken: axiosSource.token,
238
+ }))
239
+ .then(response => {
240
+ if (response) {
241
+ if (progressBar) {
242
+ let contentSize = Number(response.headers['content-length']);
243
+ progressBar.start(contentSize, 0, { file: options.dispName || url });
244
+ response.data.on('data', chunk => progressBar.increment(chunk.length));
245
+ }
246
+ let writer = fs_1.default.createWriteStream(options.tempFile || dest);
247
+ response.data.pipe(writer);
248
+ return new Promise((resolve, reject) => {
249
+ writer.on('finish', resolve);
250
+ writer.on('error', reject);
251
+ })
252
+ .then(() => {
253
+ if (options.tempFile) {
254
+ return exports.moveFile(options.tempFile, dest);
255
+ }
256
+ else {
257
+ return Promise.resolve();
258
+ }
259
+ })
260
+ .then(() => {
261
+ if (options.modifyContent) {
262
+ return exports.getFileString(dest)
263
+ .then(content => options.modifyContent(content))
264
+ .then(content => exports.saveData(dest, content));
265
+ }
266
+ else {
267
+ return Promise.resolve();
268
+ }
269
+ })
270
+ .then(() => saveCache(url, dest))
271
+ .then(() => true);
272
+ }
273
+ else {
274
+ return Promise.reject('File failed to download: ' + url);
275
+ }
276
+ })
277
+ .catch(err => {
278
+ if (axios_1.default.isCancel(err)) {
279
+ // canceled
280
+ }
281
+ else {
282
+ throw err;
283
+ }
284
+ });
285
+ });
286
+ }
287
+ exports.downloadFile = downloadFile;
288
+ function getFileZip(filename) {
289
+ return exports.getFileData(filename)
290
+ .then(data => new jszip_1.default().loadAsync(data));
291
+ }
292
+ exports.getFileZip = getFileZip;
293
+ function rmdir(folderPath) {
294
+ return new Promise((resolve, reject) => {
295
+ rimraf_1.default(folderPath, {}, err => {
296
+ if (err && err.code != 'ENOENT') {
297
+ reject(err);
298
+ }
299
+ else {
300
+ resolve(true);
301
+ }
302
+ });
303
+ });
304
+ }
305
+ exports.rmdir = rmdir;
306
+ function copyFile(filenameWithPath, destFilenameWithPath) {
307
+ return exports.mkdir(destFilenameWithPath)
308
+ .then(() => {
309
+ return new Promise((resolve, reject) => {
310
+ fs_1.default.copyFile(filenameWithPath, destFilenameWithPath, err => {
311
+ if (err) {
312
+ reject(err);
313
+ }
314
+ else {
315
+ resolve(true);
316
+ }
317
+ });
318
+ });
319
+ });
320
+ }
321
+ exports.copyFile = copyFile;
322
+ function isEmptyFolder(folderPath) {
323
+ return exports.listFiles(folderPath)
324
+ .then(list => !list.length);
325
+ }
326
+ exports.isEmptyFolder = isEmptyFolder;
327
327
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUEwQjtBQUMxQixnREFBd0I7QUFDeEIsb0RBQTRCO0FBQzVCLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsa0RBQTBCO0FBQzFCLDREQUFtQztBQUNuQyxvREFBNEI7QUFDNUIsd0RBQStCO0FBQy9CLDhDQUFzQjtBQUN0QiwrQ0FBK0M7QUFDL0MsZ0NBQWdDO0FBQ2hDLG9DQUFvQztBQUNwQyxnQ0FBZ0M7QUFDaEMsNEJBQTRCO0FBQzVCLGtDQUFrQztBQUNsQywyQ0FBMkM7QUFDM0Msb0NBQW9DO0FBQ3BDLHVDQUF1QztBQUN2Qyw4QkFBOEI7QUFFOUIsSUFBSSxlQUFlLENBQUM7QUFDUCxRQUFBLGtCQUFrQixHQUFHLFVBQVUsTUFBTTtJQUM5QyxlQUFlLEdBQUcsTUFBTSxJQUFJLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFDdEQsQ0FBQyxDQUFBO0FBRVksUUFBQSxJQUFJLEdBQUcsVUFBVSxRQUFRO0lBQ2xDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDekIsVUFBVSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQUVZLFFBQUEsS0FBSyxHQUFHLFVBQVUsZ0JBQWdCO0lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDakMsZ0JBQWdCLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3JEO0lBQ0QsT0FBTyxnQkFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFBO0FBQ1ksUUFBQSxXQUFXLEdBQUcsVUFBVSxnQkFBZ0I7SUFDakQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFD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