muffin
Version:
The 21st century way of building websites
100 lines (80 loc) • 2.45 kB
JavaScript
/* globals requirejs, require */
(function() {
define("ember-cli/test-loader",
[],
function() {
"use strict";
var moduleIncludeMatchers = [];
var moduleExcludeMatchers = [];
function addModuleIncludeMatcher(fn) {
moduleIncludeMatchers.push(fn);
};
function addModuleExcludeMatcher(fn) {
moduleExcludeMatchers.push(fn);
};
function checkMatchers(matchers, moduleName) {
var matcher;
for (var i = 0, l = matchers.length; i < l; i++) {
matcher = matchers[i];
if (matcher(moduleName)) {
return true;
}
}
return false;
}
function TestLoader() {
this._didLogMissingUnsee = false;
};
TestLoader.prototype = {
shouldLoadModule: function(moduleName) {
return (moduleName.match(/[-_]test$/));
},
listModules: function() {
return Object.keys(requirejs.entries);
},
loadModules: function() {
var moduleName, index, length;
var moduleNames = this.listModules();
for (index = 0, length = moduleNames.length; index < length; index++) {
moduleName = moduleNames[index];
if (checkMatchers(moduleExcludeMatchers, moduleName)) {
continue;
}
if (checkMatchers(moduleIncludeMatchers, moduleName) || this.shouldLoadModule(moduleName)) {
this.require(moduleName);
this.unsee(moduleName);
}
}
}
};
TestLoader.prototype.require = function(moduleName) {
try {
require(moduleName);
} catch(e) {
this.moduleLoadFailure(moduleName, e);
}
};
TestLoader.prototype.unsee = function(moduleName) {
if (typeof require.unsee === 'function') {
require.unsee(moduleName);
} else if (!this._didLogMissingUnsee) {
this._didLogMissingUnsee = true;
if (typeof console !== 'undefined') {
console.warn('unable to require.unsee, please upgrade loader.js to >= v3.3.0');
}
}
};
TestLoader.prototype.moduleLoadFailure = function(moduleName, error) {
console.error('Error loading: ' + moduleName, error.stack);
};
TestLoader.load = function() {
new TestLoader().loadModules();
};
return {
'default': TestLoader,
addModuleIncludeMatcher: addModuleIncludeMatcher,
addModuleExcludeMatcher: addModuleExcludeMatcher
};
}
);
})();