builder-webpack4
Version:
116 lines (115 loc) • 4.46 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var fs_1 = __importDefault(require("fs"));
var path_1 = __importDefault(require("path"));
var loader_utils_1 = __importDefault(require("loader-utils"));
var BuilderType;
(function (BuilderType) {
BuilderType["dev"] = "dev";
BuilderType["build"] = "build";
})(BuilderType = exports.BuilderType || (exports.BuilderType = {}));
exports.deepCopy = function (source) {
var ret = {};
for (var k in source) {
ret[k] = typeof source[k] === 'object' ? exports.deepCopy(source[k]) : source[k];
}
return ret;
};
/**
* 列出某个目录下的子目录, DFS算法
* @param root 目录路径
* @param level 列出的子目录层级
* @param directories 默认为[]
* @returns {*|Array}
*/
exports.listDir = function (root, level, directories) {
directories = directories || [];
if (!fs_1.default.existsSync(root)) {
return directories;
}
if (fs_1.default.statSync(root).isDirectory() && level > 0) {
fs_1.default.readdirSync(root)
.forEach(function (name) {
var dirPath = path_1.default.join(root, name);
if (fs_1.default.statSync(dirPath).isDirectory()) {
directories.push({
name: name,
dirPath: dirPath
});
exports.listDir(dirPath, level - 1, directories);
}
});
}
return directories;
};
/**
* Merge 2个对象
* @param obj1 Object
* @param obj2 Object
*/
exports.merge = function (obj1, obj2) {
return Object.assign({}, obj1, obj2);
};
var hasOwnProperty = Object.prototype.hasOwnProperty;
exports.isEmpty = function (obj) {
if (obj == null)
return true;
if (obj.length > 0)
return false;
if (obj.length === 0)
return true;
if (typeof obj !== "object")
return true;
for (var key in obj) {
if (hasOwnProperty.call(obj, key))
return false;
}
return true;
};
/**
* 用于css-loader转换类名:
* 1.去除样式文件名的'.module'前缀;
* 2.遇到以'index.module.xxx'命名的样式文件使用文件夹名代替文件名来组成转换后的类名。
* 此方法基于'react-dev-utils/getCSSModuleLocalIdent',增加less正则匹配(https://www.npmjs.com/package/react-dev-utils)
* @param context webpack传给css-loader的context对象
* @param localIdentName css-loader的options.localIdentName,没传默认是'[hash:base64]',这里用不到
* @param localName 原始css类名
* @param options css-loader中三个配置项的组合,长这样:
{
regExp: options.localIdentRegExp,
hashPrefix: options.hashPrefix || '',
context: options.context,
}
*/
exports.getCSSModulesLocalIdent = function (context, localIdentName, localName, options) {
// Use the filename or folder name, based on some uses the index.js / index.module.(css|scss|sass) project style
var fileNameOrFolder = context.resourcePath.match(/index\.module\.(css|scss|sass|less)$/ // 此处增加less,其余和原函数一致
)
? '[folder]'
: '[name]';
// Create a hash based on a the file location and class name. Will be unique across a project, and close to globally unique.
var hash = loader_utils_1.default.getHashDigest(path_1.default.posix.relative(context.rootContext, context.resourcePath) + localName, 'md5', 'base64', 5);
// Use loaderUtils to find the file or folder name
var className = loader_utils_1.default.interpolateName(context, fileNameOrFolder + '_' + localName + '__' + hash, options);
// remove the .module that appears in every classname when based on the file.
return className.replace('.module_', '_');
};
/**
* 增加builder作为子进程时的通信能力
* 目前有四条指令,分别对应build和dev时构建成功和失败的场景
*
*/
exports.postMessage = {
send: function (channel, data) {
process && process.send && process.send(JSON.stringify({ type: channel, data: data }));
},
error: function (type, msg) {
this.send("feflow:builder:" + type + ":error", msg);
},
success: function (type, msg) {
this.send("feflow:builder:" + type + ":success", msg);
}
};