UNPKG

dts-element-fp

Version:

typescript definition generator for functional programming

160 lines (159 loc) 8.52 kB
"use strict"; 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;