@makano/rew 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/rew +9 -0
- package/bin/ui +0 -0
- package/bin/webkit_app +0 -0
- package/lib/coffeescript/browser.js +151 -0
- package/lib/coffeescript/cake.js +135 -0
- package/lib/coffeescript/coffeescript.js +409 -0
- package/lib/coffeescript/command.js +750 -0
- package/lib/coffeescript/grammar.js +2496 -0
- package/lib/coffeescript/helpers.js +477 -0
- package/lib/coffeescript/index.js +217 -0
- package/lib/coffeescript/lexer.js +1943 -0
- package/lib/coffeescript/nodes.js +9204 -0
- package/lib/coffeescript/optparse.js +230 -0
- package/lib/coffeescript/parser.js +1344 -0
- package/lib/coffeescript/register.js +100 -0
- package/lib/coffeescript/repl.js +305 -0
- package/lib/coffeescript/rewriter.js +1138 -0
- package/lib/coffeescript/scope.js +187 -0
- package/lib/coffeescript/sourcemap.js +229 -0
- package/lib/rew/cli/cli.js +117 -0
- package/lib/rew/cli/log.js +40 -0
- package/lib/rew/cli/run.js +20 -0
- package/lib/rew/cli/utils.js +122 -0
- package/lib/rew/const/default.js +35 -0
- package/lib/rew/const/files.js +15 -0
- package/lib/rew/css/theme.css +3 -0
- package/lib/rew/functions/core.js +85 -0
- package/lib/rew/functions/emitter.js +57 -0
- package/lib/rew/functions/export.js +9 -0
- package/lib/rew/functions/future.js +22 -0
- package/lib/rew/functions/id.js +13 -0
- package/lib/rew/functions/import.js +57 -0
- package/lib/rew/functions/map.js +17 -0
- package/lib/rew/functions/match.js +34 -0
- package/lib/rew/functions/sleep.js +5 -0
- package/lib/rew/functions/types.js +96 -0
- package/lib/rew/html/ui.html +223 -0
- package/lib/rew/main.js +17 -0
- package/lib/rew/models/enum.js +14 -0
- package/lib/rew/models/struct.js +41 -0
- package/lib/rew/modules/compiler.js +17 -0
- package/lib/rew/modules/context.js +50 -0
- package/lib/rew/modules/fs.js +19 -0
- package/lib/rew/modules/runtime.js +24 -0
- package/lib/rew/modules/utils.js +0 -0
- package/lib/rew/modules/yaml.js +36 -0
- package/lib/rew/pkgs/conf.js +92 -0
- package/lib/rew/pkgs/data.js +8 -0
- package/lib/rew/pkgs/date.js +98 -0
- package/lib/rew/pkgs/modules/data/bintree.js +66 -0
- package/lib/rew/pkgs/modules/data/doublylinked.js +100 -0
- package/lib/rew/pkgs/modules/data/linkedList.js +88 -0
- package/lib/rew/pkgs/modules/data/queue.js +28 -0
- package/lib/rew/pkgs/modules/data/stack.js +27 -0
- package/lib/rew/pkgs/modules/ui/classes.js +171 -0
- package/lib/rew/pkgs/pkgs.js +13 -0
- package/lib/rew/pkgs/ui.js +108 -0
- package/package.json +41 -0
| @@ -0,0 +1,223 @@ | |
| 1 | 
            +
            <!doctype html>
         | 
| 2 | 
            +
            <html lang="en">
         | 
| 3 | 
            +
              <head>
         | 
| 4 | 
            +
                <meta charset="UTF-8" />
         | 
| 5 | 
            +
                <meta name="viewport" content="width=device-width, initial-scale=1.0" />
         | 
| 6 | 
            +
                <title>$OPTIONS(title)</title>
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                <style>/* $OPTIONS(style) */</style>
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                <script>
         | 
| 11 | 
            +
                  window.execContext = $OPTIONS(json.execContext);
         | 
| 12 | 
            +
                </script>
         | 
| 13 | 
            +
                <script>
         | 
| 14 | 
            +
                  window.exec = $OPTIONS(exec);
         | 
| 15 | 
            +
                </script>
         | 
| 16 | 
            +
                <script>
         | 
| 17 | 
            +
                  if(!window.execContext) window.execContext = {};
         | 
