karma-requirejs-preprocessor
Version:
A Karma plugin. Extend project RequireJs config by test RequireJs config
72 lines (54 loc) • 2.67 kB
JavaScript
var configParser = require('./requirejs-config');
var createRequirejsPreprocessor = function (logger, config, basePath) {
config = config || {};
var log = logger.create('preprocessor.requirejs');
return function (content, file, done) {
log.debug('Processing "%s".', file.originalPath);
var projectConfig = configParser.parse(content);
function mergeConfigs(projectConfig, config) {
var testConfig = config.config;
var testRegexp = typeof config.testRegexp === 'string' ? new RegExp(config.testRegexp) : /spec\.js$/;
if (!testConfig || !window.__karma__) return projectConfig;
var baseUrlRegexp = new RegExp('^' + (testConfig.baseUrl.slice(-1) === '/' ? testConfig.baseUrl : testConfig.baseUrl + '/'));
function isObject(obj) {
return typeof obj === 'object' && !(obj instanceof Array);
}
function mergeObjects(obj1, obj2){
for(var key in obj2){
if (obj2.hasOwnProperty(key)) {
if (isObject(obj1[key]) && isObject(obj2[key])) {
obj1[key] = mergeObjects(obj1[key], obj2[key]);
} else {
obj1[key] = obj2[key];
}
}
}
return obj1;
}
function pathToModule(path) {
return path.replace(baseUrlRegexp, '').replace(/\.js$/, '');
}
testConfig.deps = testConfig.deps || [];
testConfig.callback = window.__karma__.start;
Object.keys(window.__karma__.files).forEach(function(file) {
if (testRegexp.test(file)) {
// Normalize paths to RequireJS module names.
testConfig.deps.push(pathToModule(file));
}
});
return mergeObjects(projectConfig, testConfig);
}
var requireConfig = '!function() {\n' +
mergeConfigs.toString() + ';\n' +
'var projectConfig = ' + JSON.stringify(projectConfig, null, 4) + ';\n' +
'var config = ' + JSON.stringify(config, null, 4) + ';\n' +
'require.config(mergeConfigs(projectConfig, config));\n' +
'}();';
done(null, requireConfig);
}
};
createRequirejsPreprocessor.$inject = ['logger', 'config.requirejsPreprocessor', 'config.basePath'];
// PUBLISH DI MODULE
module.exports = {
'preprocessor:requirejs': ['factory', createRequirejsPreprocessor]
};