intermediate-component-sa 1.0.6 → 1.1.0

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 (142) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +1 -20
  3. package/build-dev.bat +2 -0
  4. package/build-prod-aot.bat +2 -0
  5. package/build-prod-rollup-aot.bat +2 -0
  6. package/build-prod.bat +2 -0
  7. package/config.ts +4 -0
  8. package/gulpfile.ts +172 -0
  9. package/index.js +4 -2
  10. package/karma.conf.js +124 -0
  11. package/package.json +326 -5
  12. package/postgrator-test.json +9 -0
  13. package/postgrator.json +9 -0
  14. package/src/app.server.ts +4 -0
  15. package/src/client/app/app.component.ts +37 -0
  16. package/src/client/app/app.html +6 -0
  17. package/src/client/app/app.module.ts +36 -0
  18. package/src/client/app/app.routing.ts +7 -0
  19. package/src/client/app/hot_loader_main.ts +14 -0
  20. package/src/client/app/main-aot.ts +8 -0
  21. package/src/client/app/main.ts +8 -0
  22. package/src/client/app/rxjs-operators.ts +15 -0
  23. package/src/client/index.html +90 -0
  24. package/src/client/tsconfig.json +44 -0
  25. package/src/server/config/app.config.ts +57 -0
  26. package/src/server/config/jwt.config.ts +4 -0
  27. package/src/server/config/logger.config.ts +161 -0
  28. package/src/server/config/mssql.config.ts +30 -0
  29. package/src/server/config/redis.config.ts +10 -0
  30. package/src/server/config/server.config.ts +20 -0
  31. package/src/server/config/templates.config.ts +41 -0
  32. package/src/server/crypt.ts +37 -0
  33. package/src/server/customRequest.ts +609 -0
  34. package/src/server/index.ts +231 -0
  35. package/src/server/interfaces/cleaner.interface.ts +3 -0
  36. package/src/server/interfaces/supervisor.interface.ts +3 -0
  37. package/src/server/routes-centralized.ts +36 -0
  38. package/src/server/routes.ts +6 -0
  39. package/src/server/services/index.ts +10 -0
  40. package/src/server/services/routes.service.ts +11 -0
  41. package/src/server/shared/file-manager.ts +1007 -0
  42. package/src/server/shared/http.shared.ts +49 -0
  43. package/src/server/shared/promises.shared.ts +13 -0
  44. package/src/server/shared/security.shared.ts +90 -0
  45. package/src/server/ssl/star_inconcertcc_com.key +28 -0
  46. package/src/server/ssl/star_inconcertcc_com.pem +62 -0
  47. package/src/server/tsconfig.json +38 -0
  48. package/tools/build.js.prod.ts +40 -0
  49. package/tools/config/project.config.ts +718 -0
  50. package/tools/config.ts +4 -0
  51. package/tools/database/SchemaZen.exe +0 -0
  52. package/tools/database/generate-all-data-scripts.bat +32 -0
  53. package/tools/database/generate-database-scripts.bat +36 -0
  54. package/tools/debug.ts +17 -0
  55. package/tools/env/base.ts +8 -0
  56. package/tools/env/dev.ts +9 -0
  57. package/tools/env/env-config.interface.ts +1 -0
  58. package/tools/env/prod.ts +10 -0
  59. package/tools/manual_typings/project/sample.package.d.ts +3 -0
  60. package/tools/manual_typings/seed/angular2-hot-loader.d.ts +9 -0
  61. package/tools/manual_typings/seed/autoprefixer.d.ts +13 -0
  62. package/tools/manual_typings/seed/colorguard.d.ts +15 -0
  63. package/tools/manual_typings/seed/connect-livereload.d.ts +5 -0
  64. package/tools/manual_typings/seed/cssnano.d.ts +18 -0
  65. package/tools/manual_typings/seed/doiuse.d.ts +16 -0
  66. package/tools/manual_typings/seed/express-history-api-fallback.d.ts +18 -0
  67. package/tools/manual_typings/seed/istream.d.ts +10 -0
  68. package/tools/manual_typings/seed/karma.d.ts +12 -0
  69. package/tools/manual_typings/seed/merge-stream.d.ts +8 -0
  70. package/tools/manual_typings/seed/open.d.ts +8 -0
  71. package/tools/manual_typings/seed/postcss-reporter.d.ts +20 -0
  72. package/tools/manual_typings/seed/slash.d.ts +5 -0
  73. package/tools/manual_typings/seed/stylelint.d.ts +16 -0
  74. package/tools/manual_typings/seed/systemjs-builder.d.ts +10 -0
  75. package/tools/manual_typings/seed/tildify.d.ts +5 -0
  76. package/tools/manual_typings/seed/tiny-lr.d.ts +10 -0
  77. package/tools/manual_typings/seed/walk.d.ts +10 -0
  78. package/tools/scripts/install.speech-analytic.sh +35 -0
  79. package/tools/tasks/build.app.server.ts +57 -0
  80. package/tools/tasks/build.assets.dev.ts +19 -0
  81. package/tools/tasks/build.assets.prod.ts +31 -0
  82. package/tools/tasks/build.bundles.app.aot.ts +31 -0
  83. package/tools/tasks/build.bundles.app.rollup.aot.ts +101 -0
  84. package/tools/tasks/build.bundles.app.ts +31 -0
  85. package/tools/tasks/build.bundles.ts +45 -0
  86. package/tools/tasks/build.database.scripts.runner.ts +137 -0
  87. package/tools/tasks/build.database.scripts.ts +27 -0
  88. package/tools/tasks/build.flags.ts +9 -0
  89. package/tools/tasks/build.fonts.ts +9 -0
  90. package/tools/tasks/build.html_css.ts +126 -0
  91. package/tools/tasks/build.index.dev.ts +68 -0
  92. package/tools/tasks/build.index.prod.ts +64 -0
  93. package/tools/tasks/build.js.dev.ts +66 -0
  94. package/tools/tasks/build.js.prod.aot.ts +44 -0
  95. package/tools/tasks/build.js.prod.rollup.aot.ts +50 -0
  96. package/tools/tasks/build.js.prod.ts +40 -0
  97. package/tools/tasks/build.packages.prod.ts +19 -0
  98. package/tools/tasks/build.server.dev.ts +59 -0
  99. package/tools/tasks/build.server.prod.ts +31 -0
  100. package/tools/tasks/build.server.statics.ts +24 -0
  101. package/tools/tasks/build.skins.ts +51 -0
  102. package/tools/tasks/build.sme.prod.aot.ts +6 -0
  103. package/tools/tasks/build.sme.prod.rollup.aot.ts +6 -0
  104. package/tools/tasks/build.sme.prod.ts +6 -0
  105. package/tools/tasks/build.tar.prod.ts +17 -0
  106. package/tools/tasks/build.test.database.scripts.ts +52 -0
  107. package/tools/tasks/clean.dev.ts +7 -0
  108. package/tools/tasks/clean.prod.ts +7 -0
  109. package/tools/tasks/compile.ahead.prod.ts +65 -0
  110. package/tools/tasks/copy.client.js.prod.rollup.aot.ts +33 -0
  111. package/tools/tasks/copy.client.js.prod.ts +18 -0
  112. package/tools/tasks/copy.server.assets.ts +38 -0
  113. package/tools/tasks/copy.server.js.prod.ts +16 -0
  114. package/tools/tasks/css-lint.ts +58 -0
  115. package/tools/tasks/e2e.ts +32 -0
  116. package/tools/tasks/karma.run.ts +18 -0
  117. package/tools/tasks/karma.watch.ts +9 -0
  118. package/tools/tasks/minify.server.statics.ts +52 -0
  119. package/tools/tasks/server.prod.ts +6 -0
  120. package/tools/tasks/server.start.ts +6 -0
  121. package/tools/tasks/test.database.ts +6 -0
  122. package/tools/tasks/transpile.bundles.rollup.aot.ts +43 -0
  123. package/tools/tasks/tslint.ts +64 -0
  124. package/tools/tasks/watch.file.changes.dev.ts +37 -0
  125. package/tools/tasks/watch.key.press.dev.ts +116 -0
  126. package/tools/tasks/webdriver.ts +6 -0
  127. package/tools/utils/project/sample_util.ts +18 -0
  128. package/tools/utils/project.utils.ts +4 -0
  129. package/tools/utils/seed/build_optimizer.ts +26 -0
  130. package/tools/utils/seed/clean.ts +35 -0
  131. package/tools/utils/seed/code_change_tools.ts +38 -0
  132. package/tools/utils/seed/karma.start.ts +10 -0
  133. package/tools/utils/seed/server.ts +43 -0
  134. package/tools/utils/seed/sme.ts +51 -0
  135. package/tools/utils/seed/tasks_tools.ts +70 -0
  136. package/tools/utils/seed/template_locals.ts +64 -0
  137. package/tools/utils/seed/tsproject.ts +25 -0
  138. package/tools/utils/seed.utils.ts +11 -0
  139. package/tools/utils.ts +5 -0
  140. package/tsconfig.json +33 -0
  141. package/tslint.json +120 -0
  142. package/utils.ts +5 -0
