@@ -174,6 +174,10 @@ export function environmentVariableSubstitution(
174
174
stringSchema ( ) ,
175
175
) ;
176
176
177
+ const validateStringOrNull : ValidationFunction < string > = validationFunction (
178
+ ( { fromJsonSchema } ) => fromJsonSchema ( { type : [ 'null' , 'string' ] } as const ) ,
179
+ ) ;
180
+
177
181
return forKey ( [ '$substitute' , '$subs' ] , ( value , key , ctx ) => async ( parse ) => {
178
182
if ( typeof value === 'string' ) {
179
183
return parse ( performAllSubstitutions ( value , envType ) , { shouldFlatten : true } ) ;
@@ -182,7 +186,7 @@ export function environmentVariableSubstitution(
182
186
validateObject ( value , [ ...ctx , key ] ) ;
183
187
if ( Array . isArray ( value ) ) throw new AppConfigError ( '$substitute was given an array' ) ;
184
188
185
- const { $name : variableName , $fallback : fallback } = value ;
189
+ const { $name : variableName , $fallback : fallback , $allowNull : allowNull } = value ;
186
190
validateString ( variableName , [ ...ctx , key , [ InObject , '$name' ] ] ) ;
187
191
188
192
const resolvedValue = process . env [ variableName ] ;
@@ -193,7 +197,12 @@ export function environmentVariableSubstitution(
193
197
194
198
if ( fallback !== undefined ) {
195
199
const fallbackValue = ( await parse ( fallback ) ) . toJSON ( ) ;
196
- validateString ( fallbackValue , [ ...ctx , key , [ InObject , '$fallback' ] ] ) ;
200
+
201
+ if ( allowNull ) {
202
+ validateStringOrNull ( fallbackValue , [ ...ctx , key , [ InObject , '$fallback' ] ] ) ;
203
+ } else {
204
+ validateString ( fallbackValue , [ ...ctx , key , [ InObject , '$fallback' ] ] ) ;
205
+ }
197
206
198
207
return parse ( fallbackValue , { shouldFlatten : true } ) ;
199
208
}
0 commit comments