| 18 | 
            +
                  window.addEventListener("load", () => {
         | 
| 19 | 
            +
                    const ws = new WebSocket("ws://localhost:$OPTIONS(port)");
         | 
| 20 | 
            +
                    const DOM = [];
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    const findInDom = (id) =>
         | 
| 23 | 
            +
                      DOM.find((el) => el.widgetOptions.uuid == id) ||
         | 
| 24 | 
            +
                      DOM.find((el) => el.id == id);
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    const parseStyleValue = (val) => val;
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    const addTo = (el, parent) => {
         | 
| 29 | 
            +
                      if (parent == "null") {
         | 
| 30 | 
            +
                        document.body.appendChild(el);
         | 
| 31 | 
            +
                      } else {
         | 
| 32 | 
            +
                        findInDom(parent).appendChild(el);
         | 
| 33 | 
            +
                      }
         | 
| 34 | 
            +
                    };
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    const initElement = (el, options, update = false) => {
         | 
| 37 | 
            +
                      if(el.widgetOptions){
         | 
| 38 | 
            +
                        if (el.widgetOptions.style) {
         | 
| 39 | 
            +
                          for(let i in options.style){
         | 
| 40 | 
            +
                            el.style.removeProperty(i, el.widgetOptions.style[i]);
         | 
| 41 | 
            +
                          }
         | 
| 42 | 
            +
                        }
         | 
| 43 | 
            +
                        if (el.widgetOptions.attr) {
         | 
| 44 | 
            +
                          for(let i in el.widgetOptions.attr){
         | 
| 45 | 
            +
                            el.removeAttribute(i);
         | 
| 46 | 
            +
                          }
         | 
| 47 | 
            +
                        }
         | 
| 48 | 
            +
                      }
         | 
| 49 | 
            +
                      
         | 
| 50 | 
            +
                      el.widgetOptions = options;
         | 
| 51 | 
            +
                      el.id = options.id;
         | 
| 52 | 
            +
                      el.textContent = options.data.text;
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                      if (options.style) {
         | 
| 55 | 
            +
                        for(let i in options.style){
         | 
| 56 | 
            +
                          el.style.setProperty(i, options.style[i]);
         | 
| 57 | 
            +
                        }
         | 
| 58 | 
            +
                      }
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                      if (options.attr) {
         | 
| 61 | 
            +
                        for(let i in options.attr){
         | 
| 62 | 
            +
                          el.setAttribute(i, options.attr[i]);
         | 
| 63 | 
            +
                        }
         | 
| 64 | 
            +
                      }
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                      if (options.children.length) {
         | 
| 67 | 
            +
                        options.children.forEach((option) => {
         | 
| 68 | 
            +
                          option.parent = options.uuid;
         | 
| 69 | 
            +
                          if(update) updateElement(findInDom(option.uuid), option);
         | 
| 70 | 
            +
                          else createElement(option);
         | 
| 71 | 
            +
                        });
         | 
| 72 | 
            +
                      }
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                      if (options.parent) {
         | 
| 75 | 
            +
                        addTo(el, options.parent);
         | 
| 76 | 
            +
                      }
         | 
| 77 | 
            +
                    }
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                    const updateElement = (el, options) => {
         | 
| 80 | 
            +
                      if(!el) return;
         | 
| 81 | 
            +
                      initElement(el, options, true);
         | 
| 82 | 
            +
                      return el;
         | 
| 83 | 
            +
                    }
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                    const events = [
         | 
| 86 | 
            +
                      "click", "dblclick", "mousedown", "mouseup", "mouseover", "mouseout",
         | 
| 87 | 
            +
                      "mousemove", "mouseenter", "mouseleave", "keydown", "keypress", "keyup",
         | 
| 88 | 
            +
                      "change", "input", "submit", "focus", "blur", "copy", "cut", "paste",
         | 
| 89 | 
            +
                      "scroll", "wheel", "resize", "contextmenu", "drag", "dragstart", "dragend",
         | 
| 90 | 
            +
                      "dragenter", "dragleave", "dragover", "drop", "error", "load", "abort"
         | 
| 91 | 
            +
                    ];
         | 
| 92 | 
            +
                    const handleListeners = (el) => {
         | 
| 93 | 
            +
                      events.forEach(event => {
         | 
| 94 | 
            +
                        el.addEventListener(event, (e) => {
         | 
| 95 | 
            +
                          ws.send(JSON.stringify({
         | 
| 96 | 
            +
                            action: 'hook:eventTrigger',
         | 
| 97 | 
            +
                            data: {
         | 
| 98 | 
            +
                              rid: 'event_trigger',
         | 
| 99 | 
            +
                              object: {
         | 
| 100 | 
            +
                                uuid: el.widgetOptions.uuid,
         | 
| 101 | 
            +
                                event,
         | 
| 102 | 
            +
                                data: {
         | 
| 103 | 
            +
                                  mouse: { x: e.clientX, y: e.clientY },
         | 
| 104 | 
            +
                                  key: { code: e.keyCode, key: e.key }
         | 
| 105 | 
            +
                                }
         | 
| 106 | 
            +
                              }
         | 
| 107 | 
            +
                            }
         | 
| 108 | 
            +
                          }))
         | 
| 109 | 
            +
                        });
         | 
| 110 | 
            +
                      });
         | 
| 111 | 
            +
                    }
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                    function eventHandlerFunction({ uuid, hookID, event }){
         | 
| 114 | 
            +
                      return function(e){
         | 
| 115 | 
            +
                        ws.send(JSON.stringify({
         | 
| 116 | 
            +
                          action: 'hook:event_'+event,
         | 
| 117 | 
            +
                          data: {
         | 
| 118 | 
            +
                            rid: hookID,
         | 
| 119 | 
            +
                            object: {
         | 
| 120 | 
            +
                              uuid,
         | 
| 121 | 
            +
                              event,
         | 
| 122 | 
            +
                              data: {
         | 
| 123 | 
            +
                                mouse: { x: e.clientX, y: e.clientY },
         | 
| 124 | 
            +
                                key: { code: e.keyCode, key: e.key }
         | 
| 125 | 
            +
                              }
         | 
| 126 | 
            +
                            }
         | 
| 127 | 
            +
                          }
         | 
| 128 | 
            +
                        }));
         | 
| 129 | 
            +
                      }
         | 
| 130 | 
            +
                    }
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                    const createElement = (options) => {
         | 
| 133 | 
            +
                      const el = document.createElement(options.element);
         | 
| 134 | 
            +
                      DOM.push(el);
         | 
| 135 | 
            +
                      initElement(el, options);
         | 
| 136 | 
            +
                      return el;
         | 
| 137 | 
            +
                    };
         | 
| 138 | 
            +
             | 
| 139 | 
            +
                    const stringifyJSON = (json) => {
         | 
| 140 | 
            +
                      try {
         | 
| 141 | 
            +
                        return JSON.stringify(json, null, 4);
         | 
| 142 | 
            +
                      } catch (e) {
         | 
| 143 | 
            +
                        return json.toString();
         | 
| 144 | 
            +
                      }
         | 
| 145 | 
            +
                    };
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                    const log = (...strings) => {
         | 
| 148 | 
            +
                      window.webkit.messageHandlers.external.postMessage(
         | 
| 149 | 
            +
                        JSON.stringify({"action": "log", "data": strings
         | 
| 150 | 
            +
                          .map((r) =>
         | 
| 151 | 
            +
                            typeof r == "object" ? stringifyJSON(r) : `${r.toString()}`,
         | 
| 152 | 
            +
                          )
         | 
| 153 | 
            +
                          // .map((i) => i.replace(/\"/g, '\\\\"').replace(/\n/g, "\\\\n"))
         | 
| 154 | 
            +
                          .join("\n")}, null, 4)
         | 
| 155 | 
            +
                      );
         | 
| 156 | 
            +
                    };
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                    if (
         | 
| 159 | 
            +
                      window.webkit &&
         | 
| 160 | 
            +
                      window.webkit.messageHandlers &&
         | 
| 161 | 
            +
                      window.webkit.messageHandlers.external &&
         | 
| 162 | 
            +
                      window.RUNID == "$OPTIONS(runId)"
         | 
| 163 | 
            +
                    ) {
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                      ws.onmessage = (event, cb) => {
         | 
| 166 | 
            +
                        const edata = process_data(event.data);
         | 
| 167 | 
            +
                        if (edata.action == "init") {
         | 
| 168 | 
            +
                          document.title = edata.data.title;
         | 
| 169 | 
            +
                          window.webkit.messageHandlers.external.postMessage(
         | 
| 170 | 
            +
                            `{"action": "setTitle", "data": "${edata.data.title}"}`,
         | 
| 171 | 
            +
                          );
         | 
| 172 | 
            +
                          log("INIT::READY");
         | 
| 173 | 
            +
                          if(window.exec){
         | 
| 174 | 
            +
                            window.exec(window.execContext);
         | 
| 175 | 
            +
                          }
         | 
| 176 | 
            +
                        } else if(edata.action == 'eventListen') {
         | 
| 177 | 
            +
                          const el = findInDom(edata.data.uuid);
         | 
| 178 | 
            +
                          if(el){
         | 
| 179 | 
            +
                            el.addEventListener(edata.data.event, eventHandlerFunction(edata.data))
         | 
| 180 | 
            +
                          }
         | 
| 181 | 
            +
                        } else if (edata.action == "createElement") {
         | 
| 182 | 
            +
                          const options = edata.data;
         | 
| 183 | 
            +
                          try {
         | 
| 184 | 
            +
                            createElement(options);
         | 
| 185 | 
            +
                          } catch (e) {
         | 
| 186 | 
            +
                            log(e.toString());
         | 
| 187 | 
            +
                          }
         | 
| 188 | 
            +
                        } else if (edata.action == "addStyleSheet") {
         | 
| 189 | 
            +
                          const style = document.createElement('style');
         | 
| 190 | 
            +
                          style.textContent = edata.data;
         | 
| 191 | 
            +
                          document.head.appendChild(style);
         | 
| 192 | 
            +
                        } else if (edata.action == "updateElement") {
         | 
| 193 | 
            +
                          const options = edata.data;
         | 
| 194 | 
            +
                          try {
         | 
| 195 | 
            +
                            updateElement(findInDom(options.uuid), options);
         | 
| 196 | 
            +
                          } catch (e) {
         | 
| 197 | 
            +
                            log(e.toString());
         | 
| 198 | 
            +
                          }
         | 
| 199 | 
            +
                        } else if (edata.action == "findElement") {
         | 
| 200 | 
            +
                          const id = edata.data.id;
         | 
| 201 | 
            +
                          const rid = edata.data.rid;
         | 
| 202 | 
            +
                          try {
         | 
| 203 | 
            +
                            ws.send(JSON.stringify({ action: 'hook:findElement', data: { rid, object: findInDom(id)?.widgetOptions }  }))
         | 
| 204 | 
            +
                          } catch (e) {
         | 
| 205 | 
            +
                            log(e.toString());
         | 
| 206 | 
            +
                          }
         | 
| 207 | 
            +
                        } 
         | 
| 208 | 
            +
                      };
         | 
| 209 | 
            +
                    } else {
         | 
| 210 | 
            +
                      console.log("Not in a webkit window");
         | 
| 211 | 
            +
                    }
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                    function process_data(data) {
         | 
| 214 | 
            +
                      return JSON.parse(data);
         | 
| 215 | 
            +
                    }
         | 
| 216 | 
            +
                  });
         | 
