# add dist

This commit is contained in:
Mario Romano
2016-04-21 11:56:31 +01:00
parent 5914688467
commit 07807e7bc3
13499 changed files with 1808930 additions and 5 deletions

View File

@@ -0,0 +1,43 @@
var Builder = require('../index');
var builder = new Builder();
builder.loadConfigSync('./test/fixtures/test-tree.config.js');
builder.config({ transpiler: 'babel' });
suite('Anonymous Compilation', function() {
test('AMD', function(done) {
builder.compile('amd.js').then(function(output) {
assert.match(output.source, /define\(\["\.\/global\.js"/);
})
.then(done, done);
});
test('CJS', function(done) {
builder.compile('cjs.js').then(function(output) {
assert.match(output.source, /System\.registerDynamic\(\[\]/);
})
.then(done, done);
});
test('Global', function(done) {
builder.compile('global.js').then(function(output) {
assert.match(output.source, /System\.registerDynamic\(\["\.\/jquery\.js"/);
})
.then(done, done);
});
test('Register', function(done) {
builder.compile('third.js').then(function(output) {
assert.match(output.source, /System\.register\(\["\.\/second.js"\]/);
})
.then(done, done);
});
test('ES', function(done) {
builder.compile('first.js').then(function(output) {
assert.match(output.source, /System\.register\(\[/);
})
.then(done, done);
});
});

View File

@@ -0,0 +1,281 @@
var Builder = require('../index');
var builder = new Builder();
builder.loadConfigSync('./test/fixtures/test-tree.config.js');
builder.config({ transpiler: 'babel' });
suite('Bundle Expressions', function() {
test('Addition', function(done) {
builder.trace('amd.js + amd-2.js')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(),
['amd-2.js', 'amd.js', 'global.js', 'jquery.js', 'some.js!plugin.js', 'text.txt!text-plugin.js']);
})
.then(done, done);
});
test('Single module subtraction', function(done) {
builder.trace('amd.js + amd-2.js - [amd-1.js]')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(),
['amd-2.js', 'amd.js', 'global.js', 'jquery.js', 'some.js!plugin.js', 'text.txt!text-plugin.js']);
})
.then(done, done);
});
test('Commonality operator', function(done) {
builder.trace('amd-5b.js & second.js')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs.js', 'second.js', 'third.js']);
})
.then(done, done);
});
test('Wildcard bundling', function(done) {
builder.trace('*.js - [amd-*] - [sfx-format-*]')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), [
'Buffer.js', 'amd.js', 'babel', 'cjs space.js', 'cjs-1.js', 'cjs-2.js', 'cjs-3.js', 'cjs-4.js', 'cjs-5.js', 'cjs-globals.js', 'cjs-in-12.js', 'cjs-in-13.js',
'cjs-resolve.js', 'cjs.js', 'component.jsx!jsx.js', 'file.json', 'first.js',
'global-inner.js', 'global-outer.js', 'global.js', 'jquery-cdn', 'jquery.js', 'json-plugin.js', 'jsx.js', 'plugin.js', 'runtime.js',
'second.js', 'some.js!plugin.js', 'text-plugin.js', 'text.txt!text-plugin.js', 'third.js', 'umd.js']);
})
.then(done, done);
});
test('Wildcard plugin', function(done) {
builder.trace('*.jsx!jsx.js - [component.jsx!jsx.js]')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), []);
})
.then(done, done);
});
test('cjs bundles added', function(done){
builder.trace('cjs-1.js + cjs-2.js + cjs-3.js')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), [
'cjs-1.js', 'cjs-2.js', 'cjs-3.js', 'cjs-in-12.js', 'cjs-in-13.js']);
})
.then(done, done);
});
test('cjs bundles added with parens and extra spaces', function(done){
builder.trace(' ( cjs-1.js & cjs-2.js ) + ( cjs-1.js & cjs-3.js)')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-12.js', 'cjs-in-13.js']);
})
.then(done, done);
});
test('cjs bundles added with single-value parameters', function(done){
builder.trace('(cjs-1.js) + (cjs-2.js) + (cjs-3.js)')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), [
'cjs-1.js', 'cjs-2.js', 'cjs-3.js', 'cjs-in-12.js', 'cjs-in-13.js']);
})
.then(done, done);
});
test('cjs bundles added with parens', function(done){
builder.trace('(cjs-1.js & cjs-2.js) + (cjs-1.js & cjs-3.js)')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-12.js', 'cjs-in-13.js']);
})
.then(done, done);
});
test('cjs bundles added with parens 2', function(done){
builder.trace('(cjs-1.js & cjs-2.js)')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-12.js']);
})
.then(done, done);
});
test('cjs bundles added with parens 3', function(done){
builder.trace('(cjs-1.js & cjs-2.js) + cjs-in-13.js - cjs-in-13.js')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-12.js']);
})
.then(done, done);
});
test('cjs bundles added with parens 4', function(done){
builder.trace('(cjs-1.js & cjs-2.js) + cjs-in-13.js - cjs-in-13.js')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-12.js']);
})
.then(done, done);
});
test('cjs bundles added with parens 5', function(done){
builder.trace('cjs-in-13.js + (cjs-1.js & cjs-2.js) - cjs-in-13.js')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-12.js']);
})
.then(done, done);
});
test('cjs bundles added with multiple parens', function(done){
builder.trace('cjs-in-13.js + (cjs-1.js & cjs-2.js) - (cjs-in-13.js)')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-12.js']);
})
.then(done, done);
});
test('cjs bundles added with multiple parens 2', function(done){
builder.trace('(cjs-1.js & cjs-2.js) + (cjs-1.js & cjs-3.js) - cjs-in-12.js')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-13.js']);
})
.then(done, done);
});
test('cjs bundles with nested parens', function(done){
builder.trace('(cjs-1.js + cjs-2.js - ([cjs-1.js] + [cjs-2.js])) - (cjs-in-12.js)')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-13.js']);
})
.then(done, done);
});
test('cjs bundles with nested parens 2', function(done){
builder.trace('(cjs-1.js + cjs-2.js - ([cjs-1.js] + [cjs-2.js])) - (cjs-in-12.js) + (cjs-4.js + cjs-5.js)')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-4.js', 'cjs-5.js', 'cjs-in-13.js']);
})
.then(done, done);
});
test('cjs bundles with nested parens 3', function(done){
builder.trace('((cjs-1.js + cjs-2.js - ([cjs-1.js] + [cjs-2.js])) - (cjs-in-12.js) + (cjs-4.js + cjs-5.js)) - ([cjs-4.js] + [cjs-5.js])')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-13.js']);
})
.then(done, done);
});
test('cjs bundles with nested parens 4', function(done){
builder.trace('((cjs-1.js + cjs-2.js - ([cjs-1.js] + [cjs-2.js] + ([cjs-4.js] + [cjs-5.js]))) - (cjs-4.js + cjs-5.js))')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-12.js', 'cjs-in-13.js']);
})
.then(done, done);
});
test('ibid with single module subtracted', function(done){
builder.trace('(cjs-1.js + cjs-2.js - ([cjs-1.js] + [cjs-2.js])) - ([cjs-in-12.js])')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-13.js']);
})
.then(done, done);
});
test('cjs bundles added with nested parens', function(done){
builder.trace('(cjs-1.js + cjs-2.js - (cjs-1.js & cjs-2.js))')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-1.js', 'cjs-2.js', 'cjs-in-13.js']);
})
.then(done, done);
});
test('cjs bundles with parens and single modules', function(done){
builder.trace('(cjs-1.js + cjs-2.js) - ([cjs-1.js] + [cjs-2.js])')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['cjs-in-12.js', 'cjs-in-13.js']);
})
.then(done, done);
});
test('file with space', function(done){
builder.trace('cjs-1.js + cjs space.js')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), [
'cjs space.js', 'cjs-1.js', 'cjs-in-12.js', 'cjs-in-13.js']);
})
.then(done, done);
});
test('file with space 2', function(done){
builder.trace('cjs-1.js + cjs space.js ')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), [
'cjs space.js', 'cjs-1.js', 'cjs-in-12.js', 'cjs-in-13.js']);
})
.then(done, done);
});
test('file with space 3', function(done){
builder.trace('cjs-1.js + cjs space.js + cjs-2.js')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), [
'cjs space.js', 'cjs-1.js', 'cjs-2.js', 'cjs-in-12.js', 'cjs-in-13.js']);
})
.then(done, done);
});
test('file with space 4', function(done){
builder.trace('cjs-1.js + cjs space.js + cjs-2.js ')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), [
'cjs space.js', 'cjs-1.js', 'cjs-2.js', 'cjs-in-12.js', 'cjs-in-13.js']);
})
.then(done, done);
});
});
suite('Bundle Expression Validation', function() {
test('missing identifier 1', function(){
return validateInvalidExpression('cjs-1.js + +');
});
test('missing identifier 2', function(){
return validateInvalidExpression('cjs-1.js + -');
});
test('missing identifier 3', function(){
return validateInvalidExpression('cjs-1.js + &');
});
test('unclosed parens 1', function(){
return validateInvalidExpression('(cjs-1.js + cjs-2.js');
});
test('unclosed parens 2', function(){
return validateInvalidExpression('(cjs-1.js + (cjs-2.js + cjs-3.js');
});
test('unclosed parens 3', function(){
return validateInvalidExpression('(cjs-1.js + (cjs-2.js + cjs-3.js)');
});
test('unclosed parens 4', function(){
return validateInvalidExpression('(cjs-2.js + cjs-3.js) + (cjs-1.js + (cjs-2.js + cjs-3.js)');
});
function validateInvalidExpression(expression){
return Promise
.resolve()
.then(function(){ return builder.trace(expression) })
.then(
function(){ return Promise.reject('Invalid expression <' + expression + '> was parsed without error'); }, //it worked but shouldn't have
function(err){
//uncomment this line to view the Syntax Errors' wordings in the test console
//console.log(err);
if (typeof err !== 'string' || !/^Syntax Error/i.test(err)){
return Promise.reject('Syntax error was expected, but not generated')
} else {
return Promise.resolve(1);
}
}
)
}
});

