Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
"use strict";

const _require = require('chain-able'),
      Chain = _require.Chain,
      ChainedSet = _require.ChainedSet;

const React = require('react');

const allTags = ['div', 'span', 'h1'];
const attributes = ['onClick', 'className', 'to', 'from'];
const specific = ['props', 'state'];

const flatten = x => [].concat.apply([], x);

let Tag; // https://github.com/infernojs/inferno/blob/master/packages/inferno-vnode-flags/src/index.ts
// https://github.com/infernojs/inferno/blob/master/packages/inferno-hyperscript/src/index.ts

let JSX = class JSX extends Chain {
  constructor(parent) {
    super(parent);
    this.extendTags(allTags);
    this.tags = new ChainedSet(this);
  }

  extendTags(tagsArray) {
    tagsArray.forEach(tag => {
      // e.g. this.div
      this[tag] = (arg1, arg2, arg3) => {
        const instance = new Tag(this);
        instance.from(arg1);
        instance.tagName = tag;
        this.tags.add(instance);
        return instance;
      };
    });
  }

  render() {
    // react.createElement
    let tags = this.tags.values();
    const tagName = this.tagName; // might need dot-prop path?
    // recursively merge all children into an object

    let values = this.entries();
    let current = values;
    tags = tags.map(tag => {
      // cleaning
      if (tag.parent) delete tag.parent;
      tag.tags.values().map(child => {
        if (child.render) {
          console.log('render');
          current = child.render();
          if (current.length === 0) current = child.entries();
          values.children = current;
        } else {
          console.log('no render');
          current = child.entries();
          values.children = current;
        }
      });
      return values;
    });
    return {
      [tagName]: tags
    };
  }

};
Tag = JSX;
const jsx = new JSX();
const eh = jsx.div({
  class: 'entry'
}) // .className('entry')
.div({
  class: 'top'
}).div({
  class: 'name'
}, 'Sammy Haddad').end().end();

require('fliplog').quick(eh.render());