diff --git a/dev.config.js b/dev.config.js index 7f1102ce..5977f850 100644 --- a/dev.config.js +++ b/dev.config.js @@ -47,9 +47,9 @@ module.exports = { plugins: [ new HtmlWebpackPlugin({ inject: false, - appMountId: 'app', title: 'Test Fixture', mobile: true, + bodyHtmlSnippet: '
', template: require('html-webpack-template'), links: [], }), diff --git a/lib/rastermanager.js b/lib/rastermanager.js index 249c6813..9b46bb9c 100644 --- a/lib/rastermanager.js +++ b/lib/rastermanager.js @@ -97,7 +97,7 @@ const createComponent = ast => { return ast; }; -RasterManager.render = component => { +RasterManager.render = (component, target) => { // rudementary rendering if (typeof component == 'function') { // hasn't been inflated yet @@ -124,7 +124,7 @@ RasterManager.render = component => { parseAST.instance.parent = c; // render through raster - _raster.render(parseAST); + _raster.render(parseAST, target); } else { // update path // look for calculated values {attributes, string children} @@ -154,7 +154,7 @@ RasterManager.render = component => { crawl(component.render(), updateAST); updateAST.update = true; - _raster.render(updateAST); + _raster.render(updateAST, target); } }; diff --git a/lib/rasters/dom/index.js b/lib/rasters/dom/index.js index 81c45732..e05bb636 100644 --- a/lib/rasters/dom/index.js +++ b/lib/rasters/dom/index.js @@ -15,21 +15,20 @@ class domraster { this.type = 'dom'; } - render(component) { + render(component, target) { // render a view - this.sendMessage('gui', component); + this.sendMessage('gui',{component, target}); } sendMessage(type, message) { if (type === 'gui') { - Raster.parseAST(message); + Raster.parseAST(message.component, message.target); } else if (type === 'animation') { Raster.setupAnimation(message); } } dimensions() { - console.log(window.innerWidth, window.innerHeight) return { width: window.innerWidth, height: window.innerHeight, diff --git a/lib/rasters/dom/raster.js b/lib/rasters/dom/raster.js index f9674503..e06057c6 100644 --- a/lib/rasters/dom/raster.js +++ b/lib/rasters/dom/raster.js @@ -4,19 +4,21 @@ import { Animator } from './animator'; let _instances = {}; class raster { - parseAST(ast) { + parseAST(ast, target) { if (ast.update) { } else { - this.build(ast); + this.build(ast, target); } } setupAnimation(ast) { Animator.animate(ast); } - build(ast) { + build(ast, target) { let instance = this.createComponent(ast); + let renderTarget = target ? target : document.body; + renderTarget = renderTarget instanceof HTMLElement ? renderTarget : document.getElementById(renderTarget); if (instance) { - document.body.appendChild(instance); + renderTarget.appendChild(instance); SyrEvents.emit({ type: 'componentDidMount', guid: ast.guid, @@ -51,6 +53,9 @@ class raster { } instance.id = component.guid; _instances[instance.id] = instance; + if(component.attributes.className) { + instance.className = component.attributes.className; + } let styles = component.instance.attributes ? component.instance.attributes.style : {}; diff --git a/libs/jsx.js b/libs/jsx.js index e70b96e7..f66d25b6 100644 --- a/libs/jsx.js +++ b/libs/jsx.js @@ -72,7 +72,7 @@ exports.default = function (_ref) { // Otherwise, we won‘t be mapping. jsxObjectTransformer = _identity2.default; } - + // console.dir('Object Transformer >>>>', jsxObjectTransformer); return { variablesRegex: variablesRegex, jsxObjectTransformer: jsxObjectTransformer @@ -199,7 +199,16 @@ exports.default = function (_ref) { }; var JSXElement = function JSXElement(node) { - return jsxObjectTransformer(t.objectExpression([t.objectProperty(t.identifier(nameProperty), JSXElementName(node.openingElement.name)), t.objectProperty(t.identifier(attributesProperty), JSXAttributes(node.openingElement.attributes)), t.objectProperty(t.identifier(childrenProperty), node.children ? JSXChildren(node.children) : t.nullLiteral()), t.objectProperty(t.identifier(uniqueId), t.stringLiteral(guid()))])); + return jsxObjectTransformer(t.objectExpression( + [ + t.objectProperty(t.identifier(nameProperty), + JSXElementName(node.openingElement.name)), + t.objectProperty(t.identifier(attributesProperty), + JSXAttributes(node.openingElement.attributes)), + t.objectProperty(t.identifier(childrenProperty), JSXChildren(node.children)), + t.objectProperty(t.identifier(uniqueId), t.stringLiteral(guid())) + ] + )); }; var JSXChild = transformOnType({ JSXText: JSXText, JSXElement: JSXElement, JSXExpressionContainer: JSXExpressionContainer }); @@ -210,6 +219,12 @@ exports.default = function (_ref) { // an optimization as we minimize the number of nodes created. // This step just turns `['1', '2']` into `['12']`. .reduce(function (children, child) { + //if it is a child is an empty expression dont append the child just return current array. + //This removes 'empty' or 'null' spaces in the children. + if(child.type === 'JSXEmptyExpression') { + return _toConsumableArray(children); + } + var lastChild = children.length > 0 ? children[children.length - 1] : null; // If this is a string literal, and the last child is a string literal, merge them. diff --git a/test/jsxtest.js b/test/jsxtest.js new file mode 100644 index 00000000..68529656 --- /dev/null +++ b/test/jsxtest.js @@ -0,0 +1,29 @@ +import { Component, Render, RasterManager, View, Text } from '../index'; +const assert = require('assert'); + +describe('JSX', function() { + describe('Comments', function() { + it('should not include comments in children', function() { + class MyComponent extends Component { + render() { + return + {/*These are comments*/} + + {/*These are comments*/} + Hello + {/*These are comments*/} + ; + } + } + + const mycomponent = new MyComponent(); + const rendering = mycomponent.render(); + + assert.equal(typeof rendering.elementName, 'function'); + assert.equal(typeof rendering.attributes, 'object'); + assert.equal(rendering.children instanceof Array, true); + assert.equal(rendering.children.length, 2); + assert.equal(typeof rendering.guid, 'string'); + }); + }); +}); diff --git a/test/rastertest.js b/test/rastertest.js new file mode 100644 index 00000000..736761c7 --- /dev/null +++ b/test/rastertest.js @@ -0,0 +1,47 @@ +import { Component, Render, RasterManager, Text } from '../index'; +const assert = require('assert'); +const initHTML = `
`; + + +// including JSDOM to test browser rendering. +require('./testsetup').testDom(initHTML); +const HTMLSpanElement = window.HTMLSpanElement; + + +describe('Render Target', function() { + class RenderTargetTest extends Component { + render() { + return Hello World; + } + } + + Render(RenderTargetTest, 'root'); + const element = document.getElementById('root').children[0]; + + it('should render the given element as a child to the target', function() { + assert.equal(element.style['height'], '50px'); + assert.equal(element.style['width'], '100px'); + assert.equal(element.innerText, 'Hello World'); + }); + + +}); +describe('Render className', function() { + class RenderClassNameTest extends Component { + render() { + return Hello World; + } + } + + Render(RenderClassNameTest); + //selecting the element with the given className + const element = document.querySelector('.foo'); + + it('should render the given element with the given class', function() { + assert.equal(element instanceof HTMLElement, true); + assert.equal(element instanceof HTMLSpanElement, true); + assert.equal(element.innerText, 'Hello World'); + }); + + +}); diff --git a/test/scrollviewtest.js b/test/scrollviewtest.js index 1c953e56..9acbf21a 100644 --- a/test/scrollviewtest.js +++ b/test/scrollviewtest.js @@ -1,8 +1,9 @@ import { Component, Render, RasterManager, ScrollView } from '../index'; const assert = require('assert'); +const initHTML = ``; //including JSDOM to test browser rendering. -require('./testsetup').testDom(); +require('./testsetup').testDom(initHTML); describe('ScrollView', function() { class ScrollViewTest extends Component { diff --git a/test/stackviewtest.js b/test/stackviewtest.js index d25a84eb..56db8efb 100644 --- a/test/stackviewtest.js +++ b/test/stackviewtest.js @@ -1,8 +1,9 @@ import { Component, Render, RasterManager, StackView } from '../index'; const assert = require('assert'); +const initHTML = ``; //including JSDOM to test browser rendering. -require('./testsetup').testDom(); +require('./testsetup').testDom(initHTML); describe('StackView', function() { class ScrollViewTest extends Component { diff --git a/test/testsetup.js b/test/testsetup.js index 80dd3ba8..5ad14964 100644 --- a/test/testsetup.js +++ b/test/testsetup.js @@ -1,8 +1,10 @@ //including JSDOM to test browser rendering. -exports.testDom = function() { +exports.testDom = function(initHTML) { const jsdom = require("jsdom"); const { JSDOM } = jsdom; -global.document = new JSDOM(``).window.document; +global.window = new JSDOM(initHTML).window; +global.document = window.document; +global.HTMLElement = window.HTMLElement; } //https://stackoverflow.com/questions/18543047/mocha-monitor-application-output diff --git a/test/texttest.js b/test/texttest.js new file mode 100644 index 00000000..bd75da8d --- /dev/null +++ b/test/texttest.js @@ -0,0 +1,26 @@ +import { Component, Render, RasterManager, Text } from '../index'; +const assert = require('assert'); +const initHTML = ``; + +// including JSDOM to test browser rendering. +require('./testsetup').testDom(initHTML); + + +describe('Text View', function() { + class TextTest extends Component { + render() { + return Hello World; + } + } + + Render(TextTest); + //since the text view is rendered in a span. + const element = document.querySelector('span'); + + it('should render text with the given styles', function() { + assert.equal(element.style['height'], '50px'); + assert.equal(element.style['width'], '100px'); + assert.equal(element.innerText, 'Hello World'); + }); + +}); diff --git a/test/touchabletest.js b/test/touchabletest.js index 2240bd8f..350b2aef 100644 --- a/test/touchabletest.js +++ b/test/touchabletest.js @@ -1,8 +1,10 @@ import { Component, Render, RasterManager, TouchableOpacity } from '../index'; const assert = require('assert'); +const initHTML = ``; //including JSDOM to test browser rendering. -require('./testsetup').testDom(); +require('./testsetup').testDom(initHTML); + const captureStream = require('./testsetup').captureStream; describe('TouchableOpacity', function() {