View File

@@ -0,0 +1,44 @@
var Builder = require('../index');
var builder = new Builder();
builder.loadConfigSync('./test/fixtures/test-tree.config.js');
builder.config({ transpiler: 'babel' });
var baseURL = builder.loader.baseURL;
suite('Canonical Names', function() {
test('Simple canonical', function() {
assert.equal(builder.getCanonicalName('amd.js'), 'amd.js');
});
test('Wildcard', function() {
assert.equal(builder.getCanonicalName(baseURL + 'test/fixtures/test-tree/asdf'), 'asdf');
});
test('Exact beats wildcard', function() {
assert.equal(builder.getCanonicalName(baseURL + 'node_modules/babel-core/browser.js'), 'babel');
});
test('Wildcard extensions', function() {
assert.equal(builder.getCanonicalName(baseURL + 'test/dummy/file.jade'), 'file.jade');
});
test('Wildcard extensions with a plugin', function() {
builder.loader.defaultJSExtensions = true;
assert.equal(builder.getCanonicalName('cjs'), 'cjs');
assert.equal(builder.getCanonicalName(baseURL + 'test/dummy/file.jade!' + baseURL + 'test/fixtures/test-tree/jade.js'), 'file.jade!jade.js');
});
test('Trailing / canonical', function() {
builder.loader.defaultJSExtensions = false;
builder.config({
paths: {
'trailing/': 'src/'
}
});
assert.equal(builder.getCanonicalName(baseURL + 'src/asdf'), 'trailing/asdf');
assert.equal(builder.getCanonicalName(baseURL + 'src/'), 'trailing/');
assert.equal(builder.getCanonicalName(baseURL + 'src'), 'trailing');
})
});

View File

@@ -0,0 +1,82 @@
var Builder = require('../index');
var builder = new Builder('test/fixtures/conditional-tree');
builder.loadConfigSync('test/fixtures/conditional-tree.config.js');
suite('Conditional Builds', function() {
test('Package environment traces all conditional variations', function() {
return builder.trace('pkg/env-condition')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['pkg/#:./env-condition', 'pkg/env-condition-browser.js', 'pkg/env-condition.js'].sort());
});
});
test('Conditional interpolation traces all conditional variations', function() {
return builder.trace('interpolated-#{conditions.js|test}.js')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['interpolated-#{conditions.js|test}.js', 'conditions.js', 'interpolated-1.js', 'interpolate-1-dep.js', 'interpolated-2.js'].sort());
});
});
test('Boolean conditional', function() {
return builder.trace('interpolated-1.js#?|browser')
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['interpolated-1.js#?@system-env|browser', 'interpolated-1.js', 'interpolate-1-dep.js'].sort());
});
});
test('Boolean conditional exclusion', function() {
return builder.trace('interpolated-1.js#?|browser', { node: true })
.then(function(tree) {
assert.deepEqual(Object.keys(tree), ['interpolated-1.js#?@system-env|browser']);
})
})
test('traceAllConditionals false', function() {
return builder.trace('pkg/env-condition + interpolated-#{conditions.js|test}.js', { traceAllConditionals: false })
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['interpolated-#{conditions.js|test}.js', 'pkg/#:./env-condition', 'conditions.js'].sort());
});
});
test('Browser:false tracing', function() {
return builder.trace('pkg/env-condition + interpolated-#{conditions.js|test}.js', { browser: false })
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['pkg/#:./env-condition', 'pkg/env-condition.js', 'interpolated-#{conditions.js|test}.js', 'conditions.js', 'interpolated-1.js', 'interpolate-1-dep.js', 'interpolated-2.js'].sort())
});
});
test('Custom conditions trace', function() {
return builder.trace('interpolated-#{conditions.js|test}.js', { conditions: { 'conditions.js|test': '1' } })
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['interpolated-#{conditions.js|test}.js', 'conditions.js', 'interpolated-1.js', 'interpolate-1-dep.js'].sort());
});
});
test('Environment tracing', function() {
return builder.trace('pkg/env-condition + interpolated-#{conditions.js|test}.js', { traceConditionsOnly: true })
.then(function(tree) {
assert.deepEqual(Object.keys(tree), ['conditions.js']);
});
});
test('Custom condition build', function() {
builder.config({
map: {
'ENV': 'ENV.js'
}
});
return builder.trace('custom-conditions.js', { conditions: { 'ENV|mock': false, 'ENV|environment': ['dev'], 'ENV|optimize': true } })
.then(function(tree) {
assert.deepEqual(Object.keys(tree).sort(), ['ENV.js', 'config.#{ENV.js|environment}.js', 'config.dev.js', 'custom-conditions.js', 'mock.js#?ENV.js|mock']);
});
});
test('Build including all conditional variations', function() {
return builder.bundle('pkg/env-condition + interpolated-#{conditions.js|test}.js', 'test/output/conditional-build.js', { sourceMaps: true })
.then(function(output) {
assert(output.source);
});
});
});

View File

