| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 | "use strict";Object.defineProperty(exports, "__esModule", {  value: true});exports.default = convertFunctionParams;var _core = require("@babel/core");const buildDefaultParam = (0, _core.template)(`  let VARIABLE_NAME =    arguments.length > ARGUMENT_KEY && arguments[ARGUMENT_KEY] !== undefined ?      arguments[ARGUMENT_KEY]    :      DEFAULT_VALUE;`);const buildLooseDefaultParam = (0, _core.template)(`  if (ASSIGNMENT_IDENTIFIER === UNDEFINED) {    ASSIGNMENT_IDENTIFIER = DEFAULT_VALUE;  }`);const buildLooseDestructuredDefaultParam = (0, _core.template)(`  let ASSIGNMENT_IDENTIFIER = PARAMETER_NAME === UNDEFINED ? DEFAULT_VALUE : PARAMETER_NAME ;`);const buildSafeArgumentsAccess = (0, _core.template)(`  let $0 = arguments.length > $1 ? arguments[$1] : undefined;`);const iifeVisitor = {  "ReferencedIdentifier|BindingIdentifier"(path, state) {    const {      scope,      node    } = path;    const {      name    } = node;    if (name === "eval" || scope.getBinding(name) === state.scope.parent.getBinding(name) && state.scope.hasOwnBinding(name)) {      state.needsOuterBinding = true;      path.stop();    }  },  "TypeAnnotation|TSTypeAnnotation|TypeParameterDeclaration|TSTypeParameterDeclaration": path => path.skip()};function convertFunctionParams(path, ignoreFunctionLength, shouldTransformParam, replaceRestElement) {  const params = path.get("params");  const isSimpleParameterList = params.every(param => param.isIdentifier());  if (isSimpleParameterList) return false;  const {    node,    scope  } = path;  const state = {    stop: false,    needsOuterBinding: false,    scope  };  const body = [];  const shadowedParams = new Set();  for (const param of params) {    for (const name of Object.keys(param.getBindingIdentifiers())) {      var _scope$bindings$name;      const constantViolations = (_scope$bindings$name = scope.bindings[name]) == null ? void 0 : _scope$bindings$name.constantViolations;      if (constantViolations) {        for (const redeclarator of constantViolations) {          const node = redeclarator.node;          switch (node.type) {            case "VariableDeclarator":              {                if (node.init === null) {                  const declaration = redeclarator.parentPath;                  if (!declaration.parentPath.isFor() || declaration.parentPath.get("body") === declaration) {                    redeclarator.remove();                    break;                  }                }                shadowedParams.add(name);                break;              }            case "FunctionDeclaration":              shadowedParams.add(name);              break;          }        }      }    }  }  if (shadowedParams.size === 0) {    for (const param of params) {      if (!param.isIdentifier()) param.traverse(iifeVisitor, state);      if (state.needsOuterBinding) break;    }  }  let firstOptionalIndex = null;  for (let i = 0; i < params.length; i++) {    const param = params[i];    if (shouldTransformParam && !shouldTransformParam(i)) {      continue;    }    const transformedRestNodes = [];    if (replaceRestElement) {      replaceRestElement(param.parentPath, param, transformedRestNodes);    }    const paramIsAssignmentPattern = param.isAssignmentPattern();    if (paramIsAssignmentPattern && (ignoreFunctionLength || node.kind === "set")) {      const left = param.get("left");      const right = param.get("right");      const undefinedNode = scope.buildUndefinedNode();      if (left.isIdentifier()) {        body.push(buildLooseDefaultParam({          ASSIGNMENT_IDENTIFIER: _core.types.cloneNode(left.node),          DEFAULT_VALUE: right.node,          UNDEFINED: undefinedNode        }));        param.replaceWith(left.node);      } else if (left.isObjectPattern() || left.isArrayPattern()) {        const paramName = scope.generateUidIdentifier();        body.push(buildLooseDestructuredDefaultParam({          ASSIGNMENT_IDENTIFIER: left.node,          DEFAULT_VALUE: right.node,          PARAMETER_NAME: _core.types.cloneNode(paramName),          UNDEFINED: undefinedNode        }));        param.replaceWith(paramName);      }    } else if (paramIsAssignmentPattern) {      if (firstOptionalIndex === null) firstOptionalIndex = i;      const left = param.get("left");      const right = param.get("right");      const defNode = buildDefaultParam({        VARIABLE_NAME: left.node,        DEFAULT_VALUE: right.node,        ARGUMENT_KEY: _core.types.numericLiteral(i)      });      body.push(defNode);    } else if (firstOptionalIndex !== null) {      const defNode = buildSafeArgumentsAccess([param.node, _core.types.numericLiteral(i)]);      body.push(defNode);    } else if (param.isObjectPattern() || param.isArrayPattern()) {      const uid = path.scope.generateUidIdentifier("ref");      const defNode = _core.types.variableDeclaration("let", [_core.types.variableDeclarator(param.node, uid)]);      body.push(defNode);      param.replaceWith(_core.types.cloneNode(uid));    }    if (transformedRestNodes) {      for (const transformedNode of transformedRestNodes) {        body.push(transformedNode);      }    }  }  if (firstOptionalIndex !== null) {    node.params = node.params.slice(0, firstOptionalIndex);  }  path.ensureBlock();  if (state.needsOuterBinding || shadowedParams.size > 0) {    body.push(buildScopeIIFE(shadowedParams, path.get("body").node));    path.set("body", _core.types.blockStatement(body));    const bodyPath = path.get("body.body");    const arrowPath = bodyPath[bodyPath.length - 1].get("argument.callee");    arrowPath.arrowFunctionToExpression();    arrowPath.node.generator = path.node.generator;    arrowPath.node.async = path.node.async;    path.node.generator = false;  } else {    path.get("body").unshiftContainer("body", body);  }  return true;}function buildScopeIIFE(shadowedParams, body) {  const args = [];  const params = [];  for (const name of shadowedParams) {    args.push(_core.types.identifier(name));    params.push(_core.types.identifier(name));  }  return _core.types.returnStatement(_core.types.callExpression(_core.types.arrowFunctionExpression(params, body), args));}
 |