fz-react-cli
Version:
A CLI tool for build modern web application and libraries
257 lines (247 loc) • 8.81 kB
JavaScript
;
var path = require("path");
var webpack = require("webpack");
var cp = require("child_process");
//var WebpackMd5Hash = require('webpack-md5-hash');
var CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin");
var ChunkManifestPlugin = require("../ChunkManifestPlugin");
var i18nPlugin = require("../i18nPlugin");
var folder = process.env.npm_config_output_folder || "build";
var appFolder = process.env.npm_config_app_folder || "src";
var context = process.env.npm_config_server_context || "app";
var cssUnique = process.env.npm_config_css_unique == "" ? false : true;
var mig = process.env.npm_config_react_mig || false;
var hash = process.env.npm_config_hash_enable || false;
var widgetEnable = process.env.npm_config_widget_enable || false;
var RuntimePublicPath = require("../RuntimePublicPath").RuntimePublicPath;
var jsSubdomain = process.env.npm_config_jsserver_subdomain || "js";
var imgSubdomain = process.env.npm_config_imgserver_subdomain || "images";
var fontSubdomain = process.env.npm_config_fontserver_subdomain || "fonts";
var useInsertInto = process.env.npm_config_use_insertInto || false;
var useInsertAt = process.env.npm_config_use_insertAt || false;
var enableSourceMap = process.env.npm_config_enable_smap || false;
if (useInsertInto && useInsertAt) {
throw new Error("You can't use style loader's insertInto and insertAt at a same time; Please refer this PR to get more info - https://github.com/webpack-contrib/style-loader/pull/325");
}
var styleLoaderOption = {};
if (useInsertInto) {
styleLoaderOption.insertInto = function () {
if (window.styleTarget) {
var element = document.getElementById(window.styleTarget);
return element.shadowRoot ? element.shadowRoot : element;
}
return document.head;
};
} else if (useInsertAt) {
var getInsertAt = require("../utils/getInsertAt");
var insertAt = getInsertAt();
styleLoaderOption.insertAt = insertAt;
}
var className = cssUnique ? "fz__[hash:base64:5]" : "[name]__[local]";
var fs = require("fs");
var appPath = fs.realpathSync(process.cwd());
var preact = process.env.npm_config_preact_switch || false;
var alias = {};
if (preact) {
alias.react = "preact-compat";
alias["react-dom"] = "preact-compat";
}
var isVendor = function isVendor(_ref) {
var userRequest = _ref.userRequest;
return userRequest && userRequest.indexOf("node_modules") >= 0 && userRequest.indexOf(".css") == -1 && userRequest.indexOf("publicPathConfig.js") == -1;
};
var isReact = function isReact(_ref) {
var userRequest = _ref.userRequest;
return userRequest && userRequest.indexOf("node_modules" + path.sep + "react") >= 0;
};
var result = cp.spawnSync("git", ["rev-parse", "HEAD"], { encoding: "utf8" });
var gitHash = result.stdout.replace(/(\r\n|\n|\r)/gm, "");
result = cp.spawnSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
encoding: "utf8"
});
var gitBranch = result.stdout.replace(/(\r\n|\n|\r)/gm, "");
result = cp.spawnSync("git", ["remote", "get-url", "origin"], {
encoding: "utf8"
});
var gitRepoUrl = result.stdout.replace(/(\r\n|\n|\r)/gm, "");
var entry = {
main: [require.resolve("../publicPathConfig.js") + "?jsSubdomain=" + jsSubdomain, path.join(appPath, appFolder, mig ? "migration.js" : "index.js")]
};
if (widgetEnable) {
entry.widget = [require.resolve("../publicPathConfig.js") + "?jsSubdomain=" + jsSubdomain, path.join(appPath, appFolder, "widget.js")];
}
module.exports = {
entry: entry,
devtool: enableSourceMap ? "hidden-source-map" : "none",
output: {
path: path.resolve(appPath, folder),
filename: hash ? "js/[name].[chunkhash:20].js" : "js/[name].js",
chunkFilename: hash ? "js/[name].[chunkhash:20].js" : "js/[name].js",
jsonpFunction: "jsonp" + context,
sourceMapFilename: "smap/[name].[chunkhash:20].map"
},
plugins: [new RuntimePublicPath({ runtimePublicPath: "publicPath(chunkId)" }), new CaseSensitivePathsPlugin(), new webpack.optimize.ModuleConcatenationPlugin(),
/*new i18nPlugin({
appPath: appPath,
context: context
}),*/
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), new webpack.optimize.CommonsChunkPlugin({
name: "vendor",
chunks: ["main"],
minChunks: isVendor
}), new webpack.optimize.CommonsChunkPlugin({
name: "react.vendor",
chunks: ["vendor"],
minChunks: isReact
}), new webpack.DefinePlugin({
__TEST__: false,
__DEVELOPMENT__: false,
__DOCS__: false,
"process.env": {
NODE_ENV: JSON.stringify("production")
},
__SERVER__: false
}),
// new WebpackMd5Hash(),
new ChunkManifestPlugin({
filename: "manifest.json",
manifestVariable: "webpackManifest" + context,
extra: {
repoInfo: {
repoUrl: gitRepoUrl || "",
branch: gitBranch || "",
hash: gitHash || ""
}
}
}), new webpack.optimize.UglifyJsPlugin({
compressor: {
warnings: false
},
sourceMap: enableSourceMap
})],
module: {
rules: [{
include: /\.json$/,
use: ["json-loader"]
}, {
test: /\.jsx|\.js$/,
use: [{
loader: "babel-loader",
options: {
presets: [[require.resolve("babel-preset-es2015"), { modules: false }], require.resolve("babel-preset-react")],
plugins: [require.resolve("../removeProperties"), [require.resolve("babel-plugin-transform-runtime"), {
helpers: true,
polyfill: true,
regenerator: false,
moduleName: "babel-runtime"
}]],
cacheDirectory: true
} /*,
{
loader: require.resolve('../i18nFilterLoader.js')
}*/
}],
include: path.join(appPath, appFolder)
}, {
test: /(\.module)?\.css$/,
use: [{
loader: "style-loader",
options: styleLoaderOption
}, {
loader: "css-loader",
options: {
modules: true,
localIdentName: className
}
}]
}, {
test: /\.jpe?g$|\.gif$|\.png$/,
use: [{
loader: "url-loader",
options: {
limit: 1000,
name: hash ? "./images/[name].[hash:20].[ext]" : "./images/[name].[ext]",
publicPath: function publicPath(url) {
return "staticDomain[" + JSON.stringify(imgSubdomain) + "] + " + JSON.stringify(url);
},
fallback: path.resolve(__dirname, "..", "fileLoader.js"),
publicPathStringify: false
}
}]
}, {
test: /\.woff2|\.woff$|\.ttf$|\.eot$/,
use: [{
loader: "url-loader",
options: {
limit: 1000,
name: hash ? "./fonts/[name].[hash:20].[ext]" : "./fonts/[name].[ext]",
publicPath: function publicPath(url) {
return "staticDomain[" + JSON.stringify(fontSubdomain) + "] + " + JSON.stringify(url);
},
fallback: path.resolve(__dirname, "..", "fileLoader.js"),
publicPathStringify: false
}
}]
}, {
test: /\.svg$/,
use: [{
loader: "url-loader",
options: {
limit: 1,
name: hash ? "./fonts/[name].[hash:20].[ext]" : "./fonts/[name].[ext]",
publicPath: function publicPath(url) {
return "staticDomain[" + JSON.stringify(fontSubdomain) + "] + " + JSON.stringify(url);
},
fallback: path.resolve(__dirname, "..", "fileLoader.js"),
publicPathStringify: false
}
}]
}]
},
externals: {
ZC: "$ZC"
},
resolve: {
alias: alias,
modules: [path.resolve(__dirname, "..", "..", "node_modules"), "node_modules"]
},
resolveLoader: {
modules: [path.resolve(__dirname, "..", "..", "node_modules"), "node_modules"]
}
};
/*
function RuntimePublicPath(options) {
this.options = options;
}
RuntimePublicPath.prototype.apply = function(compiler) {
var runtimePublicPathStr = this.options && this.options.runtimePublicPath;
if (!runtimePublicPathStr) {
console.error(
'RuntimePublicPath: no option.runtimePublicPath is specified. This plugin will do nothing.'
);
return;
}
compiler.plugin('this-compilation', function(compilation) {
compilation.mainTemplate.plugin('require-extensions', function(
source,
chunk,
hash
) {
console.log(this.requireFn);
var buf = [];
buf.push(source);
buf.push('');
buf.push('// Dynamic assets path override ');
buf.push('var e=' + this.requireFn + '.e;');
buf.push(
this.requireFn +
'.e = function requireEnsure(chunkId) {' +
runtimePublicPathStr +
';return e(chunkId);} '
);
return this.asString(buf);
});
});
};
new RuntimePublicPath({ runtimePublicPath: 'publicPath(chunkId)' })
*/