gamelet-cli 0.6.2 → 0.6.4

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 +664 -594
  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,279 +1,279 @@
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.upload = 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 isbinaryfile_1 = require("isbinaryfile");
13
- const tempFolder = '/.temp';
14
- exports.upload = ({ projectCode, folder, token, debug }) => {
15
- if (debug) {
16
- console.log('debug = true');
17
- }
18
- let srcFolder = `${folder}/src`;
19
- net_1.apiSetToken(token);
20
- file_1.setFileCacheFolder(folder);
21
- if (!file_1.fileExists(srcFolder)) {
22
- return Promise.reject(`${srcFolder} does not exist`);
23
- }
24
- let zipFilename = folder + tempFolder + '/sources.zip';
25
- return Promise.resolve()
26
- .then(() => validateToken(projectCode, token))
27
- .then(() => validateGitCommit(folder))
28
- .then(() => checkSourcesMerged(zipFilename, projectCode, folder, token))
29
- .then(basezip => createUploadQueue(projectCode, basezip, folder))
30
- .then(queue => processUploadQueue(projectCode, queue, folder))
31
- .then(queue => queue.length && downloadBase(zipFilename, projectCode, folder, token))
32
- .then(() => file_1.rmdir(`${folder}${tempFolder}`).catch(_e => { }))
33
- .then(() => {
34
- console.log();
35
- console.log('done');
36
- })
37
- .catch(err => {
38
- console.log();
39
- console.error(err);
40
- })
41
- .then(() => console.log());
42
- };
43
- function validateGitCommit(folder) {
44
- return file_1.isGitCommitted(folder)
45
- .then(committed => {
46
- if (!committed) {
47
- return Promise.reject('Please commit your current sources first.');
48
- }
49
- else {
50
- return Promise.resolve();
51
- }
52
- });
53
- }
54
- function validateToken(projectCode, _token) {
55
- return net_1.apiGet(`/validate/local_dev_token/${projectCode}/edit`)
56
- .catch(_e => {
57
- console.error('Only the current Project Editor can do the upload');
58
- throw _e;
59
- });
60
- }
61
- function downloadBase(zipFilename, projectCode, folder, token) {
62
- let basezip = `${folder}/.cg/sources.base`;
63
- console.log(`update sources base ...`);
64
- return Promise.resolve()
65
- .then(() => {
66
- if (!file_1.fileExists(zipFilename)) {
67
- let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
68
- return file_1.downloadFile(net_1.cgUrl(`/download/${projectCode}?token=${token}`), zipFilename, progressBar, { noCache: true })
69
- .then(() => progressBar && progressBar.stop());
70
- }
71
- else {
72
- return Promise.resolve();
73
- }
74
- })
75
- .then(() => file_1.moveFile(zipFilename, basezip));
76
- }
77
- let sourcesProcessing;
78
- function checkSourcesMerged(zipFilename, projectCode, folder, token) {
79
- let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
80
- sourcesProcessing = [];
81
- let basezip = `${folder}/.cg/sources.base`;
82
- if (!file_1.fileExists(basezip)) {
83
- return Promise.reject('Cannot merge: source base missing.');
84
- }
85
- console.log(`prepare updates: download remote sources ...`);
86
- return file_1.downloadFile(net_1.cgUrl(`/download/${projectCode}?token=${token}`), zipFilename, progressBar, { noCache: true })
87
- .then(() => {
88
- progressBar.stop();
89
- return file_1.getFileZip(zipFilename);
90
- })
91
- .then(jszip => {
92
- return Promise.resolve()
93
- .then(() => file_1.rmdir(`${folder}${tempFolder}`).catch(_e => { }))
94
- .then(() => file_1.getFileZip(basezip))
95
- .then(basezip => {
96
- let saveSrcFiles = [];
97
- sourcesProcessing = [];
98
- console.log(`prepare updates: diff remote sources ...`);
99
- for (let filename in jszip.files) {
100
- if (filename.startsWith('src/')) {
101
- saveSrcFiles.push(checkSourceMerged(jszip.file(filename), basezip.file(filename), folder));
102
- }
103
- }
104
- return Promise.all(saveSrcFiles)
105
- .then(results => {
106
- if (results.find(result => !result)) {
107
- return Promise.reject(`Please do a merge before upload.\nRun the command "gamelet merge"`);
108
- }
109
- return basezip;
110
- });
111
- });
112
- });
113
- }
114
- function checkSourceMerged(file, base, folder) {
115
- if (sourcesProcessing.length > 19) {
116
- return file_1.wait(30).then(() => checkSourceMerged(file, base, folder));
117
- }
118
- sourcesProcessing.push(file);
119
- return merges_1.isSourceMerged(file.name, file, base, folder)
120
- .then(result => {
121
- let index = sourcesProcessing.indexOf(file);
122
- sourcesProcessing.splice(index, 1);
123
- return result;
124
- });
125
- }
126
- function processUploadQueue(projectCode, queue, _folder) {
127
- if (!queue.length) {
128
- console.log('nothing to upload');
129
- return Promise.resolve(queue);
130
- }
131
- return inquirer_1.default.prompt([
132
- {
133
- type: 'confirm',
134
- name: 'confirm',
135
- message: `${queue.length} item(s) to upload to "${projectCode}", Continue?`,
136
- }
137
- ])
138
- .then(result => {
139
- if (result.confirm) {
140
- sourcesProcessing = [];
141
- let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
142
- progressBar.start(queue.length, 0);
143
- return Promise.all(queue.map(item => processUploadQueueItem(projectCode, item, progressBar)))
144
- .then(() => progressBar.stop());
145
- }
146
- else {
147
- queue.length = 0;
148
- }
149
- return Promise.resolve();
150
- })
151
- .then(() => queue);
152
- }
153
- function processUploadQueueItem(projectCode, queueItem, progressBar) {
154
- if (sourcesProcessing.length > 5) {
155
- return file_1.wait(30).then(() => processUploadQueueItem(projectCode, queueItem, progressBar));
156
- }
157
- sourcesProcessing.push(queueItem);
158
- return Promise.resolve()
159
- .then(() => {
160
- return net_1.apiPost(`/update/source/local_dev/${projectCode}/${queueItem.action}`, {
161
- path: queueItem.path,
162
- filename: queueItem.filename,
163
- content: queueItem.content || '',
164
- });
165
- })
166
- .then(() => {
167
- progressBar.increment(1);
168
- let index = sourcesProcessing.indexOf(queueItem);
169
- sourcesProcessing.splice(index, 1);
170
- });
171
- }
172
- function createUploadQueue(projectCode, basezip, folder) {
173
- sourcesProcessing = [];
174
- let srcFolder = `${folder}/src`;
175
- let queue = [];
176
- let filesToDelete = {};
177
- for (let filename in basezip.files) {
178
- let search = filename.match(/^src\/(.*\/)?([^\/]+)$/);
179
- if (search) {
180
- let path = search[1] ? search[1].substr(0, search[1].length - 1) : '';
181
- let fname = search[2];
182
- let fullpath = path ? `${path}/${fname}` : fname;
183
- filesToDelete[fullpath] = {
184
- path: path,
185
- filename: fname,
186
- };
187
- }
188
- }
189
- console.log('listing files to upload...');
190
- console.log('===============================');
191
- return file_1.listFiles(srcFolder)
192
- .then(files => {
193
- return Promise.all(files.map(file => updateSource(projectCode, srcFolder, '', file, basezip, queue, filesToDelete)));
194
- })
195
- .then(() => {
196
- sourcesProcessing = [];
197
- for (let key in filesToDelete) {
198
- let queueItem = Object.assign({
199
- action: 'delete',
200
- }, filesToDelete[key]);
201
- queue.push(queueItem);
202
- console.log(' - (delete) ' + key);
203
- }
204
- })
205
- .then(() => {
206
- if (queue.length) {
207
- console.log('-------------------------------');
208
- }
209
- return queue;
210
- });
211
- }
212
- function updateSource(projectCode, srcFolder, path, filename, basezip, queue, filesToDelete) {
213
- if (sourcesProcessing.length > 19) {
214
- return file_1.wait(30).then(() => updateSource(projectCode, srcFolder, path, filename, basezip, queue, filesToDelete));
215
- }
216
- let fullpathname = path ? `${path}/${filename}` : filename;
217
- sourcesProcessing.push(fullpathname);
218
- let localFilepath = `${srcFolder}/${fullpathname}`;
219
- delete filesToDelete[fullpathname];
220
- return file_1.fileStat(localFilepath)
221
- .then((stats) => {
222
- if (stats.isDirectory()) {
223
- return file_1.listFiles(localFilepath)
224
- .then(files => {
225
- let index = sourcesProcessing.indexOf(fullpathname);
226
- sourcesProcessing.splice(index, 1);
227
- return Promise.all(files.map(file => {
228
- return updateSource(projectCode, srcFolder, fullpathname, file, basezip, queue, filesToDelete);
229
- }));
230
- });
231
- }
232
- else if (stats.isFile()) {
233
- return isbinaryfile_1.isBinaryFile(localFilepath)
234
- .then(isBinary => {
235
- if (isBinary) {
236
- return Promise.reject(`${filename} is not a text file.`);
237
- }
238
- else {
239
- return file_1.getFileString(localFilepath)
240
- .then(content => {
241
- return getSourceAction(fullpathname, content, basezip)
242
- .then(action => {
243
- if (action) {
244
- queue.push({
245
- path: path,
246
- filename: filename,
247
- content: content,
248
- action: action,
249
- });
250
- let sign = action == 'create' ? '+' : '>';
251
- console.log(` ${sign} (${action}) ` + fullpathname);
252
- }
253
- });
254
- });
255
- }
256
- });
257
- }
258
- else {
259
- return Promise.resolve();
260
- }
261
- })
262
- .then(() => {
263
- let index = sourcesProcessing.indexOf(fullpathname);
264
- sourcesProcessing.splice(index, 1);
265
- });
266
- }
267
- function getSourceAction(sourcePathname, sourceContent, basezip) {
268
- let baseFile = basezip.file(`src/${sourcePathname}`);
269
- if (baseFile) {
270
- return baseFile.async('string')
271
- .then(baseContent => {
272
- return sourceContent != baseContent ? 'update' : '';
273
- });
274
- }
275
- else {
276
- return Promise.resolve('create');
277
- }
278
- }
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.upload = 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 isbinaryfile_1 = require("isbinaryfile");
13
+ const tempFolder = '/.temp';
14
+ exports.upload = ({ projectCode, folder, token, debug }) => {
15
+ if (debug) {
16
+ console.log('debug = true');
17
+ }
18
+ let srcFolder = `${folder}/src`;
19
+ net_1.apiSetToken(token);
20
+ file_1.setFileCacheFolder(folder);
21
+ if (!file_1.fileExists(srcFolder)) {
22
+ return Promise.reject(`${srcFolder} does not exist`);
23
+ }
24
+ let zipFilename = folder + tempFolder + '/sources.zip';
25
+ return Promise.resolve()
26
+ .then(() => validateToken(projectCode, token))
27
+ .then(() => validateGitCommit(folder))
28
+ .then(() => checkSourcesMerged(zipFilename, projectCode, folder, token))
29
+ .then(basezip => createUploadQueue(projectCode, basezip, folder))
30
+ .then(queue => processUploadQueue(projectCode, queue, folder))
31
+ .then(queue => queue.length && downloadBase(zipFilename, projectCode, folder, token))
32
+ .then(() => file_1.rmdir(`${folder}${tempFolder}`).catch(_e => { }))
33
+ .then(() => {
34
+ console.log();
35
+ console.log('done');
36
+ })
37
+ .catch(err => {
38
+ console.log();
39
+ console.error(err);
40
+ })
41
+ .then(() => console.log());
42
+ };
43
+ function validateGitCommit(folder) {
44
+ return file_1.isGitCommitted(folder)
45
+ .then(committed => {
46
+ if (!committed) {
47
+ return Promise.reject('Please commit your current sources first.');
48
+ }
49
+ else {
50
+ return Promise.resolve();
51
+ }
52
+ });
53
+ }
54
+ function validateToken(projectCode, _token) {
55
+ return net_1.apiGet(`/validate/local_dev_token/${projectCode}/edit`)
56
+ .catch(_e => {
57
+ console.error('Only the current Project Editor can do the upload');
58
+ throw _e;
59
+ });
60
+ }
61
+ function downloadBase(zipFilename, projectCode, folder, token) {
62
+ let basezip = `${folder}/.cg/sources.base`;
63
+ console.log(`update sources base ...`);
64
+ return Promise.resolve()
65
+ .then(() => {
66
+ if (!file_1.fileExists(zipFilename)) {
67
+ let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
68
+ return file_1.downloadFile(net_1.cgUrl(`/download/${projectCode}?token=${token}`), zipFilename, progressBar, { noCache: true })
69
+ .then(() => progressBar && progressBar.stop());
70
+ }
71
+ else {
72
+ return Promise.resolve();
73
+ }
74
+ })
75
+ .then(() => file_1.moveFile(zipFilename, basezip));
76
+ }
77
+ let sourcesProcessing;
78
+ function checkSourcesMerged(zipFilename, projectCode, folder, token) {
79
+ let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
80
+ sourcesProcessing = [];
81
+ let basezip = `${folder}/.cg/sources.base`;
82
+ if (!file_1.fileExists(basezip)) {
83
+ return Promise.reject('Cannot merge: source base missing.');
84
+ }
85
+ console.log(`prepare updates: download remote sources ...`);
86
+ return file_1.downloadFile(net_1.cgUrl(`/download/${projectCode}?token=${token}`), zipFilename, progressBar, { noCache: true })
87
+ .then(() => {
88
+ progressBar.stop();
89
+ return file_1.getFileZip(zipFilename);
90
+ })
91
+ .then(jszip => {
92
+ return Promise.resolve()
93
+ .then(() => file_1.rmdir(`${folder}${tempFolder}`).catch(_e => { }))
94
+ .then(() => file_1.getFileZip(basezip))
95
+ .then(basezip => {
96
+ let saveSrcFiles = [];
97
+ sourcesProcessing = [];
98
+ console.log(`prepare updates: diff remote sources ...`);
99
+ for (let filename in jszip.files) {
100
+ if (filename.startsWith('src/')) {
101
+ saveSrcFiles.push(checkSourceMerged(jszip.file(filename), basezip.file(filename), folder));
102
+ }
103
+ }
104
+ return Promise.all(saveSrcFiles)
105
+ .then(results => {
106
+ if (results.find(result => !result)) {
107
+ return Promise.reject(`Please do a merge before upload.\nRun the command "gamelet merge"`);
108
+ }
109
+ return basezip;
110
+ });
111
+ });
112
+ });
113
+ }
114
+ function checkSourceMerged(file, base, folder) {
115
+ if (sourcesProcessing.length > 19) {
116
+ return file_1.wait(30).then(() => checkSourceMerged(file, base, folder));
117
+ }
118
+ sourcesProcessing.push(file);
119
+ return merges_1.isSourceMerged(file.name, file, base, folder)
120
+ .then(result => {
121
+ let index = sourcesProcessing.indexOf(file);
122
+ sourcesProcessing.splice(index, 1);
123
+ return result;
124
+ });
125
+ }
126
+ function processUploadQueue(projectCode, queue, _folder) {
127
+ if (!queue.length) {
128
+ console.log('nothing to upload');
129
+ return Promise.resolve(queue);
130
+ }
131
+ return inquirer_1.default.prompt([
132
+ {
133
+ type: 'confirm',
134
+ name: 'confirm',
135
+ message: `${queue.length} item(s) to upload to "${projectCode}", Continue?`,
136
+ }
137
+ ])
138
+ .then(result => {
139
+ if (result.confirm) {
140
+ sourcesProcessing = [];
141
+ let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
142
+ progressBar.start(queue.length, 0);
143
+ return Promise.all(queue.map(item => processUploadQueueItem(projectCode, item, progressBar)))
144
+ .then(() => progressBar.stop());
145
+ }
146
+ else {
147
+ queue.length = 0;
148
+ }
149
+ return Promise.resolve();
150
+ })
151
+ .then(() => queue);
152
+ }
153
+ function processUploadQueueItem(projectCode, queueItem, progressBar) {
154
+ if (sourcesProcessing.length > 5) {
155
+ return file_1.wait(30).then(() => processUploadQueueItem(projectCode, queueItem, progressBar));
156
+ }
157
+ sourcesProcessing.push(queueItem);
158
+ return Promise.resolve()
159
+ .then(() => {
160
+ return net_1.apiPost(`/update/source/local_dev/${projectCode}/${queueItem.action}`, {
161
+ path: queueItem.path,
162
+ filename: queueItem.filename,
163
+ content: queueItem.content || '',
164
+ });
165
+ })
166
+ .then(() => {
167
+ progressBar.increment(1);
168
+ let index = sourcesProcessing.indexOf(queueItem);
169
+ sourcesProcessing.splice(index, 1);
170
+ });
171
+ }
172
+ function createUploadQueue(projectCode, basezip, folder) {
173
+ sourcesProcessing = [];
174
+ let srcFolder = `${folder}/src`;
175
+ let queue = [];
176
+ let filesToDelete = {};
177
+ for (let filename in basezip.files) {
178
+ let search = filename.match(/^src\/(.*\/)?([^\/]+)$/);
179
+ if (search) {
180
+ let path = search[1] ? search[1].substr(0, search[1].length - 1) : '';
181
+ let fname = search[2];
182
+ let fullpath = path ? `${path}/${fname}` : fname;
183
+ filesToDelete[fullpath] = {
184
+ path: path,
185
+ filename: fname,
186
+ };
187
+ }
188
+ }
189
+ console.log('listing files to upload...');
190
+ console.log('===============================');
191
+ return file_1.listFiles(srcFolder)
192
+ .then(files => {
193
+ return Promise.all(files.map(file => updateSource(projectCode, srcFolder, '', file, basezip, queue, filesToDelete)));
194
+ })
195
+ .then(() => {
196
+ sourcesProcessing = [];
197
+ for (let key in filesToDelete) {
198
+ let queueItem = Object.assign({
199
+ action: 'delete',
200
+ }, filesToDelete[key]);
201
+ queue.push(queueItem);
202
+ console.log(' - (delete) ' + key);
203
+ }
204
+ })
205
+ .then(() => {
206
+ if (queue.length) {
207
+ console.log('-------------------------------');
208
+ }
209
+ return queue;
210
+ });
211
+ }
212
+ function updateSource(projectCode, srcFolder, path, filename, basezip, queue, filesToDelete) {
213
+ if (sourcesProcessing.length > 19) {
214
+ return file_1.wait(30).then(() => updateSource(projectCode, srcFolder, path, filename, basezip, queue, filesToDelete));
215
+ }
216
+ let fullpathname = path ? `${path}/${filename}` : filename;
217
+ sourcesProcessing.push(fullpathname);
218
+ let localFilepath = `${srcFolder}/${fullpathname}`;
219
+ delete filesToDelete[fullpathname];
220
+ return file_1.fileStat(localFilepath)
221
+ .then((stats) => {
222
+ if (stats.isDirectory()) {
223
+ return file_1.listFiles(localFilepath)
224
+ .then(files => {
225
+ let index = sourcesProcessing.indexOf(fullpathname);
226
+ sourcesProcessing.splice(index, 1);
227
+ return Promise.all(files.map(file => {
228
+ return updateSource(projectCode, srcFolder, fullpathname, file, basezip, queue, filesToDelete);
229
+ }));
230
+ });
231
+ }
232
+ else if (stats.isFile()) {
233
+ return isbinaryfile_1.isBinaryFile(localFilepath)
234
+ .then(isBinary => {
235
+ if (isBinary) {
236
+ return Promise.reject(`${filename} is not a text file.`);
237
+ }
238
+ else {
239
+ return file_1.getFileString(localFilepath)
240
+ .then(content => {
241
+ return getSourceAction(fullpathname, content, basezip)
242
+ .then(action => {
243
+ if (action) {
244
+ queue.push({
245
+ path: path,
246
+ filename: filename,
247
+ content: content,
248
+ action: action,
249
+ });
250
+ let sign = action == 'create' ? '+' : '>';
251
+ console.log(` ${sign} (${action}) ` + fullpathname);
252
+ }
253
+ });
254
+ });
255
+ }
256
+ });
257
+ }
258
+ else {
259
+ return Promise.resolve();
260
+ }
261
+ })
262
+ .then(() => {
263
+ let index = sourcesProcessing.indexOf(fullpathname);
264
+ sourcesProcessing.splice(index, 1);
265
+ });
266
+ }
267
+ function getSourceAction(sourcePathname, sourceContent, basezip) {
268
+ let baseFile = basezip.file(`src/${sourcePathname}`);
269
+ if (baseFile) {
270
+ return baseFile.async('string')
271
+ .then(baseContent => {
272
+ return sourceContent != baseContent ? 'update' : '';
273
+ });
274
+ }
275
+ else {
276
+ return Promise.resolve('create');
277
+ }
278
+ }
279
279
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dhbWVsZXQvdXBsb2FkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHdDQUFvSztBQUNwSyxzQ0FBbUU7QUFDbkUscUNBQTBDO0FBQzFDLGdFQUF1QztBQUN2Qyx3REFBZ0M7QUFDaEMsK0NBQTRDO0FBRTVDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQztBQUVmLFFBQUEsTUFBTSxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO0lBQzVELElBQUksS0FBSyxFQUFFO1FBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztLQUMvQjtJQUNELElBQUksU0FBUyxHQUFHLEdBQUcsTUFBTSxNQUFNLENBQUM7SUFDaEMsaUJBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQix5QkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUzQixJQUFJLENBQUMsaUJBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUN4QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLGlCQUFpQixDQUFDLENBQUM7S0FDeEQ7SUFFRCxJQUFJLFdBQVcsR0FBRyxNQUFNLEdBQUcsVUFBVSxHQUFHLGNBQWMsQ0FBQztJQUV2RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUU7U0FDbkIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDN0MsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN2RSxJQUFJLENBQUMsT0FB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