Apply dependencies update
[e-mobility-charging-stations-simulator.git] / src / utils / FileUtils.ts
CommitLineData
717c1e56 1import { EmptyObject } from '../types/EmptyObject';
a95873d8 2import { FileType } from '../types/FileType';
e0a50bcd 3import { HandleErrorParams } from '../types/Error';
94bb13e9 4import { JsonType } from '../types/JsonType';
e8191622 5import Utils from './Utils';
8eac9a09 6import chalk from 'chalk';
a95873d8 7import fs from 'fs';
9f2e3130 8import logger from './Logger';
23132a44
JB
9
10export default class FileUtils {
94bb13e9 11 static watchJsonFile<T extends JsonType>(
a95873d8
JB
12 logPrefix: string,
13 fileType: FileType,
14 file: string,
15 attribute?: T,
16 listener: fs.WatchListener<string> = (event, filename) => {
17 if (filename && event === 'change') {
18 try {
19 logger.debug(logPrefix + ' ' + fileType + ' file ' + file + ' have changed, reload');
69d65c15 20 attribute && (attribute = JSON.parse(fs.readFileSync(file, 'utf8')) as T);
a95873d8
JB
21 } catch (error) {
22 FileUtils.handleFileException(logPrefix, fileType, file, error as NodeJS.ErrnoException, {
23 throwError: false,
24 });
25 }
26 }
27 }
28 ) {
29 if (file) {
30 try {
31 fs.watch(file, listener);
32 } catch (error) {
33 FileUtils.handleFileException(logPrefix, fileType, file, error as NodeJS.ErrnoException, {
34 throwError: false,
35 });
36 }
37 } else {
38 logger.info(`${logPrefix} No ${fileType} file to watch given. Not monitoring its changes`);
39 }
40 }
41
e7aeea18
JB
42 static handleFileException(
43 logPrefix: string,
a95873d8
JB
44 fileType: FileType,
45 file: string,
e7aeea18
JB
46 error: NodeJS.ErrnoException,
47 params: HandleErrorParams<EmptyObject> = { throwError: true, consoleOut: false }
48 ): void {
e8191622 49 const prefix = !Utils.isEmptyString(logPrefix) ? logPrefix + ' ' : '';
23132a44 50 if (error.code === 'ENOENT') {
e0a50bcd 51 if (params?.consoleOut) {
e7aeea18 52 console.warn(
a95873d8 53 chalk.green(prefix) + chalk.yellow(fileType + ' file ' + file + ' not found: '),
e7aeea18
JB
54 error
55 );
23132a44 56 } else {
a95873d8 57 logger.warn(prefix + fileType + ' file ' + file + ' not found: %j', error);
23132a44 58 }
72f041bd 59 } else if (error.code === 'EEXIST') {
e0a50bcd 60 if (params?.consoleOut) {
e7aeea18 61 console.warn(
a95873d8 62 chalk.green(prefix) + chalk.yellow(fileType + ' file ' + file + ' already exists: '),
e7aeea18
JB
63 error
64 );
72f041bd 65 } else {
a95873d8 66 logger.warn(prefix + fileType + ' file ' + file + ' already exists: %j', error);
72f041bd
JB
67 }
68 } else if (error.code === 'EACCES') {
e0a50bcd 69 if (params?.consoleOut) {
e7aeea18 70 console.warn(
a95873d8 71 chalk.green(prefix) + chalk.yellow(fileType + ' file ' + file + ' access denied: '),
e7aeea18
JB
72 error
73 );
72f041bd 74 } else {
a95873d8 75 logger.warn(prefix + fileType + ' file ' + file + ' access denied: %j', error);
72f041bd 76 }
23132a44 77 } else {
e0a50bcd 78 if (params?.consoleOut) {
e7aeea18 79 console.warn(
a95873d8 80 chalk.green(prefix) + chalk.yellow(fileType + ' file ' + file + ' error: '),
e7aeea18
JB
81 error
82 );
23132a44 83 } else {
a95873d8 84 logger.warn(prefix + fileType + ' file ' + file + ' error: %j', error);
23132a44 85 }
e0a50bcd
JB
86 if (params?.throwError) {
87 throw error;
88 }
23132a44
JB
89 }
90 }
91}