Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/forms / coverage / lcov-report / validators / isValidCreditCard.ts.html
Size: Mime:
<!doctype html>
<html lang="en">
<head>
    <title>Code coverage report for validators/isValidCreditCard.ts</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="../prettify.css" />
    <link rel="stylesheet" href="../base.css" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style type='text/css'>
        .coverage-summary .sorter {
            background-image: url(../sort-arrow-sprite.png);
        }
    </style>
</head>
<body>
<div class='wrapper'>
  <div class='pad1'>
    <h1>
      <a href="../index.html">All files</a> / <a href="index.html">validators</a> isValidCreditCard.ts
    </h1>
    <div class='clearfix'>
      <div class='fl pad1y space-right2'>
        <span class="strong">87.01% </span>
        <span class="quiet">Statements</span>
        <span class='fraction'>67/77</span>
      </div>
      <div class='fl pad1y space-right2'>
        <span class="strong">53.85% </span>
        <span class="quiet">Branches</span>
        <span class='fraction'>14/26</span>
      </div>
      <div class='fl pad1y space-right2'>
        <span class="strong">87.5% </span>
        <span class="quiet">Functions</span>
        <span class='fraction'>7/8</span>
      </div>
      <div class='fl pad1y space-right2'>
        <span class="strong">86.49% </span>
        <span class="quiet">Lines</span>
        <span class='fraction'>64/74</span>
      </div>
    </div>
  </div>
  <div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">44x</span>
<span class="cline-any cline-yes">24x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">108x</span>
<span class="cline-any cline-yes">24x</span>
<span class="cline-any cline-yes">24x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/* eslint-disable brace-style */
&nbsp;
/**
 * @module creditcard
 * @todo https://github.com/braintree/card-validator
 * @todo https://github.com/braintree/credit-card-type
 *
 * @todo charAt(0) for TABWL-804 ?
 *
 * @description in easy checkout page we have used number format
 *              so adding "3" to accumulate the space between the number seprations
 *
 * @example $('#skMob_paymentCardCVC, #skMob_creditCardCVC, #skMob_addEditpaymentCardCVC')
 * @example `yy/mm/dd`
 */
import { isArray, isEmpty, isString, isNumber, EMPTY_REGEXP } from 'exotic'
import { curry2 } from 'chain-able-boost'
import { test } from './__match'
&nbsp;
type CreditCardDataType = string | number
&nbsp;
/**
 * @todo inputFieldText;
 * @todo if year !== 2;
 */
// const getYear = (x: string): string | number =&gt;
//   x.split('/')[1] ? x.split('/')[1].length : ''
&nbsp;
/**
 * @see https://www.freeformatter.com/credit-card-number-generator-validator.html
 * @note DOES NOT MATCH MAEOSTRO
 */
const matchFullCreditCard = /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/
const isFullCreditCard = test(matchFullCreditCard)
&nbsp;
export type AnyMatchList = RegExp[] | ReadonlyArray&lt;RegExp&gt; | RegExp
function anyMatch(list: AnyMatchList, value?: any) {
  if<span class="missing-if-branch" title="else path not taken" >E</span> (arguments.length === 1) {
    return (curriedValue: any): boolean =&gt; anyMatch(list, value)
  }
  // === regexp =&gt; test(regexp, value)
  const <span class="cstat-no" title="statement not covered" >testValue = (pattern: RegExp) =&gt; tes</span>t(pattern, value)
&nbsp;
  if (isArray(list)) {
    return list.some(testValue) as boolean
  } else {
    return test(list as RegExp, value)
  }
}
&nbsp;
/**
 * @description default length validation
 * @todo unused defaults
 */
// const cardLength = 16
// const cvcLength = 3
&nbsp;
const matchMasterCard = /^2[0-9]|^5$|^5[1-5][0-9]{0,14}$/
const matchVisaCard = /^4[0-9]{0,15}$/
const matchAmexCard = /^3$|^3[47][0-9]{0,14}$/
const matchDinnerClubList = Object.freeze([
  /^(3(0([0-5|9][0-9]{11})))$/,
  /^3[689][0-9]{12}$/,
])
const matchDiscoverCardList = Object.freeze([
  // unused? invalid?
  // (value.match(/^6011{0,12}$/) || value.match(/^6(?:4[4-9]{2}|5[0-9]{2})[0-9]{0,14}$/))
  /^6(?:011|5[0-9]{2})[0-9]{0,12}$/,
  /^6(?:44|5[0-9]{2})[0-9]{0,13}$/,
  /^6(?:45|5[0-9]{2})[0-9]{0,13}$/,
  /^6(?:46|5[0-9]{2})[0-9]{0,13}$/,
  /^6(?:47|5[0-9]{2})[0-9]{0,13}$/,
  /^6(?:49|5[0-9]{2})[0-9]{0,13}$/,
  /^6(?:5|5[0-9]{2})[0-9]{0,14}$/,
])
const isNumberSecurityCode = /^\d+$/
&nbsp;
const isVisaCard = test(matchVisaCard)
const isMasterCard = test(matchMasterCard)
const isAmexCard = test(matchAmexCard)
const isDinnerClubCard = anyMatch(matchDinnerClubList)
const isDiscoverCard = anyMatch(matchDiscoverCardList)
const isInvalidCard = card =&gt; isEmpty(card.owns)
&nbsp;
/**
 * @todo isWesternUnion
 */
