namefully 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/lib/config.js +112 -0
  2. package/dist/lib/constants.js +30 -0
  3. package/dist/lib/error.js +92 -0
  4. package/dist/lib/full-name.js +115 -0
  5. package/dist/lib/index.js +27 -12
  6. package/dist/lib/name.js +230 -0
  7. package/dist/lib/namefully.js +368 -681
  8. package/dist/lib/parser.js +138 -0
  9. package/dist/lib/types.js +107 -0
  10. package/dist/lib/utils.js +92 -0
  11. package/dist/lib/validator.js +301 -0
  12. package/dist/types/config.d.ts +97 -0
  13. package/dist/types/constants.d.ts +4 -0
  14. package/dist/types/error.d.ts +158 -0
  15. package/dist/types/full-name.d.ts +54 -0
  16. package/dist/types/index.d.ts +21 -0
  17. package/dist/types/name.d.ts +126 -0
  18. package/dist/types/namefully.d.ts +313 -0
  19. package/dist/types/parser.d.ts +41 -0
  20. package/dist/types/types.d.ts +127 -0
  21. package/dist/types/utils.d.ts +53 -0
  22. package/dist/types/validator.d.ts +57 -0
  23. package/dist/umd/namefully.js +1503 -2900
  24. package/dist/umd/namefully.min.js +1 -3
  25. package/package.json +28 -38
  26. package/readme.md +138 -167
  27. package/changelog.md +0 -134
  28. package/dist/lib/core/constants.d.ts +0 -48
  29. package/dist/lib/core/constants.js +0 -101
  30. package/dist/lib/core/constants.js.map +0 -1
  31. package/dist/lib/core/core.d.ts +0 -17
  32. package/dist/lib/core/core.js +0 -24
  33. package/dist/lib/core/core.js.map +0 -1
  34. package/dist/lib/core/index.d.ts +0 -9
  35. package/dist/lib/core/index.js +0 -13
  36. package/dist/lib/core/index.js.map +0 -1
  37. package/dist/lib/core/parsers/array-name.parser.d.ts +0 -41
  38. package/dist/lib/core/parsers/array-name.parser.js +0 -86
  39. package/dist/lib/core/parsers/array-name.parser.js.map +0 -1
  40. package/dist/lib/core/parsers/array-string.parser.d.ts +0 -47
  41. package/dist/lib/core/parsers/array-string.parser.js +0 -95
  42. package/dist/lib/core/parsers/array-string.parser.js.map +0 -1
  43. package/dist/lib/core/parsers/index.d.ts +0 -11
  44. package/dist/lib/core/parsers/index.js +0 -11
  45. package/dist/lib/core/parsers/index.js.map +0 -1
  46. package/dist/lib/core/parsers/nama.parser.d.ts +0 -33
  47. package/dist/lib/core/parsers/nama.parser.js +0 -74
  48. package/dist/lib/core/parsers/nama.parser.js.map +0 -1
  49. package/dist/lib/core/parsers/parser.d.ts +0 -28
  50. package/dist/lib/core/parsers/parser.js +0 -3
  51. package/dist/lib/core/parsers/parser.js.map +0 -1
  52. package/dist/lib/core/parsers/string.parser.d.ts +0 -60
  53. package/dist/lib/core/parsers/string.parser.js +0 -62
  54. package/dist/lib/core/parsers/string.parser.js.map +0 -1
  55. package/dist/lib/core/utils.d.ts +0 -52
  56. package/dist/lib/core/utils.js +0 -178
  57. package/dist/lib/core/utils.js.map +0 -1
  58. package/dist/lib/index.d.ts +0 -10
  59. package/dist/lib/index.js.map +0 -1
  60. package/dist/lib/models/enums.d.ts +0 -106
  61. package/dist/lib/models/enums.js +0 -114
  62. package/dist/lib/models/enums.js.map +0 -1
  63. package/dist/lib/models/firstname.d.ts +0 -77
  64. package/dist/lib/models/firstname.js +0 -131
  65. package/dist/lib/models/firstname.js.map +0 -1
  66. package/dist/lib/models/fullname.d.ts +0 -73
  67. package/dist/lib/models/fullname.js +0 -99
  68. package/dist/lib/models/fullname.js.map +0 -1
  69. package/dist/lib/models/index.d.ts +0 -13
  70. package/dist/lib/models/index.js +0 -16
  71. package/dist/lib/models/index.js.map +0 -1
  72. package/dist/lib/models/lastname.d.ts +0 -80
  73. package/dist/lib/models/lastname.js +0 -157
  74. package/dist/lib/models/lastname.js.map +0 -1
  75. package/dist/lib/models/misc.d.ts +0 -108
  76. package/dist/lib/models/misc.js +0 -3
  77. package/dist/lib/models/misc.js.map +0 -1
  78. package/dist/lib/models/name.d.ts +0 -76
  79. package/dist/lib/models/name.js +0 -115
  80. package/dist/lib/models/name.js.map +0 -1
  81. package/dist/lib/models/summary.d.ts +0 -26
  82. package/dist/lib/models/summary.js +0 -61
  83. package/dist/lib/models/summary.js.map +0 -1
  84. package/dist/lib/namefully.d.ts +0 -302
  85. package/dist/lib/namefully.js.map +0 -1
  86. package/dist/lib/validators/array-name.validator.d.ts +0 -25
  87. package/dist/lib/validators/array-name.validator.js +0 -75
  88. package/dist/lib/validators/array-name.validator.js.map +0 -1
  89. package/dist/lib/validators/array-string.validator.d.ts +0 -43
  90. package/dist/lib/validators/array-string.validator.js +0 -76
  91. package/dist/lib/validators/array-string.validator.js.map +0 -1
  92. package/dist/lib/validators/common/validation-error.d.ts +0 -19
  93. package/dist/lib/validators/common/validation-error.js +0 -26
  94. package/dist/lib/validators/common/validation-error.js.map +0 -1
  95. package/dist/lib/validators/common/validation-rule.d.ts +0 -72
  96. package/dist/lib/validators/common/validation-rule.js +0 -76
  97. package/dist/lib/validators/common/validation-rule.js.map +0 -1
  98. package/dist/lib/validators/common/validation-type.d.ts +0 -24
  99. package/dist/lib/validators/common/validation-type.js +0 -28
  100. package/dist/lib/validators/common/validation-type.js.map +0 -1
  101. package/dist/lib/validators/firstname.validator.d.ts +0 -20
  102. package/dist/lib/validators/firstname.validator.js +0 -29
  103. package/dist/lib/validators/firstname.validator.js.map +0 -1
  104. package/dist/lib/validators/fullname.validator.d.ts +0 -21
  105. package/dist/lib/validators/fullname.validator.js +0 -38
  106. package/dist/lib/validators/fullname.validator.js.map +0 -1
  107. package/dist/lib/validators/index.d.ts +0 -21
  108. package/dist/lib/validators/index.js +0 -35
  109. package/dist/lib/validators/index.js.map +0 -1
  110. package/dist/lib/validators/lastname.validator.d.ts +0 -20
  111. package/dist/lib/validators/lastname.validator.js +0 -29
  112. package/dist/lib/validators/lastname.validator.js.map +0 -1
  113. package/dist/lib/validators/middlename.validator.d.ts +0 -20
  114. package/dist/lib/validators/middlename.validator.js +0 -38
  115. package/dist/lib/validators/middlename.validator.js.map +0 -1
  116. package/dist/lib/validators/nama.validator.d.ts +0 -21
  117. package/dist/lib/validators/nama.validator.js +0 -44
  118. package/dist/lib/validators/nama.validator.js.map +0 -1
  119. package/dist/lib/validators/namon.validator.d.ts +0 -20
  120. package/dist/lib/validators/namon.validator.js +0 -29
  121. package/dist/lib/validators/namon.validator.js.map +0 -1
  122. package/dist/lib/validators/prefix.validator.d.ts +0 -14
  123. package/dist/lib/validators/prefix.validator.js +0 -31
  124. package/dist/lib/validators/prefix.validator.js.map +0 -1
  125. package/dist/lib/validators/string-name.validator.d.ts +0 -20
  126. package/dist/lib/validators/string-name.validator.js +0 -29
  127. package/dist/lib/validators/string-name.validator.js.map +0 -1
  128. package/dist/lib/validators/suffix.validator.d.ts +0 -14
  129. package/dist/lib/validators/suffix.validator.js +0 -31
  130. package/dist/lib/validators/suffix.validator.js.map +0 -1
  131. package/dist/lib/validators/validator.d.ts +0 -13
  132. package/dist/lib/validators/validator.js +0 -9
  133. package/dist/lib/validators/validator.js.map +0 -1
  134. package/dist/umd/namefully.js.map +0 -1
  135. package/dist/umd/namefully.min.js.LICENSE.txt +0 -29
  136. package/dist/umd/namefully.min.js.map +0 -1
