const path = require('path'); const webpack = require('webpack'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const ProgressBarPlugin = require('progress-bar-webpack-plugin'); const VueLoaderPlugin = require('vue-loader/lib/plugin'); const md = require('markdown-it')(); const slugify = require('transliteration').slugify; const striptags = require('./strip-tags'); const config = require('./config'); const isProd = process.env.NODE_ENV === 'production'; const isPlay = !!process.env.PLAY_ENV; function convert(str) { str = str.replace(/(&#x)(\w{4});/gi, function($0) { return String.fromCharCode(parseInt(encodeURIComponent($0).replace(/(%26%23x)(\w{4})(%3B)/g, '$2'), 16)); }); return str; } function wrap(render) { return function() { return render.apply(this, arguments) .replace('', ''); }; } const webpackConfig = { mode: process.env.NODE_ENV, entry: isProd ? { docs: './examples/entry.js', 'element-ui': './src/index.js' } : (isPlay ? './examples/play.js' : './examples/entry.js'), output: { path: path.resolve(process.cwd(), './examples/element-ui/'), publicPath: process.env.CI_ENV || '', filename: '[name].[hash:7].js', chunkFilename: isProd ? '[name].[hash:7].js' : '[name].js' }, resolve: { extensions: ['.js', '.vue', '.json'], alias: config.alias, modules: ['node_modules'] }, devServer: { host: '0.0.0.0', port: 8085, publicPath: '/', noInfo: true }, performance: { hints: false }, stats: { children: false }, module: { rules: [ { enforce: 'pre', test: /\.(vue|jsx?)$/, exclude: /node_modules/, loader: 'eslint-loader' }, { test: /\.(jsx?|babel|es6)$/, include: process.cwd(), exclude: config.jsexclude, loader: 'babel-loader' }, { test: /\.vue$/, loader: 'vue-loader', options: { compilerOptions: { preserveWhitespace: false } } }, { test: /\.css$/, loaders: [ isProd ? MiniCssExtractPlugin.loader : 'style-loader', 'css-loader', 'postcss-loader' ] }, { test: /\.scss$/, loaders: [ isProd ? MiniCssExtractPlugin.loader : 'style-loader', 'css-loader', 'sass-loader' ] }, { test: /\.md$/, loaders: [ { loader: 'vue-loader' }, { loader: 'vue-markdown-loader/lib/markdown-compiler', options: { preventExtract: true, raw: true, preprocess: function(MarkdownIt, source) { MarkdownIt.renderer.rules.table_open = function() { return ''; }; MarkdownIt.renderer.rules.fence = wrap(MarkdownIt.renderer.rules.fence); return source; }, use: [ [require('markdown-it-anchor'), { level: 2, slugify: slugify, permalink: true, permalinkBefore: true }], [require('markdown-it-container'), 'demo', { validate: function(params) { return params.trim().match(/^demo\s*(.*)$/); }, render: function(tokens, idx) { var m = tokens[idx].info.trim().match(/^demo\s*(.*)$/); if (tokens[idx].nesting === 1) { var description = (m && m.length > 1) ? m[1] : ''; var content = tokens[idx + 1].content; var html = convert(striptags.strip(content, ['script', 'style'])).replace(/(<[^>]*)=""(?=.*>)/g, '$1'); var script = striptags.fetch(content, 'script'); var style = striptags.fetch(content, 'style'); var jsfiddle = { html: html, script: script, style: style }; var descriptionHTML = description ? md.render(description) : ''; jsfiddle = md.utils.escapeHtml(JSON.stringify(jsfiddle)); return `
${html}
${descriptionHTML}
`; } return '
\n'; } }], [require('markdown-it-container'), 'tip'], [require('markdown-it-container'), 'warning'] ] } } ] }, { test: /\.(svg|otf|ttf|woff2?|eot|gif|png|jpe?g)(\?\S*)?$/, loader: 'url-loader', query: { limit: 10000, name: path.posix.join('static', '[name].[hash:7].[ext]') } } ] }, plugins: [ new HtmlWebpackPlugin({ template: './examples/index.tpl', filename: './index.html', favicon: './examples/favicon.ico' }), new CopyWebpackPlugin([ { from: 'examples/versions.json' } ]), new ProgressBarPlugin(), new VueLoaderPlugin(), new webpack.LoaderOptionsPlugin({ vue: { compilerOptions: { preserveWhitespace: false } } }) ] }; if (isProd) { webpackConfig.plugins.push( new MiniCssExtractPlugin({ filename: '[name].[contenthash:7].css' }) ); } module.exports = webpackConfig;