@iot-studio/material-toolkit-utils
Version:
material 工具链相关工具
129 lines (128 loc) • 4.46 kB
JavaScript
;
/**
* 处理包依赖关系,应用于编译时和运行时
*/
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.lib = exports.getCDN = exports.externals = void 0;
var path_1 = __importDefault(require("path"));
var deps_json_1 = __importDefault(require("./external_config/deps.json"));
var libNames_json_1 = __importDefault(require("./external_config/libNames.json"));
var hash = {};
libNames_json_1.default.forEach(function (fileName) {
var item = require("./external_config/libs/" + fileName);
hash[fileName.replace(/\.json$/, "")] = item;
});
function findClosestModVersion(modName, context) {
var dirs = context.split('/');
var version;
while (true && dirs.length > 0) {
var packageJsonPath = path_1.default.resolve.apply(path_1.default, __spreadArray(__spreadArray([], dirs, false), ['node_modules', modName, 'package.json'], false));
try {
var packageJson = require(packageJsonPath);
version = packageJson.version;
break;
}
catch (e) {
// 找上一级目录
dirs.pop();
}
}
if (!version) {
return null;
}
var versions = version.split('.');
if (+versions[0] > 0) {
return versions[0];
}
return '0.' + versions[1];
}
function externals(onExternal, omit, exception, onTrans) {
if (omit === void 0) { omit = []; }
if (exception === void 0) { exception = []; }
var externals = {};
var modHash = {};
Object.keys(hash).forEach(function (modName) {
var map = hash[modName];
var version = modName.split('@')[1];
Object.keys(map).forEach(function (pathName) {
var pathNameWithVersion = pathName + '@' + version;
modHash[pathNameWithVersion] = modName;
modHash[pathName] = modName;
externals[pathNameWithVersion] = map[pathName];
externals[pathName] = map[pathName];
});
});
var externalMods = {};
return function (context, request, callback) {
var version = findClosestModVersion(request, context);
var requestKey = version ? request + '@' + version : request;
if (externals[requestKey] && exception.indexOf(modHash[request]) === -1) {
onTrans && onTrans(modHash[requestKey]);
if (omit.indexOf(request) === -1) {
if (!externalMods[modHash[requestKey]]) {
externalMods[modHash[requestKey]] = true;
onExternal && onExternal(modHash[requestKey]);
}
return callback(null, externals[requestKey]);
}
}
callback();
};
}
exports.externals = externals;
function dependencies(packageName) {
return deps_json_1.default[packageName] || [];
}
function getCDN(packages) {
var hasRun = {};
var result = [];
packages.forEach(function dep(pkg) {
if (hasRun[pkg]) {
return;
}
result.push(pkg);
hasRun[pkg] = true;
(deps_json_1.default[pkg] || []).forEach(function (item) {
var itemIndex = result.indexOf(item);
var currentIndex = result.indexOf(pkg);
if (itemIndex !== -1) {
if (itemIndex < currentIndex) {
dep(item);
return;
}
result.splice(itemIndex, 1);
}
result.splice(currentIndex, 0, item);
dep(item);
});
});
return result.map(function (item) {
return item + '.js';
});
}
exports.getCDN = getCDN;
function lib() {
var externals = {};
[].forEach.call(arguments, function (name) {
if (hash[name]) {
Object.assign(externals, hash[name]);
}
else {
console.log(name + "不是CDN上的公共包");
}
});
return externals;
}
exports.lib = lib;