mimosa-ember-test
Version:
A Mimosa module for testing Ember apps
137 lines (119 loc) • 4.44 kB
JavaScript
var path = require( "path" )
, fs = require( "fs" )
, _ = require( "lodash" );
var _updateBowerConfig = function ( config ) {
var b = config.bower
, relativeVendorToAssets = path.relative( config.vendor.javascripts, config.emberTest.assetFolderFull )
, assetFolder = relativeVendorToAssets + "/vendor";
var libraryPlacementConfig = {
qunit : {
"qunit/qunit.js": assetFolder + "/qunit.js",
"qunit/qunit.css": assetFolder + "/qunit.css"
},
requirejs: {
"require.js": assetFolder + "/require.js"
},
sinonjs: {
"index.js": assetFolder + "/sinon.js"
},
"ember-qunit-builds": {
"ember-qunit.amd.js": assetFolder + "/ember-qunit.js"
},
chai: {
"chai.js": assetFolder + "/chai.js"
},
"chai-qunit": {
"dist/globals/main.js": assetFolder + "/chai-qunit.js"
}
};
// unlikely
if ( !b.copy ) {
b.copy = {};
}
// will be inserting overrides
if ( !b.copy.mainOverrides ) {
b.copy.mainOverrides = {};
}
// if pathFull exists, then mimosa-bower has already done
// its validation (earlier in list of modules), so any
// validation-created objects need to be created now
if ( b.bowerDir.pathFull ) {
// will be inserting overridesObjects
if ( !b.copy.overridesObjects ) {
b.copy.overridesObjects = {};
}
}
Object.keys( libraryPlacementConfig ).forEach( function( lib ) {
if ( !b.copy.mainOverrides[lib] ) {
// doesn't have mainOverrides, so create it
b.copy.mainOverrides[lib] = [ libraryPlacementConfig[lib] ];
} else {
// search through mainOverrides, if not already there, add it
// but don't just add otherwise could get dupes
var hasEntry = b.copy.mainOverrides[lib].some( function( entry ) {
return JSON.stringify( entry ) === JSON.stringify( libraryPlacementConfig[lib] );
});
if ( !hasEntry ) {
b.copy.mainOverrides[lib].push( [ libraryPlacementConfig[lib] ] );
}
}
// if pathFull is there, then bower has run already
// need to update post-validation objects
if ( b.bowerDir.pathFull ) {
// if already overrides, do merge
if ( b.copy.overridesObjects[lib] ) {
b.copy.overridesObjects[lib] = _.extend( libraryPlacementConfig[lib], b.copy.overridesObjects[lib] );
} else {
b.copy.overridesObjects[lib] = libraryPlacementConfig[lib];
}
}
if ( lib === "requirejs" ) {
b.copy.mainOverrides[lib].unshift( "require.js" );
if ( b.bowerDir.pathFull ) {
if ( !b.copy.overridesArrays.requirejs ) {
b.copy.overridesArrays.requirejs = [];
}
b.copy.overridesArrays.requirejs.push( "require.js" );
}
}
});
// need to exclude ember-data
if (!b.copy.exclude) {
b.copy.exclude = [];
}
var pathToEmberData = path.join( config.root, b.bowerDir.path, "ember-data", "ember-data.js" );
b.copy.exclude.push( pathToEmberData );
};
exports.handleBower = function( config, errors ) {
if ( config.emberTest.bowerTestAssets ) {
var hasBower = config.modules.some( function( mod ) {
return mod.indexOf("bower") === 0 || mod.indexOf("mimosa-bower") === 0;
});
if ( !hasBower ) {
errors.push( "emberTest.bowerTestAssets is set to true, but you do not have the mimosa-bower module configured.");
} else {
var bowerJSONPath = path.join( config.root, "bower.json" );
if ( fs.existsSync( bowerJSONPath ) ) {
_updateBowerConfig( config );
var bowerJSON;
try {
bowerJSON = require( bowerJSONPath );
} catch (err) {
errors.push( "ember-test, cannot require in bower.json, is it formatted correctly? " + err.message );
return;
}
["qunit", "requirejs", "sinonjs", "ember-qunit-builds", "qunit", "chai-qunit"].forEach( function( bowerLib ) {
var dependencies = bowerJSON.dependencies || {};
var devDependencies = bowerJSON.devDependencies || {};
if ( !dependencies[bowerLib] && !devDependencies[bowerLib] ) {
errors.push("emberTest.bowerTestAssets is set to true, but [[ " + bowerLib +
" ]] is missing from your bower.json" );
}
});
} else {
errors.push( "emberTest.bowerTestAssets is set to true, but bower.json cannot be found at [[ " + bowerJSONPath + " ]]" );
}
}
}
};
;