dehub
Version:
Data&Event MessageHub.
224 lines (223 loc) • 7.91 kB
JavaScript
;
/**
* DEHub类型定义模块
* 包含了DEHub系统中使用的所有类型定义、接口和工具函数
* @module DETypes
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataProxy = exports.rejectedCheck = exports.sleep = exports.getDiff = exports.clearNullNodes = exports.mergeObject = exports.TagsSerializer = exports.MAX_TAG_KEYS = exports.EventStage = exports.ObjectStatus = exports.EventNames = exports.Tag = void 0;
class Tag {
#tag;
#path;
#keys;
constructor(tag) {
this.#tag = tag;
this.#keys = Object.keys(tag);
this.#path = exports.TagsSerializer.toPath(tag);
}
get members() { return this.#tag; }
get path() { return this.#path; }
get keys() { return this.#keys; }
equal(others) {
const otherType = typeof others;
if (otherType === 'string')
return others === this.#path;
if (others instanceof Tag)
return others.path === this.#path;
if (Object.keys(others).length !== this.#keys.length)
return false;
for (const key of this.#keys) {
if (this.#tag[key] !== others[key])
return false;
}
return true;
}
toString() { return this.#path; }
}
exports.Tag = Tag;
var EventNames;
(function (EventNames) {
EventNames["ValueChanged"] = "$valueChanged";
EventNames["StatusChanging"] = "$statusChanged";
EventNames["Submit"] = "$submit";
EventNames["StateChanging"] = "$stateChanged";
EventNames["Mounting"] = "$mount";
EventNames["Registration"] = "$reg";
EventNames["WillUnmount"] = "$unmount";
EventNames["ComponentsLoaded"] = "$allCmpLoaded";
EventNames["Exception"] = "$error";
})(EventNames = exports.EventNames || (exports.EventNames = {}));
var ObjectStatus;
(function (ObjectStatus) {
ObjectStatus["New"] = "new";
ObjectStatus["Ready"] = "ready";
ObjectStatus["Loading"] = "loading";
ObjectStatus["Clear"] = "clear";
ObjectStatus["Reset"] = "reset";
ObjectStatus["Uploading"] = "uploading";
ObjectStatus["Deleting"] = "deleting";
ObjectStatus["Deleted"] = "deleted";
ObjectStatus["Failed"] = "failed";
ObjectStatus["Timeout"] = "Timeout";
})(ObjectStatus = exports.ObjectStatus || (exports.ObjectStatus = {}));
var EventStage;
(function (EventStage) {
EventStage["PreOperation"] = "pre";
EventStage["PostOperation"] = "post";
})(EventStage = exports.EventStage || (exports.EventStage = {}));
exports.MAX_TAG_KEYS = 10;
exports.TagsSerializer = {
toPath: (tag) => {
const sortedKeys = Object.keys(tag).sort();
let queryString = '';
for (const key of sortedKeys) {
if (tag[key] !== undefined) {
const value = tag[key] === null ? '' : tag[key];
queryString += `${key}=${value}&`;
}
}
return queryString.slice(0, -1);
},
selfAndChildTags: (baseTags) => {
const result = [];
const keys = Object.keys(baseTags.members);
const n = keys.length;
if (n > exports.MAX_TAG_KEYS) {
console.warn(`[DEHub] Tag has ${n} keys exceeding safe limit ${exports.MAX_TAG_KEYS}. Keys: ${keys.join(', ')}`);
}
for (let i = 1; i < (1 << n); i++) {
const gVal = {};
for (let j = 0; j < n; j++) {
if (i & (1 << j)) {
gVal[keys[j]] = baseTags.members[keys[j]];
}
}
result.push(exports.TagsSerializer.toPath(gVal));
}
return result;
},
fromPath: (path) => {
const obj = {};
const paramsArr = path.split('&');
for (const param of paramsArr) {
const [key, value] = param.split('=');
obj[key] = value;
}
return obj;
}
};
const mergeObject = (objA, objB, deep = false) => {
if (objA === null && objB === null)
return null;
if (objB === null)
return objB;
if (objA == null || objB == null)
return objB ?? objA ?? undefined;
if (typeof objA !== 'object' || typeof objB !== 'object')
return objA ?? objB;
let mergedObj = {};
const allKeys = Array.from(new Set(Object.keys(objA).concat(Object.keys(objB))));
if (allKeys.length > 0) {
for (const ak of allKeys) {
if (Array.isArray(objA[ak]) && !Array.isArray(objB[ak])) {
mergedObj[ak] = objA[ak];
}
else if (deep === true && !Array.isArray(objA[ak]) && !Array.isArray(objB[ak])
&& typeof objA[ak] === 'object' && typeof objB[ak] === 'object') {
mergedObj[ak] = (0, exports.mergeObject)(objA[ak], objB[ak], deep);
}
else {
mergedObj[ak] = objB[ak] === undefined ? objA[ak] : objB[ak];
}
}
}
else {
mergedObj = objB;
}
return mergedObj;
};
exports.mergeObject = mergeObject;
const clearNullNodes = (obj) => {
if (obj != null && typeof obj === 'object') {
const nullKeys = [];
for (const [okey, oval] of Object.entries(obj)) {
if (oval == null) {
nullKeys.push(okey);
}
else if (typeof oval === 'object') {
(0, exports.clearNullNodes)(oval);
}
}
for (const key of nullKeys) {
delete obj[key];
}
}
return obj;
};
exports.clearNullNodes = clearNullNodes;
const getDiff = (obj1, obj2) => {
const updated = {};
for (const key of Object.keys(obj1)) {
if (!obj2.hasOwnProperty(key)) {
updated[key] = obj1[key];
}
else {
const value1 = obj1[key];
const value2 = obj2[key];
if (typeof value1 === "object" && typeof value2 === "object"
&& !Array.isArray(value1) && !Array.isArray(value2)) {
const childDiff = (0, exports.getDiff)(value1, value2);
if (Object.keys(childDiff).length > 0) {
updated[key] = childDiff;
}
}
else if (value1 !== value2) {
updated[key] = value1;
}
}
}
for (const key of Object.keys(obj2)) {
if (!obj1.hasOwnProperty(key)) {
updated[key] = undefined;
}
}
return updated;
};
exports.getDiff = getDiff;
const sleep = (millisecond) => {
return new Promise((resolve) => {
setTimeout(() => resolve(), millisecond);
});
};
exports.sleep = sleep;
const rejectedCheck = (results) => {
const rejectedReasons = results
.filter((r) => r.status === 'rejected')
.map(r => r.reason);
if (rejectedReasons.length > 0) {
throw new AggregateError(rejectedReasons, `${rejectedReasons.length} promise(s) rejected`);
}
};
exports.rejectedCheck = rejectedCheck;
const DataProxy = (obj) => new Proxy(obj, {
get(target, property) {
const propertyStr = property.toString();
if (propertyStr in target) {
return target[propertyStr];
}
const mKey = Object.keys(target).find(key => key.toLowerCase() === propertyStr.toLowerCase());
return mKey ? target[mKey] : null;
},
set(target, property, value) {
const propertyStr = property.toString();
const mKey = Object.keys(target).find(key => key.toLowerCase() === propertyStr.toLowerCase());
if (mKey) {
target[mKey] = value;
}
else {
target[propertyStr] = value;
}
return true;
}
});
exports.DataProxy = DataProxy;