ts-flex-query
Version:
Flexible and type-safe data queries
89 lines • 3.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataTypeType = void 0;
exports.isExpansionDataType = isExpansionDataType;
exports.createUnion = createUnion;
const lodash_1 = require("lodash");
var DataTypeType;
(function (DataTypeType) {
DataTypeType["object"] = "object";
DataTypeType["array"] = "array";
DataTypeType["string"] = "string";
DataTypeType["number"] = "number";
DataTypeType["bigint"] = "bigint";
DataTypeType["boolean"] = "boolean";
DataTypeType["undefined"] = "undefined";
DataTypeType["null"] = "null";
DataTypeType["union"] = "union";
DataTypeType["unknown"] = "unknown";
// Partially known types:
DataTypeType["unknownPrimitive"] = "unknownPrimitive";
DataTypeType["unknownObject"] = "unknownObject";
DataTypeType["unknownArray"] = "unknownArray";
})(DataTypeType || (exports.DataTypeType = DataTypeType = {}));
function isExpansionDataType(dataType) {
return dataType.type === DataTypeType.object
|| dataType.type === DataTypeType.array
|| dataType.type === DataTypeType.unknownObject
|| dataType.type === DataTypeType.unknownArray
|| (dataType.type === DataTypeType.union && dataType.types.every(isExpansionDataType));
}
function createUnion(type1, type2) {
function checkSymmetrically(check) {
var _a;
return (_a = check(type1, type2)) !== null && _a !== void 0 ? _a : check(type2, type1);
}
if ((0, lodash_1.isEqual)(type1, type2)) {
return type1;
}
const specificResult = checkSymmetrically((t1, t2) => {
switch (t1.type) {
case DataTypeType.array:
switch (t2.type) {
case DataTypeType.null:
case DataTypeType.undefined:
return t1; // Arrays are nullable.
case DataTypeType.unknownArray:
return t2;
}
break;
case DataTypeType.object:
switch (t2.type) {
case DataTypeType.null:
case DataTypeType.undefined:
return t1; // Objects are nullable.
case DataTypeType.unknownObject:
return t2;
}
break;
case DataTypeType.bigint:
case DataTypeType.boolean:
case DataTypeType.number:
case DataTypeType.string:
if (t2.type === DataTypeType.unknownPrimitive) {
return t2;
}
break;
case DataTypeType.union: {
if (t2.type === DataTypeType.union) {
return t2.types.reduce((acc, t) => createUnion(acc, t), t1);
}
const mergableType = t1.types
.map((t, index) => ({ union: createUnion(t, t2), index }))
.filter(({ union }) => union.type !== DataTypeType.union)[0];
if (mergableType) {
return {
type: DataTypeType.union,
types: t1.types.map((t, i) => i === mergableType.index ? mergableType.union : t)
};
}
break;
}
case DataTypeType.unknown:
return t1;
}
return undefined;
});
return specificResult !== null && specificResult !== void 0 ? specificResult : { type: DataTypeType.union, types: [type1, type2] };
}
//# sourceMappingURL=data-type.js.map