polymerx-cli
Version:
Unlock the power of Polymer 3, Web Components and modern web tools.
190 lines (174 loc) • 6.44 kB
JavaScript
;
exports.__esModule = true;
exports.default = void 0;
var _path = require("path");
var _findNodeModules = _interopRequireDefault(require("find-node-modules"));
var _webpack = _interopRequireDefault(require("webpack"));
var _webpackMerge = _interopRequireDefault(require("webpack-merge"));
var _workboxWebpackPlugin = require("workbox-webpack-plugin");
var _copyWebpackPlugin = _interopRequireDefault(require("copy-webpack-plugin"));
var _htmlWebpackPlugin = _interopRequireDefault(require("html-webpack-plugin"));
var _htmlWebpackExcludeAssetsPlugin = _interopRequireDefault(require("html-webpack-exclude-assets-plugin"));
var _scriptExtHtmlWebpackPlugin = _interopRequireDefault(require("script-ext-html-webpack-plugin"));
var _cleanWebpackPlugin = _interopRequireDefault(require("clean-webpack-plugin"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const renderHtmlPlugins = (outputPath, isProd, src) => [new _htmlWebpackPlugin.default({
filename: (0, _path.resolve)(outputPath, 'index.html'),
template: `!!ejs-loader!${(0, _path.resolve)(src, 'index.html')}`,
minify: isProd && {
collapseWhitespace: true,
removeScriptTypeAttributes: true,
removeRedundantAttributes: true,
removeStyleLinkTypeAttributes: true,
removeComments: true
},
inject: true,
compile: true,
excludeAssets: [/(bundle|polyfills)(\..*)?\.js$/],
paths: {
webcomponents: './vendor/webcomponents-loader.js'
}
}), new _htmlWebpackExcludeAssetsPlugin.default(), new _scriptExtHtmlWebpackPlugin.default({
defaultAttribute: 'defer'
})];
const shared = argv => {
const {
isProd,
src,
srcDir,
dest,
pkg,
cwd,
https,
workers
} = argv;
const ENV = isProd ? 'production' : 'development';
const OUTPUT_PATH = isProd ? (0, _path.resolve)(dest || 'dist') : (0, _path.resolve)(src || 'src');
const NODE_MODULES = (0, _findNodeModules.default)({
cwd,
relative: false
});
const HOST = process.env.HOST || argv.host;
const PORT = process.env.PORT || argv.port;
const FULL_HOST = `http://${HOST}:${PORT}`;
const ENTRY = isProd ? [(0, _path.resolve)(src || 'src')] : [OUTPUT_PATH].concat([`webpack-dev-server/client?${FULL_HOST}`, 'webpack/hot/dev-server']);
const processEnv = {
NODE_ENV: JSON.stringify(ENV),
appVersion: JSON.stringify(pkg.version)
};
const copyStatics = {
copyWebcomponents: [{
from: (0, _path.resolve)('./node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js'),
to: (0, _path.join)(OUTPUT_PATH, 'vendor'),
flatten: true
}, {
from: (0, _path.resolve)('./node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js'),
to: (0, _path.join)(OUTPUT_PATH, 'vendor'),
flatten: true
}, {
from: (0, _path.resolve)('./node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-ce.js'),
to: (0, _path.join)(OUTPUT_PATH, 'vendor', 'bundles'),
flatten: true
}, {
from: (0, _path.resolve)('./node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-sd-ce.js'),
to: (0, _path.join)(OUTPUT_PATH, 'vendor', 'bundles'),
flatten: true
}, {
from: (0, _path.resolve)('./node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js'),
to: (0, _path.join)(OUTPUT_PATH, 'vendor', 'bundles'),
flatten: true
}, {
from: (0, _path.resolve)('./node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-sd.js'),
to: (0, _path.join)(OUTPUT_PATH, 'vendor', 'bundles'),
flatten: true
}],
copyOthers: [{
from: 'assets/**',
context: (0, _path.resolve)(srcDir),
to: OUTPUT_PATH
}, {
from: (0, _path.resolve)(srcDir, 'index.html'),
to: OUTPUT_PATH,
flatten: true
}, {
from: (0, _path.resolve)(srcDir, 'manifest.json'),
to: OUTPUT_PATH,
flatten: true
}]
};
const sharedPlugins = [new _webpack.default.DefinePlugin({
'process.env': processEnv
}), ...renderHtmlPlugins(OUTPUT_PATH, isProd, src)];
const devPlugins = [new _copyWebpackPlugin.default(copyStatics.copyWebcomponents), new _webpack.default.HotModuleReplacementPlugin(), new _webpack.default.NamedModulesPlugin()];
const buildPlugins = [new _cleanWebpackPlugin.default([(0, _path.resolve)(OUTPUT_PATH)], {
allowExternal: true,
verbose: false
}), new _copyWebpackPlugin.default([].concat(copyStatics.copyWebcomponents, copyStatics.copyOthers))].concat(workers ? new _workboxWebpackPlugin.GenerateSW({
swDest: (0, _path.join)(OUTPUT_PATH, 'sw.js'),
skipWaiting: true
}) : []);
const plugins = sharedPlugins.concat(isProd ? buildPlugins : devPlugins);
return {
mode: ENV,
entry: ENTRY,
output: {
path: OUTPUT_PATH,
filename: 'bundle.js'
},
devtool: 'cheap-source-map',
resolve: {
modules: [...NODE_MODULES, (0, _path.resolve)(__dirname, '../../../node_modules')]
},
resolveLoader: {
modules: [...NODE_MODULES, (0, _path.resolve)(__dirname, '../../../node_modules')]
},
module: {
rules: [{
test: /\.html$/,
use: ['raw-loader']
}, {
test: /\.pcss$/,
use: ['raw-loader', 'postcss-loader']
}, {
test: /\.js$/,
exclude: /(node_modules)/,
use: {
loader: 'babel-loader',
options: {
presets: [[require.resolve('@babel/preset-env'), {
targets: {
browsers: ['>=1%', 'not ie 11', 'not op_mini all']
},
debug: !isProd
}]],
plugins: [[require.resolve('@babel/plugin-syntax-object-rest-spread'), {
useBuiltIns: true
}], [require.resolve('@babel/plugin-syntax-dynamic-import')]]
}
}
}]
},
plugins,
devServer: {
hot: true,
compress: true,
contentBase: OUTPUT_PATH,
overlay: {
errors: true
},
stats: 'minimal',
port: PORT,
host: HOST,
https,
disableHostCheck: true,
historyApiFallback: true,
quiet: true,
clientLogLevel: 'none',
watchOptions: {
ignored: [(0, _path.resolve)(cwd, 'dist'), (0, _path.resolve)(cwd, 'node_modules')]
}
}
};
};
var _default = (argv = {}) => (0, _webpackMerge.default)(shared(argv));
exports.default = _default;