Commit | Line | Data |
---|---|---|
717c1e56 | 1 | import { EmptyObject } from '../types/EmptyObject'; |
a95873d8 | 2 | import { FileType } from '../types/FileType'; |
e0a50bcd | 3 | import { HandleErrorParams } from '../types/Error'; |
94bb13e9 | 4 | import { JsonType } from '../types/JsonType'; |
e8191622 | 5 | import Utils from './Utils'; |
8eac9a09 | 6 | import chalk from 'chalk'; |
a95873d8 | 7 | import fs from 'fs'; |
9f2e3130 | 8 | import logger from './Logger'; |
23132a44 JB |
9 | |
10 | export default class FileUtils { | |
9d7484a4 | 11 | public static watchJsonFile<T extends JsonType>( |
a95873d8 JB |
12 | logPrefix: string, |
13 | fileType: FileType, | |
14 | file: string, | |
9d7484a4 | 15 | refreshedVariable?: T, |
a95873d8 JB |
16 | listener: fs.WatchListener<string> = (event, filename) => { |
17 | if (filename && event === 'change') { | |
18 | try { | |
19 | logger.debug(logPrefix + ' ' + fileType + ' file ' + file + ' have changed, reload'); | |
9d7484a4 | 20 | refreshedVariable && (refreshedVariable = 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 | } | |
9d7484a4 | 28 | ): fs.FSWatcher { |
a95873d8 JB |
29 | if (file) { |
30 | try { | |
9d7484a4 | 31 | return fs.watch(file, listener); |
a95873d8 JB |
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 | ||
9d7484a4 | 42 | public static handleFileException( |
e7aeea18 | 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 | } |