On further digging.. it turns out that loading the json5 file actually removes whatever was populated previously. Thus if config has a value before loadFile(), that value is removed. I can only guess that it's because the value from the file is a string and validate is... nullifying that as it doesn't match the custom format.
And.. that indeed is the problem. I'm using 'coerce' to take the default value as a key to the secrets. If, however, the json5 file loads a value in, coerce tries to use that value as a key... and fails to find a match returning undefined.
I have a custom format that loads values from a set of secrets.
This will use the default value and retrieve the value from the secrets. All well and good.
I also load a json5 file to provide for local overriding. This works fine if testit were a 'String' value.
E.g. testit: { format: 'String', default: 'not overridden', },
json5 file: { testit: "override!" }
In this case, configuration.getProperties().testit == 'override!'.
But.. again, if the format is 'secret-value', the testit value is NOT 'override!', but whatever value is coming from the secrets.
Here's the configuration code (roughly):
const config = convict(schema); config.loadFile(filePath); const configuration = config.getProperties();
console.log(configuration.testit);
On further digging.. it turns out that loading the json5 file actually removes whatever was populated previously. Thus if config has a value before loadFile(), that value is removed. I can only guess that it's because the value from the file is a string and validate is... nullifying that as it doesn't match the custom format.
And.. that indeed is the problem. I'm using 'coerce' to take the default value as a key to the secrets. If, however, the json5 file loads a value in, coerce tries to use that value as a key... and fails to find a match returning undefined.
So.. nevermind.