is-valid-autocomplete.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. export const autocomplete = {
  2. stateTerms: ['on', 'off'],
  3. standaloneTerms: [
  4. 'name',
  5. 'honorific-prefix',
  6. 'given-name',
  7. 'additional-name',
  8. 'family-name',
  9. 'honorific-suffix',
  10. 'nickname',
  11. 'username',
  12. 'new-password',
  13. 'current-password',
  14. 'organization-title',
  15. 'organization',
  16. 'street-address',
  17. 'address-line1',
  18. 'address-line2',
  19. 'address-line3',
  20. 'address-level4',
  21. 'address-level3',
  22. 'address-level2',
  23. 'address-level1',
  24. 'country',
  25. 'country-name',
  26. 'postal-code',
  27. 'cc-name',
  28. 'cc-given-name',
  29. 'cc-additional-name',
  30. 'cc-family-name',
  31. 'cc-number',
  32. 'cc-exp',
  33. 'cc-exp-month',
  34. 'cc-exp-year',
  35. 'cc-csc',
  36. 'cc-type',
  37. 'transaction-currency',
  38. 'transaction-amount',
  39. 'language',
  40. 'bday',
  41. 'bday-day',
  42. 'bday-month',
  43. 'bday-year',
  44. 'sex',
  45. 'url',
  46. 'photo',
  47. 'one-time-code'
  48. ],
  49. qualifiers: ['home', 'work', 'mobile', 'fax', 'pager'],
  50. qualifiedTerms: [
  51. 'tel',
  52. 'tel-country-code',
  53. 'tel-national',
  54. 'tel-area-code',
  55. 'tel-local',
  56. 'tel-local-prefix',
  57. 'tel-local-suffix',
  58. 'tel-extension',
  59. 'email',
  60. 'impp'
  61. ],
  62. locations: ['billing', 'shipping']
  63. };
  64. function isValidAutocomplete(
  65. autocompleteValue,
  66. {
  67. looseTyped = false,
  68. stateTerms = [],
  69. locations = [],
  70. qualifiers = [],
  71. standaloneTerms = [],
  72. qualifiedTerms = []
  73. } = {}
  74. ) {
  75. autocompleteValue = autocompleteValue.toLowerCase().trim();
  76. stateTerms = stateTerms.concat(autocomplete.stateTerms);
  77. if (stateTerms.includes(autocompleteValue) || autocompleteValue === '') {
  78. return true;
  79. }
  80. qualifiers = qualifiers.concat(autocomplete.qualifiers);
  81. locations = locations.concat(autocomplete.locations);
  82. standaloneTerms = standaloneTerms.concat(autocomplete.standaloneTerms);
  83. qualifiedTerms = qualifiedTerms.concat(autocomplete.qualifiedTerms);
  84. const autocompleteTerms = autocompleteValue.split(/\s+/g);
  85. if (!looseTyped) {
  86. if (
  87. autocompleteTerms[0].length > 8 &&
  88. autocompleteTerms[0].substr(0, 8) === 'section-'
  89. ) {
  90. autocompleteTerms.shift();
  91. }
  92. if (locations.includes(autocompleteTerms[0])) {
  93. autocompleteTerms.shift();
  94. }
  95. if (qualifiers.includes(autocompleteTerms[0])) {
  96. autocompleteTerms.shift();
  97. // only quantifiers allowed at this point
  98. standaloneTerms = [];
  99. }
  100. if (autocompleteTerms.length !== 1) {
  101. return false;
  102. }
  103. }
  104. const purposeTerm = autocompleteTerms[autocompleteTerms.length - 1];
  105. return (
  106. standaloneTerms.includes(purposeTerm) ||
  107. qualifiedTerms.includes(purposeTerm)
  108. );
  109. }
  110. export default isValidAutocomplete;