From 820119081d333eb6563db3bf517806f21f6f38c2 Mon Sep 17 00:00:00 2001 From: Mark Stosberg Date: Wed, 6 Apr 2016 15:55:29 -0400 Subject: [PATCH 1/2] Add new failing test for double-deferred config bug. --- test/3-config/default.js | 6 ++++++ test/3-deferred-configs.js | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/test/3-config/default.js b/test/3-config/default.js index dee3adbd..c8153f17 100644 --- a/test/3-config/default.js +++ b/test/3-config/default.js @@ -24,6 +24,12 @@ config.welcomeEmail = { justThis: defer(function () { return "Welcome to this "+this.siteTitle; }), + + doubleDefer: defer(function () { + return "refers to justThis: "+this.welcomeEmail.justThis; + }, 'welcomeEmail.justThis') + + }; config.map = { diff --git a/test/3-deferred-configs.js b/test/3-deferred-configs.js index 02d2dfb8..d4c6d4f9 100644 --- a/test/3-deferred-configs.js +++ b/test/3-deferred-configs.js @@ -41,6 +41,12 @@ vows.describe('Tests for deferred values').addBatch({ assert.deepEqual(CONFIG.get('map.centerPoint'), { lat: 3, lon: 4 }); }, + // With this naming them, there is a risk the resolution order will be wrong and the values won't be deferred. + "defer functions which refer config keys that also have deferred value work if you refer to them by name" : function () { + assert.equal(CONFIG.welcomeEmail.doubleDefer,'refers to justThis: Welcome to this New Instance!'); + }, + + } }) .export(module); From 6996e29f70d6c94080d95935a1eff5c8822df5ee Mon Sep 17 00:00:00 2001 From: Mark Stosberg Date: Wed, 6 Apr 2016 15:56:34 -0400 Subject: [PATCH 2/2] Update defer() function to take an additional argument to declare a dependency. --- defer.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/defer.js b/defer.js index ab96bd37..12df1985 100644 --- a/defer.js +++ b/defer.js @@ -4,9 +4,16 @@ function DeferredConfig () { DeferredConfig.prototype.resolve = function (config) {}; // Accept a function that we'll use to resolve this value later and return a 'deferred' configuration value to resolve it later. -function deferConfig (func) { +function deferConfig (func, dependency) { var obj = Object.create(DeferredConfig.prototype); obj.resolve = func; + + // A dependency on another deferred valuemay also also be declared as string. + // At resolution time, we will then make sure the deferred dependency gets resolved first. + // Ref: https://github.com/lorenwest/node-config/issues/266 + if (dependency) { + obj.dependency = dependency; + } return obj; }