@@ -0,0 +1,1007 @@
1
+ import * as log4js from 'log4js';
2
+ import * as moment from 'moment';
3
+ import * as path from 'path';
4
+ import * as fs from 'fs';
5
+ import * as ncp from 'ncp';
6
+ import * as mkdirp from 'mkdirp';
7
+ import * as rimraf from 'rimraf';
8
+ import * as multer from 'multer';
9
+ import * as extract from 'extract-zip';
10
+ import * as child_process from 'child_process';
11
+ let fse = require('fs-extra');
12
+ let zipFolder: any = require('zip-folder');
13
+ let mv = require('mv');
14
+
15
+ // Importo configuraciones
16
+ import { FILE_UPLOAD_LIMIT } from '../config/app.config';
17
+
18
+ import { DummyPromise } from './promises.shared';
19
+
20
+ // Funcion para ejecutar comandos de consola
21
+ let exec = child_process.exec;
22
+
23
+ // Obtengo logger
24
+ let logger = log4js.getLogger('ServerScripts');
25
+
26
+ //funcion pipe asincronico
27
+ export function PipeWriteFile(response: any, file: any): Promise<boolean> {
28
+ //declaro bluebird para tener accesos a la funcion finally
29
+ let Promise = require('bluebird');
30
+ let ended = false;
31
+ return new Promise(function (resolve: any, reject: any) {
32
+ //creamos el pipe para el response
33
+ response.pipe(file);
34
+ //si todo resulta correcto
35
+ function nice_ending() {
36
+ if (!ended) {
37
+ ended = true;
38
+ resolve(true);
39
+ }
40
+ }
41
+ //en caso de error
42
+ function error_ending() {
43
+ if (!ended) {
44
+ ended = true;
45
+ reject(false);
46
+ }
47
+ }
48
+ file.on('finish', nice_ending);
49
+ file.on('end', nice_ending);
50
+ file.on('error', error_ending);
51
+ file.on('close', error_ending);
52
+ }).finally(() => file.close());
53
+ }
54
+
55
+ export function DeleteFileSync(file: any) {
56
+ var fs = require('fs');
57
+ fs.unlinkSync(file);
58
+ }
59
+
60
+ export function FileProperty(filePath: string): Promise<any[]> {
61
+ // Armo promesa para devolver
62
+ return new Promise(function (resolve, reject) {
63
+ // Chequeo si el archivo existe
64
+ try {
65
+ // Array con el resultado de la funcion
66
+ let result: any = {};
67
+ // Verifico que el path recibido corresponda a un directorio existente
68
+ if (fs.existsSync(filePath) && fs.lstatSync(filePath).isFile()) {
69
+ // Para cada archivo obtengo sus propiedades
70
+ let fileStat = fs.lstatSync(filePath);
71
+ let creationDate = moment(fileStat.birthtime);
72
+ let updateDate = moment(fileStat.mtime);
73
+ // Armo el objeto y lo agrego al array
74
+ result = {
75
+ path: filePath,
76
+ isFile: fileStat.isFile(),
77
+ creationDate: creationDate,
78
+ updateDate: updateDate
79
+ };
80
+ }
81
+ // Resuelvo con el resultado
82
+ resolve(result);
83
+ } catch (e) {
84
+ // Algo fallo, lanzo error
85
+ reject(e);
86
+ }
87
+ });
88
+ }
89
+
90
+ export function ListFolderContent(folderPath: string): Promise<any[]> {
91
+
92
+ // Armo promesa para devolver
93
+ return new Promise(function (resolve, reject) {
94
+ // Chequeo si el archivo existe
95
+ try {
96
+ // Array con el resultado de la funcion
97
+ let result: any[] = [];
98
+
99
+ // Verifico que el path recibido corresponda a un directorio existente
100
+ if (fs.existsSync(folderPath) && fs.lstatSync(folderPath).isDirectory()) {
101
+
102
+ // Obtengo la lista de archivos del directorio
103
+ let files: string[] = fs.readdirSync(folderPath);
104
+
105
+ // Recorro el array obtenido
106
+ files.forEach(
107
+ fileName => {
108
+ // Para cada archivo obtengo sus propiedades
109
+ let filePath = path.join(folderPath, fileName);
110
+ let fileStat = fs.lstatSync(filePath);
111
+ let creationDate = moment(fileStat.birthtime);
112
+ let updateDate = moment(fileStat.mtime);
113
+ // Armo el objeto y lo agrego al array
114
+ result.push(
115
+ {
116
+ name: fileName,
117
+ path: filePath,
118
+ isFolder: fileStat.isDirectory(),
119
+ creationDate: creationDate,
120
+ updateDate: updateDate,
121
+ }
122
+ );
123
+ }
124
+ );
125
+ }
126
+ // Resuelvo con el resultado
127
+ resolve(result);
128
+ } catch (e) {
129
+ // Algo fallo, lanzo error
130
+ reject(e);
131
+ }
132
+ });
133
+ }
134
+
135
+ export function CreateFolder(folderName: string): Promise<boolean> {
136
+
137
+ // Verifico si el directorio a crear existe
138
+ return ExistInFileSystem(folderName)
139
+ .then(
140
+ result => {
141
+ // Si existe ya salgo
142
+ if (result) return true;
143
+
144
+ // Si la carpeta no existe la creo
145
+ return new Promise<boolean>(function (resolve, reject) {
146
+ try {
147
+ mkdirp(folderName, function (err) {
148
+ // Si no hay errores devuelvo true
149
+ resolve(err === null || err === undefined);
150
+ });
151
+ } catch (e) {
152
+ // Algo fallo, lanzo error
153
+ reject(e);
154
+ }
155
+ });
156
+ }
157
+ );
158
+ }
159
+
160
+ export function ExistInFileSystem(fileSystemPath: string): Promise<boolean> {
161
+
162
+ // Armo promesa para devolver
163
+ return new Promise(function (resolve, reject) {
164
+ // Chequeo si el archivo existe
165
+ try {
166
+ fs.stat(fileSystemPath, function (err, stat) {
167
+ // Si no hay errores el archivo existe
168
+ resolve(err === null || err === undefined);
169
+ });
170
+ } catch (e) {
171
+ // Algo fallo, lanzo error
172
+ reject(e);
173
+ }
174
+ });
175
+ }
176
+
177
+ export function TouchPath(fileSystemPath: string): Promise<boolean> {
178
+
179
+ // Armo promesa para devolver
180
+ return new Promise(function (resolve, reject) {
181
+ // Actualizo fecha de modificacion y acceso
182
+ try {
183
+ // Obtengo la fecha actual
184
+ let now: Date = moment().toDate();
185
+ // Actualizo fechas
186
+ fs.utimes(fileSystemPath, now, now, function (err) {
187
+ // Si no hay errores el archivo existe
188
+ resolve(err === null || err === undefined);
189
+ });
190
+ } catch (e) {
191
+ // Algo fallo, lanzo error
192
+ reject(e);
193
+ }
194
+ });
195
+ }
196
+
197
+ export function CopyFile(sourcePath: string, targetPath: string): Promise<boolean> {
198
+
199
+ // Armo promesa para devolver
200
+ return new Promise(function (resolve, reject) {
201
+ try {
202
+ // Copiamos archivo al destino
203
+ fse.copy(sourcePath, targetPath, function (err) {
204
+ // Si no hay errores el archivo se copio
205
+ resolve(err === null || err === undefined);
206
+ });
207
+ } catch (e) {
208
+ // Algo fallo, lanzo error
209
+ reject(e);
210
+ }
211
+ });
212
+ }
213
+
214
+ export function CopyFolder(sourcePath: string, targetPath: string): Promise<boolean> {
215
+
216
+ // Verifico que la carpeta de destino exista
217
+ return new Promise<boolean>(function (resolve, reject) {
218
+ try {
219
+ fs.stat(targetPath, function (err, stat) {
220
+ // Si no hay errores el archivo existe
221
+ resolve(err === null || err === undefined);
222
+ });
223
+ } catch (e) {
224
+ // Algo fallo, lanzo error
225
+ reject(e);
226
+ }
227
+ }).then(
228
+ resultExists => {
229
+ // Si ya existe sigo
230
+ if (resultExists) return true;
231
+
232
+ // Si la carpeta no existe la creo
233
+ return new Promise<boolean>(function (resolve, reject) {
234
+ try {
235
+ mkdirp(targetPath, function (err) {
236
+ // Si no hay errores devuelvo true
237
+ resolve(err === null || err === undefined);
238
+ });
239
+ } catch (e) {
240
+ // Algo fallo, lanzo error
241
+ reject(e);
242
+ }
243
+ });
244
+ }
245
+ ).then(
246
+ resultMkDir => {
247
+ // Copio la carpeta origen hacia la ruta destino
248
+ return new Promise<boolean>(function (resolve, reject) {
249
+ try {
250
+ ncp.ncp(sourcePath, targetPath, function (err) {
251
+ // Si no hay errores devuelvo true
252
+ resolve(err === null || err === undefined);
253
+ });
254
+ } catch (e) {
255
+ // Algo fallo, lanzo error
256
+ reject(e);
257
+ }
258
+ });
259
+ }
260
+ );
261
+ }
262
+
263
+ export function MoveFolder(sourceFolder: string, destFolder: string): Promise<boolean> {
264
+
265
+ // Verifico que el directorio a mover exista
266
+ return ExistInFileSystem(sourceFolder)
267
+ .then(
268
+ result => {
269
+ // Si no existe no sigo
270
+ if (!result) throw 'El directorio \'' + sourceFolder + '\' no existe';
271
+
272
+ // Armo promesa para devolver
273
+ return new Promise<boolean>((resolve, reject) => {
274
+ // Elimino la carpeta recursivamente con rimraf
275
+ try {
276
+ fs.rename(sourceFolder, destFolder, function (err) {
277
+ // Si no hay errores devuelvo true
278
+ resolve(err === null || err === undefined);
279
+ });
280
+ } catch (e) {
281
+ // Algo fallo, lanzo error
282
+ reject(e);
283
+ }
284
+ });
285
+ }
286
+ );
287
+ }
288
+
289
+ export function MoveFolderOtherDevice(sourceFolder: string, destFolder: string): Promise<boolean> {
290
+
291
+ // Verifico que el directorio a mover exista
292
+ return ExistInFileSystem(sourceFolder)
293
+ .then(
294
+ result => {
295
+ // Si no existe no sigo
296
+ if (!result) throw 'El directorio \'' + sourceFolder + '\' no existe';
297
+
298
+ // Armo promesa para devolver
299
+ return new Promise<boolean>((resolve, reject) => {
300
+ // Elimino la carpeta recursivamente con rimraf
301
+ try {
302
+ mv(sourceFolder, destFolder, function (err) {
303
+ // Si no hay errores devuelvo true
304
+ resolve(err === null || err === undefined);
305
+ });
306
+ } catch (e) {
307
+ // Algo fallo, lanzo error
308
+ reject(e);
309
+ }
310
+ });
311
+ }
312
+ );
313
+ }
314
+
315
+ export function DeleteFolder(folderPath: any): Promise<boolean> {
316
+
317
+ // Armo promesa para devolver
318
+ return new Promise(function (resolve, reject) {
319
+ // Elimino la carpeta recursivamente con rimraf
320
+ try {
321
+ rimraf(folderPath, function (err) {
322
+ // Si no hay errores devuelvo true
323
+ resolve(err === null || err === undefined);
324
+ });
325
+ } catch (e) {
326
+ // Algo fallo, lanzo error
327
+ reject(e);
328
+ }
329
+ });
330
+ }
331
+
332
+ export function DeleteFile(filePath: any): Promise<boolean> {
333
+
334
+ // Armo promesa para devolver
335
+ return new Promise(function (resolve, reject) {
336
+ // Elimino el archivo
337
+ try {
338
+ fs.unlink(filePath, function (err) {
339
+ // Si no hay errores devuelvo true
340
+ resolve(err === null || err === undefined);
341
+ });
342
+ } catch (e) {
343
+ // Algo fallo, lanzo error
344
+ reject(e);
345
+ }
346
+ });
347
+ }
348
+
349
+ export function ReadFileContent(fileName: string, encode: string, safe?: boolean): Promise<string> {
350
+
351
+ logger.info('ReadFileContent: ', fileName);
352
+ // Armo promesa para devolver
353
+ return new Promise(function (resolve, reject) {
354
+ // Leo el contenido del archivo
355
+ try {
356
+ fs.readFile(fileName, encode, function (err: any, data: any) {
357
+ //logger.info('ReadFileContent - readFile - fileName: ', fileName);
358
+ if (err) {
359
+ if (safe) {
360
+ return resolve(null);
361
+ } else {
362
+ //logger.info('ReadFileContent - readFile - err: ', err);
363
+ return reject(err);
364
+ }
365
+ } else {
366
+ return resolve(data);
367
+ }
368
+ });
369
+ } catch (e) {
370
+ logger.info('ReadFileContent - error: ', e);
371
+ // Algo fallo, lanzo error
372
+ if (safe)
373
+ resolve(null);
374
+ else
375
+ reject(e);
376
+ }
377
+ });
378
+ }
379
+
380
+ export function FileToBase64(file: any) {
381
+ return new Promise(function (resolve, reject) {
382
+ try {
383
+ // Lee data binaria.
384
+ var buffer = fs.readFileSync(file);
385
+ // Convierte la data binaria a cadena codificada en base64.
386
+ return resolve(new Buffer(buffer).toString('base64'));
387
+ } catch (e) {
388
+ reject(e);
389
+ }
390
+ });
391
+ }
392
+
393
+ export function BufferFile(file: any) {
394
+ return new Promise(function (resolve, reject) {
395
+ try {
396
+ // Lee data binaria.
397
+ var buffer = fs.readFileSync(file);
398
+ // Convierte la data binaria a cadena codificada en base64.
399
+ return resolve(buffer);
400
+ } catch (e) {
401
+ reject(e);
402
+ }
403
+ });
404
+ }
405
+
406
+ export function WriteFileContent(fileName: string, data: string, encode: string, safe?: boolean): Promise<boolean> {
407
+
408
+ // Armo promesa para devolver
409
+ return new Promise(function (resolve, reject) {
410
+ // Escribo el contenido del archivo
411
+ try {
412
+ fs.writeFile(fileName, data, { encoding: encode }, function (err: any) {
413
+ if (err) {
414
+ if (safe)
415
+ return resolve(null);
416
+ else
417
+ return reject(err);
418
+ } else {
419
+ return resolve(true);
420
+ }
421
+ });
422
+ } catch (e) {
423
+ // Algo fallo, lanzo error
424
+ if (safe)
425
+ resolve(null);
426
+ else
427
+ reject(e);
428
+ }
429
+ });
430
+ }
431
+
432
+ export function ZipFolder(srcFolder: string, zipFilePath: string): Promise<boolean> {
433
+
434
+ // Armo promesa para devolver
435
+ return new Promise<boolean>((resolve, reject) => {
436
+ // Comprimo la carpeta en el filename recibido
437
+ try {
438
+ zipFolder(srcFolder, zipFilePath, function (err: any) {
439
+ // Si no hay errores devuelvo true
440
+ resolve(err === null || err === undefined);
441
+ });
442
+ } catch (e) {
443
+ // Algo fallo, lanzo error
444
+ reject(e);
445
+ }
446
+ });
447
+ }
448
+
449
+ export function UnZipFolder(zipFilePath: string, destinationPath?: string): Promise<boolean> {
450
+
451
+ // Si el path de destino no existe uso el mismo nombre del archivo
452
+ destinationPath = destinationPath || zipFilePath;
453
+
454
+ // Armo promesa para devolver
455
+ return new Promise<boolean>((resolve, reject) => {
456
+ // Descomprimo el archivo en carpeta con rl propio filename
457
+ try {
458
+ extract(
459
+ zipFilePath,
460
+ {
461
+ dir: destinationPath
462
+ },
463
+ function (err) {
464
+ if (err) {
465
+ return reject(err);
466
+ } else {
467
+ return resolve(true);
468
+ }
469
+ }
470
+ );
471
+ } catch (e) {
472
+ // Algo fallo, lanzo error
473
+ reject(e);
474
+ }
475
+ });
476
+ }
477
+
478
+ export function UnRarFolder(rarFilePath: string, destinationPath?: string): Promise<boolean> {
479
+
480
+ // Si el path de destino no existe uso el mismo nombre del archivo
481
+ destinationPath = destinationPath || rarFilePath;
482
+
483
+ // Creo el directorio para descomprimor
484
+ return CreateFolder(destinationPath)
485
+ .then(
486
+ result => {
487
+ // Si existe ya salgo
488
+ if (!result) throw 'No se pudo crear el directorio \'' + destinationPath + '\'';
489
+
490
+ // Armo promesa para devolver
491
+ return new Promise<boolean>((resolve, reject) => {
492
+ // Descomprimo el archivo en carpeta con rl propio filename
493
+ try {
494
+ // Armo el comando para descomprimir el rar
495
+ let cmd: string = 'unrar x "' + rarFilePath + '" "' + destinationPath + '"';
496
+
497
+ // Ejecuto el comando y obtengo el resultado
498
+ exec(cmd, function (err: any, stdout: string, stderr: string) {
499
+ if (err) {
500
+ return reject(err);
501
+ } else {
502
+ return resolve(true);
503
+ }
504
+ });
505
+ } catch (e) {
506
+ // Algo fallo, lanzo error
507
+ reject(e);
508
+ }
509
+ });
510
+ }
511
+ );
512
+ }
513
+
514
+ export function GetFolderTree(folderPath: string, extensionExclude?: string[], extensionFilter?: string[]): Promise<any[]> {
515
+
516
+ // Armo promesa para devolver
517
+ return new Promise(function (resolve, reject) {
518
+
519
+ // Si los filtros me vienen vacios los inicializo
520
+ extensionExclude = extensionExclude || [];
521
+ extensionFilter = extensionFilter || [];
522
+
523
+ // Funcion para buscar archivos recurisvamente
524
+ let walk = function (dir: string, obj: any[], done: any) {
525
+
526
+ // Busco los elementos en el directorio
527
+ fs.readdir(dir, function (err, list) {
528
+
529
+ // Si hay errores no sigo
530
+ if (err) return done(err);
531
+
532
+ // Obtengo cantidad de elementos encontrados
533
+ let pending = list.length;
534
+ // Si no hay elementos ya salgo
535
+ if (!pending) return done(null);
536
+
537
+ // Recorro elementos obtenidos
538
+ list.forEach(function (fileName) {
539
+
540
+ // Obtengo la ruta del elemento
541
+ let filePath: string = path.resolve(dir, fileName);
542
+
543
+ // Obtengo propiedades del elemento
544
+ fs.stat(filePath, function (err, stat) {
545
+
546
+ // Evaluo si el elemento es un directorio
547
+ if (stat && stat.isDirectory()) {
548
+
549
+ // Armo el el objeto directorio
550
+ let objDirectory: any = {
551
+ name: fileName,
552
+ relativePath: path.relative(folderPath, filePath).replace(/\\/g, '/'),
553
+ fullPath: filePath,
554
+ type: 'directory',
555
+ children: []
556
+ };
557
+
558
+ // Agrego el directorio al arbol
559
+ obj.push(objDirectory);
560
+
561
+ // Llamo a la funcion recursivamente
562
+ walk(filePath, objDirectory.children, function (err: any, res: any[]) {
563
+ // Obtengo el size del directorio completo
564
+ objDirectory.size = objDirectory.children.reduce((prev: number, cur: any) => prev + cur.size, 0);
565
+ // Chequeo si quedan mas elementos para procesar
566
+ if (!--pending) done(null);
567
+ });
568
+ } else {
569
+ // Obtengo la extension del archivo
570
+ let fileExtension: string = path.extname(fileName).toLowerCase().slice(1);
571
+
572
+ // Flag para saber si hay que agregarlo o no
573
+ let skipFile: boolean = false;
574
+ // Si tengo exclusion de extensiones y la extension esta incluida activo el skip
575
+ if (fileExtension && extensionExclude.length && extensionExclude.indexOf(fileExtension) >= 0) skipFile = true;
576
+ // Si tengo filtro de extensiones y la extension no esta incluida activo el skip
577
+ if (extensionFilter.length && (extensionFilter.indexOf(fileExtension) === -1 || !fileExtension)) skipFile = true;
578
+
579
+ // Si no esta el skip lo agrego a la lista
580
+ if (!skipFile) {
581
+ // Armo el el objeto directorio
582
+ let objFile: any = {
583
+ name: fileName,
584
+ type: 'file',
585
+ extension: fileExtension,
586
+ relativePath: path.relative(folderPath, filePath).replace(/\\/g, '/'),
587
+ fullPath: filePath,
588
+ size: stat.size
589
+ };
590
+ // Agrego el archivo al arbol
591
+ obj.push(objFile);
592
+ }
593
+
594
+ // Chequeo si quedan mas elementos para procesar
595
+ if (!--pending) done(null);
596
+ }
597
+ });
598
+ });
599
+ });
600
+ };
601
+
602
+ // Obtengo el nombre de la carpeta
603
+ let folderName: string = path.basename(folderPath);
604
+ // Armo el el objeto del directorio principal
605
+ let objMainDirectory: any = {
606
+ name: folderName,
607
+ type: 'directory',
608
+ relativePath: path.relative(folderPath, folderPath).replace(/\\/g, '/'),
609
+ fullPath: folderPath,
610
+ children: []
611
+ };
612
+
613
+ // Objeto arbol que voy a devolver
614
+ let folderTree: any = [];
615
+ // Agrego el directorio al arbol
616
+ folderTree.push(objMainDirectory);
617
+
618
+ // Lanzo el walker y le paso la referencia a la carpeta principal
619
+ walk(folderPath, objMainDirectory.children, function (err: any, results: any[]) {
620
+ // Si hubo algun error hago el reject de la promesa
621
+ if (err) return reject(err);
622
+ // Obtengo el size del directorio completo
623
+ objMainDirectory.size = objMainDirectory.children.reduce((prev: number, cur: any) => prev + cur.size, 0);
624
+ //Devuelvo el objeto arbol completo
625
+ resolve(folderTree);
626
+ });
627
+ });
628
+ }
629
+
630
+ export function GetFolderFiles(folderPath: string, extensionExclude?: string[], extensionFilter?: string[], recursive?: boolean): Promise<any[]> {
631
+
632
+ // Armo promesa para devolver
633
+ return new Promise(function (resolve, reject) {
634
+
635
+ // Si los filtros me vienen vacios los inicializo
636
+ extensionExclude = extensionExclude || [];
637
+ extensionFilter = extensionFilter || [];
638
+ recursive = (recursive === true);
639
+
640
+ // Funcion para buscar archivos recurisvamente
641
+ let walk = function (dir: string, obj: any[], done: any) {
642
+
643
+ // Busco los elementos en el directorio
644
+ fs.readdir(dir, function (err, list) {
645
+
646
+ // Si hay errores no sigo
647
+ if (err) return done(err);
648
+
649
+ // Obtengo cantidad de elementos encontrados
650
+ let pending = list.length;
651
+ // Si no hay elementos ya salgo
652
+ if (!pending) return done(null);
653
+
654
+ // Recorro elementos obtenidos
655
+ list.forEach(function (fileName) {
656
+
657
+ // Obtengo la ruta del elemento
658
+ let filePath: string = path.resolve(dir, fileName);
659
+
660
+ // Obtengo propiedades del elemento
661
+ fs.stat(filePath, function (err, stat) {
662
+
663
+ // Evaluo si el elemento es un directorio
664
+ if (stat && stat.isDirectory()) {
665
+
666
+ // Armo el el objeto directorio
667
+ let objDirectory: any = {
668
+ name: fileName,
669
+ relativePath: path.relative(folderPath, filePath).replace(/\\/g, '/'),
670
+ fullPath: filePath,
671
+ type: 'directory',
672
+ children: []
673
+ };
674
+
675
+ // Agrego el directorio al arbol
676
+ obj.push(objDirectory);
677
+
678
+ // Segun el valor del flag proceso la carpeta recursivamente o no
679
+ if (recursive) {
680
+ // Llamo a la funcion recursivamente
681
+ walk(filePath, obj, function (err: any, res: any[]) {
682
+ // Chequeo si quedan mas elementos para procesar
683
+ if (!--pending) done(null);
684
+ });
685
+ } else {
686
+ // Chequeo si quedan mas elementos para procesar
687
+ if (!--pending) done(null);
688
+ }
689
+ } else {
690
+ // Obtengo la extension del archivo
691
+ let fileExtension: string = path.extname(fileName).toLowerCase().slice(1);
692
+
693
+ // Flag para saber si hay que agregarlo o no
694
+ let skipFile: boolean = false;
695
+ // Si tengo exclusion de extensiones y la extension esta incluida activo el skip
696
+ if (fileExtension && extensionExclude.length && extensionExclude.indexOf(fileExtension) >= 0) skipFile = true;
697
+ // Si tengo filtro de extensiones y la extension no esta incluida activo el skip
698
+ if (extensionFilter.length && (extensionFilter.indexOf(fileExtension) === -1 || !fileExtension)) skipFile = true;
699
+
700
+ // Si no esta el skip lo agrego a la lista
701
+ if (!skipFile) {
702
+ // Armo el el objeto directorio
703
+ let objFile: any = {
704
+ name: fileName,
705
+ type: 'file',
706
+ extension: fileExtension,
707
+ relativePath: path.relative(folderPath, filePath).replace(/\\/g, '/'),
708
+ fullPath: filePath,
709
+ size: stat.size
710
+ };
711
+ // Agrego el archivo al arbol
712
+ obj.push(objFile);
713
+ }
714
+
715
+ // Chequeo si quedan mas elementos para procesar
716
+ if (!--pending) done(null);
717
+ }
718
+ });
719
+ });
720
+ });
721
+ };
722
+
723
+ // Objeto arbol que voy a devolver
724
+ let folderFiles: any[] = [];
725
+
726
+ // Lanzo el walker y le paso la referencia a la carpeta principal
727
+ walk(folderPath, folderFiles, function (err: any, results: any[]) {
728
+ // Verifico si hubo algun error
729
+ if (err) {
730
+ // Obtengo mensajes de error
731
+ let errorMsg: string = (typeof err === 'string' ? err : err.message || err.description || '');
732
+ // Escribo a log
733
+ logger.error('Error al consultar archivos de la carpeta snapshot \'' + folderPath + '\': ' + errorMsg);
734
+ // Devuelvo array vacío
735
+ resolve([]);
736
+ } else {
737
+ // Devuelvo el objeto arbol completo
738
+ resolve(folderFiles);
739
+ }
740
+ });
741
+ });
742
+ }
743
+
744
+ export function UploadFileToServer(
745
+ fileName: string, destFolder: string, req: any, res: any,
746
+ types?: string, fieldName?: string, single?: boolean,
747
+ replace?: boolean, fileSizeLimit?: number): Promise<boolean> {
748
+
749
+ // Valores por defecto
750
+ single = (single === false ? single : true);
751
+ fieldName = (fieldName ? fieldName : 'file');
752
+ replace = (replace === false ? replace : true);
753
+ fileSizeLimit = (fileSizeLimit ? fileSizeLimit : FILE_UPLOAD_LIMIT);
754
+
755
+ // Inicializo contador de multer
756
+ req.multerCounter = 0;
757
+
758
+ // Configuro el storage de multer
759
+ let storageEngine: multer.StorageEngine = multer.diskStorage({
760
+ destination: function (req: any, file: any, cb: any) {
761
+ cb(null, destFolder);
762
+ },
763
+ filename: function (req: any, file: any, cb: any) {
764
+ cb(null, fileName || file.originalname);
765
+ }
766
+ });
767
+
768
+ // Armo el filtro de tipo de archivos
769
+ let fileFilter: any = function (req: any, file: any, cb: any) {
770
+ // Incremento contador
771
+ req.multerCounter++;
772
+ // Armo el regex para matchear con el filename
773
+ let typesRegEx: string = '\.(' + (types.toLowerCase() || '.+') + ')$';
774
+ let regEx: RegExp = new RegExp(typesRegEx);
775
+ // Si me llego un tipo verifico que el archivo matchee
776
+ if (types && !file.originalname.toLowerCase().match(regEx)) {
777
+ // Error de tamaño de archivo
778
+ logger.error('El archivo recibido no está dentro de los tipos permitidos (' + types.toLowerCase() + ').');
779
+ // return cb('ERROR_FILE_TYPE_NOT_ALLOWED' + '|' + types.toLowerCase().replace(/\|/g, ' '));
780
+ return cb(new Error('Only ' + types.toLowerCase() + ' files are allowed!'));
781
+ }
782
+ // Segun el valor del flag de replace verifico si el archivo existe
783
+ if (replace) {
784
+ // Paso el filtro, ejecuto callback
785
+ cb(null, true);
786
+ } else {
787
+ // Verifico si el archivo existe
788
+ ExistInFileSystem(path.join(destFolder, file.originalname))
789
+ .then(
790
+ result => {
791
+ // Si el archivo existe devuelvo false
792
+ return cb(null, !result);
793
+ }
794
+ );
795
+ }
796
+ };
797
+
798
+ // Handler para el upload
799
+ let upload: any;
800
+
801
+ // Si segun el caso uso funcion para un archivo o un array
802
+ if (single) {
803
+ upload = multer({
804
+ storage: storageEngine,
805
+ fileFilter: fileFilter,
806
+ limits: { fileSize: fileSizeLimit },
807
+ }).single(fieldName);
808
+ } else {
809
+ upload = multer({
810
+ storage: storageEngine,
811
+ fileFilter: fileFilter,
812
+ limits: { fileSize: fileSizeLimit },
813
+ }).array(fieldName);
814
+ }
815
+
816
+ // Obtengo la ruta temporal del template a subir
817
+ let tempFilename: string = path.join(destFolder, fileName);
818
+
819
+ // Si ya existe el archivo a subir lo elimino
820
+ return DummyPromise()
821
+ .then(
822
+ result => {
823
+ // Si no me llego archivo no borro nada (se usa el nombre original)
824
+ if (!fileName) return true;
825
+
826
+ // Si tengo filename lo borro
827
+ return DeleteFolder(tempFilename);
828
+ }
829
+ ).then(
830
+ resultDelete => {
831
+ // Verifico que el delete haya funcionado bien
832
+ if (!resultDelete) throw 'Cannot delete existing file \'' + tempFilename + '\'';
833
+
834
+ // Sigo con una promesa armada a mano (el multer es con callbacks)
835
+ return new Promise<boolean>((resolve, reject) => {
836
+ // Ejecuto el upload
837
+ return upload(req, res, function (err: any) {
838
+ // Verifico errores
839
+ if (err && err.code === 'LIMIT_FILE_SIZE') {
840
+ // Error de tamaño de archivo
841
+ logger.error('El archivo recibido supera el límite permitido (' + fileSizeLimit.toString() + 'bytes).');
842
+ reject('ERROR_FILE_UPLOAD_LIMIT' + '|' + (Math.round(100.00 * fileSizeLimit / 1024 / 1024) / 100.00).toString());
843
+ } else if (err) {
844
+ // Error generico
845
+ logger.error('Error al subir archivo: ' + err);
846
+ reject(err);
847
+ } else {
848
+ // Resultado correcto
849
+ resolve(true);
850
+ }
851
+ });
852
+ });
853
+ }
854
+ );
855
+ }
856
+
857
+ // export function GenerateSnapshot(fileURL: string, fileDest: string, thumbnail?: boolean): Promise<boolean> {
858
+
859
+ // // Armo promesa para devolver
860
+ // return new Promise<boolean>((resolve, reject) => {
861
+
862
+ // // Escribo a log
863
+ // logger.info('Generando snapshot para \'' + fileURL + '\' en \'' + fileDest + '\'');
864
+
865
+ // // Browser y pagina del API de puppeteer
866
+ // let browser: puppeteer.Browser;
867
+ // let page: puppeteer.Page;
868
+
869
+ // // Opciones para inicializar el chromium
870
+ // let puppeteerOpts: puppeteer.LaunchOptions = {
871
+ // args: ['--no-sandbox', '--disable-setuid-sandbox'],
872
+ // ignoreHTTPSErrors: true,
873
+ // };
874
+
875
+ // // Si tengo configurado un ejecutable para chromium lo uso
876
+ // if (CHROMIUM_EXEC_PATH) puppeteerOpts.executablePath = CHROMIUM_EXEC_PATH;
877
+
878
+ // // Opciones para el snapshot
879
+ // let screenshotOpts: puppeteer.ScreenshotOptions = {
880
+ // path: fileDest,
881
+ // type: (TEMPLATE_PREVIEW_EXT === '.jpg' ? 'jpeg' : 'png'),
882
+ // quality: (thumbnail ? 75 : 100),
883
+ // fullPage: false,
884
+ // omitBackground: false,
885
+ // };
886
+
887
+ // // Viewport del navegador
888
+ // let viewport: puppeteer.Viewport = {
889
+ // width: 1366,
890
+ // height: 768,
891
+ // deviceScaleFactor: (thumbnail ? 0.3 : 1),
892
+ // isMobile: false,
893
+ // hasTouch: false,
894
+ // isLandscape: false,
895
+ // };
896
+
897
+ // // Opciones de navegación
898
+ // let navigationOpts: puppeteer.NavigationOptions = {
899
+ // timeout: 10000
900
+ // };
901
+
902
+ // // Flags de pasos completados
903
+ // let navigationCompleted: boolean = false;
904
+ // let snapshotCompleted: boolean = false;
905
+ // let closeCompleted: boolean = false;
906
+
907
+ // // Inicializo el browser
908
+ // return puppeteer.launch(puppeteerOpts).then(
909
+ // resultBrowser => {
910
+ // // Obtengo el browser
911
+ // browser = resultBrowser;
912
+
913
+ // // Inicializo nueva pagina
914
+ // return browser.newPage();
915
+ // }
916
+ // ).then(
917
+ // resultPage => {
918
+ // // Obtengo la página
919
+ // page = resultPage;
920
+
921
+ // // Establezco el viewport
922
+ // page.setViewport(viewport);
923
+
924
+ // // Navego hacia la URL
925
+ // return page.goto(fileURL, navigationOpts);
926
+ // }
927
+ // ).then(
928
+ // resultGoto => {
929
+ // // Actualizo el flag
930
+ // navigationCompleted = true;
931
+
932
+ // // Hago el screenshot de la página
933
+ // return page.screenshot(screenshotOpts);
934
+ // }
935
+ // ).then(
936
+ // resultScreenshot => {
937
+ // // Actualizo el flag
938
+ // snapshotCompleted = true;
939
+
940
+ // // Cierro el browser
941
+ // return browser.close();
942
+ // }
943
+ // ).then(
944
+ // resultClose => {
945
+ // // Actualizo el flag
946
+ // closeCompleted = true;
947
+
948
+ // // Todo OK, sigo
949
+ // return true;
950
+ // }
951
+ // ).catch(
952
+ // err => {
953
+ // // Obtengo mensajes de error
954
+ // let errorMsg: string = (typeof err === 'string' ? err : err.message || err.description || '');
955
+
956
+ // // Escribo a log
957
+ // logger.error('Error al generar snapshot (' + fileDest + '): ' + errorMsg);
958
+
959
+ // // Si no se completo la navegacion saco el snapshot con lo que hay
960
+ // if (page && !navigationCompleted) {
961
+ // // Escribo a log
962
+ // logger.warn('La navegación alcanzó el tiempo limite (' + navigationOpts.timeout.toString() + 'ms). Se generará snapshot con la página parcialmente abierta.');
963
+
964
+ // // Hago el screenshot de la página
965
+ // return page.screenshot(screenshotOpts);
966
+ // } else {
967
+ // // No hago nada
968
+ // return null;
969
+ // }
970
+ // }
971
+ // ).then(
972
+ // resultScreenshot => {
973
+ // // Si el browser esta abierto lo cierro
974
+ // if (browser && !closeCompleted)
975
+ // return browser.close();
976
+ // else
977
+ // return null;
978
+ // }
979
+ // ).then(
980
+ // resultClose => {
981
+ // // Escribo a log
982
+ // logger.info('Snapshot generado exitosamente (' + fileDest + ')');
983
+
984
+ // // Resuelvo con el estado completo del proceso
985
+ // resolve(navigationCompleted && snapshotCompleted && closeCompleted);
986
+ // }
987
+ // ).catch(
988
+ // err => {
989
+ // // Obtengo mensajes de error
990
+ // let errorMsg: string = (typeof err === 'string' ? err : err.message || err.description || '');
991
+
992
+ // // Escribo a log
993
+ // logger.error('Error al generar snapshot (' + fileDest + '): ' + errorMsg);
994
+
995
+ // // Verifico una ultima vez si el close no se hizo
996
+ // if (browser && !closeCompleted) browser.close();
997
+
998
+ // // Algo fallo, devuelvo false
999
+ // resolve(false);
1000
+ // }
1001
+ // );
1002
+ // });
1003
+ // }
1004
+
1005
+ export function JoinPath(route: string, fileName: string): string {
1006
+ return path.join(route, fileName);
1007
+ }