Skip to content

Commit f9c50c1

Browse files
committed
Hidden envs
1 parent f15128a commit f9c50c1

File tree

4 files changed

+59
-8
lines changed

4 files changed

+59
-8
lines changed

README.md

+24
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,30 @@ mkenv.vars(env).should.eql({ x: 'y', y: 'z'})
180180
```
181181

182182

183+
## mkenv.hidden(env)
184+
mkenv.hidden(env) allows values to be retrieved from the root
185+
186+
```
187+
mkenv(
188+
mkenv.hidden({ z: 'y' }),
189+
mkenv({ 'x': '$z' })
190+
)('x').should.equal('y')
191+
```
192+
193+
194+
mkenv.hidden(env) doesn't allow direct retrieval from the root
195+
196+
```
197+
should.equal(
198+
mkenv(
199+
mkenv.hidden({ z: 'y' }),
200+
mkenv({ 'x': '${z}' })
201+
)('z'),
202+
null
203+
)
204+
```
205+
206+
183207

184208

185209

mkenv.js

+16-7
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11

2-
module.exports = function () {
2+
var mkenv = module.exports = function () {
33
var chain = [].slice.call(arguments, 0);
44

5-
function eval(name, root) {
5+
function eval(name, root, depth) {
66
root = root || eval;
7+
depth = depth || 0;
78
try {
89
var value = null;
910
for ( var i = chain.length - 1; value === null && i >= 0; i-- ) {
1011
var env = chain[i];
1112
if ( typeof env === "function" && env !== eval ) {
12-
value = env(name, root);
13+
value = env(name, root, depth);
1314
} else if ( env && env.hasOwnProperty(name) ) {
1415
value = env[name];
1516
}
@@ -19,7 +20,7 @@ module.exports = function () {
1920

2021
// Simple replacements
2122
value = value.replace(/\$([a-zA-Z0-9_]+)/g, function (m, pkey) {
22-
var v = root(pkey);
23+
var v = root(pkey, root, depth + 1);
2324
return v === null || v === undefined ? '' : v;
2425
})
2526

@@ -30,7 +31,7 @@ module.exports = function () {
3031

3132
value = value.replace(/\$\{([a-zA-Z0-9_\-\\\/]+)\}/g, function (m, pkey) {
3233
numReplacements++;
33-
var v = root(pkey);
34+
var v = root(pkey, root, depth + 1);
3435
return v === null || v === undefined ? '' : v;
3536
})
3637
} while (numReplacements > 0);
@@ -72,12 +73,20 @@ function getKeys(env) {
7273

7374
return Object.keys(keys);
7475
}
75-
module.exports.keys = getKeys;
76+
mkenv.keys = getKeys;
7677

77-
module.exports.vars = function vars(env) {
78+
mkenv.vars = function vars(env) {
7879
var vars = {};
7980
getKeys(env).forEach(function (key) {
8081
vars[key] = env(key);
8182
});
8283
return vars;
8384
}
85+
86+
87+
mkenv.hidden = function hidden(env) {
88+
env = mkenv(env);
89+
return function (key, root, depth) {
90+
return depth ? env(key, root) : null;
91+
}
92+
}

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mkenv",
3-
"version": "1.1.1",
3+
"version": "1.2.0",
44
"description": "Parser/template engine for simple enviroment variable-like text replacements",
55
"main": "mkenv.js",
66
"scripts": {

test/mkenv.js

+18
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,24 @@ describe('mkenv', function () {
155155
})
156156
})
157157

158+
describe('mkenv.hidden(env)', function () {
159+
it('allows values to be retrieved from the root', function () {
160+
mkenv(
161+
mkenv.hidden({ z: 'y' }),
162+
mkenv({ 'x': '$z' })
163+
)('x').should.equal('y')
164+
})
165+
166+
it('doesn\'t allow direct retrieval from the root', function () {
167+
should.equal(
168+
mkenv(
169+
mkenv.hidden({ z: 'y' }),
170+
mkenv({ 'x': '${z}' })
171+
)('z'),
172+
null
173+
)
174+
})
175+
})
158176

159177
docha.doc("\n\n\nDocumentation generated by [Docha](https://github.com/tehsenaus/docha)");
160178
});

0 commit comments

Comments
 (0)