config.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Copyright Epic Games, Inc. All Rights Reserved.
  2. //-- Provides configuration information from file and combines it with default values and command line arguments --//
  3. //-- Hierachy of values: Default Values < Config File < Command Line arguments --//
  4. const fs = require('fs');
  5. const path = require('path');
  6. const argv = require('yargs').argv;
  7. function initConfig(configFile, defaultConfig){
  8. defaultConfig = defaultConfig || {};
  9. // Using object spread syntax: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals
  10. let config = {...defaultConfig};
  11. try{
  12. let configData = fs.readFileSync(configFile, 'UTF8');
  13. fileConfig = JSON.parse(configData);
  14. config = {...config, ...fileConfig}
  15. // Update config file with any additional defaults (does not override existing values if default has changed)
  16. fs.writeFileSync(configFile, JSON.stringify(config, null, '\t'), 'UTF8');
  17. } catch(err) {
  18. if (err.code === 'ENOENT') {
  19. console.log("No config file found, writing defaults to log file " + configFile);
  20. fs.writeFileSync(configFile, JSON.stringify(config, null, '\t'), 'UTF8');
  21. } else if (err instanceof SyntaxError) {
  22. console.log(`ERROR: Invalid JSON in ${configFile}, ignoring file config, ${err}`)
  23. } else {
  24. console.log(`ERROR: ${err}`);
  25. }
  26. }
  27. try{
  28. //Make a copy of the command line args and remove the unneccessary ones
  29. //The _ value is an array of any elements without a key
  30. let commandLineConfig = {...argv}
  31. delete commandLineConfig._;
  32. delete commandLineConfig.help;
  33. delete commandLineConfig.version;
  34. delete commandLineConfig['$0'];
  35. config = {...config, ...commandLineConfig}
  36. } catch(err) {
  37. console.log(`ERROR: ${err}`);
  38. }
  39. return config;
  40. }
  41. module.exports = {
  42. init: initConfig
  43. }