@@ -0,0 +1,33 @@
var Builder = require('../index');
var builder = new Builder('test/fixtures/conditional-tree');
builder.loadConfigSync('test/fixtures/conditional-tree.config.js');
var baseURL = builder.loader.baseURL;
builder.config({ defaultJSExtensions: true });
suite('Conditional Canonical Names', function() {
test('Package environment canonical', function() {
assert.equal(builder.getCanonicalName(baseURL + 'pkg#:env-condition'), 'pkg#:env-condition');
});
test('Interpolation', function() {
assert.equal(builder.getCanonicalName(baseURL + 'interpolated-#{' + baseURL + 'conditions.js|test}.js'), 'interpolated-#{conditions.js|test}.js');
});
test('Plugin interpolation', function() {
assert.equal(builder.getCanonicalName(baseURL + 'pkg/test-#{' + baseURL + 'conditions.js|test}.js!plugin-#{conditions.js|another}.js'), 'pkg/test-#{conditions.js|test}.js!plugin-#{conditions.js|another}.js');
});
test('Boolean conditional', function() {
assert.equal(builder.getCanonicalName(baseURL + 'pkg/lib/test#?~' + baseURL + 'bool|exp'), 'pkg/lib/test#?~bool|exp');
});
test('Boolean conditional with plugin', function() {
builder.config({
paths: {
a: 'asdf', // only if we add .js this catches
condition: 'conditions.js',
p: 'plugin'
}
})
assert.equal(builder.getCanonicalName(baseURL + 'asdf.js' + '!' + baseURL + 'plugin.js#?' + baseURL + 'conditions.js'), 'asdf.js!p#?condition');
})
});

View File

@@ -0,0 +1,18 @@
var Builder = require('../index');
var builder = new Builder('test/fixtures/error-tree');
suite('Errors', function() {
test('Non-existing file', function() {
return builder.bundle('asdf')
.catch(function(e) {
assert(e.toString().indexOf('ENOENT') != -1);
});
});
test('Non-existing dependency', function() {
return builder.bundle('a.js')
.catch(function(e) {
assert(e.stack.toString().indexOf('a.js') != -1);
});
});
});

View File

@@ -0,0 +1 @@
import 'b.js';

View File

@@ -0,0 +1 @@
import 'c.js';

View File

@@ -0,0 +1 @@
import 'a.js';

View File

@@ -0,0 +1,14 @@
System.config({
map: {
condition: 'conditions.js'
},
packages: {
'pkg': {
map: {
'./env-condition': {
'browser': './env-condition-browser'
}
}
}
}
});

View File

@@ -0,0 +1 @@
export var test = '1';

View File

@@ -0,0 +1 @@
export default 'dev';

View File

@@ -0,0 +1,2 @@
export * from './config.#{ENV|environment}.js';
import './mock.js#?ENV|mock';

View File

@@ -0,0 +1 @@
module.exports = '1-dep';

View File

@@ -0,0 +1,2 @@
require('./interpolate-1-dep.js');
module.exports = '1';

View File

@@ -0,0 +1 @@
console.log('mock');

View File

@@ -0,0 +1 @@
module.exports = 'environment condition browser';

View File

@@ -0,0 +1 @@
module.exports = 'environment condition';

View File

@@ -0,0 +1 @@
import 'asdfe';

View File

@@ -0,0 +1,2 @@
export {b} from './b.js';
export var a = 'a';

View File

@@ -0,0 +1 @@
export var b = 'b';

View File

@@ -0,0 +1 @@
export * from '../test-tree/global-inner.js';

View File

@@ -0,0 +1,2 @@
// export * from '../test-tree/global-inner.js';
import './global-dep-loader.js';

View File

