UNPKG

luhn-generator

Version:

A generator of numbers that passes the validation of Luhn algorithm or Luhn formula, also known as the 'modulus 10' or 'mod 10' algorithm

50 lines (42 loc) 1.86 kB
"use strict"; // this fixes a bug where converting let to var // doesn't change the binding's scope to function scope // https://github.com/babel/babel/issues/4818 module.exports = function (mangler) { mangler.program.traverse({ VariableDeclaration(path) { if (path.node.kind !== "var") { return; } const fnScope = path.scope.getFunctionParent() || path.scope.getProgramParent(); const bindingIds = path.getOuterBindingIdentifierPaths(); for (const name in bindingIds) { const binding = path.scope.getBinding(name); // var isn't hoisted to fnScope if (binding.scope !== fnScope) { const existingBinding = fnScope.bindings[name]; // make sure we are clear that the fnScope doesn't already have // an existing binding if (!existingBinding) { // move binding to the function scope // update our scopeTracker first before // we mutate the scope mangler.scopeTracker.moveBinding(binding, fnScope); fnScope.bindings[name] = binding; binding.scope = fnScope; delete binding.scope.bindings[name]; } else { // we need a new binding that's valid in both the scopes // binding.scope and fnScope const newName = fnScope.generateUid(binding.scope.generateUid(name)); // rename binding in the original scope mangler.rename(binding.scope, binding, name, newName); // move binding to fnScope as newName // update our scopeTracker first before // we mutate the scope mangler.scopeTracker.moveBinding(binding, fnScope); fnScope.bindings[newName] = binding; binding.scope = fnScope; delete binding.scope.bindings[newName]; } } } } }); };