186 lines
6.3 KiB
JavaScript
186 lines
6.3 KiB
JavaScript
const path = require('path');
|
|
const fs = require('fs');
|
|
const webpack = require('webpack');
|
|
const semver = require('semver');
|
|
const cheerio = require('cheerio');
|
|
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
|
const CopyPlugin = require('copy-webpack-plugin');
|
|
|
|
// Loading the current package.json - will be used to determine version etc.
|
|
const packageJSON = require(path.resolve(__dirname, 'package.json'));
|
|
|
|
// Validate package version is valid semver
|
|
if (!semver.valid(packageJSON.version)) {
|
|
throw 'Invalid package version - ' + packageJSON.version;
|
|
}
|
|
|
|
// Distribution options configure how build paths are going to be configured.
|
|
const getDistOptions = (mode) => {
|
|
const fullVersion = packageJSON.version;
|
|
const majorVersion = semver.major(packageJSON.version);
|
|
const cdnRoot = packageJSON.com_fluidplayer.cdn;
|
|
|
|
switch (mode) {
|
|
case 'development':
|
|
return {
|
|
path: path.resolve(__dirname, 'dist'),
|
|
publicPath: '/'
|
|
};
|
|
case 'current':
|
|
return {
|
|
path: path.resolve(__dirname, 'dist-cdn/v' + majorVersion + '/current/'),
|
|
publicPath: cdnRoot + '/v' + majorVersion + '/current/'
|
|
};
|
|
case 'versioned':
|
|
return {
|
|
path: path.resolve(__dirname, 'dist-cdn/' + fullVersion + '/'),
|
|
publicPath: cdnRoot + '/' + fullVersion + '/'
|
|
};
|
|
default:
|
|
throw 'Unknown distribution type provided in --dist!';
|
|
}
|
|
}
|
|
|
|
// Webpack configuration
|
|
module.exports = (env, argv) => {
|
|
const wpMode = typeof argv.mode !== 'undefined' ? argv.mode : 'development';
|
|
const wpDebug = wpMode === 'development' && typeof env.debug !== 'undefined' && !!env.debug;
|
|
const wpDist = typeof env.dist !== 'undefined' ? env.dist : 'development';
|
|
const wpDistOptions = getDistOptions(wpDist);
|
|
|
|
if ('development' !== wpDist && (wpMode !== 'production' || wpDebug)) {
|
|
throw 'Building a production distribution in development mode or with debug enabled is not allowed!'
|
|
}
|
|
|
|
const plugins = [
|
|
// Define common variables for use in Fluid Player
|
|
new webpack.DefinePlugin({
|
|
FP_BUILD_VERSION: JSON.stringify(packageJSON.version),
|
|
FP_HOMEPAGE: JSON.stringify(packageJSON.homepage),
|
|
FP_ENV: JSON.stringify(wpMode),
|
|
FP_DEBUG: JSON.stringify(wpDebug),
|
|
FP_WITH_CSS: false
|
|
})
|
|
];
|
|
|
|
// Development mode builds and development server specifics
|
|
if ('development' === wpMode) {
|
|
// Locate all E2E cases
|
|
const caseFiles = [];
|
|
fs.readdirSync(path.resolve(__dirname, 'test/html/')).forEach(file => {
|
|
if (file === 'special-cases' || file === 'e2e') {
|
|
return;
|
|
}
|
|
|
|
const absPath = path.resolve(__dirname, 'test/html/', file);
|
|
const caseHtml = cheerio.load(fs.readFileSync(absPath));
|
|
const publicName = file.replace('.tpl', '');
|
|
|
|
plugins.push(new HtmlWebpackPlugin({
|
|
template: path.resolve(__dirname, 'test/html/', file),
|
|
inject: false,
|
|
filename: publicName,
|
|
scriptLoading: "blocking",
|
|
}));
|
|
|
|
caseFiles.push({
|
|
file: publicName,
|
|
name: caseHtml('title').text()
|
|
});
|
|
});
|
|
|
|
fs.readdirSync(path.resolve(__dirname, 'test/html/special-cases')).forEach(file => {
|
|
const publicName = file.replace('.tpl', '');
|
|
|
|
plugins.push(new HtmlWebpackPlugin({
|
|
template: path.resolve(__dirname, 'test/html/special-cases', file),
|
|
inject: false,
|
|
filename: publicName,
|
|
scriptLoading: "blocking",
|
|
}));
|
|
});
|
|
|
|
fs.readdirSync(path.resolve(__dirname, 'test/html/e2e')).forEach(file => {
|
|
const publicName = file.replace('.tpl', '');
|
|
|
|
plugins.push(new HtmlWebpackPlugin({
|
|
template: path.resolve(__dirname, 'test/html/e2e', file),
|
|
inject: false,
|
|
filename: publicName,
|
|
scriptLoading: "blocking",
|
|
}));
|
|
});
|
|
|
|
// Emit all cases as separate HTML pages
|
|
plugins.push(new HtmlWebpackPlugin({
|
|
template: path.resolve(__dirname, 'test/index.html'),
|
|
filename: 'index.html',
|
|
inject: false,
|
|
templateParameters: {
|
|
cases: caseFiles
|
|
}
|
|
}));
|
|
|
|
// Copy static assets for E2E
|
|
plugins.push(new CopyPlugin(
|
|
{
|
|
patterns: [
|
|
{ from: path.resolve(__dirname, 'test/static/'), to: path.resolve(wpDistOptions.path, 'static') }
|
|
]
|
|
}
|
|
));
|
|
}
|
|
|
|
return {
|
|
devServer: {
|
|
static: wpDistOptions.path,
|
|
// index: 'index.html',
|
|
// allowedHosts: "all", // To use with remote hosting (ie: ngrok)
|
|
},
|
|
devtool: wpMode === 'development' ? 'source-map' : false,
|
|
cache: wpMode !== 'development' ? {
|
|
type: "filesystem",
|
|
buildDependencies: {
|
|
// This makes all dependencies of this file - build dependencies
|
|
config: [__filename],
|
|
// By default webpack and loaders are build dependencies
|
|
}
|
|
} : undefined,
|
|
plugins,
|
|
entry: {
|
|
fluidplayer: './src/browser.js'
|
|
},
|
|
optimization: {
|
|
minimize: wpMode !== 'development'
|
|
},
|
|
output: {
|
|
filename: '[name].min.js',
|
|
chunkFilename: '[name].[chunkhash].min.js',
|
|
path: wpDistOptions.path,
|
|
publicPath: wpDistOptions.publicPath
|
|
},
|
|
module: {
|
|
rules: [
|
|
{
|
|
test: /\.m?js$/,
|
|
exclude: /node_modules/,
|
|
use: {
|
|
loader: 'babel-loader',
|
|
options: {
|
|
presets: ['@babel/preset-env']
|
|
}
|
|
}
|
|
},
|
|
{
|
|
test: /\.css$/i,
|
|
use: ['style-loader', 'css-loader'],
|
|
},
|
|
{
|
|
test: /\.svg/,
|
|
type: 'asset'
|
|
},
|
|
],
|
|
}
|
|
};
|
|
}
|