dts-element-fp
Version:
typescript definition generator for functional programming
160 lines (159 loc) • 8.52 kB
JavaScript
;
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
exports.__esModule = true;
var dts = require("dts-element");
var R = require("ramda");
var create_curried_types_1 = require("./create-curried-types");
var constants_1 = require("./utils/constants");
var create_masks_1 = require("./utils/create-masks");
var create_selectable_signatures_1 = require("./utils/create-selectable-signatures");
var has_same_parameter_1 = require("./utils/has-same-parameter");
/**
* @hidden
*/
function create_various_curried_types(name, types, options) {
if (options === void 0) { options = {}; }
// istanbul ignore next
var _a = options.selectable, selectable = _a === void 0 ? constants_1.selectable_default : _a, _b = options.get_placeholder_type, get_placeholder_type = _b === void 0 ? constants_1.get_placeholder_type_default : _b, get_selectable_kind_name = options.get_selectable_kind_name, get_selectable_selector_name = options.get_selectable_selector_name, hoist_name = options.hoist_name;
var is_placeholder = function (value) {
return dts.is_general_type(value) && value.name === get_placeholder_type();
};
var keys = Object.keys(types);
var parameters_length = keys.reduce(function (length, key) {
return length === -1 || length === types[key].parameters.length
? types[key].parameters.length
: (function () {
throw new Error("curried function types must be the same length");
})();
}, -1);
var curried_types_declarations = keys.reduce(function (reduced, key) { return reduced.concat([
create_curried_types_1.create_curried_types(name + "_" + key, types[key], __assign({}, options, { selectable: false })),
]); }, []);
var hoist_types_index = hoist_name === undefined ? -1 : keys.indexOf(hoist_name);
var hoist_type_members = hoist_types_index !== -1 &&
curried_types_declarations[hoist_types_index].reduce(function (a, b) { return a.concat(b.type.members); }, []);
var masks = create_masks_1.create_masks(parameters_length);
var function_types = keys.reduce(function (reduced, key) { return reduced.concat([types[key]]); }, []);
var non_conflicts = R.repeat(0, parameters_length).map(function (_, index) {
var main_function_type = function_types[0];
return function_types
.slice(1)
.every(function (current_function_type) {
return has_same_parameter_1.has_same_parameter(main_function_type, current_function_type, index);
});
});
var conflict_declarations = [];
var conflict_declarations_selectables = [];
var non_conflict_rebases = {};
var non_conflict_declarations = [];
var non_conflict_declarations_selectables = [];
curried_types_declarations[0].forEach(function (curried_type_declaration, index) {
var is_return_signature = index === curried_types_declarations[0].length - 1;
var mask = masks[index];
if (!is_return_signature &&
mask
.split('')
.every(function (bit, bit_index) { return bit === '0' || non_conflicts[bit_index]; })) {
var rebase_name_1 = name + "_" + mask;
non_conflict_declarations.push(dts.create_type_declaration({
name: rebase_name_1,
generics: curried_type_declaration.generics,
type: dts.create_object_type({
members: curried_types_declarations
.map(function (curried_types_declaration) {
return curried_types_declaration[index].type
.members;
})
.reduce(function (a, b) { return a.concat(b); }, [])
})
}));
non_conflict_declarations_selectables.push(curried_types_declarations
.map(function (curried_types_declaration, type_index) {
return create_selectable_signatures_1.create_selectable_signatures(curried_types_declaration[index].type
.members, {
group: keys[type_index],
is_placeholder: is_placeholder,
get_selectable_kind_name: get_selectable_kind_name,
get_selectable_selector_name: get_selectable_selector_name
});
})
.reduce(function (a, b) { return a.concat(b); }, []));
curried_types_declarations
.map(function (x) { return x[index]; })
.forEach(function (type_declaration) {
non_conflict_rebases[type_declaration.name] = rebase_name_1;
});
}
else {
conflict_declarations.push(curried_types_declarations.map(function (curried_type_declarations) { return curried_type_declarations[index]; }));
conflict_declarations_selectables.push(curried_types_declarations.map(function (curried_type_declarations) {
var members = curried_type_declarations[index]
.type.members;
return members !== undefined && members.every(dts.is_object_member)
? create_selectable_signatures_1.create_selectable_signatures(members, {
get_selectable_kind_name: get_selectable_kind_name,
get_selectable_selector_name: get_selectable_selector_name,
is_placeholder: is_placeholder
})
: [];
}));
}
});
var mixed_type_declarations_selectables = non_conflict_declarations_selectables.concat(conflict_declarations_selectables.reduce(function (a, b) { return a.concat(b); }, []));
return non_conflict_declarations.concat(conflict_declarations.reduce(function (a, b) { return a.concat(b); }, [])).map(function (type_declaration, index) {
var object_type = type_declaration.type;
if (!dts.is_object_type(object_type) ||
object_type.members.some(function (member) { return !dts.is_object_member(member); })) {
return type_declaration;
}
var repeated_function_types = {};
var members = [];
object_type.members.forEach(function (member, member_index, origin_members) {
var function_type = member.owned.type;
var function_return_type = function_type["return"];
if (function_return_type.name in non_conflict_rebases) {
repeated_function_types[non_conflict_rebases[function_return_type.name]] = function_type;
}
else {
members.push.apply(members, (index >= non_conflict_declarations.length ||
!hoist_type_members ||
hoist_type_members.indexOf(member) !== -1
? [member]
: []).concat((selectable && origin_members.length > 1
? [mixed_type_declarations_selectables[index][member_index]]
: [])));
}
});
var non_conflict_merged_members = Object.keys(repeated_function_types).map(function (key) {
var function_type = repeated_function_types[key];
var function_return_type = function_type["return"];
return dts.create_object_member({
owned: dts.create_function_declaration({
name: undefined,
type: __assign({}, function_type, { "return": dts.create_general_type({
name: key,
generics: function_return_type.generics
}) })
})
});
});
members.push.apply(members, non_conflict_merged_members);
if (selectable) {
members.push.apply(members, create_selectable_signatures_1.create_selectable_signatures(non_conflict_merged_members, {
is_placeholder: is_placeholder,
get_selectable_kind_name: get_selectable_kind_name,
get_selectable_selector_name: get_selectable_selector_name
}));
}
object_type.members = members;
return type_declaration;
});
}
exports.create_various_curried_types = create_various_curried_types;