Skip to content

Commit 6914e3e

Browse files
committed
feat(new tool): Credit Card Checker and Info
1 parent 545d7f0 commit 6914e3e

File tree

5 files changed

+68
-0
lines changed

5 files changed

+68
-0
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
"countries-db": "^1.2.0",
120120
"country-code-lookup": "^0.1.3",
121121
"crc": "^4.3.2",
122+
"creditcard": "^0.1.3",
122123
"creditcard-generator": "^0.0.7",
123124
"cron-parser": "^4.9.0",
124125
"cron-validator": "^1.3.1",

pnpm-lock.yaml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<script setup lang="ts">
2+
import { parse } from 'creditcard';
3+
import { useQueryParam } from '@/composable/queryParams';
4+
5+
const cardNumber = useQueryParam({ tool: 'credit-card-validator', name: 'number', defaultValue: '' });
6+
const parsed = computed(() => {
7+
if (!cardNumber.value) {
8+
return null;
9+
}
10+
return parse(cardNumber.value);
11+
});
12+
</script>
13+
14+
<template>
15+
<div style="max-width: 600px;">
16+
<c-input-text
17+
v-model:value="cardNumber"
18+
label="Credit Card Number:"
19+
label-position="left"
20+
placeholder="e.g. 4111 1111 1111 1111"
21+
mb-2
22+
/>
23+
24+
<n-alert v-if="parsed && !parsed.validates" type="error">
25+
Invlid Credit Card Number
26+
</n-alert>
27+
<n-card v-if="parsed && parsed.validates" title="Credit Card Number Info">
28+
<input-copyable label="Formatted:" label-position="left" label-width="150px" mb-1 :value="parsed.formatted" />
29+
<input-copyable label="PAN Truncated:" label-position="left" label-width="150px" mb-1 :value="parsed.truncate" />
30+
<input-copyable label="Scheme:" label-position="left" label-width="150px" mb-1 :value="parsed.scheme || 'Unknown'" />
31+
<input-copyable label="Major Industry Identifier:" mb-1 :value="parsed.mii" />
32+
<input-copyable label="Issuer Identifier Number:" mb-1 :value="parsed.iin" />
33+
<input-copyable label="CVV Length:" label-position="left" label-width="150px" mb-1 :value="parsed.cvv" />
34+
</n-card>
35+
</div>
36+
</template>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
declare module 'creditcard' {
2+
export function parse(creditCardNumber: string): {
3+
formatted: string
4+
truncate: string
5+
scheme: string
6+
mii: string
7+
iin: string
8+
validates: boolean
9+
cvv: number
10+
}
11+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { CreditCard } from '@vicons/tabler';
2+
import { defineTool } from '../tool';
3+
4+
export const tool = defineTool({
5+
name: 'Credit Card Checker',
6+
path: '/credit-card-checker',
7+
description: 'Check a Credit Card number for validity',
8+
keywords: ['credit', 'card', 'checker'],
9+
component: () => import('./credit-card-checker.vue'),
10+
icon: CreditCard,
11+
createdAt: new Date('2025-10-03'),
12+
category: 'Data',
13+
});

0 commit comments

Comments
 (0)