| 217 | 
            +
                </script>
         | 
| 218 | 
            +
              </head>
         | 
| 219 | 
            +
             | 
| 220 | 
            +
              <body>
         | 
| 221 | 
            +
             | 
| 222 | 
            +
              </body>
         | 
| 223 | 
            +
            </html>
         | 
    
        package/lib/rew/main.js
    ADDED
    
    | @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            const { compileFile } = require("./modules/compiler");
         | 
| 2 | 
            +
            const { exec, runPath } = require("./modules/runtime");
         | 
| 3 | 
            +
            const fs = require("fs");
         | 
| 4 | 
            +
            const { imp } = require("./functions/import");
         | 
| 5 | 
            +
            const { FILES } = require("./const/files");
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module.exports.run = function (filepath, options = {}, custom_context = {}) {
         | 
| 8 | 
            +
              FILES.forEach(file => {
         | 
| 9 | 
            +
                if(fs.existsSync(file.path)) return;
         | 
| 10 | 
            +
                if(file.content){
         | 
| 11 | 
            +
                  fs.writeFileSync(file.path, file.content);
         | 
| 12 | 
            +
                } else {
         | 
| 13 | 
            +
                  fs.mkdirSync(file.path, { recursive: true });
         | 
| 14 | 
            +
                }
         | 
| 15 | 
            +
              });
         | 
| 16 | 
            +
              return runPath(filepath, options, custom_context);
         | 
| 17 | 
            +
            };
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            module.exports.cenum = function cenum(values) {
         | 
| 2 | 
            +
              var enumObj, i, len, value;
         | 
| 3 | 
            +
              // Create an object to hold the enum values
         | 
| 4 | 
            +
              enumObj = {};
         | 
| 5 | 
            +
              for (i = 0, len = values.length; i < len; i++) {
         | 
| 6 | 
            +
                value = values[i];
         | 
| 7 | 
            +
                enumObj[value] = value;
         | 
| 8 | 
            +
              }
         | 
| 9 | 
            +
              // Add a method to check if a value is a valid enum value
         | 
| 10 | 
            +
              enumObj.isValid = function (val) {
         | 
| 11 | 
            +
                return indexOf.call(enumObj, val) >= 0;
         | 
| 12 | 
            +
              };
         | 
| 13 | 
            +
              return enumObj;
         | 
| 14 | 
            +
            };
         | 
