11import { identity , isInteger } from 'lodash-es' ;
22import log4js from 'log4js' ;
3- import { dirname , resolve as resolvePath } from 'path' ;
4- import { fileURLToPath } from 'url' ;
3+ import { dirname , resolve as resolvePath } from 'node: path' ;
4+ import { fileURLToPath } from 'node: url' ;
55
66const logLevels = [ 'FATAL' , 'ERROR' , 'WARN' , 'INFO' , 'DEBUG' , 'TRACE' ] ;
77
88export const root = dirname ( fileURLToPath ( import . meta. url ) ) ;
99
10+ // eslint-disable-next-line max-lines-per-function
1011export async function loadConfig ( ) {
1112 await loadDotenv ( ) ;
1213
13- const env = process . env . NODE_ENV ?? 'development' ;
14+ const environment = process . env . NODE_ENV ?? 'development' ;
1415
1516 const dbFile = resolvePath (
1617 root ,
17- parseEnvString ( 'REVPROD_DB_FILE' , 'db.json' )
18+ parseEnvironmentString ( 'REVPROD_DB_FILE' , 'db.json' )
1819 ) ;
1920
20- const host = parseEnvString ( 'REVPROD_LISTEN_HOST' , '0.0.0.0' ) ;
21- const port = parseEnvPort ( 'REVPROD_LISTEN_PORT' , 3000 ) ;
21+ const host = parseEnvironmentString ( 'REVPROD_LISTEN_HOST' , '0.0.0.0' ) ;
22+ const port = parseEnvironmentPort ( 'REVPROD_LISTEN_PORT' , 3000 ) ;
2223
23- const logLevel = parseEnvEnum (
24+ const logLevel = parseEnvironmentEnum (
2425 'REVPROD_LOG_LEVEL' ,
2526 logLevels ,
26- env === 'production' ? 'DEBUG' : 'TRACE' ,
27+ environment === 'production' ? 'DEBUG' : 'TRACE' ,
2728 value => value . toUpperCase ( )
2829 ) ;
2930
30- const cors = parseEnvBoolean ( 'REVPROD_CORS' , false ) ;
31- const corsOrigins = parseEnvString ( 'REVPROD_CORS_ORIGINS' , [ ] , origins =>
32- origins . split ( ',' )
31+ const cors = parseEnvironmentBoolean ( 'REVPROD_CORS' , false ) ;
32+ const corsOrigins = parseEnvironmentString (
33+ 'REVPROD_CORS_ORIGINS' ,
34+ [ ] ,
35+ origins => origins . split ( ',' )
3336 ) ;
3437
35- const title = parseEnvString ( 'REVPROD_TITLE' , 'The Revolutionary Product' ) ;
36- const landingPageBaseUrl = parseEnvString (
38+ const title = parseEnvironmentString (
39+ 'REVPROD_TITLE' ,
40+ 'The Revolutionary Product'
41+ ) ;
42+ const landingPageBaseUrl = parseEnvironmentString (
3743 'REVPROD_LANDING_PAGE_BASE_URL' ,
3844 ''
3945 ) ;
@@ -45,20 +51,20 @@ export async function loadConfig() {
4551 }
4652
4753 const logger = createLogger ( 'config' ) ;
48- logger . info ( `Environment: ${ env } ` ) ;
54+ logger . info ( `Environment: ${ environment } ` ) ;
4955 logger . info ( `Log level: ${ logLevel } ` ) ;
5056 logger . info ( `CORS enabled: ${ cors } ` ) ;
5157 logger . info (
5258 `CORS allowed origins: ${
53- corsOrigins . length ? corsOrigins . join ( ', ' ) : 'all'
59+ corsOrigins . length === 0 ? 'all' : corsOrigins . join ( ', ' )
5460 } `
5561 ) ;
5662
5763 return {
5864 // Paths
5965 dbFile,
6066 // Environment,
61- env,
67+ env : environment ,
6268 // Server
6369 host,
6470 port,
@@ -77,7 +83,7 @@ async function loadDotenv() {
7783 let dotenv ;
7884 try {
7985 dotenv = await import ( 'dotenv' ) ;
80- } catch ( err ) {
86+ } catch {
8187 // Ignore
8288 }
8389
@@ -86,40 +92,45 @@ async function loadDotenv() {
8692 }
8793}
8894
89- function getEnvString ( varName , required = true ) {
90- const value = process . env [ varName ] ;
95+ function getEnvironmentString ( variableName , required = true ) {
96+ const value = process . env [ variableName ] ;
9197 if ( required && value === undefined ) {
92- throw new Error ( `$${ varName } is required` ) ;
98+ throw new Error ( `$${ variableName } is required` ) ;
9399 }
94100
95101 return value ;
96102}
97103
98- function parseEnvBoolean ( varName , defaultValue ) {
99- const value = getEnvString ( varName , defaultValue === undefined ) ;
104+ function parseEnvironmentBoolean ( variableName , defaultValue ) {
105+ const value = getEnvironmentString ( variableName , defaultValue === undefined ) ;
100106 if ( value === undefined ) {
101107 return defaultValue ;
102- } else if ( value . match ( / ^ (?: 1 | y | y e s | t | t r u e ) $ / u) ) {
108+ } else if ( / ^ (?: 1 | y | y e s | t | t r u e ) $ / u. text ( value ) ) {
103109 return true ;
104- } else if ( value . match ( / ^ (?: 0 | n | n o | f | f a l s e ) $ / u) ) {
110+ } else if ( / ^ (?: 0 | n | n o | f | f a l s e ) $ / u. test ( value ) ) {
105111 return false ;
106- } else {
107- throw new Error (
108- `$${ varName } must be a boolean, but its value is ${ JSON . stringify ( value ) } `
109- ) ;
110112 }
113+
114+ throw new Error (
115+ `$${ variableName } must be a boolean, but its value is ${ JSON . stringify ( value ) } `
116+ ) ;
111117}
112118
113- function parseEnvEnum ( varName , allowedValues , defaultValue , coerce = identity ) {
114- const value = getEnvString ( varName , defaultValue === undefined ) ;
119+ function parseEnvironmentEnum (
120+ variableName ,
121+ allowedValues ,
122+ defaultValue ,
123+ coerce = identity
124+ ) {
125+ const value = getEnvironmentString ( variableName , defaultValue === undefined ) ;
115126 if ( value === undefined ) {
116127 return defaultValue ;
117128 }
118129
119130 const coerced = coerce ( value ) ;
120131 if ( ! allowedValues . includes ( coerced ) ) {
121132 throw new Error (
122- `$${ varName } must be one of ${ allowedValues
133+ `$${ variableName } must be one of ${ allowedValues
123134 . map ( allowed => JSON . stringify ( allowed ) )
124135 . join ( ', ' ) } , but its value is ${ JSON . stringify ( coerced ) } `
125136 ) ;
@@ -128,20 +139,20 @@ function parseEnvEnum(varName, allowedValues, defaultValue, coerce = identity) {
128139 return coerced ;
129140}
130141
131- function parseEnvInt ( varName , defaultValue , min , max ) {
132- const value = getEnvString ( varName , defaultValue === undefined ) ;
142+ function parseEnvironmentInt ( variableName , defaultValue , min , max ) {
143+ const value = getEnvironmentString ( variableName , defaultValue === undefined ) ;
133144 if ( value === undefined ) {
134145 return defaultValue ;
135146 }
136147
137- const parsed = parseInt ( value , 10 ) ;
148+ const parsed = Number . parseInt ( value , 10 ) ;
138149 if (
139150 ! isInteger ( parsed ) ||
140151 ( min !== undefined && value < min ) ||
141152 ( max !== undefined && value > max )
142153 ) {
143154 throw new Error (
144- `$${ varName } must be an integer between ${ min ?? '-Infinity' } and ${
155+ `$${ variableName } must be an integer between ${ min ?? '-Infinity' } and ${
145156 max ?? 'Infinity'
146157 } , but its value is ${ JSON . stringify ( value ) } `
147158 ) ;
@@ -150,12 +161,12 @@ function parseEnvInt(varName, defaultValue, min, max) {
150161 return parsed ;
151162}
152163
153- function parseEnvPort ( varName , defaultValue ) {
154- return parseEnvInt ( varName , defaultValue , 1 , 65_535 ) ;
164+ function parseEnvironmentPort ( variableName , defaultValue ) {
165+ return parseEnvironmentInt ( variableName , defaultValue , 1 , 65_535 ) ;
155166}
156167
157- function parseEnvString ( varName , defaultValue , coerce = identity ) {
158- const value = getEnvString ( varName , defaultValue === undefined ) ;
168+ function parseEnvironmentString ( variableName , defaultValue , coerce = identity ) {
169+ const value = getEnvironmentString ( variableName , defaultValue === undefined ) ;
159170 if ( value === undefined ) {
160171 return defaultValue ;
161172 }
0 commit comments