Skip to content

Commit c28a560

Browse files
authored
Merge pull request #128 from launchcodedev/hidden
Adds $hidden directive
2 parents fe8ff7d + c966483 commit c28a560

File tree

4 files changed

+94
-0
lines changed

4 files changed

+94
-0
lines changed

app-config-default-extensions/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ module.exports = {
1818
tryDirective,
1919
ifDirective,
2020
eqDirective,
21+
hiddenDirective,
2122
envDirective,
2223
envVarDirective,
2324
extendsDirective,
@@ -36,6 +37,7 @@ module.exports = {
3637
tryDirective(),
3738
ifDirective(),
3839
eqDirective(),
40+
hiddenDirective(),
3941
v1Compat(),
4042
envDirective(aliases, environmentOverride, environmentSourceNames),
4143
envVarDirective(aliases, environmentOverride, environmentSourceNames),
@@ -59,6 +61,7 @@ module.exports = {
5961
tryDirective,
6062
ifDirective,
6163
eqDirective,
64+
hiddenDirective,
6265
extendsDirective,
6366
extendsSelfDirective,
6467
overrideDirective,
@@ -69,6 +72,7 @@ module.exports = {
6972
tryDirective(),
7073
ifDirective(),
7174
eqDirective(),
75+
hiddenDirective(),
7276
extendsDirective(),
7377
extendsSelfDirective(),
7478
overrideDirective(),

app-config-extensions/src/index.test.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
tryDirective,
77
ifDirective,
88
eqDirective,
9+
hiddenDirective,
910
envDirective,
1011
envVarDirective,
1112
extendsDirective,
@@ -229,6 +230,69 @@ describe('$eq directive', () => {
229230
});
230231
});
231232

233+
describe('$hidden directive', () => {
234+
it('doesnt include hidden', async () => {
235+
const source = new LiteralSource({
236+
$hidden: {},
237+
});
238+
239+
expect(await source.readToJSON([hiddenDirective()])).toEqual({});
240+
});
241+
242+
it('merges hidden', async () => {
243+
const source = new LiteralSource({
244+
$hidden: {},
245+
foo: true,
246+
});
247+
248+
expect(await source.readToJSON([hiddenDirective()])).toEqual({ foo: true });
249+
});
250+
251+
it('references hidden property', async () => {
252+
const source = new LiteralSource({
253+
$hidden: {
254+
foo: 42,
255+
},
256+
baz: {
257+
$hidden: 44,
258+
},
259+
foo: {
260+
$extendsSelf: '$hidden.foo',
261+
},
262+
bar: {
263+
$extendsSelf: 'baz.$hidden',
264+
},
265+
});
266+
267+
expect(await source.readToJSON([extendsSelfDirective(), hiddenDirective()])).toEqual({
268+
baz: {},
269+
foo: 42,
270+
bar: 44,
271+
});
272+
});
273+
274+
it('references hidden property and processes it', async () => {
275+
process.env.FOO = 'bar';
276+
277+
const source = new LiteralSource({
278+
$hidden: {
279+
foo: {
280+
$envVar: 'FOO',
281+
},
282+
},
283+
foo: {
284+
$extendsSelf: '$hidden.foo',
285+
},
286+
});
287+
288+
expect(
289+
await source.readToJSON([extendsSelfDirective(), hiddenDirective(), envVarDirective()]),
290+
).toEqual({
291+
foo: 'bar',
292+
});
293+
});
294+
});
295+
232296
describe('$extends directive', () => {
233297
it('fails if file is missing', async () => {
234298
const source = new LiteralSource({

app-config-extensions/src/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ export function eqDirective(): ParsingExtension {
118118
);
119119
}
120120

121+
/** Prpoerties that are removed, used by references */
122+
export function hiddenDirective(): ParsingExtension {
123+
return forKey('$hidden', () => async (parse) => {
124+
return parse({}, { shouldMerge: true });
125+
});
126+
}
127+
121128
/** Uses another file as overriding values, layering them on top of current file */
122129
export function overrideDirective(): ParsingExtension {
123130
return fileReferenceDirective('$override', { shouldOverride: true });

docs/guide/intro/extensions.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,25 @@ $if:
181181
$else: bar
182182
```
183183

184+
## The `$hidden` Directive
185+
186+
You can use `$hidden` anywhere - the values underneath it are not processed directly.
187+
This is useful for shared values.
188+
189+
```yaml
190+
$hidden:
191+
foo: 42
192+
193+
bar:
194+
baz:
195+
$extendsSelf: '$hidden.foo'
196+
197+
qux:
198+
$extendsSelf: '$hidden.foo'
199+
```
200+
201+
This results in `{ bar: { baz: 42 }, qux: 42 }`.
202+
184203
## The `$timestamp` Directive
185204

186205
Allows injecting the current date and time into configuration. While this option is useful,

0 commit comments

Comments
 (0)