UNPKG

spinjs

Version:

<p align="center"><a href="#"><img width="150" src="https://rawgit.com/sysgears/spin.js/master/logo.svg"></a></p>

240 lines 9.87 kB
"use strict"; var __assign = (this && this.__assign) || Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; Object.defineProperty(exports, "__esModule", { value: true }); var path = require("path"); var ip = require("ip"); var url = require("url"); var requireModule_1 = require("../requireModule"); var pkg = requireModule_1.default('./package.json'); var __WINDOWS__ = /^win/.test(process.platform); var createPlugins = function (builder, spin) { var stack = builder.stack; var webpack = requireModule_1.default('webpack'); var buildNodeEnv = spin.dev ? (spin.test ? 'test' : 'development') : 'production'; var plugins = []; if (spin.dev) { plugins.push(new webpack.NamedModulesPlugin()); if (stack.hasAny(['server', 'web']) && !spin.test) { plugins.push(new webpack.HotModuleReplacementPlugin()); plugins.push(new webpack.NoEmitOnErrorsPlugin()); } } else { var uglifyOpts = { minimize: true }; if (stack.hasAny('angular')) { uglifyOpts.mangle = { keep_fnames: true }; } plugins.push(new webpack.optimize.UglifyJsPlugin(uglifyOpts)); var loaderOpts = { minimize: true }; if (stack.hasAny('angular')) { loaderOpts.htmlLoader = { minimize: false }; } plugins.push(new webpack.LoaderOptionsPlugin(loaderOpts)); plugins.push(new webpack.optimize.ModuleConcatenationPlugin()); } var backendUrl = spin.options.backendUrl.replace('{ip}', ip.address()); if (stack.hasAny('dll')) { var name = "vendor_" + builder.parent.name; plugins = [ new webpack.DefinePlugin({ __DEV__: spin.dev, 'process.env.NODE_ENV': "\"" + buildNodeEnv + "\"", }), new webpack.DllPlugin({ name: name, path: path.join(spin.options.dllBuildDir, name + "_dll.json"), }), ]; } else { if (stack.hasAny('server')) { plugins = plugins.concat([ new webpack.BannerPlugin({ banner: 'require("source-map-support").install();', raw: true, entryOnly: false, }), new webpack.DefinePlugin(__assign({ __CLIENT__: false, __SERVER__: true, __SSR__: spin.options.ssr && !spin.test, __DEV__: spin.dev, 'process.env.NODE_ENV': "\"" + buildNodeEnv + "\"", __BACKEND_URL__: "\"" + backendUrl + "\"" }, spin.options.defines)), ]); } else { plugins = plugins.concat([ new webpack.DefinePlugin(__assign({ __CLIENT__: true, __SERVER__: false, __SSR__: spin.options.ssr && !spin.test, __DEV__: spin.dev, 'process.env.NODE_ENV': "\"" + buildNodeEnv + "\"", __BACKEND_URL__: "\"" + backendUrl + "\"" }, spin.options.defines)), ]); if (stack.hasAny('web')) { var ManifestPlugin = requireModule_1.default('webpack-manifest-plugin'); plugins.push(new ManifestPlugin({ fileName: 'assets.json', })); if (!spin.options.ssr) { var HtmlWebpackPlugin = requireModule_1.default('html-webpack-plugin'); plugins.push(new HtmlWebpackPlugin({ template: builder.htmlTemplate || path.join(__dirname, '../../html-plugin-template.ejs'), inject: 'body', })); } if (!spin.dev) { plugins.push(new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: '[name].[hash].js', minChunks: function (module) { return module.resource && module.resource.indexOf(path.resolve('./node_modules')) === 0; }, })); } } } } return plugins; }; var getDepsForNode = function (builder, depPlatforms) { var deps = []; for (var _i = 0, _a = Object.keys(pkg.dependencies); _i < _a.length; _i++) { var key = _a[_i]; var val = depPlatforms[key]; if (key.indexOf('@types') !== 0 && (!val || (val.constructor === Array && val.indexOf(builder.parent.name) >= 0) || val === builder.parent.name)) { deps.push(key); } } return deps; }; var curWebpackDevPort = 3000; var webpackPortMap = {}; var createConfig = function (builder, spin) { var stack = builder.stack; var backendUrl = spin.options.backendUrl.replace('{ip}', ip.address()); var baseConfig = { name: builder.name, devtool: spin.dev ? '#cheap-module-source-map' : '#source-map', module: { rules: [], }, resolve: { modules: [path.join(process.cwd(), 'node_modules'), 'node_modules'], }, watchOptions: { ignored: /build/, }, bail: !spin.dev, }; var baseDevServerConfig = { hot: true, contentBase: '/', publicPath: '/', headers: { 'Access-Control-Allow-Origin': '*' }, quiet: false, noInfo: true, historyApiFallback: true, stats: { colors: true, chunkModules: false }, }; var plugins = createPlugins(builder, spin); var config = __assign({}, baseConfig, { plugins: plugins }); if (stack.hasAny('server')) { config = __assign({}, config, { target: 'node', node: { __dirname: true, __filename: true, }, externals: [requireModule_1.default('webpack-node-externals')({ whitelist: [/(^webpack|^react-native)/] })] }); } if (stack.hasAny('dll')) { var name = "vendor_" + builder.parent.name; config = __assign({}, config, { devtool: '#cheap-module-source-map', entry: { vendor: getDepsForNode(builder, spin.depPlatforms), }, output: { filename: name + ".[hash]_dll.js", path: path.resolve(spin.options.dllBuildDir), library: name, } }); } else { if (stack.hasAny('server')) { var index = []; if (spin.dev && !spin.test) { if (__WINDOWS__) { index.push('webpack/hot/poll?1000'); } else { index.push('webpack/hot/signal.js'); } } index.push('./src/server/index.js'); config = __assign({}, config, { entry: { index: index, }, output: { devtoolModuleFilenameTemplate: spin.dev ? '../../[resource-path]' : undefined, devtoolFallbackModuleFilenameTemplate: spin.dev ? '../../[resource-path];[hash]' : undefined, filename: '[name].js', sourceMapFilename: '[name].[chunkhash].js.map', path: path.resolve(spin.options.backendBuildDir), publicPath: '/', } }); } else if (stack.hasAny('web')) { var _a = url.parse(backendUrl), protocol = _a.protocol, host = _a.host; var backendBaseUrl = protocol + '//' + host; var webpackDevPort = void 0; if (!builder.webpackDevPort) { if (!webpackPortMap[builder.name]) { webpackPortMap[builder.name] = curWebpackDevPort++; } webpackDevPort = webpackPortMap[builder.name]; } else { webpackDevPort = builder.webpackDevPort; } config = __assign({}, config, { entry: { index: (spin.dev ? ["webpack-hot-middleware/client"] : []).concat([ './src/client/index.js', ]), }, output: { filename: '[name].[hash].js', path: path.resolve(path.join(spin.options.frontendBuildDir, 'web')), publicPath: '/', }, devServer: __assign({}, baseDevServerConfig, { port: webpackDevPort, proxy: { '!/*.hot-update.{json,js}': { target: backendBaseUrl, logLevel: 'info', }, } }) }); } else if (stack.hasAny('react-native')) { config = __assign({}, config, { entry: { index: [ './src/mobile/index.js', ], }, output: { filename: "index.mobile.bundle", publicPath: '/', path: path.resolve(path.join(spin.options.frontendBuildDir, builder.name)), }, devServer: __assign({}, baseDevServerConfig, { hot: false, port: stack.hasAny('android') ? 3010 : 3020 }) }); } else { throw new Error("Unknown platform target: " + stack.platform); } } return config; }; var WebpackPlugin = (function () { function WebpackPlugin() { } WebpackPlugin.prototype.configure = function (builder, spin) { var stack = builder.stack; if (stack.hasAny('webpack')) { builder.config = builder.config || {}; builder.config = spin.merge(builder.config, createConfig(builder, spin)); } }; return WebpackPlugin; }()); exports.default = WebpackPlugin; //# sourceMappingURL=WebpackPlugin.js.map