module_loader.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. const chalk = require('chalk');
  2. const fs = require('fs');
  3. const path = require('path');
  4. var load_all = function(system) {
  5. return new Promise((resolve, reject) => {
  6. let rawdata = fs.readFileSync('package.json');
  7. system.package = JSON.parse(rawdata);
  8. var length = Object.keys(system.package.dependencies).length;
  9. system.log(`Checking for MWS modules in ${chalk.bold(length)} package${length > 1 ? 's':''}:`);
  10. for (let index = 0; index < length; index++) {
  11. const element = Object.keys(system.package.dependencies)[index];
  12. instantiate_module(system, element);
  13. }
  14. system.modules.forEach(module => {
  15. module.setup(system);
  16. });
  17. system.modules.forEach(module => {
  18. module.start(system);
  19. });
  20. console.log(`Initialization complete. Loaded ${system.modules.length} module${system.modules.length > 1 ? 's':''}.`);
  21. resolve();
  22. });
  23. };
  24. var initialize_module = function(system, module_name) {
  25. var mws_module = system.require(module_name)();
  26. if (typeof mws_module.initialize === "function") {
  27. mws_module.initialize(system);
  28. }
  29. return mws_module;
  30. }
  31. var install_module = function(system, module_name) {
  32. let component = find_module_by_name(system, module_name);
  33. if(component == undefined) {
  34. system.log(chalk.red(` ❗️ Error: Could not find module ${module_name}`));
  35. return undefined;
  36. }
  37. if (typeof component.install === "function") {
  38. component.install();
  39. return component;
  40. } else {
  41. system.log(chalk.red(` ❗️ Error: Could not install ${module_name} because it does not have an install function.`));
  42. return undefined;
  43. }
  44. }
  45. var find_module_by_name = function(system, module_name) {
  46. for (let index = 0; index < system.modules.length; index++) {
  47. const element = system.modules[index];
  48. if(element.name == module_name) {
  49. return element;
  50. }
  51. }
  52. }
  53. var instantiate_module = function(system, module_name) {
  54. let dep = system.package.dependencies[module_name];
  55. if(dep.includes('file:')) dep = dep.replace('file:','');
  56. else dep = require.resolve(module_name);
  57. let filePath = dep + 'package.json'
  58. let packagePath = path.dirname(filePath);
  59. let rawdata = fs.readFileSync(packagePath + '/package.json');
  60. let package = JSON.parse(rawdata);
  61. if ('mws_module' in package && package.mws_module == true){
  62. var mws_module = initialize_module(system, module_name);
  63. let desc = `${chalk.bold(module_name)} ${chalk.gray('v' + package.version)} from ${chalk.green('\'' + packagePath + '\'')}`
  64. if(mws_module == undefined) {
  65. system.log(chalk.red(`❗️ Error instantiating module ${desc}`));
  66. return undefined;
  67. }
  68. mws_module.version = package.version;
  69. mws_module.packagePath = packagePath;
  70. if(mws_module.auto_load == false) return mws_module;
  71. system.log(`🔹 Loaded ${desc}`);
  72. system.modules.push(mws_module);
  73. if(mws_module.auto_load == true) install_module(system, module_name);
  74. return mws_module;
  75. }
  76. }
  77. module.exports.load_all = load_all;
  78. module.exports.initialize_module = initialize_module;
  79. module.exports.install_module = install_module;
  80. module.exports.find_module_by_name = find_module_by_name;
  81. module.exports.instantiate_module = instantiate_module;