silverstripe-framework/webpack.config.js
Ingo Schommer 2316b0da9f API Remove i18n::js_i18n option
The JavaScript i18n functionality in SilverStripe is used in the CMS as well as form field implementations.
Form fields used to include their own JavaScript for usage outside of CMS. This now requires custom build tooling in a project.
Hence there's no need for an i18n shim (i18nx.js), since the CMS always uses i18n support.
2016-09-16 13:46:09 +12:00

220 lines
6.9 KiB
JavaScript

const webpack = require('webpack');
const autoprefixer = require('autoprefixer');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
// const SprityWebpackPlugin = require('sprity-webpack-plugin');
const PATHS = {
MODULES: './node_modules',
ADMIN: './admin',
ADMIN_IMAGES: './admin/client/dist/images',
ADMIN_CSS_SRC: './admin/client/src/styles',
ADMIN_CSS_DIST: './admin/client/dist/styles',
ADMIN_THIRDPARTY: './admin/thirdparty',
ADMIN_JS_SRC: './admin/client/src',
ADMIN_JS_DIST: './admin/client/dist/js',
ADMIN_SPRITES_SRC: './admin/client/src/sprites',
ADMIN_SPRITES_DIST: './admin/client/dist/images/sprites',
FRAMEWORK: '.',
FRAMEWORK_THIRDPARTY: './thirdparty',
INSTALL_CSS_SRC: './dev/install/client/src/styles',
INSTALL_CSS_DIST: './dev/install/client/dist/styles',
};
// Used for autoprefixing css properties (same as Bootstrap Aplha.2 defaults)
const SUPPORTED_BROWSERS = [
'Chrome >= 35',
'Firefox >= 31',
'Edge >= 12',
'Explorer >= 9',
'iOS >= 8',
'Safari >= 8',
'Android 2.3',
'Android >= 4',
'Opera >= 12',
];
const config = [
{
name: 'js',
entry: {
'bundle-framework': `${PATHS.ADMIN_JS_SRC}/boot/index.js`,
'bundle-legacy': `${PATHS.ADMIN_JS_SRC}/bundles/legacy.js`,
'bundle-lib': `${PATHS.ADMIN_JS_SRC}/bundles/lib.js`,
'LeftAndMain.Ping': `${PATHS.ADMIN_JS_SRC}/legacy/LeftAndMain.Ping.js`,
leaktools: `${PATHS.ADMIN_JS_SRC}/legacy/leaktools.js`,
MemberImportForm: `${PATHS.ADMIN_JS_SRC}/legacy/MemberImportForm.js`,
CMSSecurity: `${PATHS.ADMIN_JS_SRC}/legacy/CMSSecurity.js`,
UploadField_select: `${PATHS.ADMIN_JS_SRC}/legacy/UploadField_select.js`,
TinyMCE_SSPlugin: `${PATHS.ADMIN_JS_SRC}/legacy/TinyMCE_SSPlugin.js`,
},
resolve: {
modulesDirectories: [PATHS.ADMIN_JS_SRC, PATHS.MODULES],
},
output: {
path: 'admin/client/dist',
filename: 'js/[name].js',
},
// lib.js provies these globals and more. These references allow the framework bundle
// to access them.
externals: {
'bootstrap-collapse': 'BootstrapCollapse',
'components/Breadcrumb/Breadcrumb': 'Breadcrumb',
'state/breadcrumbs/BreadcrumbsActions': 'BreadcrumbsActions',
'components/FormAction/FormAction': 'FormAction',
'components/FormBuilder/FormBuilder': 'FormBuilder',
'components/FormBuilderModal/FormBuilderModal': 'FormBuilderModal',
'components/GridField/GridField': 'GridField',
'components/Toolbar/Toolbar': 'Toolbar',
'deep-freeze-strict': 'DeepFreezeStrict',
i18n: 'i18n',
jQuery: 'jQuery',
'lib/Backend': 'Backend',
'lib/ReducerRegister': 'ReducerRegister',
'lib/ReactRouteRegister': 'ReactRouteRegister',
'lib/SilverStripeComponent': 'SilverStripeComponent',
'page.js': 'Page',
'react-addons-test-utils': 'ReactAddonsTestUtils',
'react-dom': 'ReactDom',
tether: 'Tether',
'react-bootstrap-ss': 'ReactBootstrap',
'react-redux': 'ReactRedux',
'react-router-redux': 'ReactRouterRedux',
'react-router': 'ReactRouter',
'react-addons-css-transition-group': 'ReactAddonsCssTransitionGroup',
react: 'React',
'redux-thunk': 'ReduxThunk',
redux: 'Redux',
config: 'Config',
'lib/Router': 'Router',
},
devtool: 'source-map',
module: {
loaders: [
{
test: /\.js$/,
exclude: /(node_modules|thirdparty)/,
loader: 'babel',
query: {
presets: ['es2015', 'react'],
plugins: ['transform-object-assign', 'transform-object-rest-spread'],
comments: false,
},
},
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract([
'css?sourceMap&minimize',
'postcss?sourceMap',
'resolve-url',
'sass?sourceMap',
], {
publicPath: '../', // needed because bundle.css is in a subfolder
}),
},
{
test: /\.css$/,
loader: ExtractTextPlugin.extract([
'css?sourceMap&minimize',
'postcss?sourceMap',
], {
publicPath: '../', // needed because bundle.css is in a subfolder
}),
},
{
test: '/i18n.js/',
loader: 'script-loader',
},
{
test: /\.(png|gif|jpg|svg)$/,
loader: 'url?limit=10000&name=images/[name].[ext]',
},
{
test: /\.(woff|eot|ttf)$/,
loader: 'file?name=fonts/[name].[ext]',
},
],
},
postcss: [
autoprefixer({ browsers: SUPPORTED_BROWSERS }),
],
plugins: [
new webpack.ProvidePlugin({
jQuery: 'jQuery',
$: 'jQuery',
}),
new webpack.DefinePlugin({
'process.env':{
// Builds React in production mode, avoiding console warnings
'NODE_ENV': JSON.stringify('production')
}
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
unused: false,
warnings: false,
},
}),
new ExtractTextPlugin('styles/bundle.css', { allChunks: true }),
],
},
// Much of the CSS is included in the javascript configuration (bundle.scss)
// These CSS files have not yet been inlined into the javascript include chain
{
name: 'css',
entry: {
[`${PATHS.ADMIN_CSS_DIST}/editor`]:
`${PATHS.ADMIN_CSS_SRC}/editor.scss`,
[`${PATHS.ADMIN_CSS_DIST}/GridField_print`]:
`${PATHS.ADMIN_CSS_SRC}/legacy/GridField_print.scss`,
[`${PATHS.ADMIN_CSS_DIST}/debug`]:
`${PATHS.ADMIN_CSS_SRC}/legacy/debug.scss`,
[`${PATHS.ADMIN_CSS_DIST}/AssetUploadField`]:
`${PATHS.ADMIN_CSS_SRC}/legacy/AssetUploadField.scss`,
[`${PATHS.ADMIN_CSS_DIST}/UploadField`]:
`${PATHS.ADMIN_CSS_SRC}/legacy/UploadField.scss`,
[`${PATHS.INSTALL_CSS_DIST}/install`]:
`${PATHS.INSTALL_CSS_SRC}/install.scss`,
},
output: {
path: './',
filename: '[name].css',
},
module: {
loaders: [
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract([
'css?sourceMap&minimize',
'postcss?sourceMap',
'resolve-url',
'sass?sourceMap',
]),
},
{
test: /\.(png|gif|jpg|svg)$/,
loader: `url?limit=10000&name=${PATHS.ADMIN_CSS_DIST}/images/[name].[ext]`,
},
{
test: /\.(woff|eot|ttf)$/,
loader: 'file?name=fonts/[name].[ext]',
},
],
},
postcss: [
autoprefixer({ browsers: SUPPORTED_BROWSERS }),
],
plugins: [
new ExtractTextPlugin('[name].css', { allChunks: true }),
],
},
];
// Use WEBPACK_CHILD=js or WEBPACK_CHILD=css env var to run a single config
if (process.env.WEBPACK_CHILD) {
module.exports = config.filter((entry) => entry.name === process.env.WEBPACK_CHILD)[0];
} else {
module.exports = config;
}