@ckeditor/ckeditor5-dev-utils
Version:
Utils for CKEditor 5 development tools packages.
147 lines (130 loc) • 3.74 kB
JavaScript
/**
* @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md.
*/
;
const path = require( 'path' );
const webpack = require( 'webpack' );
const TerserPlugin = require( 'terser-webpack-plugin' );
const bundler = require( '../bundler' );
const styles = require( '../styles' );
const tools = require( '../tools' );
const CKEditorWebpackPlugin = require( '@ckeditor/ckeditor5-dev-webpack-plugin' );
/**
* Returns a webpack configuration that creates a bundle file for the specified package. Thanks to that, plugins exported
* by the package can be added to DLL builds.
*
* @param {Object} options
* @param {String} options.themePath An absolute path to the theme package.
* @param {String} options.packagePath An absolute path to the root directory of the package.
* @param {String} options.manifestPath An absolute path to the CKEditor 5 DLL manifest file.
* @param {Boolean} [options.isDevelopmentMode=false] Whether to build a dev mode of the package.
* @returns {Object}
*/
module.exports = function getDllPluginWebpackConfig( options ) {
const packageName = tools.readPackageName( options.packagePath );
const webpackConfig = {
mode: options.isDevelopmentMode ? 'development' : 'production',
performance: { hints: false },
entry: path.join( options.packagePath, 'src', 'index.js' ),
output: {
library: [ 'CKEditor5', getGlobalKeyForPackage( packageName ) ],
path: path.join( options.packagePath, 'build' ),
filename: getIndexFileName( packageName ),
libraryTarget: 'window'
},
optimization: {
minimize: false
},
plugins: [
new CKEditorWebpackPlugin( {
// UI language. Language codes follow the https://en.wikipedia.org/wiki/ISO_639-1 format.
language: 'en',
additionalLanguages: 'all',
sourceFilesPattern: /^src[/\\].+\.js$/,
skipPluralFormFunction: true
} ),
new webpack.BannerPlugin( {
banner: bundler.getLicenseBanner(),
raw: true
} ),
new webpack.DllReferencePlugin( {
manifest: require( options.manifestPath ),
scope: 'ckeditor5/src',
name: 'CKEditor5.dll'
} )
],
module: {
rules: [
{
test: /\.svg$/,
use: [ 'raw-loader' ]
},
{
test: /\.css$/,
use: [
{
loader: 'style-loader',
options: {
injectType: 'singletonStyleTag',
attributes: {
'data-cke': true
}
}
},
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: styles.getPostCssConfig( {
themeImporter: {
themePath: options.themePath
},
minify: true
} )
}
}
]
}
]
}
};
if ( options.isDevelopmentMode ) {
webpackConfig.devtool = 'source-map';
} else {
webpackConfig.optimization.minimize = true;
webpackConfig.optimization.minimizer = [
new TerserPlugin( {
terserOptions: {
output: {
// Preserve CKEditor 5 license comments.
comments: /^!/
}
},
extractComments: false
} )
];
}
return webpackConfig;
};
/**
* Transforms the package name (`@ckeditor/ckeditor5-foo-bar`) to the name that will be used while
* exporting the library into the global scope.
*
* @param {String} packageName
* @returns {String}
*/
function getGlobalKeyForPackage( packageName ) {
return packageName
.replace( /^@ckeditor\/ckeditor5?-/, '' )
.replace( /-([a-z])/g, ( match, p1 ) => p1.toUpperCase() );
}
/**
* Extracts the main file name from the package name.
*
* @param packageName
* @returns {String}
*/
function getIndexFileName( packageName ) {
return packageName.replace( /^@ckeditor\/ckeditor5?-/, '' ) + '.js';
}