@@ -1,29 +0,0 @@
1
- /*! *****************************************************************************
2
- Copyright (c) Microsoft Corporation. All rights reserved.
3
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4
- this file except in compliance with the License. You may obtain a copy of the
5
- License at http://www.apache.org/licenses/LICENSE-2.0
6
-
7
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
8
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
9
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
10
- MERCHANTABLITY OR NON-INFRINGEMENT.
11
-
12
- See the Apache Version 2.0 License for specific language governing permissions
13
- and limitations under the License.
14
- ***************************************************************************** */
15
-
16
- /**
17
- * Welcome to namefully!
18
- *
19
- * namefully is a JS utility for handing person names.
20
- *
21
- * Sources
22
- * - repo: https://github.com/ralflorent/namefully
23
- * - docs: https://namefully.netlify.app
24
- * - npm: https://npmjs.com/package/namefully
25
- *
26
- * Created on March 03, 2020
27
- * @author Ralph Florent <ralflornt@gmail.com>
28
- * @license MIT
29
- */
@@ -1 +0,0 @@
1
- {"version":3,"sources":["webpack://namefully/webpack/universalModuleDefinition","webpack://namefully/webpack/bootstrap","webpack://namefully/./src/models/index.ts","webpack://namefully/./src/validators/index.ts","webpack://namefully/./src/core/index.ts","webpack://namefully/./node_modules/tslib/tslib.es6.js","webpack://namefully/./src/core/constants.ts","webpack://namefully/./src/core/parsers/index.ts","webpack://namefully/./src/index.ts","webpack://namefully/./src/namefully.ts","webpack://namefully/./src/core/parsers/array-name.parser.ts","webpack://namefully/./src/models/name.ts","webpack://namefully/./src/models/firstname.ts","webpack://namefully/./src/models/lastname.ts","webpack://namefully/./src/models/enums.ts","webpack://namefully/./src/models/summary.ts","webpack://namefully/./src/models/fullname.ts","webpack://namefully/./src/validators/common/validation-rule.ts","webpack://namefully/./src/validators/common/validation-type.ts","webpack://namefully/./src/validators/common/validation-error.ts","webpack://namefully/./src/validators/namon.validator.ts","webpack://namefully/./src/validators/prefix.validator.ts","webpack://namefully/./src/validators/suffix.validator.ts","webpack://namefully/./src/validators/firstname.validator.ts","webpack://namefully/./src/validators/lastname.validator.ts","webpack://namefully/./src/validators/middlename.validator.ts","webpack://namefully/./src/validators/fullname.validator.ts","webpack://namefully/./src/validators/nama.validator.ts","webpack://namefully/./src/core/core.ts","webpack://namefully/./src/validators/array-name.validator.ts","webpack://namefully/./src/validators/array-string.validator.ts","webpack://namefully/./src/validators/string-name.validator.ts","webpack://namefully/./src/core/parsers/array-string.parser.ts","webpack://namefully/./src/core/parsers/nama.parser.ts","webpack://namefully/./src/core/parsers/string.parser.ts","webpack://namefully/./src/core/utils.ts"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","default","extendStatics","b","setPrototypeOf","__proto__","Array","__extends","__","this","constructor","__assign","assign","arguments","length","apply","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__decorate","decorators","target","desc","getOwnPropertyDescriptor","Reflect","decorate","__param","paramIndex","decorator","__metadata","metadataKey","metadataValue","metadata","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","iterator","v","op","TypeError","pop","push","__exportStar","__values","__read","ar","error","__spread","concat","__spreadArrays","il","k","a","j","jl","__await","__asyncGenerator","asyncIterator","q","resume","fulfill","settle","shift","__asyncDelegator","__asyncValues","__makeTemplateObject","cooked","raw","__importStar","mod","__importDefault","__classPrivateFieldGet","receiver","privateMap","has","__classPrivateFieldSet","set","version","CONFIG","orderedBy","separator","Separator","SPACE","titling","ending","bypass","lastnameFormat","NAME_INDEX","prefix","firstname","middlename","lastname","suffix","FIRST_LAST_NAME_INDEX","LAST_FIRST_NAME_INDEX","FIRST_MIDDLE_LAST_NAME_INDEX","LAST_FIRST_MIDDLE_NAME_INDEX","PREFIX_FIRST_MIDDLE_LAST_NAME_INDEX","PREFIX_LAST_FIRST_MIDDLE_NAME_INDEX","PREFIX_FIRST_MIDDLE_LAST_SUFFIX_NAME_INDEX","PREFIX_LAST_FIRST_MIDDLE_SUFFIX_NAME_INDEX","MIN_NUMBER_NAME_PART","MAX_NUMBER_NAME_PART","RESTRICTED_CHARS","SINGLE_QUOTE","HYPHEN","PERIOD","COMMA","PASSWORD_MAPPER","Map","CharSet","Namefully","options","configure","build","parseNameOrder","config","pxSep","EMPTY","sxSep","nama","fullname","getFirstname","getMiddlenames","getLastname","join","includeAll","tostring","format","hasMiddlename","map","namon","withMid","midInits","getInitials","console","warn","initials","forEach","what","allowShortNameType","describe","Summary","summary","limit","by","warning","getFullname","fn","ln","mn","hasmid","isArray","sep","firsts","lasts","mids","cname","compress","unames","toLowerCase","father","slice","how","shorten","getBirthname","formatted","tokens","Error","trim","count","exceptions","restrictions","nameType","ascii","reduce","acc","_case","birthname","replace","split","toUpperCase","pascalCase","capitalize","decapitalize","UNDERSCORE","toggleCase","passwd","generatePassword","allowShortNameOrder","parser","parse","official","initialize","StringParser","ArrayStringParser","Name","obj","ArrayNameParser","entries","keys","Namon","NamaParser","FullnameValidator","validate","full","birth","px","getPrefix","sx","getSuffix","inits","stats","ArrayNameValidator","distribute","type","PREFIX","FIRST_NAME","Firstname","more","LAST_NAME","Lastname","mother","MIDDLE_NAME","SUFFIX","cap","initial","option","convertToAscii","decap","norm","normalize","super","hasMore","hasMother","Alphabet","Prefix","Suffix","compute","frequency","top","unique","distribution","maxfreq","uniq","freqs","groupByChar","char","frequencies","includes","FullnameBuilder","_px","_fn","_mn","_ln","_sx","PrefixValidator","FirstnameValidator","validator","NamonValidator","LastnameValidator","SuffixValidator","ValidationRule","base","RegExp","source","ValidatorType","ValidationError","message","NAMON","test","values","namonValidator","FULL_NAME","NAMA","validators","MiddlenameValidator","entry","Set","from","Math","floor","random","size","ARR_NAMES","indexing","ARR_STRING","pf","sf","index","organizeNameIndex","ArrayStringValidator","NamaValidator","str","rest","chars","argLength","nameIndex","out","filter","charCodeAt","mapper"],"mappings":"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","file":"namefully.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"namefully\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"namefully\"] = factory();\n\telse\n\t\troot[\"namefully\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 6);\n","/**\n * Make all the locals available\n *\n * Created on March 06, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nexport * from './name';\nexport * from './firstname';\nexport * from './lastname';\nexport * from './enums';\nexport * from './summary';\nexport * from './misc';\nexport * from './fullname';\n","/**\n * Make all the locals available\n *\n * Created on March 06, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nexport * from './common/validation-rule';\nexport * from './common/validation-type';\nexport * from './common/validation-error';\n\nexport * from './validator';\nexport { default as NamonValidator } from './namon.validator';\nexport { default as PrefixValidator } from './prefix.validator';\nexport { default as SuffixValidator } from './suffix.validator';\nexport { default as FirstnameValidator } from './firstname.validator';\nexport { default as LastnameValidator } from './lastname.validator';\nexport { default as MiddlenameValidator } from './middlename.validator';\nexport { default as FullnameValidator } from './fullname.validator';\nexport { default as NamaValidator } from './nama.validator';\n\nexport {default as ArrayNameValidator } from './array-name.validator';\nexport {default as ArrayStringValidator } from './array-string.validator';\nexport {default as StringNameValidator } from './string-name.validator';\n","/**\n * Make all the locals available\n *\n * Created on March 06, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nexport * from './parsers/index';\nexport * from './utils';\nexport * from './constants';\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","/**\n * Constants\n *\n * Created on March 07, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Separator, Config, NameIndex } from '../models/index';\nimport { CharSet } from './core';\n\n/**\n * The current version of `Namefully`.\n * @constant\n */\nexport const version = '1.1.0'\n\n/**\n * CONFIG\n * @constant\n * @type {Config}\n * @default\n */\nexport const CONFIG: Config = {\n orderedBy: 'firstname',\n separator: Separator.SPACE,\n titling: 'uk', // no period\n ending: false,\n bypass: false,\n lastnameFormat: 'father',\n} as const\n\n/**\n * NAME_INDEX\n * @constant\n * @type {NameIndex}\n * @default\n */\nexport const NAME_INDEX: NameIndex = {\n prefix: 0,\n firstname: 1,\n middlename: 2,\n lastname: 3,\n suffix: 4,\n} as const\n\nexport const FIRST_LAST_NAME_INDEX = 2\nexport const LAST_FIRST_NAME_INDEX = 2\nexport const FIRST_MIDDLE_LAST_NAME_INDEX = 3\nexport const LAST_FIRST_MIDDLE_NAME_INDEX = 3\nexport const PREFIX_FIRST_MIDDLE_LAST_NAME_INDEX = 4\nexport const PREFIX_LAST_FIRST_MIDDLE_NAME_INDEX = 4\nexport const PREFIX_FIRST_MIDDLE_LAST_SUFFIX_NAME_INDEX = 5\nexport const PREFIX_LAST_FIRST_MIDDLE_SUFFIX_NAME_INDEX = 5\n\nexport const MIN_NUMBER_NAME_PART = 2\nexport const MAX_NUMBER_NAME_PART = 5\n\n/**\n * RESTRICTED_CHARS\n * @constant\n * @default\n */\nexport const RESTRICTED_CHARS = [\n Separator.SPACE,\n Separator.SINGLE_QUOTE,\n Separator.HYPHEN,\n Separator.PERIOD,\n Separator.COMMA,\n] as const\n\n/**\n * PASSWORD_MAPPER\n * @constant\n */\nexport const PASSWORD_MAPPER = new Map([\n [ 'a', new CharSet(['a', 'A', '@', '4']) ],\n [ 'b', new CharSet(['b', 'B', '6', '|)', '|3', '|>']) ],\n [ 'c', new CharSet(['c', 'C', '(', '<']) ],\n [ 'd', new CharSet(['d', 'D', '(|', '<|']) ],\n [ 'e', new CharSet(['e', 'E', '3', '*']) ],\n [ 'f', new CharSet(['f', 'F', '7', '(-']) ],\n [ 'g', new CharSet(['g', 'G', '8', '&', '**']) ],\n [ 'h', new CharSet(['h', 'H', '#', '|-|']) ],\n [ 'i', new CharSet(['i', 'I', '!', '1', '|', '--']) ],\n [ 'j', new CharSet(['j', 'J', ')', '1']) ],\n [ 'k', new CharSet(['k', 'K', '%', '|<']) ],\n [ 'l', new CharSet(['l', 'L', '1', '!', '|_']) ],\n [ 'm', new CharSet(['m', 'M', '^^', '>>']) ],\n [ 'n', new CharSet(['n', 'N', '!=', '++']) ],\n [ 'o', new CharSet(['o', 'O', '0', '.', '*']) ],\n [ 'p', new CharSet(['p', 'P', '|3', '|)', '|>']) ],\n [ 'q', new CharSet(['q', 'Q', '&', '9', '<|']) ],\n [ 'r', new CharSet(['r', 'R', '7', '&']) ],\n [ 's', new CharSet(['s', 'S', '5', '$']) ],\n [ 't', new CharSet(['t', 'T', '7', '[']) ],\n [ 'u', new CharSet(['u', 'U', '|_|', 'v']) ],\n [ 'v', new CharSet(['v', 'V', '>', '<', '^']) ],\n [ 'w', new CharSet(['w', 'W', '[|]', 'vv']) ],\n [ 'x', new CharSet(['x', 'X', '%', '#']) ],\n [ 'z', new CharSet(['z', 'Z', '2', '!=']) ],\n [ '$', new CharSet([\n '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '+', '[',\n '_', '=', '{', '}', ':', ';', ',', '.', '<', '>', '|', '~', ']',\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'\n ])],\n])\n","/**\n * Export the local parsers\n *\n * Created on March 03, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nexport * from './parser';\nexport { default as ArrayNameParser } from './array-name.parser';\nexport { default as ArrayStringParser } from './array-string.parser';\nexport { default as NamaParser } from './nama.parser';\nexport { default as StringParser } from './string.parser';\n","/**\n * Main entry to `Namefully`\n *\n * Created on March 03, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nexport * from './namefully';\nexport * from './core';\nexport * from './models';\nexport * from './validators';\n","/**\n * Welcome to namefully!\n *\n * namefully is a JS utility for handing person names.\n *\n * Sources\n * - repo: https://github.com/ralflorent/namefully\n * - docs: https://namefully.netlify.app\n * - npm: https://npmjs.com/package/namefully\n *\n * Created on March 03, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n * @license MIT\n */\nimport {\n Parser,\n NamaParser,\n StringParser,\n ArrayNameParser,\n ArrayStringParser,\n capitalize,\n decapitalize,\n toggleCase,\n generatePassword,\n allowShortNameType,\n allowShortNameOrder,\n CONFIG, RESTRICTED_CHARS\n} from './core';\nimport {\n Fullname,\n Name,\n Nama,\n Namon,\n Separator,\n Summary,\n Config,\n NameOrder,\n NameType,\n LastnameFormat\n} from './models';\nimport { FullnameValidator } from './validators';\n\n\n/**\n * Person name handler\n * @class\n *\n * `Namefully` does not magically guess which part of the name is what. It relies\n * actually on how the developer indicates the roles of the name parts so that\n * it, internally, can perform certain operations and saves the developer some\n * calculations/processings. Nevertheless, Namefully can be constructed using\n * distinct raw data shape. This is intended to give some flexibility to the\n * developer so that he or she is not bound to a particular data format. Please,\n * do follow closely the APIs to know how to properly use it in order to avoid\n * some errors (mainly validation's).\n *\n * `Namefully` also works like a trap door. Once a raw data is provided and\n * validated, a developer can only ACCESS in a vast amount of, yet effective ways\n * the name info. NO EDITING is possible. If the name is mistaken, a new instance\n * of `Namefully` must be created. Remember, this utility's primary objective is\n * to help to **handle** a person name.\n *\n * Note that the name standards used for the current version of this library are\n * as follows:\n * [Prefix] Firstname [Middlename] Lastname [Suffix]\n * The opening `[` and closing `]` brackets mean that these parts are optional.\n * In other words, the most basic and typical case is a name that looks like this:\n * `John Smith`, where `John` is the first name and `Smith`, the last name.\n * @see https://departments.weber.edu/qsupport&training/Data_Standards/Name.htm\n * for more info on name standards.\n *\n * **IMPORTANT**: Keep in mind that the order of appearance matters and can be\n * altered through configured parameters, which we will be seeing later on. By\n * default, the order of appearance is as shown above and will be used as a basis\n * for future examples and use cases.\n *\n * Once imported, all that is required to do is to create an instance of\n * `Namefully` and the rest will follow.\n *\n * Some terminologies used across the library are:\n * - namon: 1 piece of a name (e.g., firstname)\n * - nama: 2+ pieces of a name (e.g., firstname + lastname)\n *\n * Happy handling!\n */\nexport class Namefully {\n /**\n * Holds a json-like high quality of data\n * @see {Fullname} description for more details\n */\n private fullname: Fullname;\n /**\n * Holds statistical info on the name\n * @see {Summary} class description for more details\n */\n private summary: Summary;\n /**\n * Holds a json-like copy of the preset configuration\n * @see {Config} description for more details\n */\n private config: Config;\n\n /**\n * Constructs an instance of the utility and helps to benefit from many helpers\n * @param {string | string[] | Name[] | Nama | Fullname} raw element to parse or\n * construct the pieces of the name\n * @param {Config} options to configure how to run the utility\n */\n constructor(\n raw: string | string[] | Name[] | Nama | Fullname,\n options?: Partial<Config>\n ) {\n // well, first thing first\n this.configure(options);\n\n // let's try to parse this, baby!\n this.build(raw);\n }\n\n /**\n * Gets the full name ordered as configured\n * @param {NameOrder} orderedBy force to order by first or last\n * name by overriding the preset configuration\n *\n * @see {format} to alter manually the order of appearance of the full name.\n * For example, ::format('l f m') outputs `lastname firstname middlename`.\n */\n getFullname(orderedBy?: NameOrder): string {\n orderedBy = this.parseNameOrder(orderedBy);\n\n const { titling, ending } = this.config;\n const pxSep = titling === 'us' ? Separator.PERIOD : Separator.EMPTY; // Mr[.]\n const sxSep = ending ? ',' : Separator.EMPTY; // [,] PhD\n const nama: string[] = [];\n\n if (this.fullname.prefix)\n nama.push(Separator.EMPTY.concat(this.fullname.prefix, pxSep))\n\n if (orderedBy === 'firstname') {\n nama.push(this.getFirstname());\n nama.push(...this.getMiddlenames());\n nama.push(Separator.EMPTY.concat(this.getLastname(), sxSep));\n } else {\n nama.push(this.getLastname());\n nama.push(this.getFirstname());\n nama.push(this.getMiddlenames().join(Separator.SPACE).concat(sxSep));\n }\n\n if (this.fullname.suffix)\n nama.push(this.fullname.suffix);\n\n return nama.join(Separator.SPACE);\n }\n\n /**\n * Gets the birth name ordered as configured, no prefix or suffix\n * @param {NameOrder} orderedBy force to order by first or last\n * name by overriding the preset configuration\n */\n getBirthname(orderedBy?: NameOrder): string {\n orderedBy = this.parseNameOrder(orderedBy);\n const nama: string[] = [];\n\n if (orderedBy === 'firstname') {\n nama.push(this.getFirstname());\n nama.push(...this.getMiddlenames());\n nama.push(this.getLastname());\n } else {\n nama.push(this.getLastname());\n nama.push(this.getFirstname());\n nama.push(...this.getMiddlenames());\n }\n\n return nama.join(Separator.SPACE);\n }\n\n /**\n * Gets the first name part of the full name\n * @param {boolean} includeAll whether to include other pieces of the first\n * name\n */\n getFirstname(includeAll: boolean = true): string {\n return this.fullname.firstname.tostring(includeAll);\n }\n\n /**\n * Gets the last name part of the full name\n * @param {LastnameFormat} [format] overrides the how-to format of a surname\n * output, considering its subparts.\n */\n getLastname(format?: LastnameFormat): string {\n return this.fullname.lastname.tostring(format);\n }\n\n /**\n * Gets the middle names part of the full name\n */\n getMiddlenames(): string[] {\n return this.hasMiddlename() ? this.fullname.middlename.map(n => n.namon) : [];\n }\n\n /**\n * Gets the prefix part of the full name\n */\n getPrefix(): string {\n return this.fullname.prefix\n ? this.fullname.prefix.concat(\n this.config.titling === 'us'\n ? Separator.PERIOD\n : Separator.EMPTY\n ): Separator.EMPTY;\n }\n\n /**\n * Gets the suffix part of the full name\n */\n getSuffix(): string {\n return this.fullname.suffix || Separator.EMPTY;\n }\n\n /**\n * Gets the initials of the full name\n * @param {NameOrder} orderedBy force to order by first or last name by\n * overriding the preset configuration\n * @param {boolean} [withMid] whether to include middle names's\n *\n * @example\n * Given the names:\n * - `John Smith` => ['J', 'S']\n * - `John Ben Smith` => ['J', 'S']\n * when `withMid` is set to true:\n * - `John Ben Smith` => ['J', 'B', 'S']\n *\n * **NOTE**:\n * Ordered by last name obeys the following format:\n * `lastname firstname [middlename]`\n * which means that if no middle name was set, setting `withMid` to true\n * will output nothing and warn the end user about it.\n */\n getInitials(\n orderedBy?: NameOrder,\n withMid: boolean = false\n ): string[] {\n orderedBy = this.parseNameOrder(orderedBy);\n const midInits = this.fullname.middlename ?\n this.fullname.middlename.map(n => n.getInitials()) : [];\n\n if (withMid && !this.hasMiddlename()) {\n console.warn('No initials for middle names since none was set.');\n }\n\n const initials = [];\n if (orderedBy === 'firstname') {\n initials.push(...this.fullname.firstname.getInitials());\n if (withMid) midInits.forEach(m => initials.push(...m));\n initials.push(...this.fullname.lastname.getInitials());\n } else {\n initials.push(...this.fullname.lastname.getInitials());\n initials.push(...this.fullname.firstname.getInitials());\n if (withMid) midInits.forEach(m => initials.push(...m));\n }\n\n return initials;\n }\n\n /**\n * Gives some descriptive statistics that summarize the central tendency,\n * dispersion and shape of the characters' distribution.\n * @param what which variant to use when describe a name part\n *\n * Treated as a categorical dataset, the summary contains the following info:\n * `count` : the number of *unrestricted* characters of the name;\n * `frequency` : the highest frequency within the characters;\n * `top` : the character with the highest frequency;\n * `unique` : the count of unique characters of the name;\n * `distribution` : the characters' distribution.\n *\n * @example\n * Given the name \"Thomas Alva Edison\", the summary will output as follows:\n *\n * Descriptive statistics for \"Thomas Alva Edison\"\n * count : 16\n * frequency: 3\n * top : A\n * unique : 12\n * distribution: { T: 1, H: 1, O: 2, M: 1, A: 2, S: 2, ' ': 2, L: 1, V: 1,\n * E: 1, D: 1, I: 1, N: 1 }\n *\n * **NOTE:**\n * During the setup, a set of restricted characters can be defined to be removed\n * from the stats. By default, the only restricted character is the `space`.\n * That is why the `count` for the example below result in `16` instead of\n * `16`.\n * Another thing to consider is that the summary is case *insensitive*. Note\n * that the letter `a` has the top frequency, be it `3`.\n */\n describe(what?: NameType): Summary {\n what = allowShortNameType(what)\n switch(what) {\n case 'firstname':\n return this.fullname.firstname.describe();\n case 'lastname':\n return this.fullname.lastname.describe();\n case 'middlename':\n if (!this.hasMiddlename()) {\n console.warn('No Summary for middle names since none was set.');\n return null;\n }\n return new Summary(\n this.fullname.middlename\n .map(n => n.namon)\n .join(Separator.SPACE)\n );\n default:\n return this.summary;\n }\n }\n\n /**\n * Shortens a complex full name to a simple typical name, a combination of\n * first name and last name.\n * @param {NameOrder} orderedBy force to order by first or last\n * name by overriding the preset configuration\n *\n * @example\n * For a given name such as `Mr Keanu Charles Reeves`, shortening this name\n * is equivalent to making it `Keanu Reeves`.\n *\n * As a shortened name, the namon of the first name is favored over the other\n * names forming part of the entire first names, if any. Meanwhile, for\n * the last name, the configured `lastnameFormat` is prioritized.\n *\n * @example\n * For a given `Firstname Fathername Mothername`, shortening this name when\n * the lastnameFormat is set as `mother` is equivalent to making it:\n * `Firstname Mothername`.\n */\n shorten(orderedBy?: NameOrder): string {\n orderedBy = orderedBy || this.config.orderedBy; // override config\n const { firstname, lastname } = this.fullname;\n return orderedBy === 'firstname'\n ? [firstname.namon, lastname.tostring()].join(Separator.SPACE)\n : [lastname.tostring(), firstname.namon].join(Separator.SPACE);\n }\n\n /**\n * Compresses a name by using different forms of variants\n * @param {number} [limit] a threshold to limit the number of characters\n * @param {'firstname'|'lastname'|'middlename'|'firstmid'|'midlast'} [by]\n * a variant to use when compressing the long name. The last two variants\n * represent respectively the combination of `firstname + middlename` and\n * `middlename + lastname`.\n * @param {boolean} [warning] should warn when the set limit is violated\n *\n * @example\n * The compressing operation is only executed iff there is valid entry and it\n * surpasses the limit set. In the examples below, let us assume that the\n * name goes beyond the limit value.\n *\n * Compressing a long name refers to reducing the name to the following forms:\n * 1. by firstname: 'John Moe Beau Lennon' => 'J. Moe Beau Lennon'\n * 2. by middlename: 'John Moe Beau Lennon' => 'John M. B. Lennon'\n * 3. by lastname: 'John Moe Beau Lennon' => 'John Moe Beau L.'\n * 4. by firstmid: 'John Moe Beau Lennon' => 'J. M. B. Lennon'\n * 5. by midlast: 'John Moe Beau Lennon' => 'John M. B. L.'\n *\n * By default, it compresses by 'firstmid' variant: 'J. M. B. Lennon'.\n */\n compress(\n limit: number = 20,\n by: 'fn' | 'ln'| 'mn' | 'fm' | 'ml' |\n 'firstname' | 'lastname' | 'middlename' | 'firstmid' | 'midlast' = 'mn',\n warning: boolean = true\n ): string {\n if (this.getFullname().length <= limit) // no need to compress\n return this.getFullname();\n\n const { firstname: fn, lastname: ln, middlename } = this.fullname;\n const mn = this.getMiddlenames().join(Separator.SPACE);\n const hasmid: boolean = Array.isArray(middlename) && middlename.length > 0;\n const sep = Separator.PERIOD;\n\n const firsts = fn.getInitials().join(sep).concat(sep);\n const lasts = ln.getInitials().join(sep).concat(sep);\n const mids = hasmid\n ? middlename.map(n => n.getInitials()).join(sep).concat(sep)\n : Separator.EMPTY;\n let cname = '';\n\n if (this.config.orderedBy === 'firstname') {\n switch (by) {\n case 'firstname': case 'fn':\n cname = hasmid ?\n [firsts, mn, ln.tostring()].join(Separator.SPACE) :\n [firsts, ln.tostring()].join(Separator.SPACE);\n break;\n case 'lastname': case 'ln':\n cname = hasmid ?\n [fn.tostring(), mn, lasts].join(Separator.SPACE) :\n [fn.tostring(), lasts].join(Separator.SPACE);\n break;\n case 'middlename': case 'mn':\n cname = hasmid ?\n [fn.tostring(), mids, ln.tostring()].join(Separator.SPACE) :\n [fn.tostring(), ln.tostring()].join(Separator.SPACE);\n break;\n case 'firstmid': case 'fm':\n cname = hasmid ?\n [firsts, mids, ln.tostring()].join(Separator.SPACE) :\n [firsts, ln.tostring()].join(Separator.SPACE);\n break;\n case 'midlast': case 'ml':\n cname = hasmid ?\n [fn.tostring(), mids, lasts].join(Separator.SPACE) :\n [fn.tostring(), lasts].join(Separator.SPACE);\n break;\n }\n }\n else {\n switch (by) {\n case 'firstname': case 'fn':\n cname = hasmid ?\n [ln.tostring(), firsts, mn].join(Separator.SPACE) :\n [ln.tostring(), firsts].join(Separator.SPACE);\n break;\n case 'lastname': case 'ln':\n cname = hasmid ?\n [lasts, fn.tostring(), mn].join(Separator.SPACE) :\n [lasts, fn.tostring()].join(Separator.SPACE);\n break;\n case 'middlename': case 'mn':\n cname = hasmid ?\n [ln.tostring(), fn.tostring(), mids].join(Separator.SPACE) :\n [ln.tostring(), fn.tostring()].join(Separator.SPACE);\n break;\n case 'firstmid': case 'fm':\n cname = hasmid ?\n [ln.tostring(), firsts, mids].join(Separator.SPACE) :\n [ln.tostring(), firsts].join(Separator.SPACE);\n break;\n case 'midlast': case 'ml':\n cname = hasmid ?\n [lasts, fn.tostring(), mids].join(Separator.SPACE) :\n [lasts, fn.tostring()].join(Separator.SPACE);\n break;\n }\n }\n\n if (warning && cname.length > limit)\n console.warn(`The compressed name <${cname}> still surpasses the set limit ${limit}`);\n\n return cname;\n }\n\n /**\n * Zips or compresses a name by using different forms of variants\n * @param by a variant to use when compressing the long name. The last two\n * variants represent respectively the combination of `firstname + middlename`\n * and `middlename + lastname`.\n */\n zip(\n by: 'fn' | 'ln'| 'mn' | 'fm' | 'ml' |\n 'firstname' | 'lastname' | 'middlename' | 'firstmid' | 'midlast' = 'mn'\n ): string {\n let v: 'firstname' | 'lastname' | 'middlename' | 'firstmid' | 'midlast';\n if (by === 'fn' || by === 'firstname') v = 'firstname';\n if (by === 'mn' || by === 'middlename') v = 'middlename';\n if (by === 'ln' || by === 'lastname') v = 'lastname';\n if (by === 'fm' || by === 'firstmid') v = 'firstmid';\n if (by === 'ml' || by === 'midlast') v = 'midlast';\n return this.compress(0, v, false);\n }\n\n /**\n * Suggests possible (randomly) usernames closest to the name\n *\n * **NOTE**\n * The validity of these usernames are not checked against any social media\n * or web app online.\n */\n username(): string[] {\n const unames: string[] = [];\n const { firstname, lastname } = this.fullname;\n const p = Separator.PERIOD;\n const fn = firstname.tostring().toLowerCase();\n const ln = lastname.father.toLowerCase();\n\n // Given `John Smith`\n unames.push(fn + ln); // johnsmith\n unames.push(ln + fn); // smithjohn\n unames.push(fn[0] + ln); // jsmith\n unames.push(ln[0] + fn); // sjohn\n unames.push(fn[0] + p + ln); // j.smith\n unames.push(ln[0] + p + fn); // s.john\n unames.push(fn.slice(0, 2) + ln); // josmith\n unames.push(ln.slice(0, 2) + fn); // smjohn\n unames.push(fn.slice(0, 2) + p + ln); // jo.smith\n unames.push(ln.slice(0, 2) + p + fn); // sm.john\n\n return unames;\n }\n\n /**\n * Formats the name as desired\n * @param {string} how to format the full name\n *\n * How to format it?\n * string format\n * -------------\n * 'short': typical first + last name\n * 'long': birth name (without prefix and suffix)\n *\n * char format\n * -----------\n * 'b': birth name\n * 'B': capitalized birth name\n * 'f': first name\n * 'F': capitalized first name\n * 'l': last name (official)\n * 'L': capitalized last name\n * 'm': middle names\n * 'M': capitalized middle names\n * 'o': official document format\n * 'O': official document format in capital letters\n * 'p': prefix\n * 'P': capitalized prefix\n * 's': suffix\n * 'S': capitalized suffix\n *\n * punctuations\n * ------------\n * '.': period\n * ',': comma\n * ' ': space\n * '-': hyphen\n * '_': underscore\n *\n * @example\n * Given the name `Joe Jim Smith`, call the `format` with the how string.\n * - format('l f') => 'Smith Joe'\n * - format('L, f') => 'SMITH, Joe'\n * - format('short') => 'Joe Smith'\n * - format() => 'SMITH, Joe Jim'\n */\n format(how: string = 'official'): string {\n if (how === 'short') return this.shorten();\n if (how === 'long') return this.getBirthname();\n if (how === 'official') how = 'o';\n\n const formatted: string[] = [];\n const tokens = [\n '.', ',', ' ', '-', '_', 'b', 'B', 'f', 'F', 'l', 'L', 'm', 'M',\n 'n', 'N', 'o', 'O', 'p', 'P', 's', 'S'\n ];\n for (const c of how) {\n if (tokens.indexOf(c) === -1)\n throw new Error(`<${c}> is an invalid character for the formatting.`)\n formatted.push(this.map(c));\n }\n return formatted.join(Separator.EMPTY).trim();\n }\n\n /**\n * Returns the count of characters of the birth name, excluding punctuations\n */\n size(): number {\n return new Summary(this.getBirthname(), [...RESTRICTED_CHARS]).count;\n }\n\n /**\n * Returns an ascii representation of each characters of a name as specified\n * @param options use specifics to shape conversion\n */\n ascii(\n options: Partial<{\n nameType: NameType;\n exceptions: string[];\n }> = {}\n ): number[] {\n const { exceptions: restrictions } = options;\n const nameType = allowShortNameType(options.nameType);\n const { firstname, lastname, middlename } = this.fullname;\n switch(nameType) {\n case 'firstname':\n return firstname.ascii(restrictions);\n case 'lastname':\n return lastname.ascii(restrictions);\n case 'middlename':\n if (!this.hasMiddlename())\n console.warn(`No ASCII conversion for middle names since none was set.`);\n return middlename\n .map(n => n.ascii(restrictions)) // convert\n .reduce((acc, value) => acc.concat(value), []); // then flatten\n default:\n const firsts = firstname.ascii(restrictions);\n const mids = middlename\n .map(n => n.ascii(restrictions))\n .reduce((acc, value) => acc.concat(value), []);\n const lasts = lastname.ascii(restrictions);\n if (this.config.orderedBy === 'firstname') {\n return firsts.concat(mids, lasts);\n }\n return lasts.concat(firsts, mids);\n }\n }\n\n /**\n * Transforms a birth name to a specific case\n * @param case which case to convert a birth name to\n */\n to(\n _case: 'upper' | 'lower' | 'camel' | 'pascal' | 'snake' | 'hyphen' | 'dot' | 'toggle'\n ): string {\n const birthname = this.getBirthname();\n const nama = birthname\n .replace(/[' -]/g, Separator.SPACE)\n .split(Separator.SPACE);\n\n switch(_case) {\n case 'upper':\n return birthname.toUpperCase();\n case 'lower':\n return birthname.toLowerCase();\n case 'camel': case 'pascal':\n const pascalCase = nama.map(n => capitalize(n)).join(Separator.EMPTY);\n return _case === 'camel' ? decapitalize(pascalCase) : pascalCase;\n case 'snake':\n return nama.map(n => n.toLowerCase()).join(Separator.UNDERSCORE);\n case 'hyphen':\n return nama.map(n => n.toLowerCase()).join(Separator.HYPHEN);\n case 'dot':\n return nama.map(n => n.toLowerCase()).join(Separator.PERIOD);\n case 'toggle':\n return toggleCase(birthname);\n default:\n return Separator.EMPTY;\n }\n }\n\n /**\n * Returns a password-like representation of a name\n * @param {NameType} [what] which name part\n */\n passwd(what?: NameType): string {\n what = allowShortNameType(what);\n switch(what) {\n case 'firstname':\n return this.fullname.firstname.passwd();\n case 'lastname':\n return this.fullname.lastname.passwd();\n case 'middlename':\n if (!this.hasMiddlename())\n console.warn('No password for middle names since none was set.');\n return this.fullname.middlename\n .map(n => n.passwd())\n .join(Separator.EMPTY);\n default:\n return generatePassword(this.getBirthname());\n }\n }\n\n private hasMiddlename(): boolean {\n return Array.isArray(this.fullname.middlename) && this.fullname.middlename.length > 0;\n }\n\n private configure(options?: Partial<Config>): void {\n // consider using deepmerge if objects no longer stay shallow\n this.config = { ...CONFIG, ...options }; // if options, it overrides CONFIG\n this.config.orderedBy = allowShortNameOrder(this.config.orderedBy);\n }\n\n private initialize<T>(parser: Parser<T>): void {\n const { orderedBy, separator, bypass, lastnameFormat } = this.config;\n this.fullname = parser.parse({ orderedBy, separator, bypass, lastnameFormat });\n }\n\n private parseNameOrder(orderedBy?: NameOrder): NameOrder {\n orderedBy = orderedBy || this.config.orderedBy; // override config\n return allowShortNameOrder(orderedBy);\n }\n\n private map(c: string): string {\n const { firstname, lastname, middlename, prefix, suffix } = this.fullname;\n\n switch(c) {\n case '.':\n return Separator.PERIOD;\n case ',':\n return Separator.COMMA;\n case ' ':\n return Separator.SPACE;\n case '-':\n return Separator.HYPHEN;\n case '_':\n return Separator.UNDERSCORE;\n case 'b':\n return this.getBirthname();\n case 'B':\n return this.getBirthname().toUpperCase();\n case 'f':\n return firstname.tostring();\n case 'F':\n return firstname.tostring().toUpperCase();\n case 'l':\n return lastname.tostring();\n case 'L':\n return lastname.tostring().toUpperCase();\n case 'm':\n if (!this.hasMiddlename()) {\n console.warn('No formatting for middle names since none was set.');\n return Separator.EMPTY;\n }\n return this.fullname.middlename.map(n => n.namon).join(Separator.SPACE);\n case 'M':\n if (!this.hasMiddlename()) {\n console.warn('No formatting for middle names since none was set.');\n return Separator.EMPTY;\n }\n return middlename.map(n => n.namon.toUpperCase()).join(Separator.SPACE);\n case 'o': case 'O':\n const { titling, ending } = this.config;\n const pxSep = titling === 'us' ? Separator.PERIOD : Separator.EMPTY;\n const sxSep = ending ? ',' : Separator.EMPTY;\n\n const nama: string[] = [];\n if (prefix)\n nama.push(prefix.concat(pxSep));\n nama.push(lastname.tostring().concat(Separator.COMMA).toUpperCase());\n if (this.hasMiddlename()) {\n nama.push(firstname.tostring());\n nama.push(middlename.map(n => n.namon).join(Separator.SPACE).concat(sxSep));\n } else {\n nama.push(firstname.tostring().concat(sxSep));\n }\n nama.push(suffix || Separator.EMPTY);\n\n const official = nama.join(Separator.SPACE).trim();\n return c === 'o' ? official : official.toUpperCase();\n case 'p':\n return prefix || Separator.EMPTY;\n case 'P':\n return prefix ? prefix.toUpperCase() : Separator.EMPTY;\n case 's':\n return suffix || Separator.EMPTY;\n case 'S':\n return suffix ? suffix.toUpperCase() : Separator.EMPTY;\n }\n }\n\n private build(raw: string | string[] | Name[] | Nama | Fullname): void {\n if (this.config.parser) {\n this.initialize(this.config.parser);\n } else if (typeof raw === 'string') { // check for string type\n this.initialize(new StringParser(raw));\n } else if (Array.isArray(raw) && raw.length) { // check for T[]\n if (typeof raw[0] === 'string') { // check for string[]\n for (const key of raw as string[])\n if (typeof key !== 'string')\n throw new Error(`Cannot parse raw data as array of 'string'`);\n this.initialize(new ArrayStringParser(raw as string[]))\n } else if (raw[0] instanceof Name) { // check for Name[]\n for (const obj of raw as string[])\n if (!(obj as any instanceof Name))\n throw new Error(`Cannot parse raw data as array of 'Name'`);\n this.initialize(new ArrayNameParser(raw as Name[]));\n } else {\n // typescript should stop them, but let's be paranoid (for JS developers)\n throw new Error(\n `Cannot parse raw data as arrays that are not of 'Name' or string`\n );\n }\n } else if (raw instanceof Object) { // check for json object\n for (const [key, value] of Object.entries(raw)) { // make sure keys are correct\n if (['firstname', 'lastname', 'middlename', 'prefix', 'suffix'].indexOf(key) === -1)\n throw new Error(\n `Cannot parse raw data as json object that does not contains keys of` +\n `'${Object.keys(Namon)}'`\n );\n\n // make sure the values are proper string or object\n if (typeof value !== 'string' && typeof value !== 'object')\n throw new Error(\n `Cannot parse raw data. The key <${key}> should be a 'string|object' type`\n );\n }\n if (typeof (raw as Nama)['firstname'] === 'string') // this key must always exist\n this.initialize(new NamaParser(raw as Nama));\n else\n this.fullname = raw as Fullname;\n } else {\n // typescript should stop them, but let's be paranoid again (for JS developers)\n throw new Error(`Cannot parse raw data. Review the data type expected.`);\n }\n // paranoid coder mode: on :P\n if (!this.config.bypass) new FullnameValidator().validate(this.fullname);\n this.summary = new Summary(this.getFullname());\n }\n}\n\n/**\n * Aliases for `Namefully`\n */\nexport interface Namefully {\n full: typeof Namefully.prototype.getFullname;\n birth: typeof Namefully.prototype.getBirthname;\n fn: typeof Namefully.prototype.getFirstname;\n ln: typeof Namefully.prototype.getLastname;\n mn: typeof Namefully.prototype.getMiddlenames;\n px: typeof Namefully.prototype.getPrefix;\n sx: typeof Namefully.prototype.getSuffix;\n inits: typeof Namefully.prototype.getInitials;\n stats: typeof Namefully.prototype.describe;\n}\n\nNamefully.prototype.full = Namefully.prototype.getFullname;\nNamefully.prototype.birth = Namefully.prototype.getBirthname;\nNamefully.prototype.fn = Namefully.prototype.getFirstname;\nNamefully.prototype.ln = Namefully.prototype.getLastname;\nNamefully.prototype.mn = Namefully.prototype.getMiddlenames;\nNamefully.prototype.px = Namefully.prototype.getPrefix;\nNamefully.prototype.sx = Namefully.prototype.getSuffix;\nNamefully.prototype.inits = Namefully.prototype.getInitials;\nNamefully.prototype.stats = Namefully.prototype.describe;\n","/**\n * An array `Name` parser\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport {\n Name,\n Namon,\n Fullname,\n Firstname,\n Lastname,\n Prefix,\n Suffix,\n LastnameFormat\n} from '../../models';\nimport { ArrayNameValidator } from '../../validators/index';\nimport { Parser } from './parser';\n\n\n/**\n * Represents a `Name[]` parser\n * @class\n * @implements {Parser<Name[]>}\n *\n * This parser parses an array of the class `Name` while checking that every part\n * plays the role they are supposed to play. The class `Name` is a ready-made\n * recipe that saves the how-to parsing for a raw data input.\n *\n * **NOTE**:\n * In this specific case, the user is expected to carefully set each name part\n * and submit a high-quality data. Why is this parser if the data is already\n * shaped as wanted? Well, it is better to be safe than sorry, so we implement a\n * double-check of these values and reconfirm a cleaner data. Remember, namefully\n * works like a trapdoor, once the data is set and confirmed safe, no editing is\n * possible.\n */\nexport default class ArrayNameParser implements Parser<Name[]> {\n\n /**\n * Create a parser ready to parse the raw data\n * @param {Name[]} raw data\n */\n constructor(public raw: Name[]) {}\n\n /**\n * Parses the raw data into a full name\n */\n parse(options: { bypass: boolean, lastnameFormat: LastnameFormat }): Fullname {\n const { bypass, lastnameFormat } = options;\n // validate first\n if (!bypass) new ArrayNameValidator().validate(this.raw);\n\n // then distribute all the elements accordingly\n const fullname: Fullname = this.distribute(lastnameFormat);\n\n // finally return high quality of data\n return fullname;\n }\n\n private distribute(lastnameFormat: LastnameFormat): Fullname {\n\n const fullname: Fullname = {\n firstname: null,\n lastname: null,\n middlename: [],\n prefix: null,\n suffix: null,\n };\n\n this.raw.forEach(name => {\n switch (name.type) {\n case Namon.PREFIX:\n fullname.prefix = name.namon as Prefix;\n break;\n case Namon.FIRST_NAME:\n if (name instanceof Firstname)\n fullname.firstname = new Firstname(name.namon, ...name.more);\n else\n fullname.firstname = new Firstname(name.namon);\n break;\n case Namon.LAST_NAME:\n if (name instanceof Lastname)\n fullname.lastname = new Lastname(name.father, name.mother, lastnameFormat)\n else\n fullname.lastname = new Lastname(name.namon, null, lastnameFormat);\n break;\n case Namon.MIDDLE_NAME:\n fullname.middlename.push(name);\n break;\n case Namon.SUFFIX:\n fullname.suffix = name.namon as Suffix;\n break;\n }\n });\n\n return fullname;\n }\n}\n","/**\n * Name class definition\n *\n * Created on March 06, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Summary, Namon } from './index';\nimport { convertToAscii, generatePassword } from '../core';\n\n/**\n * Represents a namon with some extra functionalities\n * @class\n * @see {@link Namon} interface to understand the concept of namon/nama.\n */\nexport class Name {\n\n private readonly initial: string;\n private readonly body: string;\n\n /**\n * Constructs a `Name`\n * @param namon a piece of string that will be defined as a namon\n * @param type which namon that is\n * @param cap which kind of capitalizations\n */\n constructor(public namon: string, public type: Namon, cap?: 'initial' | 'all') {\n this.initial = namon[0];\n this.body = namon.slice(1);\n if (!!cap) this.capitalize(cap);\n }\n\n /**\n * Gives some descriptive statistics that summarize the central tendency,\n * dispersion and shape of the characters' distribution.\n * @see {@link describe} in `Namefully` class for further information\n */\n describe(): Summary {\n return new Summary(this.namon);\n }\n\n /**\n * Returns a string representation of the namon\n */\n tostring(): string {\n return this.namon;\n }\n\n /**\n * Gets the initials of the name\n */\n getInitials(): string[] {\n return [this.namon[0]];\n }\n\n /**\n * Capitalizes a name\n * @param {'initial' | 'all'} option how to capitalize it\n */\n capitalize(option: 'initial' | 'all' = 'initial'): Name {\n const initial = this.initial.toUpperCase();\n if (option === 'initial') {\n this.namon = initial.concat(this.body);\n } else {\n this.namon = this.namon.toUpperCase();\n }\n return this;\n }\n\n /**\n * De-capitalizes a name\n * @param {'initial' | 'all'} option how to decapitalize it\n */\n decapitalize(option: 'initial' | 'all' = 'initial'): Name {\n const initial = this.initial.toLowerCase();\n if (option === 'initial') {\n this.namon = initial.concat(this.body);\n } else {\n this.namon = initial.concat(this.body.toLowerCase());\n }\n return this;\n }\n\n /**\n * Normalizes the name as it should be\n */\n normalize(): Name {\n this.namon = this.namon[0]\n .toUpperCase()\n .concat(this.namon.slice(1).toLowerCase());\n return this;\n }\n\n /**\n * Resets to the initial namon\n */\n reset(): Name {\n this.namon = this.initial.concat(this.body);\n return this;\n }\n\n /**\n * Returns an ascii representation of each characters of a name\n * @param restrictions chars to skip\n */\n ascii(restrictions?: string[]): number[] {\n return convertToAscii(this.namon, restrictions);\n }\n\n /**\n * Returns a password-like representation of a name\n */\n passwd(): string {\n return generatePassword(this.namon);\n }\n}\n\n/**\n * Aliases for `Name`\n */\nexport interface Name {\n cap: typeof Name.prototype.capitalize;\n decap: typeof Name.prototype.decapitalize;\n norm: typeof Name.prototype.normalize\n stats: typeof Name.prototype.describe;\n inits: typeof Name.prototype.getInitials;\n}\n\nName.prototype.cap = Name.prototype.capitalize;\nName.prototype.decap = Name.prototype.decapitalize;\nName.prototype.norm = Name.prototype.normalize;\nName.prototype.stats = Name.prototype.describe;\nName.prototype.inits = Name.prototype.getInitials;\n","/**\n * First name class definition\n *\n * Created on March 06, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Name, Namon, Summary, Separator } from './index';\nimport { convertToAscii, generatePassword } from '../core';\n\n\n/**\n * Represents a first name with some extra functionalities\n * @class\n * @extends Name\n */\nexport class Firstname extends Name {\n\n more: string[] = [];\n /**\n * Constructs a `Firstname`\n * @param {string} namon a piece of string that will be defined as a namon\n * @param {string[]} [more] additional pieces considered as a given name\n */\n constructor(public namon: string, ...more: string[]) {\n super(namon, Namon.FIRST_NAME);\n this.more = more;\n }\n\n /**\n * Determines whether a first name has more name parts\n */\n hasMore(): boolean {\n return Array.isArray(this.more) && this.more.length > 0;\n }\n\n /**\n * Gives some descriptive statistics that summarize the central tendency,\n * dispersion and shape of the characters' distribution.\n * @param {boolean} includeAll whether to include other pieces of the first\n * name in the summary\n * @see {@link describe} in `Namefully` class for further information\n */\n describe(includeAll: boolean = false): Summary {\n return new Summary(this.tostring(includeAll));\n }\n\n /**\n * Returns a string representation of the first name\n * @param {boolean} includeAll whether to include other pieces of the first\n * name\n */\n tostring(includeAll: boolean = true): string {\n return !includeAll\n ? this.namon\n : this.namon.concat(\n Separator.SPACE,\n this.more.join(Separator.SPACE)\n ).trim();\n }\n\n /**\n * Gets the initials of the first name\n */\n getInitials(includeAll: boolean = false): string[] {\n const initials: string[] = [this.namon[0]];\n if (includeAll && this.hasMore()) {\n initials.push(...this.more.map(n => n[0]));\n }\n return initials;\n }\n\n /**\n * Capitalizes a first name\n * @param {'initial' | 'all'} option how to capitalize its subparts\n */\n capitalize(option: 'initial' | 'all' = 'initial'): Firstname {\n if (option === 'initial') {\n this.namon = this.namon[0].toUpperCase().concat(this.namon.slice(1));\n if (this.hasMore())\n this.more = this.more.map(n => n[0].toUpperCase().concat(n.slice(1)));\n } else {\n this.namon = this.namon.toUpperCase();\n if (this.hasMore()) this.more = this.more.map(n => n.toUpperCase());\n }\n return this;\n }\n\n /**\n * De-capitalizes a first name\n * @param {'initial' | 'all'} option how to decapitalize its subparts\n */\n decapitalize(option: 'initial' | 'all' = 'initial'): Firstname {\n if (option === 'initial') {\n this.namon = this.namon[0].toLowerCase().concat(this.namon.slice(1));\n if (this.hasMore())\n this.more = this.more.map(n => n[0].toLowerCase().concat(n.slice(1)));\n } else {\n this.namon = this.namon.toLowerCase();\n if (this.hasMore())\n this.more = this.more.map(n => n.toLowerCase());\n }\n return this;\n }\n\n /**\n * Normalizes the first name as it should be\n */\n normalize(): Firstname {\n this.namon = this.namon[0]\n .toUpperCase()\n .concat(this.namon.slice(1).toLowerCase());\n if (this.hasMore())\n this.more = this.more.map(\n n => n[0]\n .toUpperCase()\n .concat(n.slice(1).toLowerCase())\n );\n return this;\n }\n\n /**\n * Returns an ascii representation of each characters of a first name\n * @param restrictions chars to skip\n */\n ascii(restrictions?: string[]): number[] {\n return convertToAscii(this.tostring(true), restrictions);\n }\n\n /**\n * Returns a password-like representation of a first name\n */\n passwd(): string {\n return generatePassword(this.tostring(true))\n }\n}\n\n/**\n * Aliases for `Firstname`\n */\nexport interface Firstname {\n cap: typeof Firstname.prototype.capitalize;\n decap: typeof Firstname.prototype.decapitalize;\n norm: typeof Firstname.prototype.normalize;\n stats: typeof Firstname.prototype.describe;\n inits: typeof Firstname.prototype.getInitials;\n}\n\nFirstname.prototype.cap = Firstname.prototype.capitalize;\nFirstname.prototype.decap = Firstname.prototype.decapitalize;\nFirstname.prototype.norm = Firstname.prototype.normalize;\nFirstname.prototype.stats = Firstname.prototype.describe;\nFirstname.prototype.inits = Firstname.prototype.getInitials;\n","/**\n * Last name class definition\n *\n * Created on March 06, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Name, Namon, Summary, Separator, LastnameFormat } from './index';\nimport { convertToAscii, generatePassword } from '../core';\n\n/**\n * Represents a last name with some extra functionalities\n * @class\n * @extends Name\n */\nexport class Lastname extends Name {\n\n /**\n * Constructs a `Lastname`\n * @param {string} father a piece of string that will be defined as a namon\n * @param {string} [mother] additional pieces considered as a last name\n * @param {LastnameFormat} [format] how to output a surname considering its\n * subparts\n */\n constructor(public father: string, public mother?: string, private format: LastnameFormat = 'father') {\n super(father, Namon.LAST_NAME);\n }\n\n /**\n * Determines whether a 'mother' subpart was set\n */\n hasMother(): boolean {\n return !!this.mother && this.mother.length > 0;\n }\n\n /**\n * Gives some descriptive statistics that summarize the central tendency,\n * dispersion and shape of the characters' distribution.\n * @param {LastnameFormat} [format] overrides the how-to format of a surname\n * output, considering its subparts.\n * @see {@link describe} in `Namefully` class for further information\n */\n describe(format?: LastnameFormat): Summary {\n format = format || this.format;\n return new Summary(this.tostring(format));\n }\n\n /**\n * Returns a string representation of the last name\n * @param {LastnameFormat} [format] overrides the how-to format of a surname\n * output, considering its subparts.\n */\n tostring(format?: LastnameFormat): string {\n format = format || this.format;\n switch(format) {\n case 'father':\n return this.father;\n case 'mother':\n return this.mother || Separator.EMPTY;\n case 'hyphenated':\n return this.mother ? this.father.concat(Separator.HYPHEN, this.mother) : this.father;\n case 'all':\n return this.mother ? this.father.concat(Separator.SPACE, this.mother) : this.father;\n }\n }\n\n /**\n * Gets the initials of the last name\n */\n getInitials(format?: LastnameFormat): string[] {\n format = format || this.format;\n const initials: string[] = [];\n\n switch(format) {\n case 'father':\n initials.push(this.father[0]);\n break;\n case 'mother':\n if (this.hasMother())\n initials.push(this.mother[0]);\n break;\n case 'hyphenated': case 'all':\n initials.push(this.father[0]);\n if (this.hasMother())\n initials.push(this.mother[0]);\n break;\n }\n return initials;\n }\n\n /**\n * Capitalizes a last name\n * @param {'initial' | 'all'} option how to capitalize its subparts\n */\n capitalize(option: 'initial' | 'all' = 'initial'): Lastname {\n super.capitalize(option);\n if (option === 'initial') {\n this.father = this.father[0].toUpperCase().concat(this.father.slice(1));\n if (this.hasMother())\n this.mother = this.mother[0].toUpperCase().concat(this.mother.slice(1));\n } else {\n this.father = this.father.toUpperCase();\n if (this.hasMother()) this.mother = this.mother.toUpperCase();\n }\n return this;\n }\n\n /**\n * De-capitalizes a last name\n * @param {'initial' | 'all'} option how to decapitalize its subparts\n */\n decapitalize(option: 'initial' | 'all' = 'initial'): Lastname {\n super.capitalize(option);\n if (option === 'initial') {\n this.father = this.father[0].toLowerCase().concat(this.father.slice(1));\n if (this.hasMother())\n this.mother = this.mother[0].toLowerCase().concat(this.mother.slice(1));\n } else {\n this.father = this.father.toLowerCase();\n if (this.hasMother())\n this.mother = this.mother.toLowerCase();\n }\n return this;\n }\n\n /**\n * Normalizes the last name as it should be\n */\n normalize(): Lastname {\n this.father = this.father[0]\n .toUpperCase()\n .concat(this.father.slice(1).toLowerCase());\n if (this.hasMother())\n this.mother = this.mother[0]\n .toUpperCase()\n .concat(this.mother.slice(1).toLowerCase());\n return this;\n }\n\n /**\n * Returns an ascii representation of each characters of a last name\n * @param restrictions chars to skip\n */\n ascii(restrictions?: string[]): number[] {\n return convertToAscii(this.tostring(), restrictions);\n }\n\n /**\n * Returns a password-like representation of a last name\n */\n passwd(): string {\n return generatePassword(this.tostring());\n }\n}\n\n/**\n * Aliases for `Lastname`\n */\nexport interface Lastname {\n cap: typeof Lastname.prototype.capitalize;\n decap: typeof Lastname.prototype.decapitalize;\n norm: typeof Lastname.prototype.normalize;\n stats: typeof Lastname.prototype.describe;\n inits: typeof Lastname.prototype.getInitials;\n}\n\nLastname.prototype.cap = Lastname.prototype.capitalize;\nLastname.prototype.decap = Lastname.prototype.decapitalize;\nLastname.prototype.norm = Lastname.prototype.normalize;\nLastname.prototype.stats = Lastname.prototype.describe;\nLastname.prototype.inits = Lastname.prototype.getInitials;\n","/**\n * All the enums are listed here\n *\n * Created on March 06, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\n\n/**\n * Enum `Namon` contains the finite set of a representative piece of a name\n * @readonly\n * @enum {string}\n * The word `Namon` is the singular form used to refer to a chunk|part|piece of\n * a name. And the plural form is `Nama`. (Same idea as in criterion/criteria)\n */\nexport enum Namon {\n PREFIX = 'prefix',\n LAST_NAME = 'lastname',\n MIDDLE_NAME = 'middlename',\n FIRST_NAME = 'firstname',\n SUFFIX = 'suffix',\n}\n\n/**\n * Enum `Alphabet` for the list of writing systems\n * @readonly\n * @enum {string}\n */\nexport enum Alphabet {\n LATIN = 'Latin',\n CYRILLIC = 'Cyrillic',\n GREEK = 'Greek',\n\tARMENIAN = 'Armenian',\n\tGEORGIAN = 'Georgian',\n\tHANGUL = 'Hangul',\n}\n\n/**\n * Enum for the prefix values\n * @readonly\n * @enum {string}\n * American and Canadian English follow slightly different rules for abbreviated\n * titles than British and Australian English. In North American English, titles\n * before a name require a period: `Mr., Mrs., Ms., Dr.` In British and Australian\n * English, no full stops are used in these abbreviations.\n */\nexport enum Prefix {\n FIRT_LIEUTENANT = '1st Lt',\n ADMIRAL = 'Adm',\n ATTORNEY = 'Atty',\n BROTHER = 'Brother', // Religious\n CAPTAIN = 'Capt',\n CHIEF = 'Chief',\n COMMANDER = 'Cmdr',\n COLONEL = 'Col',\n UNI_DEAN = 'Dean',\n DOCTOR = 'Dr',\n ELDER = 'Elder', // Religious\n FATHER = 'Father', // Religious\n GENERAL = 'Gen',\n HONORABLE = 'Hon',\n LIEUTENANT_COLONEL = 'Lt Col',\n MAJOR = 'Maj',\n MASTER_SERGEANT = 'MSgt',\n MISTER = 'Mr',\n MARRIED_WOMAN = 'Mrs',\n SINGLE_WOMAN = 'Ms',\n PRINCE = 'Prince',\n PROFESSOR = 'Prof',\n RABBI = 'Rabbi', // Religious\n REVEREND = 'Rev', // Religious\n SISTER = 'Sister'\n}\n\n/**\n * Enum for the suffix values\n * @readonly\n * @enum {string}\n */\nexport enum Suffix {\n THE_SECOND = 'II',\n THE_THIRD = 'III',\n THE_FOURTH = 'IV',\n CERT_PUB_ACCOUNTANT = 'CPA',\n DOCTOR_DENTAL_MED = 'DDS',\n ESQUIRE = 'Esq',\n JURIST_DOCTOR = 'JD',\n JUNIOR = 'Jr',\n DOCTOR_OF_LAWS = 'LLD',\n DOCTORATE = 'PhD',\n RETIRED_ARMED_FORCES = 'Ret',\n REGISTERED_NURSE = 'RN',\n SENIOR = 'Sr',\n DOCTOR_OF_OSTEO = 'DO'\n}\n\n/**\n * Enum for the separator values representing some of the ASCII characters\n * @readonly\n * @enum {string}\n */\nexport enum Separator {\n COLON = ':',\n COMMA = ',',\n EMPTY = '',\n HYPHEN = '-',\n PERIOD = '.',\n SPACE = ' ',\n SINGLE_QUOTE = `'`,\n DOUBLE_QUOTE = '\"',\n UNDERSCORE = '_',\n}\n","/**\n * Summary of descriptive stats of the name\n *\n * Created on March 06, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Separator } from './index';\n\n/**\n * Represents the statistical summary of a string representation\n * @class\n */\nexport class Summary {\n distribution: { [key: string]: number};\n count: number;\n frequency: number;\n top: string;\n unique: number;\n\n /**\n * Creates a `Summary` of a given string of alphabetical characters\n * @param namon piece of name\n * @param restrictions a set of undesired characters\n */\n constructor(private namon: string, restrictions: string[] = [Separator.SPACE]) {\n this.compute(restrictions);\n }\n\n /**\n * Returns a string representation of the summary\n */\n tostring(): string {\n return Separator.EMPTY.concat(\n `Descriptive statistics for \"${this.namon}\" \\n`,\n `count : ${this.count} \\n`,\n `frequency: ${this.frequency} \\n`,\n `top : ${this.top} \\n`,\n `unique : ${this.unique} \\n`,\n `distrib : ${Object.entries(this.distribution).map(e => `${e[1]}${e[0]}`).join(',')} \\n`,\n );\n }\n\n private compute(restrictions: string[] = []): void {\n // compute stats for the string\n let count = 0, maxfreq = 0, uniq = 0, top = '';\n const freqs = this.groupByChar();\n\n for (const char in freqs) {\n if (restrictions.indexOf(char) === -1) {\n count += freqs[char];\n if (freqs[char] >= maxfreq) {\n maxfreq = freqs[char];\n top = char;\n }\n uniq++;\n }\n }\n\n this.distribution = freqs;\n this.count = count;\n this.frequency = maxfreq;\n this.top = top;\n this.unique = uniq;\n }\n\n private groupByChar(): any {\n const frequencies: { [key: string]: number } = {};\n for (const char of this.namon.toUpperCase())\n if (Object.keys(frequencies).includes(char))\n frequencies[char] += 1;\n else\n frequencies[char] = 1;\n return frequencies;\n }\n}\n","/**\n * Full name builder\n *\n * Created on July 04, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Name, Firstname, Lastname, Prefix, Suffix, Namon } from './index';\nimport { LastnameFormat } from './misc';\nimport {\n PrefixValidator,\n FirstnameValidator,\n NamonValidator,\n LastnameValidator,\n SuffixValidator,\n} from '../validators'\n\n/**\n * Interface for JSON signature that represents the full name\n * @interface\n */\nexport interface Fullname {\n firstname: Firstname;\n lastname: Lastname;\n middlename?: Name[];\n prefix?: Prefix;\n suffix?: Suffix;\n}\n\n/**\n * Uses method chaining to build `Fullname`\n */\nexport class FullnameBuilder {\n private _px: Prefix = null;\n private _fn: Firstname = null;\n private _mn: Name[] = [];\n private _ln: Lastname = null;\n private _sx: Suffix = null;\n\n constructor(private bypass: boolean = false) {}\n\n /**\n * Builds with prefix\n * @param namon prefix name part\n */\n prefix(namon: string): this {\n if (!this.bypass) new PrefixValidator().validate(namon);\n this._px = namon as Prefix;\n return this;\n }\n\n /**\n * Builds with firstname\n * @param namon a piece of string that will be defined as a namon\n * @param more additional pieces considered as a given name\n */\n firstname(namon: string, ...more: string[]): this {\n this._fn = new Firstname(namon, ...more);\n if (!this.bypass) new FirstnameValidator().validate(this._fn.tostring());\n return this;\n }\n\n /**\n * Builds with middlename\n * @param nama middle names\n */\n middlename(...nama: string[]): this {\n const validator = new NamonValidator();\n this._mn = nama.map(namon => {\n if (!this.bypass) validator.validate(namon);\n return new Name(namon, Namon.MIDDLE_NAME)\n });\n return this;\n }\n\n /**\n * Builds with lastname\n * @param father a piece of string that will be defined as a namon\n * @param mother additional pieces considered as a last name\n * @param format how to output a surname considering its subparts\n */\n lastname(father: string, mother?: string, format: LastnameFormat = 'father'): this {\n this._ln = new Lastname(father, mother, format);\n if (!this.bypass) new LastnameValidator().validate(this._ln.tostring());\n return this;\n }\n\n /**\n * Builds with suffix\n * @param namon suffix name part\n */\n suffix(namon: string): this {\n if (!this.bypass) new SuffixValidator().validate(namon);\n this._sx = namon as Suffix;\n return this;\n }\n\n /**\n * Builds a `Fulllname`\n */\n build(): Fullname {\n const fullname: Fullname = {\n firstname: this._fn,\n lastname: this._ln,\n middlename: this._mn,\n prefix: this._px,\n suffix: this._sx\n };\n return fullname;\n }\n}\n\n/**\n * Aliases for `FullnameBuilder`\n */\nexport interface FullnameBuilder {\n px: typeof FullnameBuilder.prototype.prefix;\n fn: typeof FullnameBuilder.prototype.firstname;\n mn: typeof FullnameBuilder.prototype.middlename;\n ln: typeof FullnameBuilder.prototype.lastname;\n sx: typeof FullnameBuilder.prototype.suffix;\n}\n\nFullnameBuilder.prototype.px = FullnameBuilder.prototype.prefix;\nFullnameBuilder.prototype.fn = FullnameBuilder.prototype.firstname;\nFullnameBuilder.prototype.mn = FullnameBuilder.prototype.middlename;\nFullnameBuilder.prototype.ln = FullnameBuilder.prototype.lastname;\nFullnameBuilder.prototype.sx = FullnameBuilder.prototype.sx;\n","/**\n * Validation rules\n *\n * Created on March 06, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\n\n/**\n * Represents a set of validation rules (regex)\n * @class\n * @static\n *\n * This regex is intented to match specific alphabets only as a person name does\n * not contain special characters. `\\w` does not cover non-Latin characters. So,\n * it is extended using unicode chars to cover more cases (e.g., Icelandic).\n * It matches as follows:\n * [a-z]: Latin alphabet from a (index 97) to z (index 122)\n * [A-Z]: Latin alphabet from A (index 65) to Z (index 90)\n * [\\u00C0-\\u00D6]: Latin/German chars from À (index 192) to Ö (index 214)\n * [\\u00D8-\\u00f6]: German/Icelandic chars from Ø (index 216) to ö (index 246)\n * [\\u00f8-\\u00ff]: German/Icelandic chars from ø (index 248) to ÿ (index 255)\n * [\\u0400-\\u04FF]: Cyrillic alphabet from Ѐ (index 1024) to ӿ (index 1279)\n * [Ά-ωΑ-ώ]: Greek alphabet from Ά (index 902) to ω (index 969)\n */\nexport class ValidationRule {\n static base: RegExp = /[a-zA-Z\\u00C0-\\u00D6\\u00D8-\\u00f6\\u00f8-\\u00ff\\u0400-\\u04FFΆ-ωΑ-ώ]/\n /**\n * Matches one name part (namon) that is of nature:\n * - Latin (English, Spanish, French, etc.)\n * - European (Greek, Cyrillic, Icelandic, German)\n * - hyphenated\n * - with apostrophe\n * - with space\n */\n static namon: RegExp = new RegExp(`^${ValidationRule.base.source}+(([' -]${ValidationRule.base.source})?${ValidationRule.base.source}*)*$`);\n\n /**\n * Matches 1+ name parts (namon) that are of nature:\n * - Latin (English, Spanish, French, etc.)\n * - European (Greek, Cyrillic, Icelandic, German)\n * - hyphenated\n * - with apostrophe\n * - with comma\n * - with period\n * - with space\n */\n static fullname: RegExp = new RegExp(`^${ValidationRule.base.source}+(([',. -]${ValidationRule.base.source})?${ValidationRule.base.source}*)*$`);\n\n /**\n * Matches one name part (namon) that is of nature:\n * - Latin (English, Spanish, French, etc.)\n * - European (Greek, Cyrillic, Icelandic, German)\n * - hyphenated\n * - with apostrophe\n */\n static firstname: RegExp = ValidationRule.namon;\n\n /**\n * Matches 1+ names part (namon) that are of nature:\n * - Latin (English, Spanish, French, etc.)\n * - European (Greek, Cyrillic, Icelandic, German)\n * - hyphenated\n * - with apostrophe\n * - with space\n */\n static middlename: RegExp = new RegExp(`^${ValidationRule.base.source}+(([' -]${ValidationRule.base.source})?${ValidationRule.base.source}*)*$`);\n\n /**\n * Matches one name part (namon) that is of nature:\n * - Latin (English, Spanish, French, etc.)\n * - European (Greek, Cyrillic, Icelandic, German)\n * - hyphenated\n * - with apostrophe\n * - with space\n */\n static lastname: RegExp = ValidationRule.namon;\n}\n","/**\n * Validation types\n *\n * Created on March 06, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\n\n/**\n * Enum for the validation types\n * @enum\n */\nexport enum ValidatorType {\n NONE,\n NAMON,\n NAMA,\n ARR_NAMES, // array of `Name`s\n ARR_STRING, // array of string\n FULL_NAME,\n PREFIX,\n FIRST_NAME,\n MIDDLE_NAME,\n LAST_NAME,\n SUFFIX,\n\n CUSTOM, // user-defined\n}","/**\n * Validation error\n *\n * Created on March 06, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\n\n/**\n * Represents a validation error\n * @class\n * @extends Error\n */\nexport class ValidationError extends Error {\n /**\n * Create a validation `Error`\n * @param message of error to display\n * @param type categorizes the error\n */\n constructor(message?: string, type?: string) {\n super(`${ type ? type + ' :: ' + message : message }`);\n this.name = 'ValidationError';\n }\n}","/**\n * Namon validator\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Validator, ValidatorType, ValidationError, ValidationRule } from './index';\n\n/**\n * Represents a namon validator to help to parse single pieces of string\n * @class\n * @implements {Validator}\n */\nexport default class NamonValidator implements Validator<string> {\n readonly type: ValidatorType = ValidatorType.NAMON;\n /**\n * Validates the content of a name\n * @param {string} value data to validate\n */\n validate(value: string): void {\n if (!ValidationRule.namon.test(value))\n throw new ValidationError(`invalid string content '${value}'`, 'Name');\n }\n}","/**\n * Prefix validator\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Prefix } from '../models/index';\nimport { Validator, ValidatorType, ValidationError } from './index';\n\n/**\n * Represents a prefix validator\n * @class\n * @implements {Validator}\n */\nexport default class PrefixValidator implements Validator<string> {\n readonly type: ValidatorType = ValidatorType.PREFIX;\n /**\n * Validates the content of a prefix name\n * @param {string} value data to validate\n */\n validate(value: string): void {\n const prefixes: string[] = Object.entries(Prefix).map(e => e[1].toLowerCase()); // values\n if (prefixes.indexOf(value.toLowerCase()) === -1)\n throw new ValidationError(`unknown value '${value}'`, 'Prefix');\n }\n}","/**\n * Suffix validator\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Suffix } from '../models/index';\nimport { Validator, ValidatorType, ValidationError } from './index';\n\n/**\n * Represents a suffix validator\n * @class\n * @implements {Validator}\n */\nexport default class SuffixValidator implements Validator<string> {\n readonly type: ValidatorType = ValidatorType.SUFFIX;\n /**\n * Validates the content of a suffix name\n * @param {string} value data to validate\n */\n validate(value: string): void {\n const suffixes: string[] = Object.entries(Suffix).map(e => e[1].toLowerCase()); // values\n if (suffixes.indexOf(value.toLowerCase()) === -1)\n throw new ValidationError(`unknown value '${value}'`, 'Suffix');\n }\n}","/**\n * First name validator\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Validator, ValidatorType, ValidationError, ValidationRule } from './index';\n\n/**\n * Represents a first name validator\n * @class\n * @implements {Validator}\n */\nexport default class FirstnameValidator implements Validator<string> {\n readonly type: ValidatorType = ValidatorType.FIRST_NAME;\n /**\n * Validates the content of a first name\n * @param {string} value data to validate\n */\n validate(value: string): void {\n if (!ValidationRule.firstname.test(value))\n throw new ValidationError(`invalid string content '${value}'`, 'First name');\n }\n}","/**\n * Last name validator\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Validator, ValidatorType, ValidationError, ValidationRule } from './index';\n\n/**\n * Represents a last name validator\n * @class\n * @implements {Validator}\n */\nexport default class LastnameValidator implements Validator<string> {\n readonly type: ValidatorType = ValidatorType.LAST_NAME;\n /**\n * Validates the content of a last name\n * @param {string} value data to validate\n */\n validate(value: string): void {\n if (!ValidationRule.lastname.test(value))\n throw new ValidationError(`invalid string content '${value}'`, 'Last name');\n }\n}\n","/**\n * Middle name validator\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Validator, ValidatorType, ValidationError, ValidationRule, NamonValidator } from './index';\n\n/**\n * Represents a middle name validator\n * @class\n * @implements {Validator}\n */\nexport default class MiddlenameValidator implements Validator<string | string[]> {\n readonly type: ValidatorType = ValidatorType.MIDDLE_NAME;\n /**\n * Validates the content of a list of middle names\n * @param {string | string[]} values to validate\n */\n validate(values: string | string[]): void {\n\n if (typeof values === 'string') {\n if (!ValidationRule.middlename.test(values))\n throw new ValidationError(`invalid string content '${values}'`, 'Middle name');\n } else if (values instanceof Array) {\n const namonValidator = new NamonValidator();\n (values as string[]).forEach(v => namonValidator.validate(v));\n } else {\n throw new Error('Expecting string or Array<string> type');\n }\n }\n}","/**\n * `Fullname` validator\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Fullname, Firstname, Lastname } from '../models/index';\nimport { Validator, ValidatorType, ValidationError, PrefixValidator, SuffixValidator } from './index';\n\n/**\n * Represents a `Fullname` (JSON signature) validator for provided custom parser\n * @class\n * @implements {Validator}\n */\nexport default class FullnameValidator implements Validator<Fullname> {\n readonly type: ValidatorType = ValidatorType.FULL_NAME;\n /**\n * Validates that the `Fullname` contract is met\n * @param {Fullname} value data to validate\n */\n validate(v: Fullname): void {\n if (!v.firstname || !(v.firstname instanceof Firstname))\n throw new ValidationError('first name is corrupted', 'Fullname');\n if (!v.lastname || !(v.lastname instanceof Lastname))\n throw new ValidationError('last name is corrupted', 'Fullname');\n if (v.middlename && !(v.middlename instanceof Array))\n throw new ValidationError('middle name is corrupted', 'Fullname');\n if (v.prefix)\n new PrefixValidator().validate(v.prefix)\n if (v.suffix)\n new SuffixValidator().validate(v.suffix)\n }\n}","/**\n * Nama validator\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Nama, Namon } from '../models';\nimport { MIN_NUMBER_NAME_PART, MAX_NUMBER_NAME_PART } from '../core/constants';\nimport {\n Validator,\n ValidatorType,\n ValidationError ,\n PrefixValidator,\n FirstnameValidator,\n LastnameValidator,\n MiddlenameValidator,\n SuffixValidator\n} from './index';\n\n/**\n * Represents a `Nama` validator to help the nama parser\n * @class\n * @implements {Validator}\n */\nexport default class NamaValidator implements Validator<Nama> {\n readonly type: ValidatorType = ValidatorType.NAMA;\n /**\n * Validates the content of a JSON-formatted names\n * @param {string} value data to validate\n */\n validate(value: Nama): void {\n\n const entries = Object.entries(value);\n if (entries.length < MIN_NUMBER_NAME_PART && entries.length > MAX_NUMBER_NAME_PART)\n throw new ValidationError('incomplete JSON object', 'Nama')\n\n const validators = {\n [Namon.PREFIX]: new PrefixValidator(),\n [Namon.FIRST_NAME]: new FirstnameValidator(),\n [Namon.MIDDLE_NAME]: new MiddlenameValidator(),\n [Namon.LAST_NAME]: new LastnameValidator(),\n [Namon.SUFFIX]: new SuffixValidator(),\n };\n for (const entry of entries) {\n const k = entry[0] as keyof Nama;\n const v = entry[1] as string;\n validators[k].validate(v);\n }\n }\n}\n","/**\n * Core contents\n *\n * Created on June 30, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\n\n/**\n * Extends `Set` functionalities by shuffling the set values and return one\n */\nexport class CharSet<T> extends Set<T> {\n random(): T {\n return Array.from(this)[Math.floor(Math.random() * this.size)];\n }\n}\n\n/**\n * Extends `Array` functionalities\n */\nexport class CharArray<T> extends Array<T> {\n\n}\n","/**\n * Array of `Name` validator\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Name, Namon, Lastname, Firstname } from '../models';\nimport {\n Validator,\n ValidatorType,\n ValidationError ,\n PrefixValidator,\n FirstnameValidator,\n LastnameValidator,\n MiddlenameValidator,\n SuffixValidator\n} from './index';\nimport {\n MIN_NUMBER_NAME_PART,\n MAX_NUMBER_NAME_PART,\n FIRST_LAST_NAME_INDEX,\n FIRST_MIDDLE_LAST_NAME_INDEX,\n PREFIX_FIRST_MIDDLE_LAST_NAME_INDEX,\n PREFIX_FIRST_MIDDLE_LAST_SUFFIX_NAME_INDEX,\n} from '../core/constants';\n\n/**\n * Represents a validator to help the array `Name` parser\n * @class\n * @classdesc\n * This validator validates a array of `Name` objects following a specific order\n * based on the count of elements. It is expected that the array has to be\n * between two and five elements.\n *\n */\nexport default class ArrayNameValidator implements Validator<Name[]> {\n readonly type: ValidatorType = ValidatorType.ARR_NAMES;\n /**\n * Validates the content of a set of custom `Name`s\n * @param {Name[]} value data to validate\n */\n validate(values: Name[]): void {\n if (values.length < MIN_NUMBER_NAME_PART || values.length > MAX_NUMBER_NAME_PART)\n throw new ValidationError(\n `must be an array of ${MIN_NUMBER_NAME_PART} - ` +\n `${MAX_NUMBER_NAME_PART} 'Name's`, 'Array of Names'\n );\n\n const validators = {\n [Namon.PREFIX]: new PrefixValidator(),\n [Namon.FIRST_NAME]: new FirstnameValidator(),\n [Namon.MIDDLE_NAME]: new MiddlenameValidator(),\n [Namon.LAST_NAME]: new LastnameValidator(),\n [Namon.SUFFIX]: new SuffixValidator(),\n } as const;\n\n switch(values.length) {\n case FIRST_LAST_NAME_INDEX:\n values.forEach(n => {\n if ( ![Namon.FIRST_NAME, Namon.LAST_NAME].includes(n.type) )\n throw new ValidationError('Both first and last names are required')\n validators[n.type].validate(n.tostring())\n });\n break;\n case FIRST_MIDDLE_LAST_NAME_INDEX:\n values.forEach(n => {\n if ( ![Namon.FIRST_NAME, Namon.MIDDLE_NAME, Namon.LAST_NAME].includes(n.type) )\n throw new ValidationError('First, middle and last names are required')\n validators[n.type].validate(n.tostring())\n });\n break;\n case PREFIX_FIRST_MIDDLE_LAST_NAME_INDEX:\n values.forEach(n => {\n if ( ![Namon.PREFIX, Namon.FIRST_NAME, Namon.MIDDLE_NAME,\n Namon.LAST_NAME].includes(n.type) )\n throw new ValidationError('More fields are required')\n validators[n.type].validate(n.tostring())\n });\n break;\n case PREFIX_FIRST_MIDDLE_LAST_SUFFIX_NAME_INDEX:\n values.forEach(n => {\n if ( ![Namon.PREFIX, Namon.FIRST_NAME, Namon.MIDDLE_NAME, Namon.LAST_NAME,\n Namon.SUFFIX].includes(n.type) )\n throw new ValidationError('More fields are required')\n validators[n.type].validate(n.tostring())\n });\n break;\n }\n }\n}","/**\n * Array of string validator\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { NameIndex } from '../models';\nimport {\n MIN_NUMBER_NAME_PART,\n MAX_NUMBER_NAME_PART,\n FIRST_LAST_NAME_INDEX,\n FIRST_MIDDLE_LAST_NAME_INDEX,\n PREFIX_FIRST_MIDDLE_LAST_NAME_INDEX,\n PREFIX_FIRST_MIDDLE_LAST_SUFFIX_NAME_INDEX,\n} from '../core/constants';\nimport {\n Validator,\n ValidatorType,\n ValidationError ,\n PrefixValidator,\n FirstnameValidator,\n LastnameValidator,\n MiddlenameValidator,\n SuffixValidator\n} from './index';\n\n/**\n * Represents a validator to help the array string parser\n * @class\n * @classdesc\n * This validator validates an array of string name following a specific order\n * based on the count of elements. It is expected that the array has to be between\n * two and five elements. Also, the order of appearance set in the configuration\n * influences how this validation is carried out.\n *\n * Ordered by first name, the validator validates the following:\n * - 2 elements: firstname lastname\n * - 3 elements: firstname middlename lastname\n * - 4 elements: prefix firstname middlename lastname\n * - 5 elements: prefix firstname middlename lastname suffix\n *\n * Ordered by last name, the validator validates the following:\n * - 2 elements: lastname firstname\n * - 3 elements: lastname firstname middlename\n * - 4 elements: prefix lastname firstname middlename\n * - 5 elements: prefix lastname firstname middlename suffix\n */\nexport default class ArrayStringValidator implements Validator<string[]> {\n readonly type: ValidatorType = ValidatorType.ARR_STRING;\n\n /**\n * Creates an instance of the validator\n * @param indexing how to index the name parts\n */\n constructor(public indexing: NameIndex) {}\n\n /**\n * Validates the content of a name\n * @param {string} value data to validate\n */\n validate(values: string[]): void {\n\n if (values.length < MIN_NUMBER_NAME_PART || values.length > MAX_NUMBER_NAME_PART)\n throw new ValidationError(\n `must be an array of ${MIN_NUMBER_NAME_PART} - ` +\n `${MAX_NUMBER_NAME_PART} elements`,\n 'Array of names'\n )\n\n const pf = new PrefixValidator();\n const sf = new SuffixValidator();\n const fn = new FirstnameValidator();\n const ln = new LastnameValidator();\n const mn = new MiddlenameValidator();\n\n const index = this.indexing;\n\n switch(values.length) {\n case FIRST_LAST_NAME_INDEX:\n fn.validate(values[index.firstname]);\n ln.validate(values[index.lastname]);\n break;\n case FIRST_MIDDLE_LAST_NAME_INDEX:\n fn.validate(values[index.firstname]);\n mn.validate(values[index.middlename]);\n ln.validate(values[index.lastname]);\n break;\n case PREFIX_FIRST_MIDDLE_LAST_NAME_INDEX:\n pf.validate(values[index.prefix]);\n fn.validate(values[index.firstname]);\n mn.validate(values[index.middlename]);\n ln.validate(values[index.lastname]);\n break;\n case PREFIX_FIRST_MIDDLE_LAST_SUFFIX_NAME_INDEX:\n pf.validate(values[index.prefix]);\n fn.validate(values[index.firstname]);\n mn.validate(values[index.middlename]);\n ln.validate(values[index.lastname]);\n sf.validate(values[index.suffix])\n break;\n }\n }\n}","/**\n * String of full name validator\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Validator, ValidatorType, ValidationError, ValidationRule } from './index';\n\n/**\n * Represents a string full name validator\n * @class\n * @implements {Validator}\n */\nexport default class StringNameValidator implements Validator<string> {\n readonly type: ValidatorType = ValidatorType.FULL_NAME;\n /**\n * Validates the content of a name\n * @param {string} value data to validate\n */\n validate(value: string): void {\n if (!ValidationRule.fullname.test(value))\n throw new ValidationError(`invalid string content '${value}'`, 'Full name');\n }\n}","/**\n * An array of string parser\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport {\n Namon,\n Fullname,\n Firstname,\n Lastname,\n Name,\n Prefix,\n Suffix,\n NameIndex,\n NameOrder\n} from '../../models';\nimport { ArrayStringValidator } from '../../validators';\nimport { organizeNameIndex } from '../../core';\nimport { Parser } from './parser';\n\n\n/**\n * Represents an array string parser\n * @class\n * @implements {Parser<string[]>}\n *\n * This parser parses an array of string name following a specific order based\n * on the count of elements. It is expected that the array has to be between two\n * and five elements. Also, the order of appearance set in the configuration\n * influences how this parsing is carried out.\n *\n * Ordered by first name, the parser works as follows:\n * - 2 elements: firstname lastname\n * - 3 elements: firstname middlename lastname\n * - 4 elements: prefix firstname middlename lastname\n * - 5 elements: prefix firstname middlename lastname suffix\n *\n * Ordered by last name, the parser works as follows:\n * - 2 elements: lastname firstname\n * - 3 elements: lastname firstname middlename\n * - 4 elements: prefix lastname firstname middlename\n * - 5 elements: prefix lastname firstname middlename suffix\n *\n */\nexport default class ArrayStringParser implements Parser<string[]> {\n\n /**\n * Create a parser ready to parse the raw data\n * @param {string[]} raw data\n */\n constructor(public raw: string[]) { }\n\n /**\n * Parses the raw data into a full name\n */\n parse(options: { orderedBy: NameOrder, bypass: boolean }): Fullname {\n\n // given this setting\n const { orderedBy, bypass } = options;\n\n // validate first\n const raw = this.raw.map(n => n.trim()); // cleanup\n const index = organizeNameIndex(orderedBy, raw.length);\n if (!bypass) new ArrayStringValidator(index).validate(raw);\n\n // then distribute all the elements accordingly\n const fullname = this.distribute(raw, index);\n\n // finally return high quality of data\n return fullname;\n }\n\n private distribute(raw: string[], index: NameIndex): Fullname {\n\n const fullname: Fullname = {\n firstname: null,\n lastname: null,\n middlename: [],\n prefix: null,\n suffix: null,\n };\n\n switch (raw.length) {\n case 2: // first name + last name\n fullname.firstname = new Firstname(raw[index.firstname]);\n fullname.lastname = new Lastname(raw[index.lastname]);\n break;\n case 3: // first name + middle name + last name\n fullname.firstname = new Firstname(raw[index.firstname]);\n fullname.middlename.push(new Name(raw[index.middlename], Namon.MIDDLE_NAME));\n fullname.lastname = new Lastname(raw[index.lastname]);\n break;\n case 4: // prefix + first name + middle name + last name\n fullname.prefix = raw[index.prefix] as Prefix;\n fullname.firstname = new Firstname(raw[index.firstname]);\n fullname.middlename.push(new Name(raw[index.middlename], Namon.MIDDLE_NAME));\n fullname.lastname = new Lastname(raw[index.lastname]);\n break;\n case 5: // prefix + first name + middle name + last name + suffix\n fullname.prefix = raw[index.prefix] as Prefix;\n fullname.firstname = new Firstname(raw[index.firstname]);\n fullname.middlename.push(new Name(raw[index.middlename], Namon.MIDDLE_NAME));\n fullname.lastname = new Lastname(raw[index.lastname]);\n fullname.suffix = raw[index.suffix] as Suffix;\n break;\n }\n return fullname;\n }\n}\n","/**\n * A `Nama` (JSON signature) parser\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Namon, Nama, Fullname, Firstname, Lastname, Name, Prefix, Suffix } from '../../models/index';\nimport { NamaValidator } from '../../validators/index';\nimport { Parser } from './parser';\n\n\n/**\n * Represents a `Nama` parser\n * @class\n * @implements {Parser<Nama>}\n *\n * This parser parses a JSON signature of the name parts provided as string\n * values. This is to facilitate a developer's life that holds users' info in a\n * JSON format. In other words, the developer only needs to provide similar info\n * and the rest will follow.\n */\nexport default class NamaParser implements Parser<Nama> {\n /**\n * Create a parser ready to parse the raw data\n * @param {Nama} raw data as JSON object\n */\n constructor(public raw: Nama) { }\n\n /**\n * Parses the raw data into a full name\n */\n parse(options: { bypass: boolean }): Fullname {\n\n // validate first\n if (!options.bypass) new NamaValidator().validate(this.raw);\n\n // then distribute all the elements accordingly\n const fullname = this.distribute();\n\n // finally return high quality of data\n return fullname;\n }\n\n private distribute(): Fullname {\n const fullname: Fullname = {\n firstname: null,\n lastname: null,\n middlename: [],\n prefix: null,\n suffix: null,\n };\n\n for (const entry of Object.entries(this.raw)) {\n const key = entry[0] as keyof Nama;\n const value = entry[1] as string;\n switch (key) {\n case Namon.FIRST_NAME:\n fullname.firstname = new Firstname(value);\n break;\n case Namon.LAST_NAME:\n fullname.lastname = new Lastname(value);\n break;\n case Namon.MIDDLE_NAME:\n fullname.middlename.push(new Name(value, Namon.MIDDLE_NAME));\n break;\n case Namon.PREFIX:\n fullname.prefix = value as Prefix;\n break;\n case Namon.SUFFIX:\n fullname.suffix = value as Suffix;\n break;\n }\n }\n return fullname;\n }\n}\n","/**\n * A string parser\n *\n * Created on March 15, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { Separator, Fullname, NameOrder } from '../../models/index';\nimport { Parser, ArrayStringParser } from './index';\n\n\n/**\n * Represents a string parser\n * @class\n * @implements {Parser}\n * @classdesc\n * This parser parses a string name using a separator, if set, or simply using\n * the space character <' '> as a basis for the split.\n *\n * **NOTE**:\n * A string name is basically a string type containing the name parts differentiated\n * with the help of a separator. The default separator is the character <space>\n * or <' '>. However, it can be very, very helpful to use a distinct separator\n * (e.g., a colon <:>) to handle multiple names for a `Namon`. That is to say,\n * a piece of name shaped as `De La Cruz` is a last name that needs to be handled\n * as a whole, and therefore requires that a different type of separator to split\n * up the name parts. Alternatively, the `ArrayStringParser` can be used by indicating\n * specifically which part of the name is what. Do note that this parser is actually\n * a wrapper of the `ArrayStringParser`.\n *\n * @example\n * Given the name `Maria De La Cruz`, using this parser without indicating a\n * separator different than <space> will definitely throw an error. So, if the proper\n * proper of doing when `De La Cruz` is the last name:\n * ```\n * > const name = new Namefully('Maria:De La Cruz', { separator: Separator.COLON })\n * > console.log(name.getLastname())\n * De La Cruz\n * ```\n * Or\n * ```\n * > const name = new Namefully(['Maria', 'De La Cruz'])\n * > console.log(name.getLastname())\n * De La Cruz\n * ```\n */\nexport default class StringParser implements Parser<string> {\n\n /**\n * Create a parser ready to parse the raw data\n * @param {string} raw data as a string representation\n */\n constructor(public raw: string) {}\n\n /**\n * Parses the raw data into a full name\n * @param options how to parse\n */\n parse(options: {\n orderedBy: NameOrder,\n separator: Separator,\n bypass: boolean,\n }): Fullname {\n\n // given this setting\n const { orderedBy, separator, bypass } = options;\n\n // then distribute all the elements accordingly\n const nama = this.raw.split(separator);\n const fullname = new ArrayStringParser(nama).parse({ orderedBy, bypass });\n\n // finally return high quality of data\n return fullname;\n }\n}\n","/**\n * Utils for the core functionalities of `Namefully`\n *\n * Created on March 16, 2020\n * @author Ralph Florent <ralflornt@gmail.com>\n */\nimport { NameIndex, NameOrder, Separator, NameType } from '../models';\nimport {\n NAME_INDEX,\n RESTRICTED_CHARS,\n PASSWORD_MAPPER,\n FIRST_LAST_NAME_INDEX,\n LAST_FIRST_NAME_INDEX,\n FIRST_MIDDLE_LAST_NAME_INDEX,\n LAST_FIRST_MIDDLE_NAME_INDEX,\n PREFIX_FIRST_MIDDLE_LAST_NAME_INDEX,\n PREFIX_LAST_FIRST_MIDDLE_NAME_INDEX,\n PREFIX_FIRST_MIDDLE_LAST_SUFFIX_NAME_INDEX,\n PREFIX_LAST_FIRST_MIDDLE_SUFFIX_NAME_INDEX,\n} from '../core';\n\n/**\n * Capitalizes a string\n * @param str string value\n * @param {'initial' | 'all'} [option] how to capitalize it\n */\nexport function capitalize(str: string, option: 'initial' | 'all' = 'initial'): string {\n if (!str) return '';\n const initial = str[0].toUpperCase();\n const rest = str.slice(1).toLowerCase();\n return option === 'initial' ? initial.concat(rest) : str.toUpperCase();\n}\n\n/**\n * De-capitalizes a string\n * @param str string value\n * @param {'initial' | 'all'} [option] how to decapitalize it\n */\nexport function decapitalize(str: string, option: 'initial' | 'all' = 'initial'): string {\n if (!str) return '';\n const initial = str[0].toLowerCase();\n const rest = str.slice(1);\n return option === 'initial' ? initial.concat(rest) : str.toLowerCase();\n}\n\n/**\n * Toggles a string representation\n * @param str string value to toggle\n */\nexport function toggleCase(str: string): string {\n const chars = [];\n for (const c of str) {\n if (c === c.toUpperCase()) {\n chars.push(c.toLowerCase())\n } else {\n chars.push(c.toUpperCase())\n }\n }\n return chars.join(Separator.EMPTY);\n}\n\n/**\n * Reorganizes the existing global indexes for array of name parts\n * @param orderedBy by first or last name\n * @param argLength length of the provided array\n * @param nameIndex global preset of indexing\n */\nexport function organizeNameIndex(\n orderedBy: NameOrder,\n argLength: number,\n nameIndex: NameIndex = NAME_INDEX\n): NameIndex {\n const out: NameIndex = { ...nameIndex };\n\n if (orderedBy === 'firstname') {\n switch(argLength) {\n case FIRST_LAST_NAME_INDEX: // first name + last name\n out.firstname = 0;\n out.lastname = 1;\n break;\n case FIRST_MIDDLE_LAST_NAME_INDEX: // first name + middle name + last name\n out.firstname = 0;\n out.middlename = 1;\n out.lastname = 2;\n break;\n case PREFIX_FIRST_MIDDLE_LAST_NAME_INDEX: // prefix + first name + middle name + last name\n out.prefix = 0;\n out.firstname = 1;\n out.middlename = 2;\n out.lastname = 3;\n break;\n case PREFIX_FIRST_MIDDLE_LAST_SUFFIX_NAME_INDEX: // prefix + first name + middle name + last name + suffix\n out.prefix = 0;\n out.firstname = 1;\n out.middlename = 2;\n out.lastname = 3;\n out.suffix = 4;\n break;\n }\n }\n else {\n switch(argLength) {\n case LAST_FIRST_NAME_INDEX: // last name + first name\n out.lastname = 0;\n out.firstname = 1;\n break;\n case LAST_FIRST_MIDDLE_NAME_INDEX: // last name + first name + middle name\n out.lastname = 0;\n out.firstname = 1;\n out.middlename = 2;\n break;\n case PREFIX_LAST_FIRST_MIDDLE_NAME_INDEX: // prefix + last name + first name + middle name\n out.prefix = 0;\n out.lastname = 1;\n out.firstname = 2;\n out.middlename = 3;\n break;\n case PREFIX_LAST_FIRST_MIDDLE_SUFFIX_NAME_INDEX: // prefix + last name + first name + middle name + suffix\n out.prefix = 0;\n out.lastname = 1;\n out.firstname = 2;\n out.middlename = 3;\n out.suffix = 4;\n break;\n }\n }\n return out;\n}\n\n/**\n * Makes it easy to manipulate shortcuts for this `NameType`\n * @param type name type\n */\nexport function allowShortNameType(type: NameType): NameType {\n switch(type) {\n case 'firstname': case 'fn': return 'firstname';\n case 'lastname': case 'ln': return 'lastname';\n case 'middlename': case 'mn': return 'middlename';\n default:\n return type;\n }\n}\n\n/**\n * Makes it easy to manipulate shortcuts for this `NameOrder`\n * @param type name type\n */\nexport function allowShortNameOrder(type: NameOrder): NameOrder {\n switch(type) {\n case 'firstname': case 'fn': return 'firstname';\n case 'lastname': case 'ln': return 'lastname';\n default:\n return type;\n }\n}\n\n/**\n * Converts to ascii characters (using UTF-16)\n * @param str string content\n * @param restrictions unneeded content to skip\n */\nexport function convertToAscii(\n str: string,\n restrictions: string[] = [...RESTRICTED_CHARS]\n): number[] {\n return str\n .split(Separator.EMPTY)\n .filter(c => restrictions.indexOf(c) === -1)\n .map(c => c.charCodeAt(0));\n}\n\n/**\n * Generates a password\n * @param str string content\n */\nexport function generatePassword(str: string): string {\n const mapper = PASSWORD_MAPPER;\n\n const password = str\n .split(Separator.EMPTY)\n .map(char => {\n if (mapper.has(char.toLowerCase()))\n return mapper.get(char.toLowerCase()).random();\n return mapper.get('$').random();\n })\n .join(Separator.EMPTY);\n return password;\n}\n"],"sourceRoot":""}