config-helper.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. "use strict";
  2. var _path = _interopRequireDefault(require("path"));
  3. var _fs = _interopRequireDefault(require("fs"));
  4. var _url = _interopRequireDefault(require("url"));
  5. var _lodash = _interopRequireDefault(require("lodash"));
  6. var _util = require("util");
  7. var _index = _interopRequireDefault(require("./index"));
  8. var _yargs = _interopRequireDefault(require("../core/yargs"));
  9. var _importHelper = _interopRequireDefault(require("./import-helper"));
  10. var _process = _interopRequireDefault(require("process"));
  11. function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
  12. const args = (0, _yargs.default)().argv;
  13. const api = {
  14. config: undefined,
  15. rawConfig: undefined,
  16. error: undefined,
  17. async init() {
  18. let config;
  19. try {
  20. if (args.url) {
  21. config = api.parseDbUrl(args.url);
  22. } else {
  23. const module = await _importHelper.default.importModule(api.getConfigFile());
  24. config = await module.default;
  25. }
  26. } catch (e) {
  27. api.error = e;
  28. }
  29. if (typeof config === 'function') {
  30. // accepts callback parameter
  31. if (config.length === 1) {
  32. config = await (0, _util.promisify)(config)();
  33. } else {
  34. // returns a promise.
  35. config = await config();
  36. }
  37. }
  38. api.rawConfig = config;
  39. return api;
  40. },
  41. getConfigFile() {
  42. if (args.config) {
  43. return _path.default.resolve(_process.default.cwd(), args.config);
  44. }
  45. const defaultPath = _path.default.resolve(_process.default.cwd(), 'config', 'config.json');
  46. const alternativePath = defaultPath.replace('.json', '.js');
  47. return _index.default.path.existsSync(alternativePath) ? alternativePath : defaultPath;
  48. },
  49. relativeConfigFile() {
  50. return _path.default.relative(_process.default.cwd(), api.getConfigFile());
  51. },
  52. configFileExists() {
  53. return _index.default.path.existsSync(api.getConfigFile());
  54. },
  55. getDefaultConfig() {
  56. return JSON.stringify({
  57. development: {
  58. username: 'root',
  59. password: null,
  60. database: 'database_development',
  61. host: '127.0.0.1',
  62. dialect: 'mysql'
  63. },
  64. test: {
  65. username: 'root',
  66. password: null,
  67. database: 'database_test',
  68. host: '127.0.0.1',
  69. dialect: 'mysql'
  70. },
  71. production: {
  72. username: 'root',
  73. password: null,
  74. database: 'database_production',
  75. host: '127.0.0.1',
  76. dialect: 'mysql'
  77. }
  78. }, undefined, 2) + '\n';
  79. },
  80. writeDefaultConfig() {
  81. const configPath = _path.default.dirname(api.getConfigFile());
  82. if (!_index.default.path.existsSync(configPath)) {
  83. _index.default.asset.mkdirp(configPath);
  84. }
  85. _fs.default.writeFileSync(api.getConfigFile(), api.getDefaultConfig());
  86. },
  87. readConfig() {
  88. if (!api.config) {
  89. const env = _index.default.generic.getEnvironment();
  90. if (api.rawConfig === undefined) {
  91. throw new Error('Error reading "' + api.relativeConfigFile() + '". Error: ' + api.error);
  92. }
  93. if (typeof api.rawConfig !== 'object') {
  94. throw new Error('Config must be an object or a promise for an object: ' + api.relativeConfigFile());
  95. }
  96. if (args.url) {
  97. _index.default.view.log('Parsed url ' + api.filteredUrl(args.url, api.rawConfig));
  98. } else {
  99. _index.default.view.log('Loaded configuration file "' + api.relativeConfigFile() + '".');
  100. }
  101. if (api.rawConfig[env]) {
  102. _index.default.view.log('Using environment "' + env + '".');
  103. api.rawConfig = api.rawConfig[env];
  104. }
  105. // The Sequelize library needs a function passed in to its logging option
  106. if (api.rawConfig.logging && !_lodash.default.isFunction(api.rawConfig.logging)) {
  107. api.rawConfig.logging = console.log;
  108. }
  109. // in case url is present - we overwrite the configuration
  110. if (api.rawConfig.url) {
  111. api.rawConfig = _lodash.default.merge(api.rawConfig, api.parseDbUrl(api.rawConfig.url));
  112. } else if (api.rawConfig.use_env_variable) {
  113. api.rawConfig = _lodash.default.merge(api.rawConfig, api.parseDbUrl(_process.default.env[api.rawConfig.use_env_variable]));
  114. }
  115. api.config = api.rawConfig;
  116. }
  117. return api.config;
  118. },
  119. filteredUrl(uri, config) {
  120. const regExp = new RegExp(':?' + _lodash.default.escapeRegExp(config.password) + '@');
  121. return uri.replace(regExp, ':*****@');
  122. },
  123. urlStringToConfigHash(urlString) {
  124. try {
  125. const urlParts = _url.default.parse(urlString);
  126. let result = {
  127. database: urlParts.pathname.replace(/^\//, ''),
  128. host: urlParts.hostname,
  129. port: urlParts.port,
  130. protocol: urlParts.protocol.replace(/:$/, ''),
  131. ssl: urlParts.query ? urlParts.query.indexOf('ssl=true') >= 0 : false
  132. };
  133. if (urlParts.auth) {
  134. const authParts = urlParts.auth.split(':');
  135. result.username = authParts[0];
  136. if (authParts.length > 1) {
  137. result.password = authParts.slice(1).join(':');
  138. }
  139. }
  140. return result;
  141. } catch (e) {
  142. throw new Error('Error parsing url: ' + urlString);
  143. }
  144. },
  145. parseDbUrl(urlString) {
  146. let config = api.urlStringToConfigHash(urlString);
  147. config = _lodash.default.assign(config, {
  148. dialect: config.protocol
  149. });
  150. if (config.dialect === 'sqlite' && config.database.indexOf(':memory') !== 0) {
  151. config = _lodash.default.assign(config, {
  152. storage: '/' + config.database
  153. });
  154. }
  155. return config;
  156. }
  157. };
  158. module.exports = api;