@@ -14,13 +14,14 @@ import {
14
14
FailedToSelectSubObject ,
15
15
Fallbackable ,
16
16
InObject ,
17
+ ParsingContext ,
17
18
} from '@app-config/core' ;
18
19
import {
19
20
currentEnvironment ,
20
- defaultAliases ,
21
21
resolveFilepath ,
22
- EnvironmentAliases ,
23
22
FileSource ,
23
+ defaultAliases ,
24
+ EnvironmentAliases ,
24
25
} from '@app-config/node' ;
25
26
import { logger } from '@app-config/logging' ;
26
27
@@ -161,19 +162,16 @@ export function extendsSelfDirective(): ParsingExtension {
161
162
}
162
163
163
164
/** Looks up an environment-specific value ($env) */
164
- export function envDirective (
165
- aliases : EnvironmentAliases = defaultAliases ,
166
- environmentOverride ?: string ,
167
- environmentSourceNames ?: string [ ] | string ,
168
- ) : ParsingExtension {
169
- const environment = environmentOverride ?? currentEnvironment ( aliases , environmentSourceNames ) ;
165
+ export function envDirective ( ) : ParsingExtension {
170
166
const metadata = { shouldOverride : true } ;
171
167
172
168
return forKey (
173
169
'$env' ,
174
170
validateOptions (
175
171
( SchemaBuilder ) => SchemaBuilder . emptySchema ( ) . addAdditionalProperties ( ) ,
176
- ( value ) => ( parse ) => {
172
+ ( value , _ , context ) => ( parse ) => {
173
+ const environment = getEnv ( context ) ;
174
+
177
175
if ( ! environment ) {
178
176
if ( 'none' in value ) {
179
177
return parse ( value . none , metadata ) ;
@@ -188,6 +186,8 @@ export function envDirective(
188
186
) ;
189
187
}
190
188
189
+ const aliases = getAliases ( context ) ;
190
+
191
191
for ( const [ envName , envValue ] of Object . entries ( value ) ) {
192
192
if ( envName === environment || aliases [ envName ] === environment ) {
193
193
return parse ( envValue , metadata ) ;
@@ -248,14 +248,8 @@ export function timestampDirective(dateSource: () => Date = () => new Date()): P
248
248
}
249
249
250
250
/** Substitues environment variables */
251
- export function envVarDirective (
252
- aliases : EnvironmentAliases = defaultAliases ,
253
- environmentOverride ?: string ,
254
- environmentSourceNames ?: string [ ] | string ,
255
- ) : ParsingExtension {
256
- const envType = environmentOverride ?? currentEnvironment ( aliases , environmentSourceNames ) ;
257
-
258
- return forKey ( '$envVar' , ( value , parentKeys ) => async ( parse ) => {
251
+ export function envVarDirective ( ) : ParsingExtension {
252
+ return forKey ( '$envVar' , ( value , parentKeys , context ) => async ( parse ) => {
259
253
let name : string ;
260
254
let parseInt = false ;
261
255
let parseFloat = false ;
@@ -279,7 +273,7 @@ export function envVarDirective(
279
273
let resolvedValue = process . env [ name ] ;
280
274
281
275
if ( ! resolvedValue && name === 'APP_CONFIG_ENV' ) {
282
- resolvedValue = envType ;
276
+ resolvedValue = getEnv ( context ) ;
283
277
}
284
278
285
279
if ( resolvedValue ) {
@@ -330,16 +324,12 @@ export function envVarDirective(
330
324
}
331
325
332
326
/** Substitues environment variables found in strings (similar to bash variable substitution) */
333
- export function substituteDirective (
334
- aliases : EnvironmentAliases = defaultAliases ,
335
- environmentOverride ?: string ,
336
- environmentSourceNames ?: string [ ] | string ,
337
- ) : ParsingExtension {
338
- const envType = environmentOverride ?? currentEnvironment ( aliases , environmentSourceNames ) ;
339
-
340
- return forKey ( [ '$substitute' , '$subs' ] , ( value , parentKeys ) => async ( parse ) => {
327
+ export function substituteDirective ( ) : ParsingExtension {
328
+ return forKey ( [ '$substitute' , '$subs' ] , ( value , parentKeys , context ) => async ( parse ) => {
329
+ const environment = getEnv ( context ) ;
330
+
341
331
if ( typeof value === 'string' ) {
342
- return parse ( performAllSubstitutions ( value , envType ) , { shouldFlatten : true } ) ;
332
+ return parse ( performAllSubstitutions ( value , environment ) , { shouldFlatten : true } ) ;
343
333
}
344
334
345
335
validateObject ( value , parentKeys ) ;
@@ -352,7 +342,7 @@ export function substituteDirective(
352
342
let resolvedValue = process . env [ name ] ;
353
343
354
344
if ( ! resolvedValue && name === 'APP_CONFIG_ENV' ) {
355
- resolvedValue = envType ;
345
+ resolvedValue = environment ;
356
346
}
357
347
358
348
if ( resolvedValue ) {
@@ -533,6 +523,21 @@ function performAllSubstitutions(text: string, envType?: string): string {
533
523
return output ;
534
524
}
535
525
526
+ function getAliases ( context : ParsingContext ) {
527
+ const { environmentAliases } = context ;
528
+
529
+ return ( environmentAliases as EnvironmentAliases ) ?? defaultAliases ;
530
+ }
531
+
532
+ function getEnv ( context : ParsingContext ) {
533
+ const { environmentOverride, environmentSourceNames } = context ;
534
+
535
+ return (
536
+ ( environmentOverride as string ) ??
537
+ currentEnvironment ( getAliases ( context ) , environmentSourceNames as string )
538
+ ) ;
539
+ }
540
+
536
541
const validateObject : ValidationFunction <
537
542
Record < string , any >
538
543
> = validationFunction ( ( { emptySchema } ) => emptySchema ( ) . addAdditionalProperties ( ) ) ;
0 commit comments