packages/docpack-examples-compiler/lib/plugin.js (76 lines of code) (raw):
var path = require('path');
var docpack = require('docpack');
var ExamplesCompiler = require('./ExamplesCompiler');
var tools = require('webpack-toolkit');
var Asset = require('docpack/lib/data/Asset');
var defaultConfig = {
match: null,
filter: null,
/**
* Used for loaders matching, can be overridden via ExampleFile attrs.filename
*/
filename: 'example.[type]',
/**
* Used for naming emitted files.
* Extension will be appended automatically (technically - the name of entry point).
*/
outputFilename: 'examples/[hash]'
};
var ExamplesCompilerPlugin = docpack.createPlugin({
name: 'docpack-examples-compiler',
defaultConfig: defaultConfig,
apply: function(compiler) {
var config = this.config;
compiler.plugin('compilation', function(compilation) {
compilation.plugin(docpack.HOOKS.AFTER_EXTRACT, function(sources, done) {
var compiler = new ExamplesCompiler(compilation, {
filename: config.filename,
outputFilename: config.outputFilename
});
var hasFilter = typeof config.filter == 'function';
var targets = config.match === null
? sources
: sources.filter(function(source) {
return tools.matcher(config.match, source.absolutePath);
});
var filesByPaths = getExampleFilesByPath(targets);
for (var sourcePath in filesByPaths) {
filesByPaths[sourcePath].forEach(function(file) {
if (hasFilter && !config.filter(file)) {
return;
}
file.chunkName = compiler.getOutputFilename(file, sourcePath);
compiler.addFile(file, sourcePath);
});
}
compiler.run()
.then(function(compilation) {
var files = compiler.files;
var assetsByChunk = tools.getAssetsByChunkName(compilation);
files.forEach(function(file) {
if (file.chunkName in assetsByChunk == false) {
return;
}
assetsByChunk[file.chunkName].forEach(function (assetPath) {
var asset = new Asset({
type: path.extname(assetPath).substr(1),
content: compilation.assets[assetPath].source(),
path: assetPath
});
file.assets.push(asset);
});
delete file.chunkName;
});
done(null, sources);
})
.catch(done);
});
})
}
});
module.exports = ExamplesCompilerPlugin;
// TODO refactor this shit
function getExampleFilesByPath(sources) {
var filesByPath = {};
sources.forEach(function (source) {
filesByPath[source.absolutePath] = [];
source.blocks.forEach(function (block) {
block.examples.forEach(function (example) {
filesByPath[source.absolutePath] = filesByPath[source.absolutePath].concat(example.files);
});
});
});
return filesByPath;
}