'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var _typeof = require('@babel/runtime/helpers/typeof');

function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

var _typeof__default = /*#__PURE__*/_interopDefaultLegacy(_typeof);

/**
 * 高度可配置的参数获取函数。
 * 它根据提供的参数名列表，智能地将分散参数或对象参数转换为一个标准化的对象。
 *
 * @template T - 期望返回的对象类型。
 * @param {string[]} paramNames - 参数名列表，用于映射分散的参数。
 * @param {any[]} args - 原始的函数参数 `arguments`。
 * @returns {T} - 一个标准化的对象。
 * @example
 * ```ts
 * // 1. 分散参数：按 paramNames 顺序映射
 * function foo(a: string, b: number, c: boolean) {
 *   return getParameters<{ a: string; b: number; c: boolean }>(
 *     ['a', 'b', 'c'],
 *     // eslint-disable-next-line prefer-rest-params
 *     [...arguments],
 *   );
 * }
 * foo('x', 1, true); // { a: 'x', b: 1, c: true }
 *
 * // 2. 对象参数：原样返回
 * function bar(opts: { a: string; b: number }) {
 *   return getParameters<{ a: string; b: number }>(
 *     ['a', 'b'],
 *     // eslint-disable-next-line prefer-rest-params
 *     [...arguments],
 *   );
 * }
 * bar({ a: 'x', b: 1 }); // { a: 'x', b: 1 }
 * ```
 */
function getParameters(paramNames) {
  var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  // 规则1: 如果只传入了一个参数，并且这个参数是一个对象（非 null/数组），
  // 则认为它是一个完整的参数对象，直接返回。
  if (args.length === 1 && _typeof__default["default"](args[0]) === 'object' && args[0] !== null && !Array.isArray(args[0])) {
    return args[0];
  }
  // 规则2: 否则，认为传入的是分散的参数。
  // 使用 `paramNames` 列表将 `args` 数组映射成一个新对象。
  var result = {};
  paramNames.forEach(function (name, index) {
    // 将 args 中对应位置的值赋给新对象的同名属性
    result[name] = args[index];
  });
  return result;
}

exports.getParameters = getParameters;