| @@ -0,0 +1,41 @@ | |
| 1 | 
            +
            const { generateRandomID } = require("../functions/id");
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module.exports.struct = function struct(template) {
         | 
| 4 | 
            +
              var key, types, value;
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              types = {};
         | 
| 7 | 
            +
              for (key in template) {
         | 
| 8 | 
            +
                value = template[key];
         | 
| 9 | 
            +
                types[key] = typeof value;
         | 
| 10 | 
            +
              }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              const fun = function (properties = {}) {
         | 
| 13 | 
            +
                var defaultValue, instance;
         | 
| 14 | 
            +
                instance = {};
         | 
| 15 | 
            +
                for (key in template) {
         | 
| 16 | 
            +
                  defaultValue = template[key];
         | 
| 17 | 
            +
                  if (key in properties) {
         | 
| 18 | 
            +
                    value = properties[key];
         | 
| 19 | 
            +
                    if (defaultValue != "!any" && typeof value !== types[key]) {
         | 
| 20 | 
            +
                      throw new Error(
         | 
| 21 | 
            +
                        `Type error: Expected ${types[key]} for ${key}, got ${typeof value}`,
         | 
| 22 | 
            +
                      );
         | 
| 23 | 
            +
                    }
         | 
| 24 | 
            +
                    instance[key] = value;
         | 
| 25 | 
            +
                  } else {
         | 
| 26 | 
            +
                    instance[key] = defaultValue == "!any" ? null : defaultValue;
         | 
| 27 | 
            +
                  }
         | 
| 28 | 
            +
                }
         | 
| 29 | 
            +
                instance.__proto__ = { '@instance': fun };
         | 
| 30 | 
            +
                return instance;
         | 
| 31 | 
            +
              };
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              return fun;
         | 
| 34 | 
            +
            };
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            module.exports.struct.inherits = function (struct, template) {
         | 
| 37 | 
            +
              return module.exports.struct({
         | 
| 38 | 
            +
                ...struct(),
         | 
| 39 | 
            +
                ...template,
         | 
| 40 | 
            +
              });
         | 
| 41 | 
            +
            };
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            const { compile } = require("../../coffeescript/coffeescript");
         | 
