You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
4.4 KiB
JavaScript

const pkgJson = require('./package.json');
const path = require('path');
const webpack = require('webpack');
const uglifyJsOptions = {
screwIE8: true,
stats: true,
compress: {
warnings: false
},
mangle: {
toplevel: true,
eval: true
}
};
const commonConfig = {
entry: './src/hls.js',
module: {
rules: [
{
test: /\.js$/,
exclude: [
path.resolve(__dirname, 'node_modules')
],
use: {
loader: 'babel-loader'
}
}
]
}
};
// Allow to customise light dists through env-vars.
const env = process.env;
const addSubtitleSupport = (typeof env.SUBTITLE !== 'undefined' && env.SUBTITLE);
const addAltAudioSupport = (typeof env.ALT_AUDIO !== 'undefined' && env.ALT_AUDIO);
function getPluginsForConfig(type, minify = false) {
// common plugins.
const plugins = [
new webpack.optimize.OccurrenceOrderPlugin(),
new webpack.optimize.ModuleConcatenationPlugin(),
new webpack.DefinePlugin(getConstantsForConfig(type))
];
if (minify) {
// minification plugins.
return plugins.concat([
new webpack.optimize.UglifyJsPlugin(uglifyJsOptions),
new webpack.LoaderOptionsPlugin({
minimize: true,
debug: false
})
]);
}
return plugins;
}
function getConstantsForConfig(type) {
// By default the "main" dists (hls.js & hls.min.js) are full-featured.
return {
__VERSION__: JSON.stringify(pkgJson.version),
__SUBTITLE__: JSON.stringify(type === 'main' ? true: addSubtitleSupport),
__ALT_AUDIO__: JSON.stringify(type === 'main' ? true : addAltAudioSupport)
};
}
function getAliasesForLightDist() {
let aliases = {};
if (!addSubtitleSupport) {
aliases = Object.assign({}, aliases, {
'./utils/cues': './empty.js',
'./controller/timeline-controller': './empty.js',
'./controller/subtitle-track-controller': './empty.js',
'./controller/subtitle-stream-controller': './empty.js'
});
}
if (!addAltAudioSupport) {
aliases = Object.assign({}, aliases, {
'./controller/audio-track-controller': './empty.js',
'./controller/audio-stream-controller': './empty.js'
});
}
return aliases;
}
const multiConfig = [
{
name: 'debug',
output: {
filename: 'hls.js',
chunkFilename: '[name].js',
sourceMapFilename: 'hls.js.map',
path: path.resolve(__dirname, 'dist'),
publicPath: '/dist/',
library: 'Hls',
libraryTarget: 'umd',
libraryExport: 'default'
},
plugins: getPluginsForConfig('main'),
devtool: 'source-map',
},
{
name: 'dist',
output: {
filename: 'hls.min.js',
chunkFilename: '[name].js',
path: path.resolve(__dirname, 'dist'),
publicPath: '/dist/',
library: 'Hls',
libraryTarget: 'umd',
libraryExport: 'default'
},
plugins: getPluginsForConfig('main', true)
},
{
name: 'light',
output: {
filename: 'hls.light.js',
chunkFilename: '[name].js',
sourceMapFilename: 'hls.light.js.map',
path: path.resolve(__dirname, 'dist'),
publicPath: '/dist/',
library: 'Hls',
libraryTarget: 'umd',
libraryExport: 'default'
},
resolve: {
alias: getAliasesForLightDist()
},
plugins: getPluginsForConfig('light'),
devtool: 'source-map'
},
{
name: 'light-dist',
output: {
filename: 'hls.light.min.js',
chunkFilename: '[name].js',
path: path.resolve(__dirname, 'dist'),
publicPath: '/dist/',
library: 'Hls',
libraryTarget: 'umd',
libraryExport: 'default'
},
resolve: {
alias: getAliasesForLightDist()
},
plugins: getPluginsForConfig('light', true)
}
].map(fragment => Object.assign({}, commonConfig, fragment));
// webpack matches the --env arguments to a string; for example, --env.debug.min translates to { debug: true, min: true }
module.exports = (envArgs) => {
if (!envArgs) {
// If no arguments are specified, return every configuration
return multiConfig;
}
// Find the first enabled config within the arguments array
const enabledConfigName = Object.keys(envArgs).find(envName => envArgs[envName]);
let enabledConfig = multiConfig.find(config => config.name === enabledConfigName);
if (!enabledConfig) {
console.error(`Couldn't find a valid config with the name "${enabledConfigName}". Known configs are: ${multiConfig.map(config => config.name).join(', ')}`);
return;
}
return enabledConfig;
};