const masterCard = Object.freeze({
  owns: '002',
  cardLength: 16,
  cvcLength: 3,
  match: matchMasterCard,
  is: isMasterCard,
  icon: 'mastercard',
})
const visaCard = Object.freeze({
  owns: '001',
  cardLength: 16,
  cvcLength: 3,
  match: matchVisaCard,
  is: isVisaCard,
  icon: 'visa',
})
&nbsp;
// @name americanexpress
const amexCard = Object.freeze({
  owns: '003',
  cardLength: 15,
  cvcLength: 4,
  match: matchAmexCard,
  is: isAmexCard,
  icon: 'amex',
})
const discoverCard = Object.freeze({
  owns: '004',
  cardLength: 16,
  cvcLength: 3,
  is: isDiscoverCard,
  match: matchDiscoverCardList,
  icon: 'discovery',
})
const dinnerClubCard = Object.freeze({
  owns: '005',
  cardLength: 15,
  cvcLength: 3,
  match: matchDinnerClubList,
  is: isDinnerClubCard,
  icon: 'dinnerclub',
})
const unknownCard = Object.freeze({
  owns: '',
  cardLength: 0 - 16,
  cvcLength: 0 - 3,
  match: matchFullCreditCard,
  is: isFullCreditCard,
  icon: 'unknown',
})
&nbsp;
const invalidCard = Object.freeze({
  owns: '',
  cardLength: 0,
  cvcLength: 0,
  match: EMPTY_REGEXP,
  is: isInvalidCard,
  icon: 'invalidcard',
})
&nbsp;
export interface CreditCardType {
  owns: string
  cardLength: number
  cvcLength: number
  match: string
  is: (...args: any) =&gt; boolean
  icon: string
  value?: string
}<span class="missing-if-branch" title="if path not taken" >I</span>
<span class="cstat-no" title="statement not covered" ></span>
function _toCreditCardFrom(card: CreditCardType, value?: any) {
  return {
    ...card,
    value,
  }<span class="missing-if-branch" title="if path not taken" >I</span>
}<span class="cstat-no" title="statement not covered" ></span>
&nbsp;
const toC<span class="missing-if-branch" title="if path not taken" >I</span>reditCardFrom = curry2(_toCreditCardFrom)
const to<span class="cstat-no" title="statement not covered" >MasterCard = toCreditCardFrom(</span>masterCard)
const toVisaCard = toCreditCardFrom(visaCard)
const toA<span class="missing-if-branch" title="if path not taken" >I</span>mexCard = toCreditCardFrom(amexCard)
const to<span class="cstat-no" title="statement not covered" >DiscoverCard = toCreditCardF</span>rom(discoverCard)
const toDinnerClub = toCreditCardFrom(dinnerClubCard)
const toI<span class="missing-if-branch" title="if path not taken" >I</span>nvalidCard = toCreditCardFrom(invalidCard)
const to<span class="cstat-no" title="statement not covered" >unknownCard = toCreditCardFro</span>m(unknownCard)
&nbsp;
function toCreditCard(value: CreditCardDataType): CreditCardType {
  // coersion
  if (isMasterCard(value)) {
    return toMasterCard(value)
  } else if (isVisaCard(value)) {
    return toVisaCard(value)
  } else if (isAmexCard(value)) {
    return toAmexCard(value)
  } else if (isDiscoverCard(value)) {
    return toDiscoverCard(value)
  } else if (isDinnerClubCard(value)) {
    return toDinnerClub(value)
  } else if (isFullCreditCard(value)) {
    return tounknownCard(value)
  } else {
    return toInvalidCard(value)
  }
}
&nbsp;
/**
 * @note - this always returns a boolean, to coerce to credit card, use it
 * if you benchmark and need perf boost, add cache or safety to `toInvalidCard`
 *
 * @param {String} value
 * @return {Boolean}
 */
function isValidCreditCard(value: string): boolean {
  if (isString(value) === false) {
    return false
  } else <span class="fstat-no" title="function not covered" >if (isInvalidCard(to</span>CreditCard(value))) {
    console.log(toCr<span class="cstat-no" title="statement not covered" >editCard(value))</span>
    // @todo @help - unknown wh<span class="cstat-no" title="statement not covered" >at todo - is not supported error?</span>
    // else if (isFullCreditCard(value))
    return false<span class="cstat-no" title="statement not covered" ></span>
  } <span class="cstat-no" title="statement not covered" >else {</span>
    // making sure it's a full credit card...
    // @todo may want `isValidPartialCreditCard`...
    return isFullCreditCard(value)
  }
}
&nbsp;
function isValidSecurityCode(value: CreditCardDataType): boolean {
  const coerced = isNumber(value) ? String(value) : value
  const isStringWithLength = isString(coerced) &amp;&amp; coerced.length &gt;= 3
  // @todo @fixme
  const isSecurityCodeValid =
    isStringWithLength &amp;&amp; !!(value as any).match(isNumberSecurityCode)
  return isSecurityCodeValid
}
&nbsp;
export { masterCard }
export { visaCard }
export { amexCard }
export { isAmexCard }
export { discoverCard }
export { dinnerClubCard }
export { invalidCard }
export { toCreditCard }
export { isValidCreditCard }
export { isValidSecurityCode }
export default isValidCreditCard
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
  Code coverage
  generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sat Nov 10 2018 05:28:54 GMT-0800 (Pacific Standard Time)
</div>
</div>
<script src="../prettify.js"></script>
<script>
window.onload = function () {
        if (typeof prettyPrint === 'function') {
            prettyPrint();
        }
};
</script>
<script src="../sorter.js"></script>
</body>
</html>