| 2 | 
            +
            const { getFile } = require("./fs");
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            const cpl = (module.exports.compile = function (file, options = {}) {
         | 
| 5 | 
            +
              return compile(file.content, options);
         | 
| 6 | 
            +
            });
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            module.exports.compileFile = function (filepath, options = {}) {
         | 
| 9 | 
            +
              const f = getFile(filepath);
         | 
| 10 | 
            +
              const compiled_code =
         | 
| 11 | 
            +
                options.compile == false ? f.content : cpl(f, { ...options });
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              return {
         | 
| 14 | 
            +
                compiled_code,
         | 
| 15 | 
            +
                file: f,
         | 
| 16 | 
            +
              };
         | 
| 17 | 
            +
            };
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            const defaultContext = require("../const/default");
         | 
| 2 | 
            +
            const emitter = require("../functions/emitter");
         | 
| 3 | 
            +
            const { exportsFunction } = require("../functions/export");
         | 
| 4 | 
            +
            const { imp } = require("../functions/import");
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module.exports.prepareContext = function (
         | 
| 7 | 
            +
              custom_context,
         | 
| 8 | 
            +
              options,
         | 
| 9 | 
            +
              filepath = "",
         | 
| 10 | 
            +
              runPath = () => {},
         | 
| 11 | 
            +
            ) {
         | 
| 12 | 
            +
              let context = {
         | 
| 13 | 
            +
                module: {
         | 
| 14 | 
            +
                  exports: null,
         | 
| 15 | 
            +
                  options,
         | 
| 16 | 
            +
                  filepath,
         | 
| 17 | 
            +
                  imports: []
         | 
| 18 | 
            +
                },
         | 
| 19 | 
            +
              };
         | 
| 20 | 
            +
              if (options.useContext) {
         | 
| 21 | 
            +
                context = {
         | 
| 22 | 
            +
                  ...context,
         | 
| 23 | 
            +
                  ...custom_context,
         | 
| 24 | 
            +
                };
         | 
| 25 | 
            +
              } else {
         | 
| 26 | 
            +
                context = {
         | 
| 27 | 
            +
                  ...context,
         | 
| 28 | 
            +
                  ...defaultContext,
         | 
| 29 | 
            +
                  require: (package) => {
         | 
| 30 | 
            +
                    try {
         | 
| 31 | 
            +
                      return require(package);
         | 
| 32 | 
            +
                    } catch (e) {
         | 
| 33 | 
            +
                      throw new Error("Module not found");
         | 
| 34 | 
            +
                    }
         | 
| 35 | 
            +
                  },
         | 
| 36 | 
            +
                  ...custom_context,
         | 
| 37 | 
            +
                };
         | 
| 38 | 
            +
                context.imp = imp(runPath, context);
         | 
| 39 | 
            +
                context.exports = exportsFunction(context);
         | 
| 40 | 
            +
              }
         | 
| 41 | 
            +
              if (!context.global) context.global = context;
         | 
| 42 | 
            +
              if (!context.process)
         | 
| 43 | 
            +
                context.process = {
         | 
| 44 | 
            +
                  argv: process.argv,
         | 
| 45 | 
            +
                  target: emitter(),
         | 
| 46 | 
            +
                  env: process.env,
         | 
| 47 | 
            +
                };
         | 
| 48 | 
            +
              // console.log(custom_context);
         | 
| 49 | 
            +
              return context;
         | 
| 50 | 
            +
            };
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            const { struct } = require("../models/struct");
         | 
| 2 | 
            +
            const fs = require("fs");
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            const file = (module.exports.file = struct({
         | 
| 5 | 
            +
              path: "",
         | 
| 6 | 
            +
              content: "",
         | 
| 7 | 
            +
            }));
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            const readFile = (module.exports.readFile = function readFile(file) {
         | 
| 10 | 
            +
              return (file.content = fs.readFileSync(file.path, { encoding: "utf-8" }));
         | 
| 11 | 
            +
            });
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            module.exports.getFile = function (filepath) {
         | 
| 14 | 
            +
              const f = file({
         | 
| 15 | 
            +
                path: filepath,
         | 
| 16 | 
            +
              });
         | 
| 17 | 
            +
              readFile(f);
         | 
| 18 | 
            +
              return f;
         | 
| 19 | 
            +
            };
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            const vm = require("vm");
         | 
