Skip to content

Commit

Permalink
feat(#131): starts test for $extends with env
Browse files Browse the repository at this point in the history
  • Loading branch information
joelgallant committed Apr 10, 2021
1 parent 6285b3d commit 7caed5c
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 15 deletions.
2 changes: 1 addition & 1 deletion app-config-cli/src/validation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export async function validateAllConfigVariants({

await Promise.all(
appConfigFiles.map(async (filename) => {
const parsed = await new FileSource(filename).read();
const parsed = await new FileSource(filename).read(undefined, { environmentAliases });

parsed.visitAll((value) => {
const obj = value.asObject();
Expand Down
25 changes: 25 additions & 0 deletions app-config-extensions/src/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -843,6 +843,31 @@ describe('$env directive', () => {
const parsed2 = await source.read([envDirective()]);
expect(parsed2.toJSON()).toEqual({ sibling: true, testing: false });
});

it('overrides env', async () => {
await withTempFiles(
{
'test-file.yml': `
foo:
$env:
default: 44
dev: 88
`,
},
async (inDir) => {
const source = new LiteralSource({
$extends: {
path: inDir('test-file.yml'),
env: 'development',
},
});

const parsed = await source.read([envDirective(), extendsDirective()]);

expect(parsed.toJSON()).toEqual({ foo: 88 });
},
);
});
});

/* eslint-disable no-template-curly-in-string */
Expand Down
39 changes: 25 additions & 14 deletions app-config-extensions/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -411,26 +411,37 @@ function fileReferenceDirective(keyName: string, meta: ParsedValueMetadata): Par
SchemaBuilder.emptySchema()
.addString('path')
.addBoolean('optional', {}, false)
.addString('select', {}, false),
.addString('select', {}, false)
.addString('env', {}, false),
);

return SchemaBuilder.oneOf(reference, SchemaBuilder.arraySchema(reference));
},
(value) => async (_, __, context, extensions) => {
const retrieveFile = async (filepath: string, subselector?: string, isOptional = false) => {
const resolvedPath = resolveFilepath(context, filepath);
(value, _, context) => async (_, __, originalSource, extensions) => {
const retrieveFile = async (
filepath: string,
subselector?: string,
isOptional = false,
env?: string,
) => {
const resolvedPath = resolveFilepath(originalSource, filepath);

logger.verbose(`Loading file for ${keyName}: ${resolvedPath}`);

const source = new FileSource(resolvedPath);

const parsed = await source.read(extensions).catch((error) => {
if (error instanceof NotFoundError && isOptional) {
return ParsedValue.literal({});
}
const parsed = await source
.read(extensions, {
...context,
environmentOverride: env ?? context.environmentOverride,
})
.catch((error) => {
if (error instanceof NotFoundError && isOptional) {
return ParsedValue.literal({});
}

throw error;
});
throw error;
});

if (subselector) {
const found = parsed.property(subselector.split('.'));
Expand Down Expand Up @@ -458,15 +469,15 @@ function fileReferenceDirective(keyName: string, meta: ParsedValueMetadata): Par
if (typeof ext === 'string') {
parsed = ParsedValue.merge(parsed, await retrieveFile(ext));
} else {
const { path, optional, select } = ext;
const { path, optional, select, env } = ext;

parsed = ParsedValue.merge(parsed, await retrieveFile(path, select, optional));
parsed = ParsedValue.merge(parsed, await retrieveFile(path, select, optional, env));
}
}
} else {
const { path, optional, select } = value;
const { path, optional, select, env } = value;

parsed = await retrieveFile(path, select, optional);
parsed = await retrieveFile(path, select, optional, env);
}

return parsed.assignMeta(meta);
Expand Down

0 comments on commit 7caed5c

Please sign in to comment.