JSFiddle - React, Tailwind, and code Playground

by gschutz

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.9.3/lodash.min.js"></script>

JavaScript

(function(exports) {
  
  function mixin(object, source, options) {
    for(var methodName in source) {
    if (_.isFunction(source[methodName])) {
      object.prototype[methodName] = function(method, methodName) {
        function mixed() {
        var args = [this];
        Array.prototype.push.apply(args, arguments);
         
        method.apply(this, args);
        
        // return the current class when mixed
        return this;
        }
        return mixed;
      }.call(source, source[methodName], methodName);
    } else {
      object.prototype[methodName] = source[methodName];
    }
    }
    return object;
  }

  var ai = {};

  function Class(name) {
    
    var classed = {};
    
    name = name.toLowerCase();
    var Name = _.capitalize(name);
    var NameWrapper = Name + "Wrapper";


    ai[name] = 1;

    console.log(ai);
    
    eval('function '+Name+'(o){\
       o = _.defaults(o || {}, {\
        guid: ai[name]\
      });\
      _.assign(this,o);\
      ai[name] += 1;\
    }');
    
    eval('function '+NameWrapper+'(value){\
      var u = new '+Name+'(value);\
      _.assign(this,u);\
      this.$wrapped = u;\
    }');
    
    eval('function '+name+'(value){\
      if (value instanceof '+NameWrapper+')\
        return value;\
      return new '+NameWrapper+'(value);\
    }');
       
    eval(name+'.$data = [];');
    eval(name+'.$current = null;');
    eval(name+'.$current = $current.bind('+name+');');
    eval(name+'.$add = $add.bind('+name+');');
    
    function $current(c) {
      if (c) {
        eval(name+'.$current = c');
        return this;
      } else {
        return eval(name+'.$current');
      }
    }
    function $add(u) {
      eval(name+'.$data.push(u);');
      return this;
    };
  
    eval('mixin('+name+', '+name+');');
    eval(NameWrapper+'.prototype = '+name+'.prototype;');
    
    return eval(name);
  }
  
  exports.Class = Class;

}(window));

var user = Class('user');

var guilherme = user({name:...