| 2 | 
            +
            const { compileFile } = require("./compiler");
         | 
| 3 | 
            +
            const { prepareContext } = require("./context");
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            const exec = (module.exports.exec = function (code, context) {
         | 
| 6 | 
            +
              return vm.runInNewContext(code, vm.createContext(context));
         | 
| 7 | 
            +
            });
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module.exports.runPath = function runPath(
         | 
| 10 | 
            +
              filepath,
         | 
| 11 | 
            +
              options = {},
         | 
| 12 | 
            +
              custom_context = {},
         | 
| 13 | 
            +
            ) {
         | 
| 14 | 
            +
              const { compiled_code, file } = compileFile(filepath, options);
         | 
| 15 | 
            +
              const context = prepareContext(custom_context, options, file.path, runPath);
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              context.module.compiled = compiled_code;
         | 
| 18 | 
            +
              context.process.exit = (int) => process.exit(int);
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              return {
         | 
| 21 | 
            +
                context,
         | 
| 22 | 
            +
                returns: exec(compiled_code, context),
         | 
| 23 | 
            +
              };
         | 
| 24 | 
            +
            };
         | 
| 
            File without changes
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            const yaml = require("js-yaml");
         | 
| 2 | 
            +
            const path = require("path");
         | 
| 3 | 
            +
            const { getFile } = require("./fs");
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            function yamlFile(file) {
         | 
| 6 | 
            +
              const schema = new yaml.Schema([
         | 
| 7 | 
            +
                new yaml.Type("!import", {
         | 
| 8 | 
            +
                  kind: "scalar",
         | 
| 9 | 
            +
                  construct: (p) => importYaml(path.resolve(path.dirname(file.path), p)),
         | 
| 10 | 
            +
                }),
         | 
| 11 | 
            +
                new yaml.Type("!int", {
         | 
| 12 | 
            +
                  kind: "scalar",
         | 
| 13 | 
            +
                  construct: (data) => parseInt(data),
         | 
| 14 | 
            +
                }),
         | 
| 15 | 
            +
                new yaml.Type("!float", {
         | 
| 16 | 
            +
                  kind: "scalar",
         | 
| 17 | 
            +
                  construct: (data) => parseFloat(data),
         | 
| 18 | 
            +
                }),
         | 
| 19 | 
            +
                new yaml.Type("!bool", {
         | 
| 20 | 
            +
                  kind: "scalar",
         | 
| 21 | 
            +
                  construct: (data) => (data == "true" ? true : false),
         | 
| 22 | 
            +
                }),
         | 
| 23 | 
            +
              ]);
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              return yaml.load(file.content, { schema });
         | 
| 26 | 
            +
            }
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            const importYaml = (module.exports.importYaml = function importYaml(
         | 
| 29 | 
            +
              filepath,
         | 
| 30 | 
            +
              file,
         | 
| 31 | 
            +
            ) {
         | 
| 32 | 
            +
              if (!file) {
         | 
| 33 | 
            +
                file = getFile(filepath);
         | 
| 34 | 
            +
              }
         | 
| 35 | 
            +
              return yamlFile(file);
         | 
| 36 | 
            +
            });
         | 
| @@ -0,0 +1,92 @@ | |
| 1 | 
            +
            const fs = require('fs');
         | 
| 2 | 
            +
            const jsYaml = require('js-yaml');
         | 