@@ -0,0 +1 @@
{"version":3,"sources":["third.js","cjs.js","jquery.js","some","text.txt","component.jsx","global.js","amd.js","second.js","first.js"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1 @@
{"version":3,"sources":["amd-2.js"],"names":[],"mappings":";;;AAAA,KAAK,SAAS,AAAC,CAAC,OAAM,CAAG,GAAC,CAAG,MAAI,CAAG,UAAQ,AAAC,CAAE;AAC7C,OAMK,EAAE,GAAE,CAAG,IAAE,CAAE,CANQ;AAC1B,CAAC,CAKmB;AAAA"}

View File

@@ -0,0 +1 @@
{"version":3,"sources":["third.js","cjs.js","jquery.js","some","text.txt","component.jsx","global.js","amd.js","second.js","first.js"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1 @@
{"version":3,"sources":["amd-2.js"],"names":[],"mappings":";;;AAAA,KAAK,SAAS,AAAC,CAAC,OAAM,CAAG,GAAC,CAAG,MAAI,CAAG,UAAQ,AAAC,CAAE;AAC7C,OAMK,EAAE,GAAE,CAAG,IAAE,CAAE,CANQ;AAC1B,CAAC,CAKmB;AAAA"}

View File

@@ -0,0 +1,3 @@
define([], function(module) {
console.log('I hate caches');
});

View File

@@ -0,0 +1,27 @@
System.config({
paths: {
'*': './test/fixtures/test-tree/*',
'*.jade': './test/dummy/*.jade',
'babel': './node_modules/babel-core/browser.js',
'babel-helpers': './node_modules/babel-core/external-helpers.js',
'traceur': './node_modules/traceur/bin/traceur.js',
'traceur-runtime': './node_modules/traceur/bin/traceur-runtime.js',
'typescript': './node_modules/typescript/lib/typescript.js'
},
meta: {
'babel': {
format: 'global'
},
'jquery-cdn': {
build: false
},
'cjs-globals.js': {
globals: {
Buffer: 'Buffer.js'
}
},
'*.json': {
loader: 'json-plugin.js'
}
}
});

View File

@@ -0,0 +1,2 @@
"use strict";
module.exports = 'Buffer';

View File

@@ -0,0 +1,13 @@
define(['./first.js', './second.js', 'require', 'module'], function(first, second, require, module) {
module.exports = {
first: first,
second: require('./second.js'),
utfChar: '\u221e'
};
if (DEBUG) {
console.log('debug mode');
}
});

View File

@@ -0,0 +1,18 @@
define('a', {
a: 'a'
});
define('b', {
b: 'b'
});
define(['c'], function(c) {
return c;
});
define('c', ['b'], function(b) {
return {
b: b,
c: 'c'
};
});

View File

@@ -0,0 +1,19 @@
(function() {
var define = System.amdDefine;
define('a', {a: 'a'});
define('b', {b: 'b'});
define("amd-10.js", ["c"], function(c) {
return c;
});
define('c', ['b'], function(b) {
return {
b: b,
c: 'c'
};
});
})();
define(['amd-10.js'], function(m) {
return m;
});

View File

@@ -0,0 +1,10 @@
define(function() {
var a = 'a';
function internal() {
define(a, [], {});
}
return { a: a };
});

View File

@@ -0,0 +1,8 @@
/* asdf
define({ amd: 2 }); // ?
*/
define(window.m = { amd: '2' });

View File

@@ -0,0 +1,3 @@
define(function(req, exports, module) {
module.exports = req('./first.js');
});

View File

@@ -0,0 +1,10 @@
function factory(second) {
var define = 'asdf';
return second;
}
if (false)
System.import('x');
define(['./second.js'], factory)

View File

@@ -0,0 +1,6 @@
function factory() {
window.jquery = '1';
return { jquery: '1' };
}
define('jquery', [], factory);

View File

@@ -0,0 +1,5 @@
function factory(first) {
return { jquery: '1', first: first };
}
define('jquery', ['./first.js'], factory);

View File

@@ -0,0 +1,3 @@
define(function(require) {
this.p = 'a';
});

View File

@@ -0,0 +1,3 @@
define(['require', 'exports'], function() {
this.p = 'b';
});

View File

@@ -0,0 +1,2 @@
var factory = { amd: 'object' };
define(factory);

View File

@@ -0,0 +1,5 @@
"deps ./amd-meta-dep.js";
if (!window.meta)
define(function() {
return window.meta;
});

View File

@@ -0,0 +1,18 @@
define(['c'], function(c) {
return c;
});
define('a', {
a: 'a'
});
define('b', {
b: 'b'
});
define('c', ['b'], function(b) {
return {
b: b,
c: 'c'
};
});

View File

@@ -0,0 +1 @@
window.meta = 'dep';

View File

@@ -0,0 +1,3 @@
define(['./global.js', './some.js!./plugin.js', './text.txt!./text-plugin.js'], function(a, b, c) {
return { is: 'amd', text: c };
});

View File

@@ -0,0 +1,2 @@
module.exports = { name: 'cjs space' };

View File

@@ -0,0 +1,4 @@
var shared1 = require('./cjs-in-12.js');
var shared2 = require('./cjs-in-13.js');
module.exports = { name: 'cjs1' };

View File

@@ -0,0 +1,3 @@
var shared1 = require('./cjs-in-12.js');
module.exports = { name: 'cjs2' };

View File

@@ -0,0 +1,4 @@
var shared1 = require('./cjs-in-13.js');
module.exports = { name: 'cjs3' };

View File

@@ -0,0 +1 @@
module.exports = { name: 'cjs4' };

View File

@@ -0,0 +1 @@
module.exports = { name: 'cjs5' };

View File

@@ -0,0 +1 @@
module.exports = Buffer;

View File

@@ -0,0 +1 @@
module.exports = { name: 'cjs-in-12' };

View File

@@ -0,0 +1 @@
module.exports = { name: 'cjs-in-13' };

View File

@@ -0,0 +1 @@
module.exports = require.resolve('./first.js');

View File

@@ -0,0 +1,11 @@
console.log(__filename);
(function(require) {
if (typeof require != 'undefined' && eval('typeof require') == 'undefined')
exports.cjs = true;
if (false)
require('some' + 'expression');
})(require);
exports.env = process.env.NODE_ENV;

View File

@@ -0,0 +1,3 @@
var React = {};
React.createElement = function() {;};
export var component = <div className="foo" />;

View File

@@ -0,0 +1,3 @@
{
"some": "json"
}

View File

@@ -0,0 +1,11 @@
import 'jquery-cdn';
import '@empty';
import { q } from "./second.js";
import './amd.js';
import './component.jsx!./jsx.js';
import {some} from './file.json';
export var j = some;
export var p = 5;
q;

View File

@@ -0,0 +1,11 @@
(function() {
var p = 5;
});
if (true) {
let q = 5;
}
{
let r = 10;
var r = 10;
}

View File

@@ -0,0 +1,9 @@
(function() {
p = 6;
});
var p = 5;
function q() {}
if (false)
var window = 5;

View File

@@ -0,0 +1,6 @@
"exports myjquery.test";
"globals.myjquery ./jquery.js";
this.myjquery.test = 'output';
//@ sourceMappingURL=asdf

View File

@@ -0,0 +1 @@
var jquery = {};

View File

@@ -0,0 +1,14 @@
/*
JSON plugin
*/
define({
translate: function(load) {
if (this.builder)
return 'module.exports = ' + JSON.stringify(JSON.parse(load.source));
},
instantiate: function(load) {
if (!this.builder)
return JSON.parse(load.source);
}
});

View File

@@ -0,0 +1,7 @@
var babel = require('babel');
exports.translate = function(load) {
var output = babel.transform(load.source, { modules: 'system', sourceMaps: true });
load.source = output.code;
load.metadata.sourceMap = output.map;
};

View File

@@ -0,0 +1,17 @@
//exports.build = false;
define(function() {
return {
fetch: function() {
return '';
},
listAssets: function(loads) {
return loads.map(function(load) {
return {
url: load.address,
contentType: 'text/plain'
};
});
}
};
});

View File

@@ -0,0 +1,6 @@
export class test extends Object {
constructor() {
super();
q;
}
}

View File

@@ -0,0 +1,3 @@
import './third.js';
import './cjs.js';
export var q = 4;

View File

@@ -0,0 +1,8 @@
import comp from './component.jsx!jsx.js';
export function basic() {
return 1 + 1;
}
export var component = comp;
export default {
'hello': 'world'
};

View File

@@ -0,0 +1,12 @@
exports.translate = function(load) {
return 'module.exports = "' + load.source
.replace(/(["\\])/g, '\\$1')
.replace(/[\f]/g, "\\f")
.replace(/[\b]/g, "\\b")
.replace(/[\n]/g, "\\n")
.replace(/[\t]/g, "\\t")
.replace(/[\r]/g, "\\r")
.replace(/[\u2028]/g, "\\u2028")
.replace(/[\u2029]/g, "\\u2029")
+ '";';
}

View File

@@ -0,0 +1 @@
This is some text

View File

@@ -0,0 +1,10 @@
System.register(['./second.js'], function($__export) {
return {
setters: [function() {}],
execute: function() {
$__export('some', 'exports');
$__export('pi', 'π');
$__export('name', __moduleName);
}
};
});

View File

@@ -0,0 +1,12 @@
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(['require', 'exports', 'cjs.js'], factory);
} else if (typeof exports === 'object') {
module.exports = factory(require, exports, module);
} else {
root.wAnalytics = factory();
}
}(this, function(require, exports) {
require('cjs.js');
exports.umd = 'detection';
}));

View File

@@ -0,0 +1 @@
module.exports = {};

View File

@@ -0,0 +1,3 @@
--require test/setup.js
--ui tdd
--timeout 120000

View File

@@ -0,0 +1,2 @@
global.Promise = require('bluebird');
global.assert = require('chai').assert;

View File

@@ -0,0 +1,205 @@
var fs = require('fs');
var Builder = require('../index');
// OH DEAR!
return;
function atob(str) {
return new Buffer(str, 'base64').toString('binary');
}
var err = function(e) {
setTimeout(function() {
throw e;
});
};
var buildOpts = { sourceMaps: true };
var configFile = './test/fixtures/test-tree.config.js';
var compareSourceMaps = function(filename, expectation, done, transpiler) {
var instance = new Builder(configFile);
buildOpts.config = buildOpts.config || {};
buildOpts.config.transpiler = transpiler || 'traceur';
instance.build(filename, null, buildOpts)
.then(function(output) {
assert.equal(expectation, output.sourceMap.toString());
})
.then(done)
.catch(err);
};
var readExpectation = function(filename) {
return fs.readFileSync('test/fixtures/sourcemaps-expectations/' + filename).toString().replace(/\n$/, '');
};
function writeTestOutput() {
(new Builder()).loadConfig(configFile)
.then(function(builder) {
builder.buildSFX('first', 'test/output/output.js', buildOpts);
})
.catch(err);
}
function writeSourceMaps(moduleName, transpiler, sourceMapFile) {
var instance = new Builder(configFile);
buildOpts.config = buildOpts.config || {};
buildOpts.config.transpiler = transpiler || 'traceur';
instance.build(moduleName, null, buildOpts)
.then(function(output) {
fs.writeFile('test/fixtures/sourcemaps-expectations/' + sourceMapFile, output.sourceMap.toString());
})
.catch(err);
}
writeTestOutput();
var toJSON = function(map) {
return JSON.parse(map.toString());
};
var getSources = function(map) {
return toJSON(map).sources;
};
suite('Source Maps', function() {
test('can render inline', function(done) {
var module = 'amd-2';
var filename = 'inline-source-map.js';
var instance = new Builder(configFile);
instance.build(module, null, { sourceMaps: 'inline' })
.then(function(output) {
assert.equal(undefined, output.sourceMap);
var source = output.source;
assert.equal(1, source.match(/sourceMappingURL=/g).length);
var lines = output.source.split("\n");
var lastLine = lines[lines.length - 1];
var commentPrefix = /^\/\/# sourceMappingURL=data:application\/json;base64,/;
assert(lastLine.match(commentPrefix));
var encoding = lastLine.replace(commentPrefix, "");
var decoded = JSON.parse(atob(encoding));
// not a regular array so tedious
assert.equal(1, decoded.sources.length);
assert.equal('amd-2.js', decoded.sources[0]);
done();
});
});
suite('sources paths', function() {
test('are relative to outFile', function(done) {
var builder = new Builder(configFile);
builder.buildSFX('first', 'dist/output.js', buildOpts)
.then(function(outputs) {
var sources = getSources(outputs.sourceMap);
assert.deepEqual(sources,
[ '../test/fixtures/test-tree/third.js',
'../test/fixtures/test-tree/cjs.js',
'../test/fixtures/test-tree/jquery.js',
'../test/fixtures/test-tree/some',
'../test/fixtures/test-tree/text.txt',
'../test/fixtures/test-tree/component.jsx',
'../test/fixtures/test-tree/global.js',
'../test/fixtures/test-tree/amd.js',
'../test/fixtures/test-tree/second.js',
'../test/fixtures/test-tree/first.js' ]);
})
.then(done)
.catch(err);
});
test('are relative to baseURL, if no outFile', function(done) {
var builder = new Builder(configFile);
var opts = { sourceMaps: true, config: { baseURL: 'test/fixtures/test-tree' } };
builder.buildSFX('first', null, opts)
.then(function(outputs) {
var sources = getSources(outputs.sourceMap);
assert.deepEqual(sources,
[ 'third.js',
'cjs.js',
'jquery.js',
'some',
'text.txt',
'component.jsx',
'global.js',
'amd.js',
'second.js',
'first.js' ]);
})
.then(done)
.catch(err);
});
});
suite('Option: sourceMapContents', function() {
suite('includes all file contents', function(done) {
var builder = new Builder(configFile);
var opts = { sourceMaps: true, sourceMapContents: true };
builder.buildSFX('first', null, opts)
.then(function(outputs) {
var map = toJSON(outputs.sourceMap);
var sources = map.sources;
var contents = map.sourcesContent;
assert.equal(sources.length, contents.length);
for (var i=0; i<contents.length; i++) {
var content = contents[i];
assert(content && content.length > 0);
assert.equal(content, fs.readFileSync('test/fixtures/test-tree/' + sources[i]).toString());
}
})
.then(done)
.catch(err);
});
});
suite('Traceur', function() {
var transpiler = 'traceur';
suite('without input source maps', function() {
test('handles single compilation targets correctly', function(done) {
var module = 'amd-2';
var source = 'traceur.tree.single.json';
if (process.env.UPDATE_EXPECTATIONS)
writeSourceMaps(module, transpiler, source);
var expected = readExpectation(source);
compareSourceMaps(module, expected, done, transpiler);
});
/* test('handles multiple compilation targets correctly', function(done) {
var module = 'first';
var source = 'traceur.tree.multi.json';
if (process.env.UPDATE_EXPECTATIONS)
writeSourceMaps(module, transpiler, source);
var expected = readExpectation(source);
compareSourceMaps(module, expected, done, transpiler);
}); */
});
});
suite('babel', function() {
var transpiler = 'babel';
suite('without input source maps', function() {
test('handles single compilation targets correctly', function(done) {
var module = 'amd-2';
var source = 'babel.tree.single.json';
if (process.env.UPDATE_EXPECTATIONS)
writeSourceMaps(module, transpiler, source);
var expected = readExpectation(source);
compareSourceMaps(module, expected, done, transpiler);
});
/* test('handles multiple compilation targets correctly', function(done) {
var module = 'first';
var source = 'babel.tree.multi.json';
if (process.env.UPDATE_EXPECTATIONS)
writeSourceMaps(module, transpiler, source);
var expected = readExpectation(source);
compareSourceMaps(module, expected, done, transpiler);
}); */
});
});
});

View File

@@ -0,0 +1,46 @@
var Builder = require('../index');
var builder = new Builder();
var minify = false;
builder.loadConfigSync('./test/fixtures/test-tree.config.js');
builder.config({
transpiler: false,
meta: {
'a.js': {
format: 'esm'
},
'b.js': {
format: 'esm'
},
'global-dep.js': {
format: 'esm'
},
'global-dep-loader.js': {
format: 'esm'
}
},
paths: {
'*': './test/fixtures/es-tree/*',
'global': './test/fixtures/test-tree/global-inner.js'
}
});
suite('SFX Optimizations', function() {
test('All ES6 rollup optimization', function(done) {
builder.buildStatic('a.js', 'test/output/es-sfx.js', { runtime: false, minify: minify, format: 'esm', rollup: true })
.then(function(output) {
assert(output.source, 'var b = \'b\';\n\nvar a = \'a\';\n\nexport { a, b };');
done();
}, done)
});
test('ES6 rollup with a global dep', function(done) {
builder.buildStatic('global-dep.js', 'test/output/es-sfx.js', { runtime: false, minify: minify, format: 'esm', rollup: true })
.then(function(output) {
assert(output.source.indexOf('System.registerDynamic("2"') != -1 && output.source.indexOf(', ["2"') != -1);
done();
}, done);
});
});

View File

@@ -0,0 +1,236 @@
var Builder = require('../index');
var expect = require('chai').expect;
var toFileURL = require('../lib/utils.js').toFileURL;
var fs = require('fs');
suite('Test compiler cache', function() {
var builder = new Builder('test/fixtures/test-cache-tree');
builder.config({ transpiler: 'babel' });
test('Use compile cache entry when available', function() {
var loadName = 'simple.js';
var outputPath = 'test/output/cached.js';
var cacheObj;
var tree;
return builder.trace(loadName).then(function(_tree) {
tree = _tree;
return builder.bundle(tree);
})
.then(function() {
var cacheEntry = builder.getCache();
expect(cacheEntry).to.be.an('object');
cacheObj = cacheEntry.compile.loads['simple.js'];
expect(cacheObj).to.be.an('object');
expect(cacheObj.hash).to.be.a('string');
expect(cacheObj.output).to.be.an('object');
// poison cache
cacheObj.output.source = cacheObj.output.source.replace('hate', 'love');
return builder.bundle(tree);
})
.then(function(output) {
// verify buildTree use poisoned cache rather than recompiling
var outputSource = output.source;
expect(outputSource).not.to.contain('hate caches');
expect(outputSource).to.contain('love caches');
// invalidate poisoned cache entry and rebuild
cacheObj.hash = 'out of date';
return builder.bundle(tree);
})
.then(function(output) {
// verify original source is used once more
var outputSource = output.source;
expect(outputSource).to.contain('hate caches');
expect(outputSource).not.to.contain('love caches');
});
});
test('Use trace cache when available', function() {
// construct the load record for the cache
var cacheObj = {
trace: {
'simple.js': {
name: 'simple.js',
path: 'fixtures/test-cache-tree/simple.js',
metadata: {
deps: [],
format: 'amd',
isAnon: true
},
deps: [],
depMap: {},
source: 'define([], function(module) {\n console.log(\'fake cache\');\n});\n',
originalSource: 'define([], function(module) {\n console.log(\'fake cache\');\n});\n'
}
}
};
builder.reset();
builder.setCache(cacheObj);
return builder.bundle('simple.js').then(function(output) {
expect(output.source).to.contain('fake cache');
});
});
test('Cache invalidation', function() {
var cacheObj = {
trace: {
'simple.js': {},
'another/path.js': {}
}
};
builder.reset();
builder.setCache(cacheObj);
var invalidated = builder.invalidate('*');
assert.deepEqual(invalidated, [builder.loader.normalizeSync('simple.js'), builder.loader.normalizeSync('another/path.js')]);
cacheObj = {
trace: {
'simple.js': {},
'new/path.js': {},
'deep/wildcard/test.js': {}
}
};
builder.setCache(cacheObj);
invalidated = builder.invalidate('new/path.js');
assert.deepEqual(invalidated, [builder.loader.normalizeSync('new/path.js')]);
invalidated = builder.invalidate('deep/*.js');
assert.deepEqual(invalidated, [builder.loader.normalizeSync('deep/wildcard/test.js')]);
});
test('Bundle example', function() {
var builder = new Builder('test/output');
fs.writeFileSync('./test/output/dynamic-module.js', 'export var p = 5;');
return builder.bundle('dynamic-module.js')
.then(function(output) {
assert(output.source.match(/p = 5/));
fs.writeFileSync('./test/output/dynamic-module.js', 'export var p = 6;');
builder.invalidate('dynamic-module.js');
return builder.bundle('dynamic-module.js');
})
.then(function(output) {
assert(output.source.match(/p = 6/));
});
});
test('Bundle example with imported file', function() {
var builder = new Builder('test/output');
fs.writeFileSync('./test/output/dynamic-import.js', [
'const d = 9;',
'export default d;'
].join('\n'));
fs.writeFileSync('./test/output/dynamic-main.js', [
'import d from "./dynamic-import.js";',
'console.log(d);'
].join('\n'));
return builder.bundle('dynamic-main.js')
.then(function(output) {
assert(output.source.match(/d = 9/));
assert(output.source.match(/console/));
fs.writeFileSync('./test/output/dynamic-import.js', [
'import "./dynamic-import2.js";', // Add another transitive dependency.
'const d = 7;',
'export default d;'
].join('\n'));
builder.invalidate('dynamic-import.js');
fs.writeFileSync('./test/output/dynamic-import2.js', [
'const u = "transitive";',
'export default u;'
].join('\n'));
return builder.bundle('dynamic-main.js');
})
.then(function(output) {
assert(output.source.match(/transitive/));
assert(output.source.match(/d = 7/));
assert(output.source.match(/console/));
// Remove the transitive dependency from the build.
fs.writeFileSync('./test/output/dynamic-import.js', [
'const d = 7;',
'export default d;'
].join('\n'));
builder.invalidate('dynamic-import.js');
return builder.bundle('dynamic-main.js');
})
.then(function(output) {
assert(!output.source.match(/transitive/));
});
});
test('Static build example statting check', function() {
var builder = new Builder('test/output');
fs.writeFileSync('./test/output/static-main.js', "import { testThing } from './static-test-module.js'; testThing();");
fs.writeFileSync('./test/output/static-test-module.js', "export function testThing() { console.log('test'); }");
return builder.buildStatic('static-main.js')
.then(function() {
builder.invalidate('static-main.js');
// despite removing the file, it remains cached
fs.unlinkSync('./test/output/static-test-module.js');
return builder.buildStatic('static-main.js');
});
});
test('Static build example dependency reload check', function() {
var builder = new Builder('test/output');
fs.writeFileSync('./test/output/static-main.js', "import { testThing } from './static-test-module.js'; testThing();");
fs.writeFileSync('./test/output/static-test-module.js', "export function testThing() { console.log('test'); }");
return builder.buildStatic('static-main.js')
.then(function() {
fs.writeFileSync('./test/output/static-test-module.js', "export function testThing() { console.log('new test'); }")
builder.invalidate('static-test-module.js');
return builder.buildStatic('static-main.js');
});
});
test('Static build, fetch override', function () {
var builder = new Builder('test/fixtures/test-tree');
return builder.buildStatic('foo.js', {
fetch: function (load, fetch) {
if (load.name.indexOf('foo.js') !== -1) {
return fs.readFileSync('test/fixtures/test-tree/cjs.js', 'utf8');
} else {
return fetch(load);
}
}
});
});
test('Static string build', function () {
var builder = new Builder('test/fixtures/test-tree');
return builder.bundle('foo.js', {
fetch: function (load, fetch) {
if (load.name.indexOf('foo.js') !== -1) {
return fs.readFileSync('test/fixtures/test-tree/cjs.js', 'utf8');
} else {
return fetch(load);
}
}
});
});
});

View File

@@ -0,0 +1,285 @@
<!doctype html>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="../node_modules/mocha/mocha.css">
<script src="../node_modules/mocha/mocha.js"></script>
<script src="../node_modules/systemjs/dist/system.src.js" type="text/javascript"></script>
<body>
<div id="mocha">
<script>
DEBUG = false;
mocha.setup('tdd');
function ok(assertion, msg) {
if (!assertion)
throw new Error(msg || 'Assertion failed');
}
System.config({
baseURL: './fixtures/test-tree/',
paths: {
'traceur-runtime': '../node_modules/traceur/bin/traceur-runtime.js',
'babel/external-helpers': '../node_modules/babel-core/external-helpers.js',
'jquery-cdn': './jquery.js',
'output/*': './output/*'
},
bundles: {
'output/tree-build.js': ['third.js', 'cjs.js', 'jquery.js', 'second.js', 'global.js', 'amd.js', 'first.js'],
'output/umd.js': ['umd.js']
}
});
suite('Test Tree Bundle', function () {
test('Loading AMD from a bundle', function(done) {
System['import']('amd.js').then(function(m) {
ok(m.is == 'amd');
ok(m.text == 'This is some text');
done();
})
.catch(done);
});
test('Loading CommonJS from a bundle', function(done) {
System['import']('cjs.js').then(function(m) {
ok(m.env == 'production');
ok(m.cjs === true);
done();
})
.catch(done);
});
test('Loading a Global from a bundle', function(done) {
System['import']('global.js').then(function(m) {
ok(m === 'output');
done();
})
.catch(done);
});
test('Loading named System.register', function(done) {
System['import']('third.js').then(function(m) {
ok(m.some == 'exports');
ok(m.pi == 'π');
done();
})
.catch(done);
});
test('Loading System.register from ES6', function(done) {
this.timeout(10000);
System['import']('first.js').then(function(m) {
ok(m.p == 5);
done();
})
.catch(done);
});
test('AMD rewriting 1', function(done) {
System['import']('output/amd-1.js').then(function(m) {
return System['import']('amd-1.js');
})
.then(function(m) {
ok(m.first.p == 5);
done();
})
.catch(done);
});
test('AMD rewriting 2', function(done) {
System['import']('output/amd-2.js').then(function(m) {
return System['import']('amd-2.js');
})
.then(function(m) {
ok(m.amd == 2);
done();
})
.catch(done);
});
test('AMD rewriting 3', function(done) {
System['import']('output/amd-3.js').then(function(m) {
return System['import']('amd-3.js');
})
.then(function(m) {
ok(m.p == 5);
done();
})
.catch(done);
});
test('AMD rewriting 4', function(done) {
System['import']('output/amd-4.js').then(function(m) {
return System['import']('amd-4.js');
})
.then(function(m) {
ok(m.q == 4);
done();
})
.catch(done);
});
test('AMD rewriting 5a', function(done) {
System['import']('output/amd-5a.js').then(function(m) {
return System['import']('amd-5a.js');
})
.then(function(m) {
ok(m.jquery == 1);
done();
})
.catch(done);
});
test('AMD rewriting 5b', function(done) {
System['import']('output/amd-5b.js').then(function(m) {
return System['import']('amd-5b.js');
})
.then(function(m) {
ok(m.jquery == 1);
done();
})
.catch(done);
});
test('AMD rewriting 6a', function(done) {
System['import']('output/amd-6a.js').then(function(m) {
return System['import']('amd-6a.js');
})
.then(function(m) {
ok(window.p == 'a');
done();
})
.catch(done);
});
test('AMD rewriting 6b', function(done) {
System['import']('output/amd-6b.js').then(function(m) {
return System['import']('amd-6b.js');
})
.then(function(m) {
ok(m.p == 'b');
done();
})
.catch(done);
});
test('Loading UMD', function(done) {
System['import']('umd.js').then(function(m) {
ok(m.umd == 'detection');
done();
});
});
test('AMD 7', function(done) {
System['import']('output/amd-7.js').then(function() {
return System['import']('amd-7.js');
})
.then(function(m) {
ok(m.amd == 'object');
done();
})
.catch(done);
});
test('AMD 8', function(done) {
System['import']('output/amd-8.js').then(function() {
return System['import']('amd-8.js');
})
.then(function(m) {
ok(m == 'dep');
done();
})
.catch(done);
});
test('AMD 9', function(done) {
System['import']('output/amd-9.js').then(function() {
return System['import']('amd-9.js');
})
.then(function(m) {
ok(m.b.b == 'b');
ok(m.c == 'c');
done();
})
.catch(done);
});
test('AMD 10', function(done) {
System['import']('output/amd-10.js').then(function() {
return System['import']('amd-10.js');
})
.then(function(m) {
ok(m.b.b == 'b');
ok(m.c == 'c');
done();
})
.catch(done);
});
test('AMD 11', function(done) {
System['import']('output/amd-11.js').then(function() {
return System['import']('amd-11.js');
})
.then(function(m) {
ok(m.b.b == 'b');
ok(m.c == 'c');
done();
})
.catch(done);
});
test('AMD 12', function(done) {
System['import']('output/amd-12.js').then(function() {
return System['import']('amd-12.js');
})
.then(function(m) {
ok(m.a == 'a');
done();
})
.catch(done);
});
test('CJS Globals', function(done) {
System['import']('output/cjs-globals.js').then(function() {
return System['import']('cjs-globals.js');
})
.then(function(m) {
ok(m == 'Buffer');
done();
})
.catch(done);
});
test('CJS require.resolve', function(done) {
System['import']('output/cjs-resolve.js').then(function(m) {
return System['import']('cjs-resolve.js');
})
.then(function(m) {
ok(m.substr(m.length - 27, 27) == 'fixtures/test-tree/first.js');
done();
})
.catch(done);
});
(/PhantomJS/.test(window.navigator.userAgent) ? test.skip : test)('Runtime', function(done) {
System['import']('output/runtime.js').then(function() {
return System['import']('runtime.js');
})
.then(function(m) {
ok(m.test);
done();
})
.catch(function(e) {
// traceur runtime doesn't load in PhantomJS
if (e.toString().match(/Attempted to assign to readonly/))
return done();
done(e);
});
});
});
</script>
<script>
if (window.mochaPhantomJS)
mochaPhantomJS.run();
else
mocha.run();
</script>

View File

@@ -0,0 +1,234 @@
var Builder = require('../index');
var inline = require('../lib/output').inlineSourceMap;
var fs = require('fs');
var path = require('path');
var spawn = require('child_process').spawn;
if (process.argv[2] == 'typescript')
global.ts = require('typescript');
var minify = true;
var err = function(e) {
setTimeout(function() {
throw e;
});
};
var builder = new Builder('test/fixtures/test-tree', 'test/fixtures/test-tree.config.js');
function testPhantom(html) {
return new Promise(function(resolve, reject) {
spawn('node_modules/.bin/mocha-phantomjs' + (process.platform.match(/^win/) ? '.cmd' : ''), [html], { stdio: 'inherit' })
.on('close', function(code) {
if (code !== 0)
reject(Error('Phantom test failed ' + html + ' failed.'));
else
resolve();
});
});
}
function doTests(transpiler) {
test('In-memory build', function() {
builder.reset();
builder.config({ transpiler: transpiler });
return builder.bundle('first.js', { sourceMaps: true, minify: minify })
.then(function(output) {
fs.writeFileSync('test/output/memory-test.js', inline(output.source, output.sourceMap));
});
});
test('Multi-format tree build', function() {
builder.reset();
builder.config({ transpiler: transpiler });
return builder.bundle('first.js', 'test/output/tree-build.js', { sourceMaps: true, minify: minify, globalDefs: { DEBUG: false } })
.then(function(output) {
assert(output.assetList[0].url);
var treeFirst;
Promise.all(['first.js', 'amd.js'].map(builder.trace.bind(builder)))
.then(function(trees) {
treeFirst = trees[0];
return builder.bundle(builder.subtractTrees(trees[0], trees[1]), 'test/output/excluded.js');
})
.then(function() {
return builder.trace('global-inner.js').then(function(tree) {
return builder.bundle(tree, 'test/output/global-inner.js');
});
})
.then(function() {
return builder.trace('global-outer.js').then(function(tree) {
return builder.bundle(tree, 'test/output/global-outer.js');
});
})
.then(function() {
return builder.trace('amd-1.js').then(function(tree) {
return builder.bundle(builder.subtractTrees(tree, treeFirst), 'test/output/amd-1.js');
});
})
.then(function() {
return builder.trace('amd-2.js').then(function(tree) {
return builder.bundle(builder.subtractTrees(tree, treeFirst), 'test/output/amd-2.js');
});
})
.then(function() {
return builder.trace('amd-3.js').then(function(tree) {
return builder.bundle(builder.subtractTrees(tree, treeFirst), 'test/output/amd-3.js');
});
})
.then(function() {
return builder.trace('amd-4.js').then(function(tree) {
return builder.getDeferredImports(tree)
.then(function(deferredImports) {
assert(deferredImports[0].name == 'x');
return builder.bundle(builder.subtractTrees(tree, treeFirst), 'test/output/amd-4.js');
});
});
})
.then(function() {
return builder.trace('amd-5a.js').then(function(tree) {
return builder.bundle(builder.subtractTrees(tree, treeFirst), 'test/output/amd-5a.js');
});
})
.then(function() {
return builder.trace('amd-5b.js').then(function(tree) {
return builder.bundle(builder.subtractTrees(tree, treeFirst), 'test/output/amd-5b.js');
});
})
.then(function() {
return builder.trace('amd-6a.js').then(function(tree) {
return builder.bundle(builder.subtractTrees(tree, treeFirst), 'test/output/amd-6a.js');
});
})
.then(function() {
return builder.trace('amd-6b.js').then(function(tree) {
return builder.bundle(builder.subtractTrees(tree, treeFirst), 'test/output/amd-6b.js');
});
})
.then(function() {
return builder.trace('umd.js').then(function(tree) {
return builder.bundle(builder.subtractTrees(tree, treeFirst), 'test/output/umd.js');
});
})
.then(function() {
return builder.bundle('amd-7.js', 'test/output/amd-7.js');
})
.then(function() {
return builder.bundle('amd-8.js', 'test/output/amd-8.js');
})
.then(function() {
return builder.bundle('amd-9.js', 'test/output/amd-9.js');
})
.then(function() {
return builder.bundle('amd-10.js', 'test/output/amd-10.js');
})
.then(function() {
return builder.bundle('amd-11.js', 'test/output/amd-11.js');
})
.then(function() {
return builder.bundle('amd-12.js', 'test/output/amd-12.js');
})
.then(function() {
builder.loader.config({ paths: { 'output/*': './test/output/*' } });
return builder.bundle('cjs-globals.js - output/amd-8.js', 'test/output/cjs-globals.js');
})
.then(function() {
return builder.bundle('cjs-resolve.js', 'test/output/cjs-resolve.js');
})
.then(function() {
return builder.bundle('runtime.js', 'test/output/runtime.js');
})
})
.then(function () {
return testPhantom('test/test-build.html');
})
['catch'](function(err) {
throw err;
});
});
// traceur runtime function.bind fails in Phantom
if (transpiler != 'traceur')
test('SFX tree build', function() {
builder.reset();
builder.config({ transpiler: transpiler });
builder.config({
map: {
'toamd1': 'amd-1.js'
},
meta: {
'jquery-cdn': {
build: false
}
}
});
return builder.buildStatic('toamd1', 'test/output/sfx.js', {
runtime: true,
minify: minify,
format: 'global',
globalDefs: { DEBUG: false },
globalName: 'amd1',
globalDeps: {
'jquery-cdn': '$'
}
})
.then(function() {
return testPhantom('test/test-sfx.html');
});
});
}
suite('Test tree builds - Traceur', function() {
doTests('traceur');
});
suite('Test tree builds - Babel', function() {
doTests('babel');
});
suite('Test tree builds - TypeScript', function() {
doTests('typescript');
});
suite('Bundle Format', function() {
test('Test AMD format', function() {
return Promise.resolve()
.then(function() {
return builder.buildStatic('sfx-format-01.js', 'test/output/sfx-amd.js', { format: 'amd' });
})
.then(function() {
return testPhantom('test/test-sfx-amd.html');
});
});
});

View File

@@ -0,0 +1,14 @@
var Builder = require('../index');
var builder = new Builder('test/fixtures/circular-tree');
suite('Test circular tree', function(err) {
test('Circular tree', function() {
builder.reset();
return builder.bundle('a.js')
.then(function(out) {
assert(out.entryPoints.length == 1 && out.entryPoints[0] == 'a.js');
});
});
});

View File

@@ -0,0 +1,85 @@
var Builder = require('../index');
var fs = require('fs');
suite('Test builder.loadConfig', function() {
test('builder.loadConfig works', function(done) {
var configFile = 'test/output/builderConfig.js';
var builder = new Builder();
fs.writeFileSync(configFile, 'System.config({map: {m: "./m.js"}});');
builder.loadConfig(configFile).then(function() {
assert.equal(builder.loader.map['m'], './m.js', 'loader map was loaded from config');
}).then(done, done);
});
test('builder.loadConfig does not affect other builders', function(done) {
var configFile1 = 'test/output/builder1Config.js';
var configFile2 = 'test/output/builder2Config.js';
fs.writeFileSync(configFile1, 'System.config({baseURL: "base1", map: {m1: "./m1.js"}, packages: {p1: {main: "index1.js"}}});');
fs.writeFileSync(configFile2, 'System.config({baseURL: "base2", map: {m2: "./m2.js"}, packages: {p2: {main: "index2.js"}}});');
var builder1 = new Builder();
var builder2 = new Builder();
var p1 = builder1.loadConfig(configFile1);
var p2 = builder2.loadConfig(configFile2);
Promise.all([p1, p2]).then(function() {
assert.match(builder1.loader.baseURL, /base1\/$/, 'builder1 baseURL');
assert.match(builder2.loader.baseURL, /base2\/$/, 'builder2 baseURL');
assert.equal(builder1.loader.map['m1'], './m1.js', 'builder1.loader map was loaded from config');
assert.equal(builder1.loader.map['m2'], undefined, 'map for builder1.loader only');
assert.equal(builder2.loader.map['m2'], './m2.js', 'builder2.loader map was loaded from config');
assert.equal(builder2.loader.map['m1'], undefined, 'map for builder2.loader only');
builder1.loader.normalize('p1').then(function(p1) {
assert.match(p1, /base1\/p1\/index1\.js$/, 'builder1 package p1');
assert.equal(builder1.loader.packages['p2'], undefined, 'builder1 package p2');
assert.equal(builder2.loader.packages['p1'], undefined, 'builder2 package p1');
builder2.loader.normalize('p2').then(function(p2) {
assert.match(p2, /base2\/p2\/index2\.js$/, 'builder2 package p2');
}).then(done, done);
});
});
});
test('builder.loadConfig does not affect global variables', function(done) {
global._tmp_1 = '1';
var configFile = 'test/output/builderConfig.js';
var builder = new Builder();
fs.writeFileSync(configFile, '_tmp_1=2; _tmp_2=3; global._tmp_1=4;');
builder.loadConfig(configFile).then(function() {
assert.equal(global._tmp_1, '1', 'previously defined global variable is not affected');
assert.equal(global._tmp_2, undefined, 'new global variables are not defined');
delete global._tmp_1;
}).then(done, done);
});
test('builder.loadConfig makes require available to config code', function(done) {
var configFile = 'test/output/builderConfig.js';
var builder = new Builder();
fs.writeFileSync(configFile, 'var m = require("module"); System.config({baseURL:"base"});');
builder.loadConfig(configFile).then(function() {
assert.match(builder.loader.baseURL, /base\/$/, 'builder baseURL set');
}).then(done, done);
});
});

View File

@@ -0,0 +1,151 @@
var expect = require('unexpected');
var getTreeModulesPostOrder = require('../lib/compile').getTreeModulesPostOrder;
suite('Test post order traversal', function() {
test('should return single module that has no incoming relation', function() {
var tree = {
'a': {
name: 'a',
deps: [],
depMap: {}
}
};
return expect(getTreeModulesPostOrder(tree).modules, 'to satisfy', ['a']);
});
test('should return modules that has no incoming relations', function() {
var tree = {
'a': {
name: 'a',
deps: [],
depMap: {}
},
'b': {
name: 'b',
deps: [],
depMap: {}
}
};
return expect(getTreeModulesPostOrder(tree).modules, 'to satisfy', ['a', 'b']);
});
test('should resolve module names based on depMap', function() {
var tree = {
'a': {
name: 'a',
deps: ['foo'],
depMap: {
'foo': 'b'
}
},
'b': {
name: 'b',
deps: [],
depMap: {}
}
};
return expect(getTreeModulesPostOrder(tree).modules, 'to satisfy', ['b', 'a']);
});
test('should order modules with dependencies first', function() {
var tree = {
'a': {
name: 'a',
deps: ['b', 'd'],
depMap: {
'b': 'b',
'd': 'd'
}
},
'b': {
name: 'b',
deps: ['c'],
depMap: {
'c': 'c'
}
},
'c': {
name: 'c',
deps: [],
depMap: {}
},
'd': {
name: 'd',
deps: [],
depMap: {}
}
};
return expect(getTreeModulesPostOrder(tree).modules, 'to satisfy', ['c', 'b', 'd', 'a']);
});
test('should order graph entries alphabetically', function() {
var tree = {
'a': {
name: 'a',
deps: ['b'],
depMap: {
'b': 'b'
}
},
'b': {
name: 'b',
deps: ['c'],
depMap: {
'c': 'c'
}
},
'c': {
name: 'c',
deps: [],
depMap: {}
},
'd': {
name: 'd',
deps: [],
depMap: {}
}
};
return expect(getTreeModulesPostOrder(tree).modules, 'to satisfy', ['c', 'b', 'a', 'd']);
});
test('should include entry points not present in given entryPoints order, in alphabetical order', function() {
var tree = {
'a': {
name: 'a',
deps: ['b'],
depMap: {
'b': 'b'
}
},
'b': {
name: 'b',
deps: ['c'],
depMap: {
'c': 'c'
}
},
'c': {
name: 'c',
deps: [],
depMap: {}
},
'd': {
name: 'd',
deps: [],
depMap: {}
},
'e': {
name: 'e',
deps: [],
depMap: {}
}
};
return expect(getTreeModulesPostOrder(tree).modules, 'to satisfy', ['c', 'b', 'a', 'd', 'e']);
});
});

View File

@@ -0,0 +1,36 @@
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="../node_modules/mocha/mocha.css">
<script src="../node_modules/mocha/mocha.js"></script>
<script src="../node_modules/chai/chai.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.18/require.js"></script>
</head>
<body>
<div id="mocha"></div>
<script>
var expect = chai.expect;
mocha.setup('tdd');
require.config({
baseUrl: 'output'
});
suite('amd loading', function () {
test('should load multiple exports', function(done) {
require(['sfx-amd'], function(result) {
expect(result.default).to.eql({ hello: 'world' });
expect(result.basic).to.be.a('function');
done();
});
});
});
if (window.mochaPhantomJS)
mochaPhantomJS.run();
else
mocha.run();
</script>
</body>
</html>

View File

@@ -0,0 +1,33 @@
<!doctype html>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="../node_modules/mocha/mocha.css">
<script src="../node_modules/mocha/mocha.js"></script>
<body>
<div id="mocha">
<script>
window.$ = { jquery: 1 };
</script>
<script src="output/sfx.js"></script>
<script>
mocha.setup('tdd');
DEBUG = false;
function assert(assertion, msg) {
if (!assertion)
throw new Error(msg || 'Assertion failed');
}
suite('SFX', function () {
test('should have globals defined', function (done) {
assert(window.amd1);
assert(window.amd1.utfChar == '\u221e');
done();
});
});
if (window.mochaPhantomJS)
mochaPhantomJS.run();
else
mocha.run();
</script>