devebot
Version:
Nodejs Microservice Framework
241 lines (240 loc) • 8.96 kB
JavaScript
;
const util = require("util");
const lodash = require("lodash");
const LoggingWrapper = require("./logging-wrapper");
const chores = require("../utils/chores");
const constx = require("../utils/constx");
const nodash = require("../utils/nodash");
const blockRef = chores.getBlockRef(__filename);
const _isUpgradeSupported = chores.isUpgradeSupported.bind(chores);
const FRAMEWORK_NAMESPACE = constx.FRAMEWORK.NAMESPACE;
const FRAMEWORK_PACKAGE_NAME = constx.FRAMEWORK.PACKAGE_NAME;
const FRAMEWORK_BRIDGE_LABEL = "bridge";
const FRAMEWORK_PLUGIN_LABEL = "plugin";
function NameResolver(params = {}) {
const {
issueInspector,
bridgeList,
pluginList
} = params;
const loggingWrapper = new LoggingWrapper(blockRef);
const L = loggingWrapper.getLogger();
const T = loggingWrapper.getTracer();
const CTX = {
L,
T,
issueInspector
};
L && L.has("silly") && L.log("silly", T && T.toMessage({
tags: [blockRef, "constructor-begin"],
text: " + constructor start ..."
}));
const absoluteAliasMap = {};
const relativeAliasMap = {};
function _getAbsoluteAliasMap() {
absoluteAliasMap.plugin = absoluteAliasMap.plugin || buildAbsoluteAliasMap(pluginList);
absoluteAliasMap.bridge = absoluteAliasMap.bridge || buildAbsoluteAliasMap(bridgeList);
return absoluteAliasMap;
}
function _getRelativeAliasMap() {
relativeAliasMap.plugin = relativeAliasMap.plugin || buildRelativeAliasMap(pluginList);
relativeAliasMap.bridge = relativeAliasMap.bridge || buildRelativeAliasMap(bridgeList);
return relativeAliasMap;
}
function _getOriginalNameOf(crateName, crateType) {
switch (crateType) {
case "application":
{
crateName = crateType;
break;
}
case FRAMEWORK_PLUGIN_LABEL:
case FRAMEWORK_BRIDGE_LABEL:
{
const absoluteAlias = _getAbsoluteAliasMap();
crateName = absoluteAlias[crateType][crateName] || crateName;
break;
}
}
return crateName;
}
function _getDefaultAliasOf(crateName, crateType) {
switch (crateType) {
case "application":
{
crateName = crateType;
break;
}
case FRAMEWORK_PLUGIN_LABEL:
case FRAMEWORK_BRIDGE_LABEL:
{
crateName = _getOriginalNameOf(crateName, crateType);
const relativeAlias = _getRelativeAliasMap();
crateName = relativeAlias[crateType][crateName] || crateName;
break;
}
}
return crateName;
}
this.getOriginalNameOf = _getOriginalNameOf;
this.getDefaultAliasOf = _getDefaultAliasOf;
if (!_isUpgradeSupported("simplify-name-resolver")) {
this.getAbsoluteAliasMap = _getAbsoluteAliasMap;
this.getRelativeAliasMap = _getRelativeAliasMap;
}
if (!_isUpgradeSupported("refining-name-resolver")) {
this.getAliasBy = function (selectedField, crateDescriptor) {
crateDescriptor = crateDescriptor || {};
if (crateDescriptor.type === "application") {
return crateDescriptor.type;
}
if (crateDescriptor.type in LIB_NAME_PATTERNS) {
if (!hasSupportFields(crateDescriptor)) {
extractAliasNames(CTX, crateDescriptor.type, [crateDescriptor]);
}
}
return crateDescriptor[selectedField];
};
this.getOriginalName = this.getAliasBy.bind(this, "name");
this.getDefaultAlias = this.getAliasBy.bind(this, "codeInCamel");
}
extractAliasNames(CTX, FRAMEWORK_PLUGIN_LABEL, pluginList);
extractAliasNames(CTX, FRAMEWORK_BRIDGE_LABEL, bridgeList);
L && L.has("silly") && L.log("silly", T && T.toMessage({
tags: [blockRef, "constructor-end"],
text: " - constructor has finished"
}));
}
NameResolver.argumentSchema = {
"$id": "nameResolver",
"type": "object",
"properties": {
"issueInspector": {
"type": "object"
},
"pluginList": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"formers": {
"type": "array",
"items": {
"type": "string"
}
},
"path": {
"type": "string"
}
},
"required": ["name"]
}
},
"bridgeList": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"formers": {
"type": "array",
"items": {
"type": "string"
}
},
"path": {
"type": "string"
}
},
"required": ["name"]
}
}
}
};
module.exports = NameResolver;
const LIB_NAME_PATTERNS = {
bridge: [new RegExp(util.format("^%s-(%s-[a-z][a-z0-9-]*[a-z0-9])$", FRAMEWORK_NAMESPACE, constx.BUILTIN.BRIDGE.LONG_PREFIX), "g"), new RegExp(util.format("^@%s/(%s-[a-z][a-z0-9-]*[a-z0-9])$", FRAMEWORK_NAMESPACE, constx.BUILTIN.BRIDGE.LONG_PREFIX), "g"), new RegExp(util.format("^%s-%s-([a-z][a-z0-9-]*[a-z0-9])$", FRAMEWORK_NAMESPACE, constx.BUILTIN.BRIDGE.PREFIX), "g"), new RegExp(util.format("^@%s/%s-([a-z][a-z0-9-]*[a-z0-9])$", FRAMEWORK_NAMESPACE, constx.BUILTIN.BRIDGE.PREFIX), "g"), new RegExp(util.format("^%s-%s-([a-z][a-z0-9-]*[a-z0-9])$", FRAMEWORK_NAMESPACE, constx.BUILTIN.BRIDGE.ALIAS), "g"), new RegExp(util.format("^@%s/%s-([a-z][a-z0-9-]*[a-z0-9])$", FRAMEWORK_NAMESPACE, constx.BUILTIN.BRIDGE.ALIAS), "g"), /^([a-z][a-z0-9-]*[a-z0-9])$/g],
plugin: [new RegExp(util.format("^%s-(%s-[a-z][a-z0-9-]*[a-z0-9])$", FRAMEWORK_NAMESPACE, constx.BUILTIN.PLUGIN.LONG_PREFIX), "g"), new RegExp(util.format("^@%s/(%s-[a-z][a-z0-9-]*[a-z0-9])$", FRAMEWORK_NAMESPACE, constx.BUILTIN.PLUGIN.LONG_PREFIX), "g"), new RegExp(util.format("^%s-%s-([a-z][a-z0-9-]*[a-z0-9])$", FRAMEWORK_NAMESPACE, constx.BUILTIN.PLUGIN.PREFIX), "g"), new RegExp(util.format("^@%s/%s-([a-z][a-z0-9-]*[a-z0-9])$", FRAMEWORK_NAMESPACE, constx.BUILTIN.PLUGIN.PREFIX), "g"), /^([a-z][a-z0-9-]*[a-z0-9])$/g]
};
function hasSupportFields(moduleRef) {
return nodash.isString(moduleRef.code) && nodash.isString(moduleRef.codeInCamel) && nodash.isString(moduleRef.name) && nodash.isString(moduleRef.nameInCamel);
}
function extractAliasNames(ctx, type, moduleRefs) {
const {
issueInspector
} = ctx || this || {};
function buildSupportFields(moduleRef) {
if (moduleRef.name == FRAMEWORK_PACKAGE_NAME) {
moduleRef.code = FRAMEWORK_NAMESPACE;
moduleRef.codeInCamel = chores.stringCamelCase(moduleRef.code);
moduleRef.nameInCamel = chores.stringCamelCase(moduleRef.name);
return moduleRef;
}
const info = chores.extractCodeByPattern(LIB_NAME_PATTERNS[type], moduleRef.name);
if (info.i >= 0) {
moduleRef.code = info.code;
moduleRef.codeInCamel = chores.stringCamelCase(moduleRef.code);
if (moduleRef.name == moduleRef.code) {
moduleRef.nameInCamel = moduleRef.codeInCamel;
} else {
moduleRef.nameInCamel = chores.stringCamelCase(moduleRef.name);
}
if (moduleRef && lodash.isArray(moduleRef.formers)) {
moduleRef.formerInCamels = moduleRef.formerInCamels || {};
for (let formerName of moduleRef.formers) {
moduleRef.formerInCamels[formerName] = chores.stringCamelCase(formerName);
}
}
} else {
issueInspector.collect(lodash.assign({
stage: "naming",
type: type,
hasError: true,
stack: LIB_NAME_PATTERNS[type].toString()
}, moduleRef));
}
}
if (lodash.isArray(moduleRefs)) {
lodash.forEach(moduleRefs, buildSupportFields);
} else if (lodash.isObject(moduleRefs)) {
lodash.forOwn(moduleRefs, buildSupportFields);
}
return moduleRefs;
}
function buildAbsoluteAliasMap(moduleRefs, aliasMap) {
aliasMap = aliasMap || {};
lodash.forEach(moduleRefs, function (moduleRef) {
aliasMap[moduleRef.name] = moduleRef.name;
aliasMap[moduleRef.nameInCamel] = moduleRef.name;
aliasMap[moduleRef.code] = aliasMap[moduleRef.code] || moduleRef.name;
aliasMap[moduleRef.codeInCamel] = aliasMap[moduleRef.codeInCamel] || moduleRef.name;
});
//
lodash.forEach(moduleRefs, function (moduleRef) {
if (moduleRef && lodash.isPlainObject(moduleRef.formerInCamels)) {
for (let formerName in moduleRef.formerInCamels) {
const formerInCamel = moduleRef.formerInCamels[formerName];
if (!(formerName in aliasMap)) {
aliasMap[formerName] = moduleRef.name;
}
if (formerInCamel != formerName && !(formerInCamel in aliasMap)) {
aliasMap[formerInCamel] = moduleRef.name;
}
}
}
});
//
return aliasMap;
}
function buildRelativeAliasMap(moduleRefs, aliasMap) {
aliasMap = aliasMap || {};
lodash.forEach(moduleRefs, function (moduleRef) {
aliasMap[moduleRef.name] = moduleRef.codeInCamel;
});
return aliasMap;
}