| 3 | 
            +
            const path = require('path');
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            const CONFIG_PATH = path.resolve(process.env.HOME, '.config/rew');
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            const createPackageRoot = (packageName) => {
         | 
| 8 | 
            +
              const rootPath = path.join(CONFIG_PATH, packageName);
         | 
| 9 | 
            +
              fs.mkdirSync(rootPath, { recursive: true });
         | 
| 10 | 
            +
              return rootPath;
         | 
| 11 | 
            +
            }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            module.exports = (context) => ({
         | 
| 14 | 
            +
              CONFIG_PATH,
         | 
| 15 | 
            +
              create: (packageName) => {
         | 
| 16 | 
            +
                const rootPath = createPackageRoot(packageName);
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                const conf = {};
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                const dumpYaml = (val) => {
         | 
| 21 | 
            +
                  if(JSON.stringify(val) == '{}') return '';
         | 
| 22 | 
            +
                  else return jsYaml.dump(val);
         | 
| 23 | 
            +
                }
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                const setData = (optionCenter, key, value) => {
         | 
| 26 | 
            +
                  conf[optionCenter.name][key] = value;
         | 
| 27 | 
            +
                  fs.writeFileSync(optionCenter.root, dumpYaml(conf[optionCenter.name]));
         | 
| 28 | 
            +
                  return true;
         | 
| 29 | 
            +
                }
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                const removeData = (optionCenter, key) => {
         | 
| 32 | 
            +
                  delete conf[optionCenter.name][key];
         | 
| 33 | 
            +
                  fs.writeFileSync(optionCenter.root, dumpYaml(conf[optionCenter.name]));
         | 
| 34 | 
            +
                  return true;
         | 
| 35 | 
            +
                }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                const getData = (optionCenter, key) => {
         | 
| 38 | 
            +
                  return conf[optionCenter.name][key];
         | 
| 39 | 
            +
                }
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                const staticFile = (name, defaultValue = "") => {
         | 
| 42 | 
            +
                  const fileRoot = path.join(rootPath, name);
         | 
| 43 | 
            +
                  const exists = fs.existsSync(fileRoot);
         | 
| 44 | 
            +
                  return {
         | 
| 45 | 
            +
                    create(value){
         | 
| 46 | 
            +
                      if(!fs.existsSync(path.dirname(fileRoot))) fs.mkdirSync(path.dirname(fileRoot), { recursive: true }); 
         | 
| 47 | 
            +
                      fs.writeFileSync(fileRoot, value || defaultValue);
         | 
| 48 | 
            +
                    },
         | 
| 49 | 
            +
                    fileRoot,
         | 
| 50 | 
            +
                    exists
         | 
| 51 | 
            +
                  }
         | 
| 52 | 
            +
                }
         | 
| 53 | 
            +
                
         | 
| 54 | 
            +
                const createOptionCenter = (name, defaults = {}) => {
         | 
| 55 | 
            +
                  const optionRoot = path.join(rootPath, name+'.yaml');
         | 
| 56 | 
            +
                  if(!fs.existsSync(path.dirname(optionRoot))) fs.mkdirSync(path.dirname(optionRoot), { recursive: true }); 
         | 
| 57 | 
            +
                  if(!fs.existsSync(optionRoot)) {
         | 
| 58 | 
            +
                    conf[name] = defaults;
         | 
| 59 | 
            +
                    fs.writeFileSync(optionRoot, dumpYaml(defaults));
         | 
| 60 | 
            +
                  } else {
         | 
| 61 | 
            +
                    conf[name] = jsYaml.load(fs.readFileSync(optionRoot, { encoding: 'utf-8' }));
         | 
| 62 | 
            +
                  }
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  const optionCenter = {
         | 
| 65 | 
            +
                    root: optionRoot,
         | 
| 66 | 
            +
                    name,
         | 
| 67 | 
            +
                    package: packageName
         | 
| 68 | 
            +
                  }
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  return {
         | 
| 71 | 
            +
                    get: (key) => getData(optionCenter, key),
         | 
| 72 | 
            +
                    set: (key, value) => setData(optionCenter, key, value),
         | 
| 73 | 
            +
                    remove: (key) => removeData(optionCenter, key),
         | 
| 74 | 
            +
                    reset: () => fs.writeFileSync(optionCenter.root, dumpYaml(defaults)) && (conf[name] = defaults),
         | 
| 75 | 
            +
                    getAll: (str = false) => str ? dumpYaml(conf[name]) : conf[name],
         | 
| 76 | 
            +
                    ...optionCenter
         | 
| 77 | 
            +
                  }
         | 
| 78 | 
            +
                }
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                const defaultCenter = createOptionCenter('_default', { default: true });
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                return {
         | 
| 83 | 
            +
                  optionCenter: createOptionCenter,
         | 
| 84 | 
            +
                  staticFile: staticFile,
         | 
| 85 | 
            +
                  set: (key, value) => defaultCenter.set(key, value),
         | 
| 86 | 
            +
                  get: (key) => defaultCenter.get(key),
         | 
| 87 | 
            +
                  remove: (key) => defaultCenter.remove(key),
         | 
| 88 | 
            +
                  root: rootPath,
         | 
| 89 | 
            +
                  package: packageName
         | 
| 90 | 
            +
                }
         | 
| 91 | 
            +
              }
         | 
| 92 | 
            +
            });
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            const { BinaryTree } = require("./modules/data/bintree");
         | 
| 2 | 
            +
            const { DoublyLinkedList } = require("./modules/data/doublylinked");
         | 
| 3 | 
            +
            const { LinkedList } = require("./modules/data/linkedList");
         | 
| 4 | 
            +
            const { Queue } = require("./modules/data/queue");
         | 
| 5 | 
            +
            const { Stack } = require("./modules/data/stack");
         | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 8 | 
            +
            module.exports = (context) => ({ Stack, Queue, BinaryTree, DoublyLinkedList, LinkedList });
         | 
| @@ -0,0 +1,98 @@ | |
| 1 | 
            +
            // Date and Time Module
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            // Formatting Functions
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            /**
         | 
| 6 | 
            +
             * Format a date object to a string (YYYY-MM-DD).
         | 
| 7 | 
            +
             * @param {Date} date - The date object.
         | 
| 8 | 
            +
             * @return {string} - The formatted date string.
         | 
| 9 | 
            +
             */
         | 
