"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildScopeIIFE = buildScopeIIFE; exports.collectShadowedParamsNames = collectShadowedParamsNames; exports.iifeVisitor = void 0; var _core = require("@babel/core"); 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() }; exports.iifeVisitor = iifeVisitor; function collectShadowedParamsNames(param, functionScope, shadowedParams) { for (const name of Object.keys(param.getBindingIdentifiers())) { var _functionScope$bindin; const constantViolations = (_functionScope$bindin = functionScope.bindings[name]) == null ? void 0 : _functionScope$bindin.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; } } } } } 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)); }