Browse Source

Initial commit

James Peret 1 year ago
commit
642d5ac46a
5 changed files with 289 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 24 0
      index.js
  3. 161 0
      package-lock.json
  4. 16 0
      package.json
  5. 87 0
      src/module_loader.js

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+/node_modules

+ 24 - 0
index.js

@@ -0,0 +1,24 @@
+const chalk = require('chalk');
+const fs = require('fs');
+const path = require('path');
+const module_loader = require('./src/module_loader');
+const figures = require('figures');
+
+module.exports.start = function(system) {
+    system.modules = [];
+    system.log = function(text){
+        console.log(text);
+    }
+    system.logUpdate = function(text){
+        if (process.stdout.isTTY) {
+            process.stdout.clearLine(0);
+            process.stdout.cursorTo(0);
+            process.stdout.write(text + '\r');
+         }
+    }
+    system.logSymbols = figures;
+    system.log(`Starting the ${chalk.bold('Modular Web System')}`);
+    system.chalk = chalk;
+    system.module_loader = module_loader;
+    system.module_loader.load_all(system);
+}

+ 161 - 0
package-lock.json

@@ -0,0 +1,161 @@
+{
+  "name": "mws-core",
+  "version": "0.0.1",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "mws-core",
+      "version": "0.0.1",
+      "license": "ISC",
+      "dependencies": {
+        "chalk": "^4.1.2",
+        "figures": "^3.2.0"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/figures": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "dependencies": {
+        "escape-string-regexp": "^1.0.5"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    }
+  },
+  "dependencies": {
+    "ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "requires": {
+        "color-convert": "^2.0.1"
+      }
+    },
+    "chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "requires": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      }
+    },
+    "color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "requires": {
+        "color-name": "~1.1.4"
+      }
+    },
+    "color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+    },
+    "figures": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      }
+    },
+    "has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+    },
+    "supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "requires": {
+        "has-flag": "^4.0.0"
+      }
+    }
+  }
+}

+ 16 - 0
package.json

@@ -0,0 +1,16 @@
+{
+  "name": "mws-core",
+  "version": "0.0.1",
+  "description": "Core loader for the Modular Web Framework",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "James Peret <james.peret@gmail.com> (http://jamesperet.com/)",
+  "license": "ISC",
+  "dependencies": {
+    "chalk": "^4.1.2",
+    "figures": "^3.2.0"
+  },
+  "publishConfig":{"registry":"https://registry.kairoscope.net"}
+}

+ 87 - 0
src/module_loader.js

@@ -0,0 +1,87 @@
+const chalk = require('chalk');
+const fs = require('fs');
+const path = require('path');
+
+var load_all = function(system) { 
+    return new Promise((resolve, reject) => {
+        let rawdata = fs.readFileSync('package.json');
+        system.package = JSON.parse(rawdata);
+        var length = Object.keys(system.package.dependencies).length;
+        system.log(`Checking for MWS modules in ${chalk.bold(length)} package${length > 1 ? 's':''}:`);
+        for (let index = 0; index < length; index++) {
+            const element = Object.keys(system.package.dependencies)[index];
+            instantiate_module(system, element);
+        }
+        system.modules.forEach(module => {
+            module.setup(system);
+        });
+        system.modules.forEach(module => {
+            module.start(system);
+        });
+        console.log(`Initialization complete. Loaded ${system.modules.length} module${system.modules.length > 1 ? 's':''}.`);
+        resolve(); 
+    });
+};
+
+var initialize_module = function(system, module_name) {
+    var mws_module = system.require(module_name)();
+    if (typeof mws_module.initialize === "function") { 
+        mws_module.initialize(system);
+    }
+    return mws_module;
+}
+
+var install_module = function(system, module_name) {
+    let component = find_module_by_name(system, module_name);
+    if(component == undefined) {
+        system.log(chalk.red(`  ❗️ Error: Could not find module ${module_name}`));
+        return undefined;
+    }
+    if (typeof component.install === "function") { 
+        component.install();
+        return component;
+    } else {
+        system.log(chalk.red(`  ❗️ Error: Could not install ${module_name} because it does not have an install function.`));
+        return undefined;
+    }
+}
+
+var find_module_by_name = function(system, module_name) {
+    for (let index = 0; index < system.modules.length; index++) {
+        const element = system.modules[index];
+        if(element.name == module_name) {
+            return element;
+        }
+    }
+}
+
+var instantiate_module = function(system, module_name) {
+    let dep = system.package.dependencies[module_name];
+    if(dep.includes('file:')) dep = dep.replace('file:','');
+    else dep = require.resolve(module_name);
+    let filePath = dep + 'package.json'
+    let packagePath = path.dirname(filePath);
+    let rawdata = fs.readFileSync(packagePath + '/package.json');
+    let package = JSON.parse(rawdata);
+    if ('mws_module' in package && package.mws_module == true){
+        var mws_module = initialize_module(system, module_name);
+        let desc = `${chalk.bold(module_name)} ${chalk.gray('v' + package.version)} from ${chalk.green('\'' + packagePath + '\'')}`
+        if(mws_module == undefined) {
+            system.log(chalk.red(`❗️ Error instantiating module ${desc}`));
+            return undefined;
+        }
+        mws_module.version = package.version;
+        mws_module.packagePath = packagePath;
+        if(mws_module.auto_load == false) return mws_module;
+        system.log(`🔹 Loaded ${desc}`);
+        system.modules.push(mws_module);
+        if(mws_module.auto_load == true) install_module(system, module_name);
+        return mws_module;        
+    }
+}
+
+module.exports.load_all = load_all;
+module.exports.initialize_module = initialize_module;
+module.exports.install_module = install_module;
+module.exports.find_module_by_name = find_module_by_name;
+module.exports.instantiate_module = instantiate_module;