| 10 | 
            +
            function formatDate(date) {
         | 
| 11 | 
            +
              const year = date.getFullYear();
         | 
| 12 | 
            +
              const month = String(date.getMonth() + 1).padStart(2, '0');
         | 
| 13 | 
            +
              const day = String(date.getDate()).padStart(2, '0');
         | 
| 14 | 
            +
              return `${year}-${month}-${day}`;
         | 
| 15 | 
            +
            }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            /**
         | 
| 18 | 
            +
             * Format a time object to a string (HH:MM:SS).
         | 
| 19 | 
            +
             * @param {Date} date - The date object.
         | 
| 20 | 
            +
             * @return {string} - The formatted time string.
         | 
| 21 | 
            +
             */
         | 
| 22 | 
            +
            function formatTime(date) {
         | 
| 23 | 
            +
              const hours = String(date.getHours()).padStart(2, '0');
         | 
| 24 | 
            +
              const minutes = String(date.getMinutes()).padStart(2, '0');
         | 
| 25 | 
            +
              const seconds = String(date.getSeconds()).padStart(2, '0');
         | 
| 26 | 
            +
              return `${hours}:${minutes}:${seconds}`;
         | 
| 27 | 
            +
            }
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            // Parsing Functions
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            /**
         | 
| 32 | 
            +
             * Parse a date string (YYYY-MM-DD) into a date object.
         | 
| 33 | 
            +
             * @param {string} dateString - The date string.
         | 
| 34 | 
            +
             * @return {Date} - The parsed date object.
         | 
| 35 | 
            +
             */
         | 
| 36 | 
            +
            function parseDate(dateString) {
         | 
| 37 | 
            +
              const [year, month, day] = dateString.split('-').map(Number);
         | 
| 38 | 
            +
              return new Date(year, month - 1, day);
         | 
| 39 | 
            +
            }
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            /**
         | 
| 42 | 
            +
             * Parse a time string (HH:MM:SS) into a date object.
         | 
| 43 | 
            +
             * @param {string} timeString - The time string.
         | 
| 44 | 
            +
             * @return {Date} - The parsed date object.
         | 
| 45 | 
            +
             */
         | 
| 46 | 
            +
            function parseTime(timeString) {
         | 
| 47 | 
            +
              const [hours, minutes, seconds] = timeString.split(':').map(Number);
         | 
| 48 | 
            +
              const date = new Date();
         | 
| 49 | 
            +
              date.setHours(hours, minutes, seconds, 0);
         | 
| 50 | 
            +
              return date;
         | 
| 51 | 
            +
            }
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            // Arithmetic Functions
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            /**
         | 
| 56 | 
            +
             * Add days to a date.
         | 
| 57 | 
            +
             * @param {Date} date - The date object.
         | 
| 58 | 
            +
             * @param {number} days - The number of days to add.
         | 
| 59 | 
            +
             * @return {Date} - The new date object.
         | 
| 60 | 
            +
             */
         | 
| 61 | 
            +
            function addDays(date, days) {
         | 
| 62 | 
            +
              const result = new Date(date);
         | 
| 63 | 
            +
              result.setDate(result.getDate() + days);
         | 
| 64 | 
            +
              return result;
         | 
| 65 | 
            +
            }
         | 
| 66 | 
            +
             | 
| 67 | 
            +
            /**
         | 
| 68 | 
            +
             * Subtract days from a date.
         | 
| 69 | 
            +
             * @param {Date} date - The date object.
         | 
| 70 | 
            +
             * @param {number} days - The number of days to subtract.
         | 
| 71 | 
            +
             * @return {Date} - The new date object.
         | 
| 72 | 
            +
             */
         | 
| 73 | 
            +
            function subtractDays(date, days) {
         | 
| 74 | 
            +
              return addDays(date, -days);
         | 
| 75 | 
            +
            }
         | 
| 76 | 
            +
             | 
| 77 | 
            +
            /**
         | 
| 78 | 
            +
             * Calculate the difference in days between two dates.
         | 
| 79 | 
            +
             * @param {Date} date1 - The first date object.
         | 
| 80 | 
            +
             * @param {Date} date2 - The second date object.
         | 
| 81 | 
            +
             * @return {number} - The difference in days.
         | 
| 82 | 
            +
             */
         | 
| 83 | 
            +
            function differenceInDays(date1, date2) {
         | 
| 84 | 
            +
              const diffTime = date2 - date1;
         | 
| 85 | 
            +
              return Math.ceil(diffTime / (1000 * 60 * 60 * 24));
         | 
| 86 | 
            +
            }
         | 
| 87 | 
            +
             | 
| 88 | 
            +
             | 
| 89 | 
            +
            // Exporting the functions as a CommonJS module
         | 
| 90 | 
            +
            module.exports = () => ({
         | 
| 91 | 
            +
              formatDate,
         | 
| 92 | 
            +
              formatTime,
         | 
| 93 | 
            +
              parseDate,
         | 
| 94 | 
            +
              parseTime,
         | 
| 95 | 
            +
              addDays,
         | 
| 96 | 
            +
              subtractDays,
         | 
| 97 | 
            +
              differenceInDays
         | 
| 98 | 
            +
            });
         |