Skip to content

Commit 1e7836c

Browse files
committed
feat: reads env from parsing context
1 parent 6304de1 commit 1e7836c

File tree

4 files changed

+40
-40
lines changed

4 files changed

+40
-40
lines changed

app-config-core/src/parsed-value.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export type ParsingExtensionKey =
1717
| [typeof InArray, number]
1818
| [typeof Root];
1919

20-
export type ParsingContext = Record<string, string>;
20+
export type ParsingContext = Record<string, string | Record<string, string>>;
2121

2222
export type ParsingExtension<T extends Json = Json> = (
2323
value: T,

app-config-default-extensions/index.js

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,7 @@
77
const { defaultAliases } = require('@app-config/node');
88

99
module.exports = {
10-
defaultExtensions(
11-
aliases = defaultAliases,
12-
environmentOverride,
13-
symmetricKey,
14-
environmentSourceNames,
15-
) {
10+
defaultExtensions() {
1611
const {
1712
unescape$Directives,
1813
tryDirective,
@@ -34,13 +29,13 @@ module.exports = {
3429
ifDirective(),
3530
eqDirective(),
3631
hiddenDirective(),
37-
envDirective(aliases, environmentOverride, environmentSourceNames),
38-
envVarDirective(aliases, environmentOverride, environmentSourceNames),
32+
envDirective(),
33+
envVarDirective(),
3934
extendsDirective(),
4035
extendsSelfDirective(),
4136
overrideDirective(),
4237
timestampDirective(),
43-
substituteDirective(aliases, environmentOverride, environmentSourceNames),
38+
substituteDirective(),
4439
];
4540
},
4641
defaultEnvExtensions() {

app-config-extensions/src/index.ts

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@ import {
1414
FailedToSelectSubObject,
1515
Fallbackable,
1616
InObject,
17+
ParsingContext,
1718
} from '@app-config/core';
1819
import {
1920
currentEnvironment,
20-
defaultAliases,
2121
resolveFilepath,
22-
EnvironmentAliases,
2322
FileSource,
23+
defaultAliases,
24+
EnvironmentAliases,
2425
} from '@app-config/node';
2526
import { 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+
536541
const validateObject: ValidationFunction<
537542
Record<string, any>
538543
> = validationFunction(({ emptySchema }) => emptySchema().addAdditionalProperties());

app-config-v1-compat/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import { logger } from '@app-config/logging';
77

88
/** V1 app-config compatibility */
99
export default function v1Compat(): ParsingExtension {
10-
return (value, [[_, key], ...context]) => {
10+
return (value, [[_, key], ...parents]) => {
1111
// only apply in top-level app-config property
12-
if (context[context.length - 1]?.[0] !== Root) {
12+
if (parents[parents.length - 1]?.[0] !== Root) {
1313
return false;
1414
}
1515

0 commit comments

Comments
 (0)