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

395 lines (314 loc) 15 kB
"use strict"; exports.__esModule = true; var _create = require("babel-runtime/core-js/object/create"); var _create2 = _interopRequireDefault(_create); var _getIterator2 = require("babel-runtime/core-js/get-iterator"); var _getIterator3 = _interopRequireDefault(_getIterator2); var _symbol = require("babel-runtime/core-js/symbol"); var _symbol2 = _interopRequireDefault(_symbol); exports.default = function (_ref) { var t = _ref.types; var IGNORE_REASSIGNMENT_SYMBOL = (0, _symbol2.default)(); var reassignmentVisitor = { "AssignmentExpression|UpdateExpression": function AssignmentExpressionUpdateExpression(path) { if (path.node[IGNORE_REASSIGNMENT_SYMBOL]) return; path.node[IGNORE_REASSIGNMENT_SYMBOL] = true; var arg = path.get(path.isAssignmentExpression() ? "left" : "argument"); if (!arg.isIdentifier()) return; var name = arg.node.name; if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return; var exportedNames = this.exports[name]; if (!exportedNames) return; var node = path.node; var isPostUpdateExpression = path.isUpdateExpression() && !node.prefix; if (isPostUpdateExpression) { if (node.operator === "++") node = t.binaryExpression("+", node.argument, t.numericLiteral(1));else if (node.operator === "--") node = t.binaryExpression("-", node.argument, t.numericLiteral(1));else isPostUpdateExpression = false; } for (var _iterator = exportedNames, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) { var _ref2; if (_isArray) { if (_i >= _iterator.length) break; _ref2 = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref2 = _i.value; } var exportedName = _ref2; node = this.buildCall(exportedName, node).expression; } if (isPostUpdateExpression) node = t.sequenceExpression([node, path.node]); path.replaceWith(node); } }; return { visitor: { CallExpression: function CallExpression(path, state) { if (path.node.callee.type === TYPE_IMPORT) { var contextIdent = state.contextIdent; path.replaceWith(t.callExpression(t.memberExpression(contextIdent, t.identifier("import")), path.node.arguments)); } }, ReferencedIdentifier: function ReferencedIdentifier(path, state) { if (path.node.name == "__moduleName" && !path.scope.hasBinding("__moduleName")) { path.replaceWith(t.memberExpression(state.contextIdent, t.identifier("id"))); } }, Program: { enter: function enter(path, state) { state.contextIdent = path.scope.generateUidIdentifier("context"); }, exit: function exit(path, state) { var exportIdent = path.scope.generateUidIdentifier("export"); var contextIdent = state.contextIdent; var exportNames = (0, _create2.default)(null); var modules = []; var beforeBody = []; var setters = []; var sources = []; var variableIds = []; var removedPaths = []; function addExportName(key, val) { exportNames[key] = exportNames[key] || []; exportNames[key].push(val); } function pushModule(source, key, specifiers) { var module = void 0; modules.forEach(function (m) { if (m.key === source) { module = m; } }); if (!module) { modules.push(module = { key: source, imports: [], exports: [] }); } module[key] = module[key].concat(specifiers); } function buildExportCall(name, val) { return t.expressionStatement(t.callExpression(exportIdent, [t.stringLiteral(name), val])); } var body = path.get("body"); var canHoist = true; for (var _iterator2 = body, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) { var _ref3; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref3 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref3 = _i2.value; } var _path = _ref3; if (_path.isExportDeclaration()) _path = _path.get("declaration"); if (_path.isVariableDeclaration() && _path.node.kind !== "var") { canHoist = false; break; } } for (var _iterator3 = body, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) { var _ref4; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref4 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref4 = _i3.value; } var _path2 = _ref4; if (canHoist && _path2.isFunctionDeclaration()) { beforeBody.push(_path2.node); removedPaths.push(_path2); } else if (_path2.isImportDeclaration()) { var source = _path2.node.source.value; pushModule(source, "imports", _path2.node.specifiers); for (var name in _path2.getBindingIdentifiers()) { _path2.scope.removeBinding(name); variableIds.push(t.identifier(name)); } _path2.remove(); } else if (_path2.isExportAllDeclaration()) { pushModule(_path2.node.source.value, "exports", _path2.node); _path2.remove(); } else if (_path2.isExportDefaultDeclaration()) { var declar = _path2.get("declaration"); if (declar.isClassDeclaration() || declar.isFunctionDeclaration()) { var id = declar.node.id; var nodes = []; if (id) { nodes.push(declar.node); nodes.push(buildExportCall("default", id)); addExportName(id.name, "default"); } else { nodes.push(buildExportCall("default", t.toExpression(declar.node))); } if (!canHoist || declar.isClassDeclaration()) { _path2.replaceWithMultiple(nodes); } else { beforeBody = beforeBody.concat(nodes); removedPaths.push(_path2); } } else { _path2.replaceWith(buildExportCall("default", declar.node)); } } else if (_path2.isExportNamedDeclaration()) { var _declar = _path2.get("declaration"); if (_declar.node) { _path2.replaceWith(_declar); var _nodes = []; var bindingIdentifiers = void 0; if (_path2.isFunction()) { var node = _declar.node; var _name = node.id.name; if (canHoist) { addExportName(_name, _name); beforeBody.push(node); beforeBody.push(buildExportCall(_name, node.id)); removedPaths.push(_path2); } else { var _bindingIdentifiers; bindingIdentifiers = (_bindingIdentifiers = {}, _bindingIdentifiers[_name] = node.id, _bindingIdentifiers); } } else { bindingIdentifiers = _declar.getBindingIdentifiers(); } for (var _name2 in bindingIdentifiers) { addExportName(_name2, _name2); _nodes.push(buildExportCall(_name2, t.identifier(_name2))); } _path2.insertAfter(_nodes); } else { var specifiers = _path2.node.specifiers; if (specifiers && specifiers.length) { if (_path2.node.source) { pushModule(_path2.node.source.value, "exports", specifiers); _path2.remove(); } else { var _nodes2 = []; for (var _iterator7 = specifiers, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : (0, _getIterator3.default)(_iterator7);;) { var _ref8; if (_isArray7) { if (_i7 >= _iterator7.length) break; _ref8 = _iterator7[_i7++]; } else { _i7 = _iterator7.next(); if (_i7.done) break; _ref8 = _i7.value; } var specifier = _ref8; _nodes2.push(buildExportCall(specifier.exported.name, specifier.local)); addExportName(specifier.local.name, specifier.exported.name); } _path2.replaceWithMultiple(_nodes2); } } } } } modules.forEach(function (specifiers) { var setterBody = []; var target = path.scope.generateUidIdentifier(specifiers.key); for (var _iterator4 = specifiers.imports, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : (0, _getIterator3.default)(_iterator4);;) { var _ref5; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref5 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref5 = _i4.value; } var specifier = _ref5; if (t.isImportNamespaceSpecifier(specifier)) { setterBody.push(t.expressionStatement(t.assignmentExpression("=", specifier.local, target))); } else if (t.isImportDefaultSpecifier(specifier)) { specifier = t.importSpecifier(specifier.local, t.identifier("default")); } if (t.isImportSpecifier(specifier)) { setterBody.push(t.expressionStatement(t.assignmentExpression("=", specifier.local, t.memberExpression(target, specifier.imported)))); } } if (specifiers.exports.length) { var exportObjRef = path.scope.generateUidIdentifier("exportObj"); setterBody.push(t.variableDeclaration("var", [t.variableDeclarator(exportObjRef, t.objectExpression([]))])); for (var _iterator5 = specifiers.exports, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : (0, _getIterator3.default)(_iterator5);;) { var _ref6; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref6 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref6 = _i5.value; } var node = _ref6; if (t.isExportAllDeclaration(node)) { setterBody.push(buildExportAll({ KEY: path.scope.generateUidIdentifier("key"), EXPORT_OBJ: exportObjRef, TARGET: target })); } else if (t.isExportSpecifier(node)) { setterBody.push(t.expressionStatement(t.assignmentExpression("=", t.memberExpression(exportObjRef, node.exported), t.memberExpression(target, node.local)))); } else {} } setterBody.push(t.expressionStatement(t.callExpression(exportIdent, [exportObjRef]))); } sources.push(t.stringLiteral(specifiers.key)); setters.push(t.functionExpression(null, [target], t.blockStatement(setterBody))); }); var moduleName = this.getModuleName(); if (moduleName) moduleName = t.stringLiteral(moduleName); if (canHoist) { (0, _babelHelperHoistVariables2.default)(path, function (id) { return variableIds.push(id); }); } if (variableIds.length) { beforeBody.unshift(t.variableDeclaration("var", variableIds.map(function (id) { return t.variableDeclarator(id); }))); } path.traverse(reassignmentVisitor, { exports: exportNames, buildCall: buildExportCall, scope: path.scope }); for (var _iterator6 = removedPaths, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : (0, _getIterator3.default)(_iterator6);;) { var _ref7; if (_isArray6) { if (_i6 >= _iterator6.length) break; _ref7 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) break; _ref7 = _i6.value; } var _path3 = _ref7; _path3.remove(); } path.node.body = [buildTemplate({ SYSTEM_REGISTER: t.memberExpression(t.identifier(state.opts.systemGlobal || "System"), t.identifier("register")), BEFORE_BODY: beforeBody, MODULE_NAME: moduleName, SETTERS: setters, SOURCES: sources, BODY: path.node.body, EXPORT_IDENTIFIER: exportIdent, CONTEXT_IDENTIFIER: contextIdent })]; } } } }; }; var _babelHelperHoistVariables = require("babel-helper-hoist-variables"); var _babelHelperHoistVariables2 = _interopRequireDefault(_babelHelperHoistVariables); var _babelTemplate = require("babel-template"); var _babelTemplate2 = _interopRequireDefault(_babelTemplate); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var buildTemplate = (0, _babelTemplate2.default)("\n SYSTEM_REGISTER(MODULE_NAME, [SOURCES], function (EXPORT_IDENTIFIER, CONTEXT_IDENTIFIER) {\n \"use strict\";\n BEFORE_BODY;\n return {\n setters: [SETTERS],\n execute: function () {\n BODY;\n }\n };\n });\n"); var buildExportAll = (0, _babelTemplate2.default)("\n for (var KEY in TARGET) {\n if (KEY !== \"default\" && KEY !== \"__esModule\") EXPORT_OBJ[KEY] = TARGET[KEY];\n }\n"); var TYPE_IMPORT = "Import"; module.exports = exports["default"];