UNPKG

ts-flex-query

Version:
89 lines 3.61 kB
"use strict"; 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