@@ -14,13 +14,14 @@ import {
1414 FailedToSelectSubObject ,
1515 Fallbackable ,
1616 InObject ,
17+ ParsingContext ,
1718} from '@app-config/core' ;
1819import {
1920 currentEnvironment ,
20- defaultAliases ,
2121 resolveFilepath ,
22- EnvironmentAliases ,
2322 FileSource ,
23+ defaultAliases ,
24+ EnvironmentAliases ,
2425} from '@app-config/node' ;
2526import { logger } from '@app-config/logging' ;
2627
@@ -161,19 +162,16 @@ export function extendsSelfDirective(): ParsingExtension {
161162}
162163
163164/** 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 {
170166 const metadata = { shouldOverride : true } ;
171167
172168 return forKey (
173169 '$env' ,
174170 validateOptions (
175171 ( SchemaBuilder ) => SchemaBuilder . emptySchema ( ) . addAdditionalProperties ( ) ,
176- ( value ) => ( parse ) => {
172+ ( value , _ , context ) => ( parse ) => {
173+ const environment = getEnv ( context ) ;
174+
177175 if ( ! environment ) {
178176 if ( 'none' in value ) {
179177 return parse ( value . none , metadata ) ;
@@ -188,6 +186,8 @@ export function envDirective(
188186 ) ;
189187 }
190188
189+ const aliases = getAliases ( context ) ;
190+
191191 for ( const [ envName , envValue ] of Object . entries ( value ) ) {
192192 if ( envName === environment || aliases [ envName ] === environment ) {
193193 return parse ( envValue , metadata ) ;
@@ -248,14 +248,8 @@ export function timestampDirective(dateSource: () => Date = () => new Date()): P
248248}
249249
250250/** 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 ) => {
259253 let name : string ;
260254 let parseInt = false ;
261255 let parseFloat = false ;
@@ -279,7 +273,7 @@ export function envVarDirective(
279273 let resolvedValue = process . env [ name ] ;
280274
281275 if ( ! resolvedValue && name === 'APP_CONFIG_ENV' ) {
282- resolvedValue = envType ;
276+ resolvedValue = getEnv ( context ) ;
283277 }
284278
285279 if ( resolvedValue ) {
@@ -330,16 +324,12 @@ export function envVarDirective(
330324}
331325
332326/** 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+
341331 if ( typeof value === 'string' ) {
342- return parse ( performAllSubstitutions ( value , envType ) , { shouldFlatten : true } ) ;
332+ return parse ( performAllSubstitutions ( value , environment ) , { shouldFlatten : true } ) ;
343333 }
344334
345335 validateObject ( value , parentKeys ) ;
@@ -352,7 +342,7 @@ export function substituteDirective(
352342 let resolvedValue = process . env [ name ] ;
353343
354344 if ( ! resolvedValue && name === 'APP_CONFIG_ENV' ) {
355- resolvedValue = envType ;
345+ resolvedValue = environment ;
356346 }
357347
358348 if ( resolvedValue ) {
@@ -533,6 +523,21 @@ function performAllSubstitutions(text: string, envType?: string): string {
533523 return output ;
534524}
535525
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+
536541const validateObject : ValidationFunction <
537542 Record < string , any >
538543> = validationFunction ( ( { emptySchema } ) => emptySchema ( ) . addAdditionalProperties ( ) ) ;
0 commit comments