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,737 +1,737 @@
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.download = void 0;
7
- const file_1 = require("../utils/file");
8
- const net_1 = require("../utils/net");
9
- const merges_1 = require("./merges");
10
- const cli_progress_1 = __importDefault(require("cli-progress"));
11
- const inquirer_1 = __importDefault(require("inquirer"));
12
- const ArrayUtil_1 = require("../server/utils/ArrayUtil");
13
- const tempFolder = '/.temp';
14
- const cliFolder = __dirname + '/../../..';
15
- const dtsPrepend = "// @ts-nocheck\n";
16
- exports.download = ({ projectCode, folder, token, sourceHandler, targetItems, force, debug }) => {
17
- let fullProject;
18
- let engineInfo;
19
- net_1.apiSetToken(token);
20
- file_1.setFileCacheFolder(folder);
21
- return Promise.resolve()
22
- .then(() => {
23
- if (!projectCode) {
24
- return Promise.reject('Please specify a project code that is created on code.gamelet.com');
25
- }
26
- if (!folder) {
27
- return Promise.reject('Please specify a folder to install');
28
- }
29
- if (!token) {
30
- return Promise.reject('No valid token is provided');
31
- }
32
- return Promise.resolve();
33
- })
34
- .then(() => file_1.isEmptyFolder(folder))
35
- .then(empty => {
36
- if (sourceHandler == 'download') {
37
- if (debug) {
38
- // just do it
39
- }
40
- else if (!empty) {
41
- return inquirer_1.default.prompt([
42
- {
43
- type: 'list',
44
- name: 'confirm',
45
- message: 'The folder is not empty!',
46
- choices: [
47
- 'Quit',
48
- 'Force downloading project into this folder'
49
- ]
50
- }
51
- ])
52
- .then(choice => {
53
- if (choice.confirm == 'Quit') {
54
- return Promise.reject('Quit: The folder is not empty.');
55
- }
56
- else {
57
- return Promise.resolve();
58
- }
59
- });
60
- }
61
- else {
62
- console.log(`Create workspace in ${folder}/ ...`);
63
- }
64
- }
65
- else {
66
- console.log('sync workspace from CG ...');
67
- }
68
- })
69
- .then(() => file_1.rmdir(`${folder}${tempFolder}`).catch(_e => { }))
70
- .then(() => Promise.all([
71
- getEngineInfo().then(info => (engineInfo = info)),
72
- net_1.apiGet(`/get/full_project/${projectCode}`)
73
- .then(json => fullProject = json),
74
- ]))
75
- .then(() => updatePackageJsons(fullProject, folder))
76
- .then(() => saveToken(fullProject, token, folder))
77
- .then(() => secureSourcesBase(fullProject, folder, token))
78
- .then(() => includeItem(targetItems, 'source') && downloadSources(fullProject, folder, token, sourceHandler, force))
79
- .then(() => includeItem(targetItems, 'resource') && downloadResources(fullProject, folder, 3))
80
- .then(() => (includeItem(targetItems, 'source') || includeItem(targetItems, 'resource')) &&
81
- downloadStaticFiles(engineInfo, folder)
82
- .then(() => adjustStaticFiles(fullProject, folder)))
83
- .then(() => includeItem(targetItems, 'score') && downloadScoreModes(fullProject, folder))
84
- .then(() => includeItem(targetItems, 'item') && downloadItems(fullProject, folder))
85
- .then(() => includeItem(targetItems, 'badge') && downloadBadges(fullProject, folder))
86
- .then(() => file_1.wait(300))
87
- .then(() => file_1.rmdir(`${folder}${tempFolder}`).catch(_e => { }))
88
- .then(() => {
89
- console.log();
90
- console.log('done');
91
- })
92
- .catch(err => {
93
- console.log();
94
- console.error(err);
95
- })
96
- .then(() => console.log());
97
- };
98
- function secureSourcesBase(fullProject, folder, token) {
99
- let basePath = getSourceBasePath(folder);
100
- if (!file_1.fileExists(basePath)) {
101
- let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
102
- console.log('Missing sources.base, downloading from CG ...');
103
- let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
104
- return file_1.downloadFile(net_1.cgUrl(`/download/${fullProject.project.code}?token=${token}`), basePath, progressBar, {
105
- tempFile: `${folder}${tempFolder}/${tempName}.zip`,
106
- noCache: true,
107
- })
108
- .then(() => progressBar && progressBar.stop());
109
- }
110
- else {
111
- return Promise.resolve();
112
- }
113
- }
114
- function includeItem(targetItems, item) {
115
- return !targetItems || targetItems.includes(item);
116
- }
117
- function saveToken(fullProject, token, folder) {
118
- let filename = `${fullProject.project.code.toLowerCase()}.token`;
119
- let fullpath = `${folder}/.cg/${filename}`;
120
- return checkSavedToken(fullpath, token)
121
- .then(saved => {
122
- if (!saved) {
123
- console.log(`Building workspace: saving access token ...`);
124
- return file_1.saveData(fullpath, token)
125
- .then(() => deleteOldTokens(folder, filename))
126
- .then(() => { });
127
- }
128
- else {
129
- return Promise.resolve();
130
- }
131
- });
132
- }
133
- function deleteOldTokens(folder, currentTokenFile) {
134
- let path = `${folder}/.cg`;
135
- return file_1.listFiles(path)
136
- .then(files => {
137
- files = files.filter(f => f != currentTokenFile && f.toLowerCase().endsWith('.token'));
138
- return Promise.all(files.map(f => file_1.unlink(`${path}/${f}`)));
139
- });
140
- }
141
- function checkSavedToken(filename, token) {
142
- if (file_1.fileExists(filename)) {
143
- return file_1.getFileString(filename, true)
144
- .then(savedToken => token == savedToken);
145
- }
146
- else {
147
- return Promise.resolve(false);
148
- }
149
- }
150
- function getEngineInfo() {
151
- return net_1.apiGet(`/get/engine_info`);
152
- }
153
- function updatePackageJsons(fullProject, folder) {
154
- console.log(`Building workspace: update package configs ...`);
155
- return Promise.all([
156
- createPackageJson(fullProject.project, folder),
157
- createTsconfig(fullProject.project, folder),
158
- file_1.copyFile(cliFolder + '/assets/gitignore.txt', `${folder}/.gitignore`),
159
- file_1.copyFile(cliFolder + '/assets/common.d.ts', `${folder}/typings/common.d.ts`),
160
- mergeLaunchJson(folder),
161
- ]);
162
- }
163
- function mergeLaunchJson(folder) {
164
- let srcFile = cliFolder + '/assets/launch.json';
165
- let destFile = `${folder}/.vscode/launch.json`;
166
- if (file_1.fileExists(destFile)) {
167
- return Promise.all([file_1.getFileJson(srcFile, true), file_1.getFileJson(destFile, true)])
168
- .then(results => {
169
- let needSave = false;
170
- let srcJson = results[0];
171
- let destJson = results[1];
172
- srcJson.configurations = srcJson.configurations || [];
173
- srcJson.configurations.forEach(config => {
174
- let search = destJson.configurations.find(c => c.name == config.name);
175
- if (!search) {
176
- destJson.configurations.push(config);
177
- needSave = true;
178
- }
179
- });
180
- if (needSave) {
181
- return file_1.saveData(destFile, JSON.stringify(destJson, null, 4));
182
- }
183
- else {
184
- return Promise.resolve();
185
- }
186
- })
187
- .catch(_e => {
188
- return file_1.copyFile(srcFile, destFile);
189
- });
190
- }
191
- else {
192
- return file_1.copyFile(srcFile, destFile);
193
- }
194
- }
195
- function createPackageJson(projectJson, folder) {
196
- let lastBuildVer = projectJson.lastBuildVer || '0.0.0';
197
- let verArr = lastBuildVer.split('.').map(str => Number(str));
198
- verArr[2]++;
199
- let nextVer = verArr.join('.');
200
- return file_1.renderTwig(cliFolder + '/assets/package.json.twig', {
201
- CG_URL: net_1.cgUrl(''),
202
- project: projectJson,
203
- version: nextVer,
204
- })
205
- .then(content => file_1.saveData(folder + '/package.json', content));
206
- }
207
- function createTsconfig(projectJson, folder) {
208
- return file_1.renderTwig(cliFolder + '/assets/tsconfig.json.twig', {
209
- CG_URL: net_1.cgUrl(''),
210
- project: projectJson,
211
- })
212
- .then(content => file_1.saveData(folder + '/tsconfig.json', content));
213
- }
214
- let sourcesProcessing;
215
- function downloadSources(fullProject, folder, token, sourceHandler, force) {
216
- if (sourceHandler == 'skip') {
217
- return Promise.resolve();
218
- }
219
- console.log(`Building workspace: download sources ...`);
220
- return file_1.isGitCommitted(folder)
221
- .then(committed => {
222
- if (!committed && !force) {
223
- return Promise.reject('Please commit your current sources first.');
224
- }
225
- else {
226
- return Promise.resolve();
227
- }
228
- })
229
- .then(() => {
230
- let zipFilename = folder + tempFolder + '/sources.zip';
231
- let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
232
- sourcesProcessing = [];
233
- return file_1.downloadFile(net_1.cgUrl(`/download/${fullProject.project.code}?token=${token}`), zipFilename, progressBar, { noCache: true })
234
- .then(() => {
235
- progressBar.stop();
236
- return file_1.getFileZip(zipFilename);
237
- })
238
- .then(jszip => {
239
- if (sourceHandler == 'merge') {
240
- return mergeSources(jszip, folder);
241
- }
242
- else {
243
- return overwriteSources(jszip, folder);
244
- }
245
- })
246
- .then(result => result && file_1.moveFile(zipFilename, getSourceBasePath(folder)));
247
- });
248
- }
249
- function getSourceBasePath(folder) {
250
- return `${folder}/.cg/sources.base`;
251
- }
252
- function overwriteSources(jszip, folder) {
253
- let saveSrcFiles = [];
254
- let progressBar = new cli_progress_1.default.SingleBar({
255
- format: ` {bar} {percentage}% | Overwriting ({value}/{total})`
256
- }, cli_progress_1.default.Presets.shades_classic);
257
- for (let filename in jszip.files) {
258
- if (filename.startsWith('src/')) {
259
- saveSrcFiles.push(saveSrcFile(jszip.file(filename), folder, progressBar));
260
- }
261
- }
262
- progressBar.start(saveSrcFiles.length, 0);
263
- return Promise.all(saveSrcFiles)
264
- .then(() => {
265
- progressBar && progressBar.stop();
266
- return true;
267
- });
268
- }
269
- function saveSrcFile(file, dest, progressBar) {
270
- if (sourcesProcessing.length > 49) {
271
- return file_1.wait(10).then(() => saveSrcFile(file, dest, progressBar));
272
- }
273
- sourcesProcessing.push(file);
274
- return file.async('string')
275
- .then(content => {
276
- return file_1.saveData(dest + '/' + file.name, content);
277
- })
278
- .then(() => {
279
- progressBar && progressBar.increment(1);
280
- let index = sourcesProcessing.indexOf(file);
281
- sourcesProcessing.splice(index, 1);
282
- });
283
- }
284
- function mergeSources(jszip, folder) {
285
- let basezip = getSourceBasePath(folder);
286
- if (!file_1.fileExists(basezip)) {
287
- return Promise.reject('Cannot merge: source base missing.');
288
- }
289
- return file_1.getFileZip(basezip)
290
- .then(basezip => {
291
- let saveSrcFiles = [];
292
- let progressBar = new cli_progress_1.default.SingleBar({
293
- format: ` {bar} {percentage}% | Merging ({value}/{total})`
294
- }, cli_progress_1.default.Presets.shades_classic);
295
- for (let filename in jszip.files) {
296
- if (filename.startsWith('src/')) {
297
- saveSrcFiles.push(mergeSrcFile(jszip.file(filename), basezip.file(filename), folder, progressBar));
298
- }
299
- }
300
- return Promise.all(saveSrcFiles)
301
- //.then(results => !results.find(result => !result))
302
- .then(results => {
303
- progressBar && progressBar.stop();
304
- results.filter(result => result.name == 'deleted').forEach(result => {
305
- console.log(`Source deleted: ${result.filename}`);
306
- });
307
- results.filter(result => result.name == 'added').forEach(result => {
308
- console.log(`Source added: ${result.filename}`);
309
- });
310
- return true;
311
- });
312
- });
313
- }
314
- function mergeSrcFile(file, base, folder, progressBar) {
315
- if (sourcesProcessing.length > 19) {
316
- return file_1.wait(30).then(() => mergeSrcFile(file, base, folder, progressBar));
317
- }
318
- sourcesProcessing.push(file);
319
- return Promise.all([fileToText(file), fileToText(base)])
320
- .then(contents => {
321
- return merges_1.sourceMerge(file.name, contents[0], contents[1], folder);
322
- })
323
- .then(result => {
324
- progressBar && progressBar.increment(1);
325
- let index = sourcesProcessing.indexOf(file);
326
- sourcesProcessing.splice(index, 1);
327
- return result;
328
- });
329
- }
330
- function fileToText(file) {
331
- if (file) {
332
- return file.async('string');
333
- }
334
- else {
335
- return Promise.resolve(null);
336
- }
337
- }
338
- function isLibArchive(resource, file) {
339
- return resource.type.startsWith('build') && file.endsWith('archive.zip');
340
- }
341
- let resourceTotalBar;
342
- let resourceBars;
343
- function addResourceProgress() {
344
- resourceTotalBar && resourceTotalBar.increment(1);
345
- }
346
- function downloadResources(fullProject, folder, concurrent) {
347
- console.log(`Building workspace: download resources ...`);
348
- return Promise.resolve()
349
- .then(() => file_1.listFiles(`${folder}/resource`))
350
- .then(oldDirs => {
351
- let pack = fullProject.resourcePack;
352
- let resToLoad = [];
353
- let resIds = [];
354
- for (let alias in pack.aliasMap) {
355
- let resourceInfo = pack.aliasMap[alias];
356
- let resource = pack.resourceMap[resourceInfo.resourceId];
357
- resIds.push(resourceInfo.resourceId);
358
- for (let file of resource.meta.files) {
359
- let info = {
360
- file: file,
361
- resource: resource,
362
- alias: alias,
363
- };
364
- if (file.endsWith('.d.ts') || !isLibArchive(resource, file)) {
365
- resToLoad.push(info);
366
- }
367
- }
368
- let oldDirIndex = oldDirs.indexOf(resource.id.toString(36));
369
- if (oldDirIndex != -1) {
370
- oldDirs.splice(oldDirIndex, 1);
371
- }
372
- }
373
- resourceBars = new cli_progress_1.default.MultiBar({
374
- clearOnComplete: false,
375
- hideCursor: true,
376
- format: ` {bar} {percentage}% | {file} ({value}/{total})`
377
- }, cli_progress_1.default.Presets.shades_classic);
378
- let collectInfo = {};
379
- resourceTotalBar = resourceBars.create(resToLoad.length, 0, { file: 'Total' });
380
- return startDownloadResources(collectInfo, resToLoad, folder, concurrent)
381
- .then(() => resourceBars && resourceBars.stop())
382
- .then(() => logDownloadResourceResult(collectInfo))
383
- .then(() => deleteResDirs(folder, oldDirs))
384
- .then(() => deleteOldDtses(folder, resIds));
385
- });
386
- }
387
- function logDownloadResourceResult(collectInfo) {
388
- let list = ArrayUtil_1.ArrayUtil.listValuesOfObject(collectInfo);
389
- let files = 0;
390
- for (let info of list) {
391
- files += info.files.length;
392
- }
393
- console.log(` ${list.length} resource(s) added (${files} file(s))`);
394
- }
395
- function deleteOldDtses(folder, resIds) {
396
- return file_1.listFiles(`${folder}/typings`)
397
- .then(files => {
398
- let filesToDelete = [];
399
- files.forEach(f => {
400
- let search = f.match(/\.cg_([a-z0-9]+)\.d\.ts$/);
401
- if (search) {
402
- let resId = parseInt(search[1], 36);
403
- if (!resIds.includes(resId)) {
404
- filesToDelete.push(f);
405
- }
406
- }
407
- });
408
- sourcesProcessing = [];
409
- return Promise.all(filesToDelete.map(f => deleteFile(`${folder}/typings/${f}`)))
410
- .then(() => {
411
- console.log(` ${filesToDelete.length} old Dts removed`);
412
- });
413
- });
414
- }
415
- function deleteFile(file) {
416
- if (sourcesProcessing.length > 19) {
417
- return file_1.wait(30).then(() => deleteFile(file));
418
- }
419
- sourcesProcessing.push(file);
420
- return file_1.unlink(file)
421
- .then(() => {
422
- let index = sourcesProcessing.indexOf(file);
423
- sourcesProcessing.splice(index, 1);
424
- });
425
- }
426
- function deleteResDirs(folder, dirs) {
427
- sourcesProcessing = [];
428
- return Promise.all(dirs.map(dir => deleteResDir(folder, dir)))
429
- .then(() => console.log(` ${dirs.length} old resource(s) removed`));
430
- }
431
- function deleteResDir(folder, dir) {
432
- if (sourcesProcessing.length > 19) {
433
- return file_1.wait(30).then(() => deleteResDir(dir));
434
- }
435
- sourcesProcessing.push(dir);
436
- return file_1.rmdir(`${folder}/resource/${dir}`)
437
- .then(() => {
438
- let index = sourcesProcessing.indexOf(dir);
439
- sourcesProcessing.splice(index, 1);
440
- });
441
- }
442
- function startDownloadResources(collectInfo, resToLoad, folder, concurrent) {
443
- return Promise.all(resToLoad.map(info => {
444
- return downloadResource(collectInfo, info, folder, concurrent);
445
- }));
446
- }
447
- function getResourceFolder(folder, resource) {
448
- return `${folder}/resource/${resource.id.toString(36)}`;
449
- }
450
- function downloadResource(collectInfo, info, folder, concurrent) {
451
- if (resourceBars.bars.length > concurrent) {
452
- return file_1.wait(100).then(() => downloadResource(collectInfo, info, folder, concurrent));
453
- }
454
- let resource = info.resource;
455
- let file = info.file;
456
- let alias = info.alias;
457
- let url = net_1.cgUrl(`${resource.url}${file}`);
458
- let dest = getResourceFolder(folder, resource) + `/${file}`;
459
- let dispName = alias;
460
- let isDts = file.endsWith('.d.ts');
461
- let modifyContent = null;
462
- if (isDts) {
463
- let destFile = file.split('/').pop().replace(/\.d\.ts$/, `.cg_${resource.id.toString(36)}.d.ts`);
464
- dest = `${folder}/typings/${alias}_${destFile}`;
465
- dispName += '.d.ts';
466
- modifyContent = (content) => {
467
- if (!content.startsWith(dtsPrepend)) {
468
- content = dtsPrepend + content;
469
- }
470
- return content;
471
- };
472
- }
473
- let resourceBar = resourceBars.create(100, 0, { file: dispName });
474
- let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
475
- let tempFile = `${folder}${tempFolder}/${tempName}`;
476
- return file_1.downloadFile(url, dest, resourceBar, {
477
- dispName: dispName,
478
- tempFile: tempFile,
479
- appendSize: isDts ? dtsPrepend.length : 0,
480
- modifyContent: modifyContent,
481
- })
482
- .then(realDownload => {
483
- if (realDownload) {
484
- let resourceInfo = collectInfo[resource.id];
485
- if (!resourceInfo) {
486
- collectInfo[resource.id] = {
487
- resource: resource,
488
- files: [],
489
- };
490
- }
491
- collectInfo[resource.id].files.push(file);
492
- }
493
- addResourceProgress();
494
- resourceBars.remove(resourceBar);
495
- });
496
- }
497
- let staticBar;
498
- function downloadStaticFiles(engineInfo, folder) {
499
- console.log(`Building workspace: download static files ...`);
500
- let version = 'min';
501
- //version = 'debug' + parseInt(engineInfo.version, 36).toString(24);
502
- let tempStaticFolder = `${folder}/.cg/static`;
503
- let promises = [
504
- downloadStaticFile(`${engineInfo.url}static/css/preload.css`, `${folder}/static/css/preload.css`),
505
- downloadStaticFile(`${engineInfo.url}static/img/logo_42.png`, `${folder}/static/img/logo_42.png`),
506
- downloadStaticFile(`https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/pace.min.js`, `${folder}/static/js/pace.min.js`),
507
- downloadStaticFile(`${engineInfo.url}static/js/index.offline.html`, `${tempStaticFolder}/index.html`),
508
- downloadStaticFile(`${engineInfo.url}static/js/systemjs-starter.offline.${version}.js`, `${tempStaticFolder}/systemjs-starter.offline.js`),
509
- downloadStaticFile(`${engineInfo.url}static/js/systemjs-starter.offline-dev.${version}.js`, `${tempStaticFolder}/systemjs-starter.offline-dev.js`),
510
- downloadStaticFile(`${engineInfo.url}static/js/boot.prod.${version}.js`, `${tempStaticFolder}/boot.prod.js`),
511
- ];
512
- staticBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
513
- staticBar.start(promises.length, 0);
514
- return Promise.all(promises)
515
- .then(() => staticBar && staticBar.stop());
516
- }
517
- function downloadStaticFile(url, dest) {
518
- return file_1.downloadFile(url, dest)
519
- .then(() => staticBar && staticBar.increment(1));
520
- }
521
- function adjustStaticFiles(fullProject, folder) {
522
- return Promise.all([
523
- adjustIndexHtml(fullProject, folder),
524
- generateScriptJs(fullProject, folder),
525
- ])
526
- .catch(err => {
527
- console.error(err);
528
- });
529
- }
530
- function adjustIndexHtml(fullProject, folder) {
531
- let project = fullProject.project;
532
- let filename = `${folder}/.cg/static/index.html`;
533
- return file_1.getFileString(filename)
534
- .then(text => {
535
- text = text.replace('%appName%', project.name);
536
- text = text.replace('</body>', ` <script src="output/build.js" type="text/javascript"></script>\n</body>`);
537
- return file_1.saveData(`${folder}/index.html`, text);
538
- });
539
- }
540
- function generateScriptJs(fullProject, folder) {
541
- let project = fullProject.project;
542
- let staticCacheFolder = `${folder}/.cg/static`;
543
- let starterFilename = `${staticCacheFolder}/systemjs-starter.offline.js`;
544
- let booterFilename = `${staticCacheFolder}/boot.prod.js`;
545
- let devFilename = `${staticCacheFolder}/systemjs-starter.offline-dev.js`;
546
- let starterScripts;
547
- let scripts = '';
548
- let appendScripts = (_scripts, text) => {
549
- if (_scripts && !_scripts.endsWith(';')) {
550
- _scripts += ';';
551
- }
552
- return _scripts + text.trim();
553
- };
554
- return net_1.apiGet(`/get/offlineDevRenderParameters/${project.code}`)
555
- .then(renderParams => {
556
- return Promise.resolve()
557
- .then(() => {
558
- return file_1.getFileString(starterFilename)
559
- .then(content => {
560
- starterScripts = content.replace('"%CG_CFG%"', JSON.stringify({ data: renderParams }));
561
- });
562
- })
563
- .then(() => {
564
- return file_1.getFileString(devFilename)
565
- .then(content => {
566
- scripts = appendScripts(scripts, content);
567
- });
568
- })
569
- .then(() => {
570
- return file_1.getFileString(booterFilename)
571
- .then(content => {
572
- scripts = appendScripts(scripts, content);
573
- });
574
- })
575
- .then(() => {
576
- return net_1.apiGet(`/list/resources/dependency/project/${project.code}`);
577
- })
578
- .then(data => {
579
- let libs = data.list;
580
- let libsPack = {};
581
- return Promise.all(libs.map(lib => prepareLibContent(lib, libsPack, folder)))
582
- .then(() => {
583
- let systemBootFuncs = libs.map(lib => `function(){${libsPack[lib.id]};CgLibs.bootModule('${lib.meta.pcode}')}`);
584
- systemBootFuncs.unshift(`function(){CgLibs.initBoots([${libs.map(lib => JSON.stringify(lib)).join(',')}])}`);
585
- scripts = appendScripts(scripts, 'var __cgSystemBoots=[' + systemBootFuncs.join(',') + '];');
586
- scripts = appendScripts(scripts, starterScripts);
587
- });
588
- })
589
- .then(() => file_1.saveData(`${folder}/static/js/scripts.js`, scripts));
590
- });
591
- }
592
- function prepareLibContent(lib, libsPack, folder) {
593
- let file = `${folder}/resource/${lib.id.toString(36)}/${lib.meta.main}`;
594
- return file_1.getFileString(file)
595
- .then(content => {
596
- libsPack[lib.id] = content;
597
- });
598
- }
599
- function downloadBadges(fullProject, folder) {
600
- console.log(`Building workspace: download badges ...`);
601
- let project = fullProject.project;
602
- let data;
603
- return net_1.apiPost(`/glt/client/${project.code}`, {
604
- api: '/list/game_badges',
605
- data: {
606
- start: 0,
607
- length: 1000,
608
- }
609
- })
610
- .then(_d => (data = _d))
611
- .then(() => {
612
- let list = data.list;
613
- if (list.length) {
614
- return downloadBadgeImages(list, folder, 3);
615
- }
616
- else {
617
- console.log(' no badges found');
618
- return Promise.resolve();
619
- }
620
- })
621
- .then(() => file_1.saveData(`${folder}/static/json/badges.json`, JSON.stringify(data, null, 4)));
622
- }
623
- let badgeBars;
624
- function downloadBadgeImages(badges, folder, concurrent) {
625
- badgeBars = new cli_progress_1.default.MultiBar({
626
- clearOnComplete: false,
627
- hideCursor: true,
628
- format: ` {bar} {percentage}% | {file} ({value}/{total})`
629
- }, cli_progress_1.default.Presets.shades_classic);
630
- let totalBar = badgeBars.create(badges.length, 0, { file: 'Total' });
631
- return Promise.all(badges.map(badge => {
632
- return downloadBadgeImage(badge, folder, concurrent)
633
- .then(() => totalBar && totalBar.increment(1));
634
- }))
635
- .then(() => badgeBars && badgeBars.stop());
636
- }
637
- function downloadBadgeImage(badge, folder, concurrent) {
638
- if (badgeBars.bars.length > concurrent) {
639
- return file_1.wait(100).then(() => downloadBadgeImage(badge, folder, concurrent));
640
- }
641
- let url = badge.iconUrl;
642
- let ext = url.split('.').pop();
643
- let dispName = badge.code;
644
- let localUri = `/static/img/badge/${badge.code}.${ext}`;
645
- let dest = `${folder}${localUri}`;
646
- badge.iconUrl = localUri;
647
- badge.aquired = 0;
648
- let badgeBar = badgeBars.create(100, 0, { file: dispName });
649
- let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
650
- let tempFile = `${folder}${tempFolder}/${tempName}`;
651
- return file_1.downloadFile(url, dest, badgeBar, {
652
- dispName: dispName,
653
- tempFile: tempFile,
654
- })
655
- .then(() => badgeBars.remove(badgeBar));
656
- }
657
- function downloadItems(fullProject, folder) {
658
- console.log(`Building workspace: download items ...`);
659
- let project = fullProject.project;
660
- let pack = fullProject.resourcePack;
661
- let refPcodes = [];
662
- let data;
663
- for (let id in pack.resourceMap) {
664
- let resource = pack.resourceMap[id];
665
- if (resource.type == 'buildLib' && resource.meta.gitems) {
666
- let pcode = resource.meta.pcode;
667
- if (!refPcodes.includes(pcode)) {
668
- refPcodes.push(pcode);
669
- }
670
- }
671
- }
672
- return net_1.apiPost(`/glt/client/${project.code}`, {
673
- api: '/list/game_items',
674
- data: {
675
- refPcodes: refPcodes.join(','),
676
- start: 0,
677
- length: 1000,
678
- }
679
- })
680
- .then(_d => (data = _d))
681
- .then(() => {
682
- let list = data.list;
683
- if (list.length) {
684
- return downloadItemImages(list, folder, 3);
685
- }
686
- else {
687
- console.log(' no items found');
688
- return Promise.resolve();
689
- }
690
- })
691
- .then(() => file_1.saveData(`${folder}/static/json/items.json`, JSON.stringify(data, null, 4)));
692
- }
693
- let itemBars;
694
- function downloadItemImages(items, folder, concurrent) {
695
- itemBars = new cli_progress_1.default.MultiBar({
696
- clearOnComplete: false,
697
- hideCursor: true,
698
- format: ` {bar} {percentage}% | {file} ({value}/{total})`
699
- }, cli_progress_1.default.Presets.shades_classic);
700
- let totalBar = itemBars.create(items.length, 0, { file: 'Total' });
701
- return Promise.all(items.map(item => {
702
- return downloadItemImage(item, folder, concurrent)
703
- .then(() => totalBar && totalBar.increment(1));
704
- }))
705
- .then(() => itemBars && itemBars.stop());
706
- }
707
- function downloadItemImage(item, folder, concurrent) {
708
- if (itemBars.bars.length > concurrent) {
709
- return file_1.wait(100).then(() => downloadItemImage(item, folder, concurrent));
710
- }
711
- let url = item.iconUrl;
712
- let ext = url.split('.').pop();
713
- let dispName = item.code;
714
- let localUri = `/static/img/item/${item.code}.${ext}`;
715
- let dest = `${folder}${localUri}`;
716
- item.iconUrl = localUri;
717
- let itemBar = itemBars.create(100, 0, { file: dispName });
718
- let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
719
- let tempFile = `${folder}${tempFolder}/${tempName}`;
720
- return file_1.downloadFile(url, dest, itemBar, {
721
- dispName: dispName,
722
- tempFile: tempFile,
723
- })
724
- .then(() => itemBars.remove(itemBar));
725
- }
726
- function downloadScoreModes(fullProject, folder) {
727
- console.log(`Building workspace: download score modes ...`);
728
- let project = fullProject.project;
729
- let data;
730
- return net_1.apiPost(`/glt/client/${project.code}`, {
731
- api: '/list/score_modes',
732
- data: {}
733
- })
734
- .then(_d => (data = _d))
735
- .then(() => file_1.saveData(`${folder}/static/json/score_modes.json`, JSON.stringify(data, null, 4)));
736
- }
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.download = void 0;
7
+ const file_1 = require("../utils/file");
8
+ const net_1 = require("../utils/net");
9
+ const merges_1 = require("./merges");
10
+ const cli_progress_1 = __importDefault(require("cli-progress"));
11
+ const inquirer_1 = __importDefault(require("inquirer"));
12
+ const ArrayUtil_1 = require("../server/utils/ArrayUtil");
13
+ const tempFolder = '/.temp';
14
+ const cliFolder = __dirname + '/../../..';
15
+ const dtsPrepend = "// @ts-nocheck\n";
16
+ exports.download = ({ projectCode, folder, token, sourceHandler, targetItems, force, debug }) => {
17
+ let fullProject;
18
+ let engineInfo;
19
+ net_1.apiSetToken(token);
20
+ file_1.setFileCacheFolder(folder);
21
+ return Promise.resolve()
22
+ .then(() => {
23
+ if (!projectCode) {
24
+ return Promise.reject('Please specify a project code that is created on code.gamelet.com');
25
+ }
26
+ if (!folder) {
27
+ return Promise.reject('Please specify a folder to install');
28
+ }
29
+ if (!token) {
30
+ return Promise.reject('No valid token is provided');
31
+ }
32
+ return Promise.resolve();
33
+ })
34
+ .then(() => file_1.isEmptyFolder(folder))
35
+ .then(empty => {
36
+ if (sourceHandler == 'download') {
37
+ if (debug) {
38
+ // just do it
39
+ }
40
+ else if (!empty) {
41
+ return inquirer_1.default.prompt([
42
+ {
43
+ type: 'list',
44
+ name: 'confirm',
45
+ message: 'The folder is not empty!',
46
+ choices: [
47
+ 'Quit',
48
+ 'Force downloading project into this folder'
49
+ ]
50
+ }
51
+ ])
52
+ .then(choice => {
53
+ if (choice.confirm == 'Quit') {
54
+ return Promise.reject('Quit: The folder is not empty.');
55
+ }
56
+ else {
57
+ return Promise.resolve();
58
+ }
59
+ });
60
+ }
61
+ else {
62
+ console.log(`Create workspace in ${folder}/ ...`);
63
+ }
64
+ }
65
+ else {
66
+ console.log('sync workspace from CG ...');
67
+ }
68
+ })
69
+ .then(() => file_1.rmdir(`${folder}${tempFolder}`).catch(_e => { }))
70
+ .then(() => Promise.all([
71
+ getEngineInfo().then(info => (engineInfo = info)),
72
+ net_1.apiGet(`/get/full_project/${projectCode}`)
73
+ .then(json => fullProject = json),
74
+ ]))
75
+ .then(() => updatePackageJsons(fullProject, folder))
76
+ .then(() => saveToken(fullProject, token, folder))
77
+ .then(() => secureSourcesBase(fullProject, folder, token))
78
+ .then(() => includeItem(targetItems, 'source') && downloadSources(fullProject, folder, token, sourceHandler, force))
79
+ .then(() => includeItem(targetItems, 'resource') && downloadResources(fullProject, folder, 3))
80
+ .then(() => (includeItem(targetItems, 'source') || includeItem(targetItems, 'resource')) &&
81
+ downloadStaticFiles(engineInfo, folder)
82
+ .then(() => adjustStaticFiles(fullProject, folder)))
83
+ .then(() => includeItem(targetItems, 'score') && downloadScoreModes(fullProject, folder))
84
+ .then(() => includeItem(targetItems, 'item') && downloadItems(fullProject, folder))
85
+ .then(() => includeItem(targetItems, 'badge') && downloadBadges(fullProject, folder))
86
+ .then(() => file_1.wait(300))
87
+ .then(() => file_1.rmdir(`${folder}${tempFolder}`).catch(_e => { }))
88
+ .then(() => {
89
+ console.log();
90
+ console.log('done');
91
+ })
92
+ .catch(err => {
93
+ console.log();
94
+ console.error(err);
95
+ })
96
+ .then(() => console.log());
97
+ };
98
+ function secureSourcesBase(fullProject, folder, token) {
99
+ let basePath = getSourceBasePath(folder);
100
+ if (!file_1.fileExists(basePath)) {
101
+ let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
102
+ console.log('Missing sources.base, downloading from CG ...');
103
+ let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
104
+ return file_1.downloadFile(net_1.cgUrl(`/download/${fullProject.project.code}?token=${token}`), basePath, progressBar, {
105
+ tempFile: `${folder}${tempFolder}/${tempName}.zip`,
106
+ noCache: true,
107
+ })
108
+ .then(() => progressBar && progressBar.stop());
109
+ }
110
+ else {
111
+ return Promise.resolve();
112
+ }
113
+ }
114
+ function includeItem(targetItems, item) {
115
+ return !targetItems || targetItems.includes(item);
116
+ }
117
+ function saveToken(fullProject, token, folder) {
118
+ let filename = `${fullProject.project.code.toLowerCase()}.token`;
119
+ let fullpath = `${folder}/.cg/${filename}`;
120
+ return checkSavedToken(fullpath, token)
121
+ .then(saved => {
122
+ if (!saved) {
123
+ console.log(`Building workspace: saving access token ...`);
124
+ return file_1.saveData(fullpath, token)
125
+ .then(() => deleteOldTokens(folder, filename))
126
+ .then(() => { });
127
+ }
128
+ else {
129
+ return Promise.resolve();
130
+ }
131
+ });
132
+ }
133
+ function deleteOldTokens(folder, currentTokenFile) {
134
+ let path = `${folder}/.cg`;
135
+ return file_1.listFiles(path)
136
+ .then(files => {
137
+ files = files.filter(f => f != currentTokenFile && f.toLowerCase().endsWith('.token'));
138
+ return Promise.all(files.map(f => file_1.unlink(`${path}/${f}`)));
139
+ });
140
+ }
141
+ function checkSavedToken(filename, token) {
142
+ if (file_1.fileExists(filename)) {
143
+ return file_1.getFileString(filename, true)
144
+ .then(savedToken => token == savedToken);
145
+ }
146
+ else {
147
+ return Promise.resolve(false);
148
+ }
149
+ }
150
+ function getEngineInfo() {
151
+ return net_1.apiGet(`/get/engine_info`);
152
+ }
153
+ function updatePackageJsons(fullProject, folder) {
154
+ console.log(`Building workspace: update package configs ...`);
155
+ return Promise.all([
156
+ createPackageJson(fullProject.project, folder),
157
+ createTsconfig(fullProject.project, folder),
158
+ file_1.copyFile(cliFolder + '/assets/gitignore.txt', `${folder}/.gitignore`),
159
+ file_1.copyFile(cliFolder + '/assets/common.d.ts', `${folder}/typings/common.d.ts`),
160
+ mergeLaunchJson(folder),
161
+ ]);
162
+ }
163
+ function mergeLaunchJson(folder) {
164
+ let srcFile = cliFolder + '/assets/launch.json';
165
+ let destFile = `${folder}/.vscode/launch.json`;
166
+ if (file_1.fileExists(destFile)) {
167
+ return Promise.all([file_1.getFileJson(srcFile, true), file_1.getFileJson(destFile, true)])
168
+ .then(results => {
169
+ let needSave = false;
170
+ let srcJson = results[0];
171
+ let destJson = results[1];
172
+ srcJson.configurations = srcJson.configurations || [];
173
+ srcJson.configurations.forEach(config => {
174
+ let search = destJson.configurations.find(c => c.name == config.name);
175
+ if (!search) {
176
+ destJson.configurations.push(config);
177
+ needSave = true;
178
+ }
179
+ });
180
+ if (needSave) {
181
+ return file_1.saveData(destFile, JSON.stringify(destJson, null, 4));
182
+ }
183
+ else {
184
+ return Promise.resolve();
185
+ }
186
+ })
187
+ .catch(_e => {
188
+ return file_1.copyFile(srcFile, destFile);
189
+ });
190
+ }
191
+ else {
192
+ return file_1.copyFile(srcFile, destFile);
193
+ }
194
+ }
195
+ function createPackageJson(projectJson, folder) {
196
+ let lastBuildVer = projectJson.lastBuildVer || '0.0.0';
197
+ let verArr = lastBuildVer.split('.').map(str => Number(str));
198
+ verArr[2]++;
199
+ let nextVer = verArr.join('.');
200
+ return file_1.renderTwig(cliFolder + '/assets/package.json.twig', {
201
+ CG_URL: net_1.cgUrl(''),
202
+ project: projectJson,
203
+ version: nextVer,
204
+ })
205
+ .then(content => file_1.saveData(folder + '/package.json', content));
206
+ }
207
+ function createTsconfig(projectJson, folder) {
208
+ return file_1.renderTwig(cliFolder + '/assets/tsconfig.json.twig', {
209
+ CG_URL: net_1.cgUrl(''),
210
+ project: projectJson,
211
+ })
212
+ .then(content => file_1.saveData(folder + '/tsconfig.json', content));
213
+ }
214
+ let sourcesProcessing;
215
+ function downloadSources(fullProject, folder, token, sourceHandler, force) {
216
+ if (sourceHandler == 'skip') {
217
+ return Promise.resolve();
218
+ }
219
+ console.log(`Building workspace: download sources ...`);
220
+ return file_1.isGitCommitted(folder)
221
+ .then(committed => {
222
+ if (!committed && !force) {
223
+ return Promise.reject('Please commit your current sources first.');
224
+ }
225
+ else {
226
+ return Promise.resolve();
227
+ }
228
+ })
229
+ .then(() => {
230
+ let zipFilename = folder + tempFolder + '/sources.zip';
231
+ let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
232
+ sourcesProcessing = [];
233
+ return file_1.downloadFile(net_1.cgUrl(`/download/${fullProject.project.code}?token=${token}`), zipFilename, progressBar, { noCache: true })
234
+ .then(() => {
235
+ progressBar.stop();
236
+ return file_1.getFileZip(zipFilename);
237
+ })
238
+ .then(jszip => {
239
+ if (sourceHandler == 'merge') {
240
+ return mergeSources(jszip, folder);
241
+ }
242
+ else {
243
+ return overwriteSources(jszip, folder);
244
+ }
245
+ })
246
+ .then(result => result && file_1.moveFile(zipFilename, getSourceBasePath(folder)));
247
+ });
248
+ }
249
+ function getSourceBasePath(folder) {
250
+ return `${folder}/.cg/sources.base`;
251
+ }
252
+ function overwriteSources(jszip, folder) {
253
+ let saveSrcFiles = [];
254
+ let progressBar = new cli_progress_1.default.SingleBar({
255
+ format: ` {bar} {percentage}% | Overwriting ({value}/{total})`
256
+ }, cli_progress_1.default.Presets.shades_classic);
257
+ for (let filename in jszip.files) {
258
+ if (filename.startsWith('src/')) {
259
+ saveSrcFiles.push(saveSrcFile(jszip.file(filename), folder, progressBar));
260
+ }
261
+ }
262
+ progressBar.start(saveSrcFiles.length, 0);
263
+ return Promise.all(saveSrcFiles)
264
+ .then(() => {
265
+ progressBar && progressBar.stop();
266
+ return true;
267
+ });
268
+ }
269
+ function saveSrcFile(file, dest, progressBar) {
270
+ if (sourcesProcessing.length > 49) {
271
+ return file_1.wait(10).then(() => saveSrcFile(file, dest, progressBar));
272
+ }
273
+ sourcesProcessing.push(file);
274
+ return file.async('string')
275
+ .then(content => {
276
+ return file_1.saveData(dest + '/' + file.name, content);
277
+ })
278
+ .then(() => {
279
+ progressBar && progressBar.increment(1);
280
+ let index = sourcesProcessing.indexOf(file);
281
+ sourcesProcessing.splice(index, 1);
282
+ });
283
+ }
284
+ function mergeSources(jszip, folder) {
285
+ let basezip = getSourceBasePath(folder);
286
+ if (!file_1.fileExists(basezip)) {
287
+ return Promise.reject('Cannot merge: source base missing.');
288
+ }
289
+ return file_1.getFileZip(basezip)
290
+ .then(basezip => {
291
+ let saveSrcFiles = [];
292
+ let progressBar = new cli_progress_1.default.SingleBar({
293
+ format: ` {bar} {percentage}% | Merging ({value}/{total})`
294
+ }, cli_progress_1.default.Presets.shades_classic);
295
+ for (let filename in jszip.files) {
296
+ if (filename.startsWith('src/')) {
297
+ saveSrcFiles.push(mergeSrcFile(jszip.file(filename), basezip.file(filename), folder, progressBar));
298
+ }
299
+ }
300
+ return Promise.all(saveSrcFiles)
301
+ //.then(results => !results.find(result => !result))
302
+ .then(results => {
303
+ progressBar && progressBar.stop();
304
+ results.filter(result => result.name == 'deleted').forEach(result => {
305
+ console.log(`Source deleted: ${result.filename}`);
306
+ });
307
+ results.filter(result => result.name == 'added').forEach(result => {
308
+ console.log(`Source added: ${result.filename}`);
309
+ });
310
+ return true;
311
+ });
312
+ });
313
+ }
314
+ function mergeSrcFile(file, base, folder, progressBar) {
315
+ if (sourcesProcessing.length > 19) {
316
+ return file_1.wait(30).then(() => mergeSrcFile(file, base, folder, progressBar));
317
+ }
318
+ sourcesProcessing.push(file);
319
+ return Promise.all([fileToText(file), fileToText(base)])
320
+ .then(contents => {
321
+ return merges_1.sourceMerge(file.name, contents[0], contents[1], folder);
322
+ })
323
+ .then(result => {
324
+ progressBar && progressBar.increment(1);
325
+ let index = sourcesProcessing.indexOf(file);
326
+ sourcesProcessing.splice(index, 1);
327
+ return result;
328
+ });
329
+ }
330
+ function fileToText(file) {
331
+ if (file) {
332
+ return file.async('string');
333
+ }
334
+ else {
335
+ return Promise.resolve(null);
336
+ }
337
+ }
338
+ function isLibArchive(resource, file) {
339
+ return resource.type.startsWith('build') && file.endsWith('archive.zip');
340
+ }
341
+ let resourceTotalBar;
342
+ let resourceBars;
343
+ function addResourceProgress() {
344
+ resourceTotalBar && resourceTotalBar.increment(1);
345
+ }
346
+ function downloadResources(fullProject, folder, concurrent) {
347
+ console.log(`Building workspace: download resources ...`);
348
+ return Promise.resolve()
349
+ .then(() => file_1.listFiles(`${folder}/resource`))
350
+ .then(oldDirs => {
351
+ let pack = fullProject.resourcePack;
352
+ let resToLoad = [];
353
+ let resIds = [];
354
+ for (let alias in pack.aliasMap) {
355
+ let resourceInfo = pack.aliasMap[alias];
356
+ let resource = pack.resourceMap[resourceInfo.resourceId];
357
+ resIds.push(resourceInfo.resourceId);
358
+ for (let file of resource.meta.files) {
359
+ let info = {
360
+ file: file,
361
+ resource: resource,
362
+ alias: alias,
363
+ };
364
+ if (file.endsWith('.d.ts') || !isLibArchive(resource, file)) {
365
+ resToLoad.push(info);
366
+ }
367
+ }
368
+ let oldDirIndex = oldDirs.indexOf(resource.id.toString(36));
369
+ if (oldDirIndex != -1) {
370
+ oldDirs.splice(oldDirIndex, 1);
371
+ }
372
+ }
373
+ resourceBars = new cli_progress_1.default.MultiBar({
374
+ clearOnComplete: false,
375
+ hideCursor: true,
376
+ format: ` {bar} {percentage}% | {file} ({value}/{total})`
377
+ }, cli_progress_1.default.Presets.shades_classic);
378
+ let collectInfo = {};
379
+ resourceTotalBar = resourceBars.create(resToLoad.length, 0, { file: 'Total' });
380
+ return startDownloadResources(collectInfo, resToLoad, folder, concurrent)
381
+ .then(() => resourceBars && resourceBars.stop())
382
+ .then(() => logDownloadResourceResult(collectInfo))
383
+ .then(() => deleteResDirs(folder, oldDirs))
384
+ .then(() => deleteOldDtses(folder, resIds));
385
+ });
386
+ }
387
+ function logDownloadResourceResult(collectInfo) {
388
+ let list = ArrayUtil_1.ArrayUtil.listValuesOfObject(collectInfo);
389
+ let files = 0;
390
+ for (let info of list) {
391
+ files += info.files.length;
392
+ }
393
+ console.log(` ${list.length} resource(s) added (${files} file(s))`);
394
+ }
395
+ function deleteOldDtses(folder, resIds) {
396
+ return file_1.listFiles(`${folder}/typings`)
397
+ .then(files => {
398
+ let filesToDelete = [];
399
+ files.forEach(f => {
400
+ let search = f.match(/\.cg_([a-z0-9]+)\.d\.ts$/);
401
+ if (search) {
402
+ let resId = parseInt(search[1], 36);
403
+ if (!resIds.includes(resId)) {
404
+ filesToDelete.push(f);
405
+ }
406
+ }
407
+ });
408
+ sourcesProcessing = [];
409
+ return Promise.all(filesToDelete.map(f => deleteFile(`${folder}/typings/${f}`)))
410
+ .then(() => {
411
+ console.log(` ${filesToDelete.length} old Dts removed`);
412
+ });
413
+ });
414
+ }
415
+ function deleteFile(file) {
416
+ if (sourcesProcessing.length > 19) {
417
+ return file_1.wait(30).then(() => deleteFile(file));
418
+ }
419
+ sourcesProcessing.push(file);
420
+ return file_1.unlink(file)
421
+ .then(() => {
422
+ let index = sourcesProcessing.indexOf(file);
423
+ sourcesProcessing.splice(index, 1);
424
+ });
425
+ }
426
+ function deleteResDirs(folder, dirs) {
427
+ sourcesProcessing = [];
428
+ return Promise.all(dirs.map(dir => deleteResDir(folder, dir)))
429
+ .then(() => console.log(` ${dirs.length} old resource(s) removed`));
430
+ }
431
+ function deleteResDir(folder, dir) {
432
+ if (sourcesProcessing.length > 19) {
433
+ return file_1.wait(30).then(() => deleteResDir(dir));
434
+ }
435
+ sourcesProcessing.push(dir);
436
+ return file_1.rmdir(`${folder}/resource/${dir}`)
437
+ .then(() => {
438
+ let index = sourcesProcessing.indexOf(dir);
439
+ sourcesProcessing.splice(index, 1);
440
+ });
441
+ }
442
+ function startDownloadResources(collectInfo, resToLoad, folder, concurrent) {
443
+ return Promise.all(resToLoad.map(info => {
444
+ return downloadResource(collectInfo, info, folder, concurrent);
445
+ }));
446
+ }
447
+ function getResourceFolder(folder, resource) {
448
+ return `${folder}/resource/${resource.id.toString(36)}`;
449
+ }
450
+ function downloadResource(collectInfo, info, folder, concurrent) {
451
+ if (resourceBars.bars.length > concurrent) {
452
+ return file_1.wait(100).then(() => downloadResource(collectInfo, info, folder, concurrent));
453
+ }
454
+ let resource = info.resource;
455
+ let file = info.file;
456
+ let alias = info.alias;
457
+ let url = net_1.cgUrl(`${resource.url}${file}`);
458
+ let dest = getResourceFolder(folder, resource) + `/${file}`;
459
+ let dispName = alias;
460
+ let isDts = file.endsWith('.d.ts');
461
+ let modifyContent = null;
462
+ if (isDts) {
463
+ let destFile = file.split('/').pop().replace(/\.d\.ts$/, `.cg_${resource.id.toString(36)}.d.ts`);
464
+ dest = `${folder}/typings/${alias}_${destFile}`;
465
+ dispName += '.d.ts';
466
+ modifyContent = (content) => {
467
+ if (!content.startsWith(dtsPrepend)) {
468
+ content = dtsPrepend + content;
469
+ }
470
+ return content;
471
+ };
472
+ }
473
+ let resourceBar = resourceBars.create(100, 0, { file: dispName });
474
+ let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
475
+ let tempFile = `${folder}${tempFolder}/${tempName}`;
476
+ return file_1.downloadFile(url, dest, resourceBar, {
477
+ dispName: dispName,
478
+ tempFile: tempFile,
479
+ appendSize: isDts ? dtsPrepend.length : 0,
480
+ modifyContent: modifyContent,
481
+ })
482
+ .then(realDownload => {
483
+ if (realDownload) {
484
+ let resourceInfo = collectInfo[resource.id];
485
+ if (!resourceInfo) {
486
+ collectInfo[resource.id] = {
487
+ resource: resource,
488
+ files: [],
489
+ };
490
+ }
491
+ collectInfo[resource.id].files.push(file);
492
+ }
493
+ addResourceProgress();
494
+ resourceBars.remove(resourceBar);
495
+ });
496
+ }
497
+ let staticBar;
498
+ function downloadStaticFiles(engineInfo, folder) {
499
+ console.log(`Building workspace: download static files ...`);
500
+ let version = 'min';
501
+ //version = 'debug' + parseInt(engineInfo.version, 36).toString(24);
502
+ let tempStaticFolder = `${folder}/.cg/static`;
503
+ let promises = [
504
+ downloadStaticFile(`${engineInfo.url}static/css/preload.css`, `${folder}/static/css/preload.css`),
505
+ downloadStaticFile(`${engineInfo.url}static/img/logo_42.png`, `${folder}/static/img/logo_42.png`),
506
+ downloadStaticFile(`https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/pace.min.js`, `${folder}/static/js/pace.min.js`),
507
+ downloadStaticFile(`${engineInfo.url}static/js/index.offline.html`, `${tempStaticFolder}/index.html`),
508
+ downloadStaticFile(`${engineInfo.url}static/js/systemjs-starter.offline.${version}.js`, `${tempStaticFolder}/systemjs-starter.offline.js`),
509
+ downloadStaticFile(`${engineInfo.url}static/js/systemjs-starter.offline-dev.${version}.js`, `${tempStaticFolder}/systemjs-starter.offline-dev.js`),
510
+ downloadStaticFile(`${engineInfo.url}static/js/boot.prod.${version}.js`, `${tempStaticFolder}/boot.prod.js`),
511
+ ];
512
+ staticBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
513
+ staticBar.start(promises.length, 0);
514
+ return Promise.all(promises)
515
+ .then(() => staticBar && staticBar.stop());
516
+ }
517
+ function downloadStaticFile(url, dest) {
518
+ return file_1.downloadFile(url, dest)
519
+ .then(() => staticBar && staticBar.increment(1));
520
+ }
521
+ function adjustStaticFiles(fullProject, folder) {
522
+ return Promise.all([
523
+ adjustIndexHtml(fullProject, folder),
524
+ generateScriptJs(fullProject, folder),
525
+ ])
526
+ .catch(err => {
527
+ console.error(err);
528
+ });
529
+ }
530
+ function adjustIndexHtml(fullProject, folder) {
531
+ let project = fullProject.project;
532
+ let filename = `${folder}/.cg/static/index.html`;
533
+ return file_1.getFileString(filename)
534
+ .then(text => {
535
+ text = text.replace('%appName%', project.name);
536
+ text = text.replace('</body>', ` <script src="output/build.js" type="text/javascript"></script>\n</body>`);
537
+ return file_1.saveData(`${folder}/index.html`, text);
538
+ });
539
+ }
540
+ function generateScriptJs(fullProject, folder) {
541
+ let project = fullProject.project;
542
+ let staticCacheFolder = `${folder}/.cg/static`;
543
+ let starterFilename = `${staticCacheFolder}/systemjs-starter.offline.js`;
544
+ let booterFilename = `${staticCacheFolder}/boot.prod.js`;
545
+ let devFilename = `${staticCacheFolder}/systemjs-starter.offline-dev.js`;
546
+ let starterScripts;
547
+ let scripts = '';
548
+ let appendScripts = (_scripts, text) => {
549
+ if (_scripts && !_scripts.endsWith(';')) {
550
+ _scripts += ';';
551
+ }
552
+ return _scripts + text.trim();
553
+ };
554
+ return net_1.apiGet(`/get/offlineDevRenderParameters/${project.code}`)
555
+ .then(renderParams => {
556
+ return Promise.resolve()
557
+ .then(() => {
558
+ return file_1.getFileString(starterFilename)
559
+ .then(content => {
560
+ starterScripts = content.replace('"%CG_CFG%"', JSON.stringify({ data: renderParams }));
561
+ });
562
+ })
563
+ .then(() => {
564
+ return file_1.getFileString(devFilename)
565
+ .then(content => {
566
+ scripts = appendScripts(scripts, content);
567
+ });
568
+ })
569
+ .then(() => {
570
+ return file_1.getFileString(booterFilename)
571
+ .then(content => {
572
+ scripts = appendScripts(scripts, content);
573
+ });
574
+ })
575
+ .then(() => {
576
+ return net_1.apiGet(`/list/resources/dependency/project/${project.code}`);
577
+ })
578
+ .then(data => {
579
+ let libs = data.list;
580
+ let libsPack = {};
581
+ return Promise.all(libs.map(lib => prepareLibContent(lib, libsPack, folder)))
582
+ .then(() => {
583
+ let systemBootFuncs = libs.map(lib => `function(){${libsPack[lib.id]};CgLibs.bootModule('${lib.meta.pcode}')}`);
584
+ systemBootFuncs.unshift(`function(){CgLibs.initBoots([${libs.map(lib => JSON.stringify(lib)).join(',')}])}`);
585
+ scripts = appendScripts(scripts, 'var __cgSystemBoots=[' + systemBootFuncs.join(',') + '];');
586
+ scripts = appendScripts(scripts, starterScripts);
587
+ });
588
+ })
589
+ .then(() => file_1.saveData(`${folder}/static/js/scripts.js`, scripts));
590
+ });
591
+ }
592
+ function prepareLibContent(lib, libsPack, folder) {
593
+ let file = `${folder}/resource/${lib.id.toString(36)}/${lib.meta.main}`;
594
+ return file_1.getFileString(file)
595
+ .then(content => {
596
+ libsPack[lib.id] = content;
597
+ });
598
+ }
599
+ function downloadBadges(fullProject, folder) {
600
+ console.log(`Building workspace: download badges ...`);
601
+ let project = fullProject.project;
602
+ let data;
603
+ return net_1.apiPost(`/glt/client/${project.code}`, {
604
+ api: '/list/game_badges',
605
+ data: {
606
+ start: 0,
607
+ length: 1000,
608
+ }
609
+ })
610
+ .then(_d => (data = _d))
611
+ .then(() => {
612
+ let list = data.list;
613
+ if (list.length) {
614
+ return downloadBadgeImages(list, folder, 3);
615
+ }
616
+ else {
617
+ console.log(' no badges found');
618
+ return Promise.resolve();
619
+ }
620
+ })
621
+ .then(() => file_1.saveData(`${folder}/static/json/badges.json`, JSON.stringify(data, null, 4)));
622
+ }
623
+ let badgeBars;
624
+ function downloadBadgeImages(badges, folder, concurrent) {
625
+ badgeBars = new cli_progress_1.default.MultiBar({
626
+ clearOnComplete: false,
627
+ hideCursor: true,
628
+ format: ` {bar} {percentage}% | {file} ({value}/{total})`
629
+ }, cli_progress_1.default.Presets.shades_classic);
630
+ let totalBar = badgeBars.create(badges.length, 0, { file: 'Total' });
631
+ return Promise.all(badges.map(badge => {
632
+ return downloadBadgeImage(badge, folder, concurrent)
633
+ .then(() => totalBar && totalBar.increment(1));
634
+ }))
635
+ .then(() => badgeBars && badgeBars.stop());
636
+ }
637
+ function downloadBadgeImage(badge, folder, concurrent) {
638
+ if (badgeBars.bars.length > concurrent) {
639
+ return file_1.wait(100).then(() => downloadBadgeImage(badge, folder, concurrent));
640
+ }
641
+ let url = badge.iconUrl;
642
+ let ext = url.split('.').pop();
643
+ let dispName = badge.code;
644
+ let localUri = `/static/img/badge/${badge.code}.${ext}`;
645
+ let dest = `${folder}${localUri}`;
646
+ badge.iconUrl = localUri;
647
+ badge.aquired = 0;
648
+ let badgeBar = badgeBars.create(100, 0, { file: dispName });
649
+ let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
650
+ let tempFile = `${folder}${tempFolder}/${tempName}`;
651
+ return file_1.downloadFile(url, dest, badgeBar, {
652
+ dispName: dispName,
653
+ tempFile: tempFile,
654
+ })
655
+ .then(() => badgeBars.remove(badgeBar));
656
+ }
657
+ function downloadItems(fullProject, folder) {
658
+ console.log(`Building workspace: download items ...`);
659
+ let project = fullProject.project;
660
+ let pack = fullProject.resourcePack;
661
+ let refPcodes = [];
662
+ let data;
663
+ for (let id in pack.resourceMap) {
664
+ let resource = pack.resourceMap[id];
665
+ if (resource.type == 'buildLib' && resource.meta.gitems) {
666
+ let pcode = resource.meta.pcode;
667
+ if (!refPcodes.includes(pcode)) {
668
+ refPcodes.push(pcode);
669
+ }
670
+ }
671
+ }
672
+ return net_1.apiPost(`/glt/client/${project.code}`, {
673
+ api: '/list/game_items',
674
+ data: {
675
+ refPcodes: refPcodes.join(','),
676
+ start: 0,
677
+ length: 1000,
678
+ }
679
+ })
680
+ .then(_d => (data = _d))
681
+ .then(() => {
682
+ let list = data.list;
683
+ if (list.length) {
684
+ return downloadItemImages(list, folder, 3);
685
+ }
686
+ else {
687
+ console.log(' no items found');
688
+ return Promise.resolve();
689
+ }
690
+ })
691
+ .then(() => file_1.saveData(`${folder}/static/json/items.json`, JSON.stringify(data, null, 4)));
692
+ }
693
+ let itemBars;
694
+ function downloadItemImages(items, folder, concurrent) {
695
+ itemBars = new cli_progress_1.default.MultiBar({
696
+ clearOnComplete: false,
697
+ hideCursor: true,
698
+ format: ` {bar} {percentage}% | {file} ({value}/{total})`
699
+ }, cli_progress_1.default.Presets.shades_classic);
700
+ let totalBar = itemBars.create(items.length, 0, { file: 'Total' });
701
+ return Promise.all(items.map(item => {
702
+ return downloadItemImage(item, folder, concurrent)
703
+ .then(() => totalBar && totalBar.increment(1));
704
+ }))
705
+ .then(() => itemBars && itemBars.stop());
706
+ }
707
+ function downloadItemImage(item, folder, concurrent) {
708
+ if (itemBars.bars.length > concurrent) {
709
+ return file_1.wait(100).then(() => downloadItemImage(item, folder, concurrent));
710
+ }
711
+ let url = item.iconUrl;
712
+ let ext = url.split('.').pop();
713
+ let dispName = item.code;
714
+ let localUri = `/static/img/item/${item.code}.${ext}`;
715
+ let dest = `${folder}${localUri}`;
716
+ item.iconUrl = localUri;
717
+ let itemBar = itemBars.create(100, 0, { file: dispName });
718
+ let tempName = Date.now().toString(36) + '.' + Math.round(10 + Math.random() * 1000000).toString(36);
719
+ let tempFile = `${folder}${tempFolder}/${tempName}`;
720
+ return file_1.downloadFile(url, dest, itemBar, {
721
+ dispName: dispName,
722
+ tempFile: tempFile,
723
+ })
724
+ .then(() => itemBars.remove(itemBar));
725
+ }
726
+ function downloadScoreModes(fullProject, folder) {
727
+ console.log(`Building workspace: download score modes ...`);
728
+ let project = fullProject.project;
729
+ let data;
730
+ return net_1.apiPost(`/glt/client/${project.code}`, {
731
+ api: '/list/score_modes',
732
+ data: {}
733
+ })
734
+ .then(_d => (data = _d))
735
+ .then(() => file_1.saveData(`${folder}/static/json/score_modes.json`, JSON.stringify(data, null, 4)));
736
+ }
737
737
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZWxldC9kb3dubG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx3Q0FBOE47QUFDOU4sc0NBQW1FO0FBQ25FLHFDQUEyRDtBQUMzRCxnRUFBdUM7QUFDdkMsd0RBQWdDO0FBQ2hDLHlEQUFzRDtBQUV0RCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUE7QUFDM0IsTUFBTSxTQUFTLEdBQUcsU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUMxQyxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztBQUV6QixRQUFBLFFBQVEsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtJQUNqRyxJQUFJLFdBQVcsQ0FBQztJQUNoQixJQUFJLFVBQVUsQ0FBQztJQUNmLGlCQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkIseUJBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFM0IsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFO1NBQ25CLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7U0FDOUY7UUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDL0Q7UUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDdkQ7UUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDLENBQUM7U0FDRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsb0JB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