diff --git a/lib/assets/tmpl-spec.jst b/lib/assets/tmpl-spec.jst index 72cbbd0..181a7a5 100644 --- a/lib/assets/tmpl-spec.jst +++ b/lib/assets/tmpl-spec.jst @@ -80,7 +80,7 @@ function loadTemplate(file, exportName) { return { apply: function() { return e.stack; } }; } } -function reRequire(file, exportName) { +function reRequire(file) { file = require.resolve(file); clearRequire(file); return require(file); diff --git a/lib/node-configurator.js b/lib/node-configurator.js index 065de2f..4c02a1b 100644 --- a/lib/node-configurator.js +++ b/lib/node-configurator.js @@ -37,6 +37,8 @@ exports.configure = function (config, options) { config.nodes(pattern, function (nodeConfig) { var langs = options.langs, engines = options.engines, + prependFiles = [].concat(options.prependFiles).filter(Boolean), + appendFiles = [].concat(options.appendFiles).filter(Boolean), coverageEngines = options.coverage.engines, engineTargets = [], specTargets = [], @@ -70,17 +72,23 @@ exports.configure = function (config, options) { [files] ]); - // Add engines' techs + // Provide prepending and appending files if any. + prependFiles.concat(appendFiles) + .forEach(function (filepath) { + nodeConfig.addTech([provide, { target: filepath }]); + }); + + // Add engines' techs and set needsCoverage flag engines.forEach(function (engine) { engine.hasOwnProperty('needsCoverage') || (engine.needsCoverage = _.contains(coverageEngines, engine.name)); nodeConfig.addTech([engine.tech, engine.options]); }); // For each lang including no-lang (false) and mock-lang (true) - (Array.isArray(langs) ? langs : [langs && 'lang']).forEach(function (lang) { - var suffix = '.' + lang + '.js', - isMock = lang === 'lang', - isReal = lang && !isMock; + (Array.isArray(langs) ? langs : [langs && 'mock']).forEach(function (lang) { + var isMock = lang === 'mock', + isReal = !isMock && typeof lang === 'string', + suffix = '.' + (lang || 'merged') + '.js'; // Keyset and lang file for real langs: isReal && nodeConfig.addTechs([ @@ -95,14 +103,17 @@ exports.configure = function (config, options) { engines.forEach(function (engine) { var target = engine.target, - destTarget = target; + destTarget = target, + sources = prependFiles.concat(target).concat(appendFiles); // Skip block for `langs: false` - if (lang) { + // or if we don't need prepending/appending files. + if (lang || sources.length > 1) { destTarget = target.replace('.js', suffix); + lang && sources.unshift('?.lang' + suffix); nodeConfig.addTech([mergeFile, { - sources: ['?.lang' + suffix, target], + sources: sources, target: destTarget, sourcemap: true }]); diff --git a/lib/plugin.js b/lib/plugin.js index 1405714..08ee2e6 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -68,6 +68,8 @@ module.exports = function (helper, commonOpts) { }), langs: options.langs, mockI18N: options.mockI18N, + prependFiles: options.prependFiles, + appendFiles: options.appendFiles, engines: _.map(engines, function (engine, name) { var techPath = engine.tech, tech = require(techPath), @@ -174,6 +176,8 @@ module.exports = function (helper, commonOpts) { sourceLevels: options.sourceLevels, langs: options.langs, mockI18N: options.mockI18N, + prependFiles: options.prependFiles, + appendFiles: options.appendFiles, engines: options.engines, saveHtml: options.saveHtml, coverage: options.coverage,