Skip to content

Commit

Permalink
Adds Node.js support - Fixes #188
Browse files Browse the repository at this point in the history
  • Loading branch information
eduardolundgren committed Dec 30, 2016
1 parent f769ed8 commit ca73624
Show file tree
Hide file tree
Showing 8 changed files with 47 additions and 19 deletions.
9 changes: 9 additions & 0 deletions env/test/node.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
var assert = require('assert');
var sinon = require('sinon');
var lerna = require('../../lerna.json');

global.assert = assert;
global.sinon = sinon;
global.METAL_VERSION = lerna.version;

// In order to keep the test code the same for different environments, even
// though it's a common antipattern, jsdom is copying globals from a jsdom
// window onto the Node.js global.
// https://github.com/tmpvar/jsdom/wiki/Don't-stuff-jsdom-globals-onto-the-Node-global

require('jsdom-global')();
14 changes: 12 additions & 2 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,20 @@ metal.registerTasks({
lintGlobs: codeGlobs,
testDepTasks: ['build:cjs'],
testNodeSrc: [
// Since all files will be added, we need to ensure manually that these
// will be added first.
'packages/metal-incremental-dom/lib/incremental-dom.js',

// Test files
'env/test/node.js',
'packages/metal/test/**/*.js',
'packages/metal-component/test/**/*.js',
'packages/metal-dom/test/**/*.js',
'packages/metal-events/test/**/*.js',
'packages/metal-state/test/**/*.js',
'packages/metal/test/**/*.js'
'packages/metal-incremental-dom/test/**/*.js',
'packages/metal-jsx/test/**/*.js',
'packages/metal-soy/test/**/*.js',
'packages/metal-state/test/**/*.js'
],
testSaucelabsBrowsers: {
sl_chrome: {
Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
"gulp-babel": "^6.1.2",
"gulp-metal": "^1.0.0",
"gulp-replace": "^0.5.4",
"jsdom": "^9.9.1",
"jsdom-global": "^2.1.1",
"karma": "^1.1.0",
"karma-browserify": "^5.0.5",
"karma-chai": "^0.1.0",
Expand Down
4 changes: 4 additions & 0 deletions packages/metal-dom/test/globalEval.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ import globalEval from '../src/globalEval';

describe('globalEval', function() {
before(function() {
if (typeof process !== 'undefined') {
// Skip this test in Node.js environment.
this.skip();
}
window.testScript = null;
});

Expand Down
7 changes: 6 additions & 1 deletion packages/metal-dom/test/globalEvalStyles.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@ import * as dom from '../src/dom';
import globalEvalStyles from '../src/globalEvalStyles';

describe('globalEvalStyles', function() {
before(function() {});
before(function() {
if (typeof process !== 'undefined') {
// Skip this test in Node.js environment.
this.skip();
}
});

afterEach(function() {});

Expand Down
4 changes: 3 additions & 1 deletion packages/metal-incremental-dom/src/incremental-dom.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@
* limitations under the License.
*/

const scope = (typeof exports !== 'undefined' && typeof global !== 'undefined') ? global : window;

(function (global, factory) {
(factory((global.IncrementalDOM = global.IncrementalDOM || {})));
}(window, function (exports) { 'use strict';
}(scope, function (exports) { 'use strict';

/**
* Copyright 2015 The Incremental DOM Authors. All Rights Reserved.
Expand Down
18 changes: 10 additions & 8 deletions packages/metal-jsx/src/iDOMHelpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@ import JSXRenderer from './JSXRenderer';
* https://github.com/jridgewell/babel-plugin-incremental-dom#runtime
*/

window.iDOMHelpers = window.iDOMHelpers || {};
const scope = (typeof exports !== 'undefined' && typeof global !== 'undefined') ? global : window;

window.iDOMHelpers.attr = function(value, attrName) {
scope.iDOMHelpers = scope.iDOMHelpers || {};

scope.iDOMHelpers.attr = function(value, attrName) {
IncrementalDOM.attr(attrName, value);
};

window.iDOMHelpers.forOwn = function(object, iterator) {
scope.iDOMHelpers.forOwn = function(object, iterator) {
const hasOwn = Object.prototype.hasOwnProperty;
for (let prop in object) {
if (hasOwn.call(object, prop)) {
Expand All @@ -24,32 +26,32 @@ window.iDOMHelpers.forOwn = function(object, iterator) {
}
};

window.iDOMHelpers.jsxWrapper = function(elementClosure, args) {
scope.iDOMHelpers.jsxWrapper = function(elementClosure, args) {
const wrapper = args ? function() {
return elementClosure.apply(this, args);
} : elementClosure;
wrapper.__jsxDOMWrapper = true;
return wrapper;
};

window.iDOMHelpers.renderArbitrary = function(child) {
scope.iDOMHelpers.renderArbitrary = function(child) {
const type = typeof child;
if (type === 'number' || (type === 'string' || child && child instanceof String)) {
IncrementalDOM.text(child);
} else if (type === 'function' && child.__jsxDOMWrapper) {
child();
} else if (Array.isArray(child)) {
child.forEach(window.iDOMHelpers.renderArbitrary);
child.forEach(scope.iDOMHelpers.renderArbitrary);
} else if (String(child) === '[object Object]') {
// Renders special incremental dom nodes in a special way :)
if (IncrementalDomRenderer.isIncDomNode(child)) {
IncrementalDomRenderer.renderChild(child);
} else {
window.iDOMHelpers.forOwn(child, window.iDOMHelpers.renderArbitrary);
scope.iDOMHelpers.forOwn(child, scope.iDOMHelpers.renderArbitrary);
}
} else if (!child) {
JSXRenderer.skipChild();
}
};

export default window.iDOMHelpers;
export default scope.iDOMHelpers;
8 changes: 1 addition & 7 deletions packages/metal/test/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -265,9 +265,7 @@ describe('core', function() {

describe('Compatibility Mode', function() {
afterEach(function() {
if (typeof window !== 'undefined') {
delete window.__METAL_COMPATIBILITY__;
}
window.__METAL_COMPATIBILITY__ = undefined;
core.disableCompatibilityMode();
});

Expand All @@ -282,10 +280,6 @@ describe('core', function() {
});

it('should return the data specified by global var', function() {
if (typeof window === 'undefined') {
// Skip this test in Node.js environment.
return;
}
const data = {};
window.__METAL_COMPATIBILITY__ = data;
assert.strictEqual(data, core.getCompatibilityModeData());
Expand Down

0 comments on commit ca73624

Please sign in to comment.