zod-ir 1.2.2 → 1.3.0
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.
- package/README.md +33 -2
- package/dist/index.d.mts +14 -2
- package/dist/index.d.ts +14 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
- ✈️ **Passport:** Validates Iranian Passport numbers.
|
|
35
35
|
- 📮 **Postal Code:** Validates 10-digit Iranian postal codes.
|
|
36
36
|
- ☎️ **Landline:** Validates fixed line numbers with area codes.
|
|
37
|
-
- 🔄 **Auto-fix Digits:**
|
|
37
|
+
- 🔄 **Auto-fix Digits:** Automatically converts Persian/Arabic digits and characters (ي, ك) to standard format.
|
|
38
|
+
- 🎨 **Metadata Extraction:** Extract **Bank Name/Color** from card numbers and **Operator Name** from mobiles.
|
|
38
39
|
- 🌍 **Bilingual:** Built-in error messages in **Persian** and **English**.
|
|
39
40
|
|
|
40
41
|
---
|
|
@@ -100,7 +101,29 @@ try {
|
|
|
100
101
|
}
|
|
101
102
|
```
|
|
102
103
|
|
|
103
|
-
2.
|
|
104
|
+
2. Extracting Metadata (New ✨)
|
|
105
|
+
You can extract useful information like Bank Name, Brand Color, or Mobile Operator directly from your validated data.
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
import { getBankInfo, getMobileOperator } from "zod-ir";
|
|
109
|
+
|
|
110
|
+
// --- Bank Info ---
|
|
111
|
+
const bank = getBankInfo("6037991155667788");
|
|
112
|
+
if (bank) {
|
|
113
|
+
console.log(bank.name); // "Melli"
|
|
114
|
+
console.log(bank.label); // "ملی"
|
|
115
|
+
console.log(bank.color); // "#EF3F3E" (Great for UI backgrounds!)
|
|
116
|
+
console.log(bank.formatted); // "6037-9911-5566-7788"
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// --- Mobile Operator ---
|
|
120
|
+
const operator = getMobileOperator("09121234567");
|
|
121
|
+
if (operator) {
|
|
122
|
+
console.log(operator.label); // "همراه اول"
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
3. Usage with React Hook Form 📋
|
|
104
127
|
|
|
105
128
|
```typescript
|
|
106
129
|
import { useForm } from "react-hook-form";
|
|
@@ -160,6 +183,14 @@ All validators accept an optional configuration object to customize behavior.
|
|
|
160
183
|
| `locale` | `"fa"`, `"en"` | Language for the default error message (defaults to "fa"). |
|
|
161
184
|
| `strictZero` | `boolean`, `optional` | (Mobile Only) If true, input must start with 0. |
|
|
162
185
|
|
|
186
|
+
## Metadata Helpers (New)
|
|
187
|
+
|
|
188
|
+
| Function | Return Type | Description |
|
|
189
|
+
| :-------------------------- | :---------------------------------- | ------------------------------------------------------------------ |
|
|
190
|
+
| `getBankInfo(card)` | `{ name, label, color, formatted }` | Returns bank details from card number. |
|
|
191
|
+
| `getMobileOperator(mobile)` | `{ name, label }` | Returns operator (MCI, Irancell...) from mobile number. |
|
|
192
|
+
| `verifyAndNormalize(str)` | `string` | Converts Persian/Arabic digits & chars (ي, ك) to standard English. |
|
|
193
|
+
|
|
163
194
|
## License
|
|
164
195
|
|
|
165
196
|
MIT
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
|
+
declare function verifyAndNormalize(value: string): string;
|
|
4
|
+
type BankInfo = {
|
|
5
|
+
name: string;
|
|
6
|
+
label: string;
|
|
7
|
+
color: string;
|
|
8
|
+
formatted: string;
|
|
9
|
+
} | null;
|
|
10
|
+
declare function getBankInfo(cardNumber: string): BankInfo;
|
|
11
|
+
type OperatorInfo = {
|
|
12
|
+
name: string;
|
|
13
|
+
label: string;
|
|
14
|
+
} | null;
|
|
15
|
+
declare function getMobileOperator(mobile: string): OperatorInfo;
|
|
3
16
|
declare function isMelliCode(code: string): boolean;
|
|
4
17
|
declare function isShenaseMelli(code: string): boolean;
|
|
5
18
|
declare function isPassport(code: string): boolean;
|
|
@@ -11,7 +24,6 @@ declare function isIranianMobile(mobile: string, { strictZero }?: MobileValidati
|
|
|
11
24
|
declare function isSheba(code: string): boolean;
|
|
12
25
|
declare function isPostalCode(code: string): boolean;
|
|
13
26
|
declare function isLandline(code: string): boolean;
|
|
14
|
-
declare function verifyAndNormalize(value: string): string;
|
|
15
27
|
|
|
16
28
|
declare const ERROR_MESSAGES: {
|
|
17
29
|
readonly fa: {
|
|
@@ -54,4 +66,4 @@ declare const zPostalCode: (options?: BaseOptions) => z.ZodString;
|
|
|
54
66
|
declare const zLandline: (options?: BaseOptions) => z.ZodString;
|
|
55
67
|
declare const preprocessNumber: (schema: z.ZodTypeAny) => z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
56
68
|
|
|
57
|
-
export { isCardNumber, isIranianMobile, isLandline, isMelliCode, isPassport, isPostalCode, isSheba, isShenaseMelli, preprocessNumber, verifyAndNormalize, zCardNumber, zIranianMobile, zLandline, zMelliCode, zPassport, zPostalCode, zSheba, zShenaseMelli };
|
|
69
|
+
export { getBankInfo, getMobileOperator, isCardNumber, isIranianMobile, isLandline, isMelliCode, isPassport, isPostalCode, isSheba, isShenaseMelli, preprocessNumber, verifyAndNormalize, zCardNumber, zIranianMobile, zLandline, zMelliCode, zPassport, zPostalCode, zSheba, zShenaseMelli };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
|
+
declare function verifyAndNormalize(value: string): string;
|
|
4
|
+
type BankInfo = {
|
|
5
|
+
name: string;
|
|
6
|
+
label: string;
|
|
7
|
+
color: string;
|
|
8
|
+
formatted: string;
|
|
9
|
+
} | null;
|
|
10
|
+
declare function getBankInfo(cardNumber: string): BankInfo;
|
|
11
|
+
type OperatorInfo = {
|
|
12
|
+
name: string;
|
|
13
|
+
label: string;
|
|
14
|
+
} | null;
|
|
15
|
+
declare function getMobileOperator(mobile: string): OperatorInfo;
|
|
3
16
|
declare function isMelliCode(code: string): boolean;
|
|
4
17
|
declare function isShenaseMelli(code: string): boolean;
|
|
5
18
|
declare function isPassport(code: string): boolean;
|
|
@@ -11,7 +24,6 @@ declare function isIranianMobile(mobile: string, { strictZero }?: MobileValidati
|
|
|
11
24
|
declare function isSheba(code: string): boolean;
|
|
12
25
|
declare function isPostalCode(code: string): boolean;
|
|
13
26
|
declare function isLandline(code: string): boolean;
|
|
14
|
-
declare function verifyAndNormalize(value: string): string;
|
|
15
27
|
|
|
16
28
|
declare const ERROR_MESSAGES: {
|
|
17
29
|
readonly fa: {
|
|
@@ -54,4 +66,4 @@ declare const zPostalCode: (options?: BaseOptions) => z.ZodString;
|
|
|
54
66
|
declare const zLandline: (options?: BaseOptions) => z.ZodString;
|
|
55
67
|
declare const preprocessNumber: (schema: z.ZodTypeAny) => z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
56
68
|
|
|
57
|
-
export { isCardNumber, isIranianMobile, isLandline, isMelliCode, isPassport, isPostalCode, isSheba, isShenaseMelli, preprocessNumber, verifyAndNormalize, zCardNumber, zIranianMobile, zLandline, zMelliCode, zPassport, zPostalCode, zSheba, zShenaseMelli };
|
|
69
|
+
export { getBankInfo, getMobileOperator, isCardNumber, isIranianMobile, isLandline, isMelliCode, isPassport, isPostalCode, isSheba, isShenaseMelli, preprocessNumber, verifyAndNormalize, zCardNumber, zIranianMobile, zLandline, zMelliCode, zPassport, zPostalCode, zSheba, zShenaseMelli };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var g=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var k=(n,e)=>{for(var t in e)g(n,t,{get:e[t],enumerable:!0})},F=(n,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of z(e))!P.call(n,r)&&r!==t&&g(n,r,{get:()=>e[r],enumerable:!(a=y(e,r))||a.enumerable});return n};var $=n=>F(g({},"__esModule",{value:!0}),n);var w={};k(w,{getBankInfo:()=>R,getMobileOperator:()=>N,isCardNumber:()=>I,isIranianMobile:()=>C,isLandline:()=>x,isMelliCode:()=>u,isPassport:()=>h,isPostalCode:()=>B,isSheba:()=>S,isShenaseMelli:()=>d,preprocessNumber:()=>W,verifyAndNormalize:()=>b,zCardNumber:()=>K,zIranianMobile:()=>Z,zLandline:()=>G,zMelliCode:()=>D,zPassport:()=>T,zPostalCode:()=>j,zSheba:()=>L,zShenaseMelli:()=>v});module.exports=$(w);var l=require("zod");var M={603799:{name:"Melli",label:"\u0645\u0644\u06CC",color:"#EF3F3E"},589210:{name:"Sepah",label:"\u0633\u067E\u0647",color:"#FFC600"},627648:{name:"ToseeSaderat",label:"\u062A\u0648\u0633\u0639\u0647 \u0635\u0627\u062F\u0631\u0627\u062A",color:"#EDB12C"},627961:{name:"SanatMadar",label:"\u0635\u0646\u0639\u062A \u0648 \u0645\u0639\u062F\u0646",color:"#B3986D"},603770:{name:"Keshavarzi",label:"\u06A9\u0634\u0627\u0648\u0631\u0632\u06CC",color:"#4E7A46"},628023:{name:"Maskan",label:"\u0645\u0633\u06A9\u0646",color:"#F05A23"},627760:{name:"PostBank",label:"\u067E\u0633\u062A \u0628\u0627\u0646\u06A9",color:"#00764D"},502908:{name:"ToseeTaavon",label:"\u062A\u0648\u0633\u0639\u0647 \u062A\u0639\u0627\u0648\u0646",color:"#0064A6"},627412:{name:"EghtesadNovin",label:"\u0627\u0642\u062A\u0635\u0627\u062F \u0646\u0648\u06CC\u0646",color:"#652D86"},622106:{name:"Parsian",label:"\u067E\u0627\u0631\u0633\u06CC\u0627\u0646",color:"#B3282D"},502229:{name:"Pasargad",label:"\u067E\u0627\u0633\u0627\u0631\u06AF\u0627\u062F",color:"#FFC72C"},627488:{name:"Karafarin",label:"\u06A9\u0627\u0631\u0622\u0641\u0631\u06CC\u0646",color:"#3B9C56"},621986:{name:"Saman",label:"\u0633\u0627\u0645\u0627\u0646",color:"#006DB6"},639346:{name:"Sina",label:"\u0633\u06CC\u0646\u0627",color:"#004E8A"},639607:{name:"Sarmayeh",label:"\u0633\u0631\u0645\u0627\u06CC\u0647",color:"#0077B6"},636214:{name:"Ayandeh",label:"\u0622\u06CC\u0646\u062F\u0647",color:"#8B5F34"},502806:{name:"Shahr",label:"\u0634\u0647\u0631",color:"#ED3438"},502938:{name:"Day",label:"\u062F\u06CC",color:"#0099CC"},603769:{name:"Saderat",label:"\u0635\u0627\u062F\u0631\u0627\u062A",color:"#1A3266"},610433:{name:"Mellat",label:"\u0645\u0644\u062A",color:"#D70005"},627353:{name:"Tejarat",label:"\u062A\u062C\u0627\u0631\u062A",color:"#005696"},585983:{name:"Tejarat",label:"\u062A\u062C\u0627\u0631\u062A",color:"#005696"},589463:{name:"Refah",label:"\u0631\u0641\u0627\u0647",color:"#2B3C8E"},627381:{name:"Ansar",label:"\u0627\u0646\u0635\u0627\u0631",color:"#F7B500"},505785:{name:"IranZamin",label:"\u0627\u06CC\u0631\u0627\u0646 \u0632\u0645\u06CC\u0646",color:"#92278F"},505416:{name:"Gardeshgari",label:"\u06AF\u0631\u062F\u0634\u06AF\u0631\u06CC",color:"#1D3265"},636949:{name:"Hekmat",label:"\u062D\u06A9\u0645\u062A",color:"#5F2C83"},505801:{name:"Kosar",label:"\u06A9\u0648\u062B\u0631",color:"#C62828"},606373:{name:"MehrIran",label:"\u0645\u0647\u0631 \u0627\u06CC\u0631\u0627\u0646",color:"#359E49"},504172:{name:"Resalat",label:"\u0631\u0633\u0627\u0644\u062A",color:"#000000"},523388:{name:"Pasargad",label:"\u067E\u0627\u0633\u0627\u0631\u06AF\u0627\u062F (\u0648\u06CC\u067E\u0627\u062F)",color:"#FFC72C"},505809:{name:"Khavarmianeh",label:"\u062E\u0627\u0648\u0631\u0645\u06CC\u0627\u0646\u0647",color:"#1F2B5B"}},O={MCI:{label:"\u0647\u0645\u0631\u0627\u0647 \u0627\u0648\u0644",prefixes:["0910","0911","0912","0913","0914","0915","0916","0917","0918","0919","0990","0991","0992","0993","0994"]},Irancell:{label:"\u0627\u06CC\u0631\u0627\u0646\u0633\u0644",prefixes:["0930","0933","0935","0936","0937","0938","0939","0901","0902","0903","0904","0905","0941"]},Rightel:{label:"\u0631\u0627\u06CC\u062A\u0644",prefixes:["0920","0921","0922","0923"]},Shatel:{label:"\u0634\u0627\u062A\u0644 \u0645\u0648\u0628\u0627\u06CC\u0644",prefixes:["0998"]},Taliya:{label:"\u062A\u0627\u0644\u06CC\u0627",prefixes:["0932"]}};function b(n){if(!n)return"";let e=1776,t=1785,a=1632,r=1641,o=1610,A=1740,c=1603,m=1705,E="";for(let f=0;f<n.length;f++){let i=n.charCodeAt(f),p=n[f];i>=e&&i<=t?p=String(i-e):i>=a&&i<=r?p=String(i-a):i===o?p=String.fromCharCode(A):i===c&&(p=String.fromCharCode(m)),E+=p}return E}function R(n){let e=b(n).replace(/[\-\s]/g,"");if(e.length<6)return null;let t=e.substring(0,6),a=M[t];return a?{...a,formatted:e.replace(/(\d{4})(?=\d)/g,"$1-")}:null}function N(n){let e=b(n),t="";if(e.startsWith("09")?t=e.substring(0,4):e.startsWith("9")?t="0"+e.substring(0,3):e.startsWith("+98")&&(t="0"+e.substring(3,6)),t.length!==4)return null;for(let[a,r]of Object.entries(O))if(r.prefixes.includes(t))return{name:a,label:r.label};return null}function u(n){if(!/^\d{10}$/.test(n)||/^(\d)\1+$/.test(n))return!1;let e=parseInt(n[9]),t=n.substring(0,9).split("").reduce((a,r,o)=>a+parseInt(r)*(10-o),0)%11;return t<2?e===t:e===11-t}function d(n){if(n.length!==11||!/^\d{11}$/.test(n))return!1;let e=parseInt(n[9]),t=parseInt(n[10]),a=[29,27,23,19,17,29,27,23,19,17],r=0;for(let c=0;c<10;c++){let m=parseInt(n[c]);r+=(m+e+2)*a[c]}let o=r%11;return(o===10?0:o)===t}function h(n){return/^[A-Za-z][0-9]{8,9}$/.test(n)}function I(n){let e=n.replace(/[\-\s]/g,"");if(!/^\d{16}$/.test(e))return!1;let t=0,a=!1;for(let r=e.length-1;r>=0;r--){let o=parseInt(e[r]);a&&(o*=2,o>9&&(o-=9)),t+=o,a=!a}return t%10===0}function C(n,{strictZero:e="optional"}={}){let t="9\\d{9}",a="";return e===!0?a=`^0${t}$`:e===!1?a=`^${t}$`:a=`^(?:0|\\+98)?${t}$`,new RegExp(a).test(n)}function S(n){let e=n.toUpperCase().replace(/[\-\s]/g,"");if(e.length!==26||!e.startsWith("IR"))return!1;let a=(e.substring(4)+e.substring(0,4)).split("").map(r=>{let o=r.charCodeAt(0);return o>=48&&o<=57?r:(o-55).toString()}).join("");try{return BigInt(a)%BigInt(97)===BigInt(1)}catch{return!1}}function B(n){return/^[1-9]\d{9}$/.test(n)}function x(n){return/^0\d{2}\d{8}$/.test(n)}var _={fa:{melliCode:"\u06A9\u062F \u0645\u0644\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",shenaseMelli:"\u0634\u0646\u0627\u0633\u0647 \u0645\u0644\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",passport:"\u0634\u0645\u0627\u0631\u0647 \u06AF\u0630\u0631\u0646\u0627\u0645\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",cardNumber:"\u0634\u0645\u0627\u0631\u0647 \u06A9\u0627\u0631\u062A \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",mobile:"\u0634\u0645\u0627\u0631\u0647 \u0645\u0648\u0628\u0627\u06CC\u0644 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",sheba:"\u0634\u0645\u0627\u0631\u0647 \u0634\u0628\u0627 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",postalCode:"\u06A9\u062F \u067E\u0633\u062A\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",landline:"\u0634\u0645\u0627\u0631\u0647 \u062A\u0644\u0641\u0646 \u062B\u0627\u0628\u062A \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A"},en:{melliCode:"Invalid national code",shenaseMelli:"Invalid legal person ID (Shenase Melli)",passport:"Invalid passport number",cardNumber:"Invalid card number",mobile:"Invalid mobile number",sheba:"Invalid Sheba (IBAN) number",postalCode:"Invalid postal code",landline:"Invalid landline number"}},s=(n,e)=>{if(e?.message)return e.message;let t=e?.locale||"fa";return _[t][n]};var D=n=>l.z.string().refine(e=>u(e),{message:s("melliCode",n)}),v=n=>l.z.string().refine(e=>d(e),{message:s("shenaseMelli",n)}),T=n=>l.z.string().refine(e=>h(e),{message:s("passport",n)}),K=n=>l.z.string().refine(e=>I(e),{message:s("cardNumber",n)}),Z=n=>l.z.string().refine(e=>C(e,{strictZero:n?.strictZero}),{message:s("mobile",n)}),L=n=>l.z.string().refine(e=>S(e),{message:s("sheba",n)}),j=n=>l.z.string().refine(e=>B(e),{message:s("postalCode",n)}),G=n=>l.z.string().refine(e=>x(e),{message:s("landline",n)}),W=n=>l.z.preprocess(e=>typeof e=="string"?b(e):e,n);0&&(module.exports={getBankInfo,getMobileOperator,isCardNumber,isIranianMobile,isLandline,isMelliCode,isPassport,isPostalCode,isSheba,isShenaseMelli,preprocessNumber,verifyAndNormalize,zCardNumber,zIranianMobile,zLandline,zMelliCode,zPassport,zPostalCode,zSheba,zShenaseMelli});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/constants.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n isMelliCode,\n isShenaseMelli,\n isPassport,\n isCardNumber,\n isIranianMobile,\n isSheba,\n isPostalCode,\n isLandline,\n verifyAndNormalize,\n} from \"./utils\";\nimport { getMessage, BaseOptions } from \"./constants\";\n\nexport const zMelliCode = (options?: BaseOptions) =>\n z.string().refine((val) => isMelliCode(val), {\n message: getMessage(\"melliCode\", options),\n });\n\nexport const zShenaseMelli = (options?: BaseOptions) =>\n z.string().refine((val) => isShenaseMelli(val), {\n message: getMessage(\"shenaseMelli\", options),\n });\n\nexport const zPassport = (options?: BaseOptions) =>\n z.string().refine((val) => isPassport(val), {\n message: getMessage(\"passport\", options),\n });\n\nexport const zCardNumber = (options?: BaseOptions) =>\n z.string().refine((val) => isCardNumber(val), {\n message: getMessage(\"cardNumber\", options),\n });\n\ninterface MobileOptions extends BaseOptions {\n strictZero?: boolean | \"optional\";\n}\n\nexport const zIranianMobile = (options?: MobileOptions) =>\n z\n .string()\n .refine(\n (val) => isIranianMobile(val, { strictZero: options?.strictZero }),\n {\n message: getMessage(\"mobile\", options),\n }\n );\n\nexport const zSheba = (options?: BaseOptions) =>\n z.string().refine((val) => isSheba(val), {\n message: getMessage(\"sheba\", options),\n });\n\nexport const zPostalCode = (options?: BaseOptions) =>\n z.string().refine((val) => isPostalCode(val), {\n message: getMessage(\"postalCode\", options),\n });\n\nexport const zLandline = (options?: BaseOptions) =>\n z.string().refine((val) => isLandline(val), {\n message: getMessage(\"landline\", options),\n });\n\nexport const preprocessNumber = (schema: z.ZodTypeAny) =>\n z.preprocess((val) => {\n if (typeof val === \"string\") {\n return verifyAndNormalize(val);\n }\n return val;\n }, schema);\n\nexport {\n isMelliCode,\n isShenaseMelli,\n isPassport,\n isCardNumber,\n isIranianMobile,\n isSheba,\n isPostalCode,\n isLandline,\n verifyAndNormalize,\n};\n","export function isMelliCode(code: string): boolean {\n if (!/^\\d{10}$/.test(code)) return false;\n if (/^(\\d)\\1+$/.test(code)) return false;\n\n const check = parseInt(code[9]);\n const sum =\n code\n .substring(0, 9)\n .split(\"\")\n .reduce((acc, x, i) => acc + parseInt(x) * (10 - i), 0) % 11;\n\n return sum < 2 ? check === sum : check === 11 - sum;\n}\n\nexport function isShenaseMelli(code: string): boolean {\n if (code.length !== 11 || !/^\\d{11}$/.test(code)) return false;\n\n const tenth = parseInt(code[9]);\n const inputCheck = parseInt(code[10]);\n const coefficients = [29, 27, 23, 19, 17, 29, 27, 23, 19, 17];\n\n let sum = 0;\n for (let i = 0; i < 10; i++) {\n const digit = parseInt(code[i]);\n sum += (digit + tenth + 2) * coefficients[i];\n }\n\n const remainder = sum % 11;\n const calculatedCheck = remainder === 10 ? 0 : remainder;\n\n return calculatedCheck === inputCheck;\n}\n\nexport function isPassport(code: string): boolean {\n return /^[A-Za-z][0-9]{8,9}$/.test(code);\n}\n\nexport function isCardNumber(code: string): boolean {\n const sanitized = code.replace(/[\\-\\s]/g, \"\");\n if (!/^\\d{16}$/.test(sanitized)) return false;\n\n let sum = 0;\n let shouldDouble = false;\n for (let i = sanitized.length - 1; i >= 0; i--) {\n let digit = parseInt(sanitized[i]);\n if (shouldDouble) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n sum += digit;\n shouldDouble = !shouldDouble;\n }\n return sum % 10 === 0;\n}\n\ninterface MobileValidationOptions {\n strictZero?: boolean | \"optional\";\n}\n\nexport function isIranianMobile(\n mobile: string,\n { strictZero = \"optional\" }: MobileValidationOptions = {}\n): boolean {\n const corePattern = \"9\\\\d{9}\";\n let pattern = \"\";\n if (strictZero === true) pattern = `^0${corePattern}$`;\n else if (strictZero === false) pattern = `^${corePattern}$`;\n else pattern = `^(?:0|\\\\+98)?${corePattern}$`;\n\n return new RegExp(pattern).test(mobile);\n}\n\nexport function isSheba(code: string): boolean {\n const iban = code.toUpperCase().replace(/[\\-\\s]/g, \"\");\n if (iban.length !== 26 || !iban.startsWith(\"IR\")) return false;\n\n const newStr = iban.substring(4) + iban.substring(0, 4);\n const numericString = newStr\n .split(\"\")\n .map((c) => {\n const code = c.charCodeAt(0);\n return code >= 48 && code <= 57 ? c : (code - 55).toString();\n })\n .join(\"\");\n\n try {\n return BigInt(numericString) % BigInt(97) === BigInt(1);\n } catch {\n return false;\n }\n}\n\nexport function isPostalCode(code: string): boolean {\n return /^[1-9]\\d{9}$/.test(code);\n}\n\nexport function isLandline(code: string): boolean {\n return /^0\\d{2}\\d{8}$/.test(code);\n}\n\nexport function verifyAndNormalize(value: string): string {\n return value\n .replace(/[۰-۹]/g, (d) => \"۰۱۲۳۴۵۶۷۸۹\".indexOf(d).toString())\n .replace(/[٠-٩]/g, (d) => \"٠١٢٣٤٥٦٧٨٩\".indexOf(d).toString());\n}\n","export const ERROR_MESSAGES = {\n fa: {\n melliCode: \"کد ملی نامعتبر است\",\n shenaseMelli: \"شناسه ملی نامعتبر است\",\n passport: \"شماره گذرنامه نامعتبر است\",\n cardNumber: \"شماره کارت نامعتبر است\",\n mobile: \"شماره موبایل نامعتبر است\",\n sheba: \"شماره شبا نامعتبر است\",\n postalCode: \"کد پستی نامعتبر است\",\n landline: \"شماره تلفن ثابت نامعتبر است\",\n },\n en: {\n melliCode: \"Invalid national code\",\n shenaseMelli: \"Invalid legal person ID (Shenase Melli)\",\n passport: \"Invalid passport number\",\n cardNumber: \"Invalid card number\",\n mobile: \"Invalid mobile number\",\n sheba: \"Invalid Sheba (IBAN) number\",\n postalCode: \"Invalid postal code\",\n landline: \"Invalid landline number\",\n },\n} as const;\n\nexport type Language = keyof typeof ERROR_MESSAGES;\n\nexport interface BaseOptions {\n message?: string;\n locale?: Language;\n}\n\nexport const getMessage = (\n key: keyof typeof ERROR_MESSAGES[\"fa\"],\n options?: BaseOptions\n): string => {\n if (options?.message) return options.message;\n const lang = options?.locale || \"fa\";\n return ERROR_MESSAGES[lang][key];\n};"],"mappings":"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","names":["index_exports","__export","isCardNumber","isIranianMobile","isLandline","isMelliCode","isPassport","isPostalCode","isSheba","isShenaseMelli","preprocessNumber","verifyAndNormalize","zCardNumber","zIranianMobile","zLandline","zMelliCode","zPassport","zPostalCode","zSheba","zShenaseMelli","__toCommonJS","import_zod","isMelliCode","code","check","sum","acc","x","isShenaseMelli","tenth","inputCheck","coefficients","i","digit","remainder","isPassport","isCardNumber","sanitized","shouldDouble","isIranianMobile","mobile","strictZero","corePattern","pattern","isSheba","iban","numericString","c","isPostalCode","isLandline","verifyAndNormalize","value","d","ERROR_MESSAGES","getMessage","key","options","lang","zMelliCode","options","val","isMelliCode","getMessage","zShenaseMelli","isShenaseMelli","zPassport","isPassport","zCardNumber","isCardNumber","zIranianMobile","isIranianMobile","zSheba","isSheba","zPostalCode","isPostalCode","zLandline","isLandline","preprocessNumber","schema","verifyAndNormalize"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/data.ts","../src/utils.ts","../src/constants.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n isMelliCode,\n isShenaseMelli,\n isPassport,\n isCardNumber,\n isIranianMobile,\n isSheba,\n isPostalCode,\n isLandline,\n verifyAndNormalize,\n getBankInfo,\n getMobileOperator,\n} from \"./utils\";\nimport { getMessage, BaseOptions } from \"./constants\";\n\nexport const zMelliCode = (options?: BaseOptions) =>\n z.string().refine((val) => isMelliCode(val), {\n message: getMessage(\"melliCode\", options),\n });\n\nexport const zShenaseMelli = (options?: BaseOptions) =>\n z.string().refine((val) => isShenaseMelli(val), {\n message: getMessage(\"shenaseMelli\", options),\n });\n\nexport const zPassport = (options?: BaseOptions) =>\n z.string().refine((val) => isPassport(val), {\n message: getMessage(\"passport\", options),\n });\n\nexport const zCardNumber = (options?: BaseOptions) =>\n z.string().refine((val) => isCardNumber(val), {\n message: getMessage(\"cardNumber\", options),\n });\n\ninterface MobileOptions extends BaseOptions {\n strictZero?: boolean | \"optional\";\n}\n\nexport const zIranianMobile = (options?: MobileOptions) =>\n z\n .string()\n .refine(\n (val) => isIranianMobile(val, { strictZero: options?.strictZero }),\n {\n message: getMessage(\"mobile\", options),\n }\n );\n\nexport const zSheba = (options?: BaseOptions) =>\n z.string().refine((val) => isSheba(val), {\n message: getMessage(\"sheba\", options),\n });\n\nexport const zPostalCode = (options?: BaseOptions) =>\n z.string().refine((val) => isPostalCode(val), {\n message: getMessage(\"postalCode\", options),\n });\n\nexport const zLandline = (options?: BaseOptions) =>\n z.string().refine((val) => isLandline(val), {\n message: getMessage(\"landline\", options),\n });\n\nexport const preprocessNumber = (schema: z.ZodTypeAny) =>\n z.preprocess((val) => {\n if (typeof val === \"string\") {\n return verifyAndNormalize(val);\n }\n return val;\n }, schema);\n\nexport {\n isMelliCode,\n isShenaseMelli,\n isPassport,\n isCardNumber,\n isIranianMobile,\n isSheba,\n isPostalCode,\n isLandline,\n verifyAndNormalize,\n getBankInfo,\n getMobileOperator,\n};\n","export const BANKS = {\n \"603799\": { name: \"Melli\", label: \"ملی\", color: \"#EF3F3E\" },\n \"589210\": { name: \"Sepah\", label: \"سپه\", color: \"#FFC600\" },\n \"627648\": { name: \"ToseeSaderat\", label: \"توسعه صادرات\", color: \"#EDB12C\" },\n \"627961\": { name: \"SanatMadar\", label: \"صنعت و معدن\", color: \"#B3986D\" },\n \"603770\": { name: \"Keshavarzi\", label: \"کشاورزی\", color: \"#4E7A46\" },\n \"628023\": { name: \"Maskan\", label: \"مسکن\", color: \"#F05A23\" },\n \"627760\": { name: \"PostBank\", label: \"پست بانک\", color: \"#00764D\" },\n \"502908\": { name: \"ToseeTaavon\", label: \"توسعه تعاون\", color: \"#0064A6\" },\n \"627412\": { name: \"EghtesadNovin\", label: \"اقتصاد نوین\", color: \"#652D86\" },\n \"622106\": { name: \"Parsian\", label: \"پارسیان\", color: \"#B3282D\" },\n \"502229\": { name: \"Pasargad\", label: \"پاسارگاد\", color: \"#FFC72C\" },\n \"627488\": { name: \"Karafarin\", label: \"کارآفرین\", color: \"#3B9C56\" },\n \"621986\": { name: \"Saman\", label: \"سامان\", color: \"#006DB6\" },\n \"639346\": { name: \"Sina\", label: \"سینا\", color: \"#004E8A\" },\n \"639607\": { name: \"Sarmayeh\", label: \"سرمایه\", color: \"#0077B6\" },\n \"636214\": { name: \"Ayandeh\", label: \"آینده\", color: \"#8B5F34\" },\n \"502806\": { name: \"Shahr\", label: \"شهر\", color: \"#ED3438\" },\n \"502938\": { name: \"Day\", label: \"دی\", color: \"#0099CC\" },\n \"603769\": { name: \"Saderat\", label: \"صادرات\", color: \"#1A3266\" },\n \"610433\": { name: \"Mellat\", label: \"ملت\", color: \"#D70005\" },\n \"627353\": { name: \"Tejarat\", label: \"تجارت\", color: \"#005696\" },\n \"585983\": { name: \"Tejarat\", label: \"تجارت\", color: \"#005696\" },\n \"589463\": { name: \"Refah\", label: \"رفاه\", color: \"#2B3C8E\" },\n \"627381\": { name: \"Ansar\", label: \"انصار\", color: \"#F7B500\" },\n \"505785\": { name: \"IranZamin\", label: \"ایران زمین\", color: \"#92278F\" },\n \"505416\": { name: \"Gardeshgari\", label: \"گردشگری\", color: \"#1D3265\" },\n \"636949\": { name: \"Hekmat\", label: \"حکمت\", color: \"#5F2C83\" },\n \"505801\": { name: \"Kosar\", label: \"کوثر\", color: \"#C62828\" },\n \"606373\": { name: \"MehrIran\", label: \"مهر ایران\", color: \"#359E49\" },\n \"504172\": { name: \"Resalat\", label: \"رسالت\", color: \"#000000\" },\n \"523388\": { name: \"Pasargad\", label: \"پاسارگاد (ویپاد)\", color: \"#FFC72C\" },\n \"505809\": { name: \"Khavarmianeh\", label: \"خاورمیانه\", color: \"#1F2B5B\" },\n} as const;\n\nexport const MOBILE_OPERATORS = {\n MCI: {\n label: \"همراه اول\",\n prefixes: [\n \"0910\",\n \"0911\",\n \"0912\",\n \"0913\",\n \"0914\",\n \"0915\",\n \"0916\",\n \"0917\",\n \"0918\",\n \"0919\",\n \"0990\",\n \"0991\",\n \"0992\",\n \"0993\",\n \"0994\",\n ],\n },\n Irancell: {\n label: \"ایرانسل\",\n prefixes: [\n \"0930\",\n \"0933\",\n \"0935\",\n \"0936\",\n \"0937\",\n \"0938\",\n \"0939\",\n \"0901\",\n \"0902\",\n \"0903\",\n \"0904\",\n \"0905\",\n \"0941\",\n ],\n },\n Rightel: {\n label: \"رایتل\",\n prefixes: [\"0920\", \"0921\", \"0922\", \"0923\"],\n },\n Shatel: {\n label: \"شاتل موبایل\",\n prefixes: [\"0998\"],\n },\n Taliya: {\n label: \"تالیا\",\n prefixes: [\"0932\"],\n },\n} as const;\n","import { BANKS, MOBILE_OPERATORS } from \"./data\";\n\nexport function verifyAndNormalize(value: string): string {\n if (!value) return \"\";\n\n const PERSIAN_ZERO = 1776;\n const PERSIAN_NINE = 1785;\n const ARABIC_ZERO = 1632;\n const ARABIC_NINE = 1641;\n\n const ARABIC_YEH = 1610;\n const PERSIAN_YE = 1740;\n const ARABIC_KAF = 1603;\n const PERSIAN_KE = 1705;\n\n let result = \"\";\n\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n let char = value[i];\n\n if (code >= PERSIAN_ZERO && code <= PERSIAN_NINE) {\n char = String(code - PERSIAN_ZERO);\n } else if (code >= ARABIC_ZERO && code <= ARABIC_NINE) {\n char = String(code - ARABIC_ZERO);\n } else if (code === ARABIC_YEH) {\n char = String.fromCharCode(PERSIAN_YE);\n } else if (code === ARABIC_KAF) {\n char = String.fromCharCode(PERSIAN_KE);\n }\n\n result += char;\n }\n\n return result;\n}\n\nexport type BankInfo = {\n name: string;\n label: string;\n color: string;\n formatted: string;\n} | null;\n\nexport function getBankInfo(cardNumber: string): BankInfo {\n const normalized = verifyAndNormalize(cardNumber).replace(/[\\-\\s]/g, \"\");\n\n if (normalized.length < 6) return null;\n\n const bin = normalized.substring(0, 6);\n // @ts-ignore\n const bank = BANKS[bin];\n\n if (!bank) return null;\n\n return {\n ...bank,\n formatted: normalized.replace(/(\\d{4})(?=\\d)/g, \"$1-\"),\n };\n}\n\nexport type OperatorInfo = {\n name: string;\n label: string;\n} | null;\n\nexport function getMobileOperator(mobile: string): OperatorInfo {\n const normalized = verifyAndNormalize(mobile);\n\n let prefix = \"\";\n if (normalized.startsWith(\"09\")) {\n prefix = normalized.substring(0, 4);\n } else if (normalized.startsWith(\"9\")) {\n prefix = \"0\" + normalized.substring(0, 3);\n } else if (normalized.startsWith(\"+98\")) {\n prefix = \"0\" + normalized.substring(3, 6);\n }\n\n if (prefix.length !== 4) return null;\n\n for (const [key, op] of Object.entries(MOBILE_OPERATORS)) {\n // @ts-ignore\n if (op.prefixes.includes(prefix)) {\n return { name: key, label: op.label };\n }\n }\n\n return null;\n}\n\nexport function isMelliCode(code: string): boolean {\n if (!/^\\d{10}$/.test(code)) return false;\n if (/^(\\d)\\1+$/.test(code)) return false;\n\n const check = parseInt(code[9]);\n const sum =\n code\n .substring(0, 9)\n .split(\"\")\n .reduce((acc, x, i) => acc + parseInt(x) * (10 - i), 0) % 11;\n\n return sum < 2 ? check === sum : check === 11 - sum;\n}\n\nexport function isShenaseMelli(code: string): boolean {\n if (code.length !== 11 || !/^\\d{11}$/.test(code)) return false;\n\n const tenth = parseInt(code[9]);\n const inputCheck = parseInt(code[10]);\n const coefficients = [29, 27, 23, 19, 17, 29, 27, 23, 19, 17];\n\n let sum = 0;\n for (let i = 0; i < 10; i++) {\n const digit = parseInt(code[i]);\n sum += (digit + tenth + 2) * coefficients[i];\n }\n\n const remainder = sum % 11;\n const calculatedCheck = remainder === 10 ? 0 : remainder;\n\n return calculatedCheck === inputCheck;\n}\n\nexport function isPassport(code: string): boolean {\n return /^[A-Za-z][0-9]{8,9}$/.test(code);\n}\n\nexport function isCardNumber(code: string): boolean {\n const sanitized = code.replace(/[\\-\\s]/g, \"\");\n if (!/^\\d{16}$/.test(sanitized)) return false;\n\n let sum = 0;\n let shouldDouble = false;\n for (let i = sanitized.length - 1; i >= 0; i--) {\n let digit = parseInt(sanitized[i]);\n if (shouldDouble) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n sum += digit;\n shouldDouble = !shouldDouble;\n }\n return sum % 10 === 0;\n}\n\ninterface MobileValidationOptions {\n strictZero?: boolean | \"optional\";\n}\n\nexport function isIranianMobile(\n mobile: string,\n { strictZero = \"optional\" }: MobileValidationOptions = {}\n): boolean {\n const corePattern = \"9\\\\d{9}\";\n let pattern = \"\";\n if (strictZero === true) pattern = `^0${corePattern}$`;\n else if (strictZero === false) pattern = `^${corePattern}$`;\n else pattern = `^(?:0|\\\\+98)?${corePattern}$`;\n\n return new RegExp(pattern).test(mobile);\n}\n\nexport function isSheba(code: string): boolean {\n const iban = code.toUpperCase().replace(/[\\-\\s]/g, \"\");\n if (iban.length !== 26 || !iban.startsWith(\"IR\")) return false;\n\n const newStr = iban.substring(4) + iban.substring(0, 4);\n const numericString = newStr\n .split(\"\")\n .map((c) => {\n const code = c.charCodeAt(0);\n return code >= 48 && code <= 57 ? c : (code - 55).toString();\n })\n .join(\"\");\n\n try {\n return BigInt(numericString) % BigInt(97) === BigInt(1);\n } catch {\n return false;\n }\n}\n\nexport function isPostalCode(code: string): boolean {\n return /^[1-9]\\d{9}$/.test(code);\n}\n\nexport function isLandline(code: string): boolean {\n return /^0\\d{2}\\d{8}$/.test(code);\n}\n","export const ERROR_MESSAGES = {\n fa: {\n melliCode: \"کد ملی نامعتبر است\",\n shenaseMelli: \"شناسه ملی نامعتبر است\",\n passport: \"شماره گذرنامه نامعتبر است\",\n cardNumber: \"شماره کارت نامعتبر است\",\n mobile: \"شماره موبایل نامعتبر است\",\n sheba: \"شماره شبا نامعتبر است\",\n postalCode: \"کد پستی نامعتبر است\",\n landline: \"شماره تلفن ثابت نامعتبر است\",\n },\n en: {\n melliCode: \"Invalid national code\",\n shenaseMelli: \"Invalid legal person ID (Shenase Melli)\",\n passport: \"Invalid passport number\",\n cardNumber: \"Invalid card number\",\n mobile: \"Invalid mobile number\",\n sheba: \"Invalid Sheba (IBAN) number\",\n postalCode: \"Invalid postal code\",\n landline: \"Invalid landline number\",\n },\n} as const;\n\nexport type Language = keyof typeof ERROR_MESSAGES;\n\nexport interface BaseOptions {\n message?: string;\n locale?: Language;\n}\n\nexport const getMessage = (\n key: keyof typeof ERROR_MESSAGES[\"fa\"],\n options?: BaseOptions\n): string => {\n if (options?.message) return options.message;\n const lang = options?.locale || \"fa\";\n return ERROR_MESSAGES[lang][key];\n};"],"mappings":"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","names":["index_exports","__export","getBankInfo","getMobileOperator","isCardNumber","isIranianMobile","isLandline","isMelliCode","isPassport","isPostalCode","isSheba","isShenaseMelli","preprocessNumber","verifyAndNormalize","zCardNumber","zIranianMobile","zLandline","zMelliCode","zPassport","zPostalCode","zSheba","zShenaseMelli","__toCommonJS","import_zod","BANKS","MOBILE_OPERATORS","verifyAndNormalize","value","PERSIAN_ZERO","PERSIAN_NINE","ARABIC_ZERO","ARABIC_NINE","ARABIC_YEH","PERSIAN_YE","ARABIC_KAF","PERSIAN_KE","result","i","code","char","getBankInfo","cardNumber","normalized","bin","bank","BANKS","getMobileOperator","mobile","prefix","key","op","MOBILE_OPERATORS","isMelliCode","check","sum","acc","x","isShenaseMelli","tenth","inputCheck","coefficients","digit","remainder","isPassport","isCardNumber","sanitized","shouldDouble","isIranianMobile","strictZero","corePattern","pattern","isSheba","iban","numericString","c","isPostalCode","isLandline","ERROR_MESSAGES","getMessage","key","options","lang","zMelliCode","options","val","isMelliCode","getMessage","zShenaseMelli","isShenaseMelli","zPassport","isPassport","zCardNumber","isCardNumber","zIranianMobile","isIranianMobile","zSheba","isSheba","zPostalCode","isPostalCode","zLandline","isLandline","preprocessNumber","schema","verifyAndNormalize"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{z as
|
|
1
|
+
import{z as s}from"zod";var d={603799:{name:"Melli",label:"\u0645\u0644\u06CC",color:"#EF3F3E"},589210:{name:"Sepah",label:"\u0633\u067E\u0647",color:"#FFC600"},627648:{name:"ToseeSaderat",label:"\u062A\u0648\u0633\u0639\u0647 \u0635\u0627\u062F\u0631\u0627\u062A",color:"#EDB12C"},627961:{name:"SanatMadar",label:"\u0635\u0646\u0639\u062A \u0648 \u0645\u0639\u062F\u0646",color:"#B3986D"},603770:{name:"Keshavarzi",label:"\u06A9\u0634\u0627\u0648\u0631\u0632\u06CC",color:"#4E7A46"},628023:{name:"Maskan",label:"\u0645\u0633\u06A9\u0646",color:"#F05A23"},627760:{name:"PostBank",label:"\u067E\u0633\u062A \u0628\u0627\u0646\u06A9",color:"#00764D"},502908:{name:"ToseeTaavon",label:"\u062A\u0648\u0633\u0639\u0647 \u062A\u0639\u0627\u0648\u0646",color:"#0064A6"},627412:{name:"EghtesadNovin",label:"\u0627\u0642\u062A\u0635\u0627\u062F \u0646\u0648\u06CC\u0646",color:"#652D86"},622106:{name:"Parsian",label:"\u067E\u0627\u0631\u0633\u06CC\u0627\u0646",color:"#B3282D"},502229:{name:"Pasargad",label:"\u067E\u0627\u0633\u0627\u0631\u06AF\u0627\u062F",color:"#FFC72C"},627488:{name:"Karafarin",label:"\u06A9\u0627\u0631\u0622\u0641\u0631\u06CC\u0646",color:"#3B9C56"},621986:{name:"Saman",label:"\u0633\u0627\u0645\u0627\u0646",color:"#006DB6"},639346:{name:"Sina",label:"\u0633\u06CC\u0646\u0627",color:"#004E8A"},639607:{name:"Sarmayeh",label:"\u0633\u0631\u0645\u0627\u06CC\u0647",color:"#0077B6"},636214:{name:"Ayandeh",label:"\u0622\u06CC\u0646\u062F\u0647",color:"#8B5F34"},502806:{name:"Shahr",label:"\u0634\u0647\u0631",color:"#ED3438"},502938:{name:"Day",label:"\u062F\u06CC",color:"#0099CC"},603769:{name:"Saderat",label:"\u0635\u0627\u062F\u0631\u0627\u062A",color:"#1A3266"},610433:{name:"Mellat",label:"\u0645\u0644\u062A",color:"#D70005"},627353:{name:"Tejarat",label:"\u062A\u062C\u0627\u0631\u062A",color:"#005696"},585983:{name:"Tejarat",label:"\u062A\u062C\u0627\u0631\u062A",color:"#005696"},589463:{name:"Refah",label:"\u0631\u0641\u0627\u0647",color:"#2B3C8E"},627381:{name:"Ansar",label:"\u0627\u0646\u0635\u0627\u0631",color:"#F7B500"},505785:{name:"IranZamin",label:"\u0627\u06CC\u0631\u0627\u0646 \u0632\u0645\u06CC\u0646",color:"#92278F"},505416:{name:"Gardeshgari",label:"\u06AF\u0631\u062F\u0634\u06AF\u0631\u06CC",color:"#1D3265"},636949:{name:"Hekmat",label:"\u062D\u06A9\u0645\u062A",color:"#5F2C83"},505801:{name:"Kosar",label:"\u06A9\u0648\u062B\u0631",color:"#C62828"},606373:{name:"MehrIran",label:"\u0645\u0647\u0631 \u0627\u06CC\u0631\u0627\u0646",color:"#359E49"},504172:{name:"Resalat",label:"\u0631\u0633\u0627\u0644\u062A",color:"#000000"},523388:{name:"Pasargad",label:"\u067E\u0627\u0633\u0627\u0631\u06AF\u0627\u062F (\u0648\u06CC\u067E\u0627\u062F)",color:"#FFC72C"},505809:{name:"Khavarmianeh",label:"\u062E\u0627\u0648\u0631\u0645\u06CC\u0627\u0646\u0647",color:"#1F2B5B"}},h={MCI:{label:"\u0647\u0645\u0631\u0627\u0647 \u0627\u0648\u0644",prefixes:["0910","0911","0912","0913","0914","0915","0916","0917","0918","0919","0990","0991","0992","0993","0994"]},Irancell:{label:"\u0627\u06CC\u0631\u0627\u0646\u0633\u0644",prefixes:["0930","0933","0935","0936","0937","0938","0939","0901","0902","0903","0904","0905","0941"]},Rightel:{label:"\u0631\u0627\u06CC\u062A\u0644",prefixes:["0920","0921","0922","0923"]},Shatel:{label:"\u0634\u0627\u062A\u0644 \u0645\u0648\u0628\u0627\u06CC\u0644",prefixes:["0998"]},Taliya:{label:"\u062A\u0627\u0644\u06CC\u0627",prefixes:["0932"]}};function f(n){if(!n)return"";let e=1776,t=1785,a=1632,r=1641,o=1610,g=1740,c=1603,m=1705,u="";for(let b=0;b<n.length;b++){let i=n.charCodeAt(b),p=n[b];i>=e&&i<=t?p=String(i-e):i>=a&&i<=r?p=String(i-a):i===o?p=String.fromCharCode(g):i===c&&(p=String.fromCharCode(m)),u+=p}return u}function O(n){let e=f(n).replace(/[\-\s]/g,"");if(e.length<6)return null;let t=e.substring(0,6),a=d[t];return a?{...a,formatted:e.replace(/(\d{4})(?=\d)/g,"$1-")}:null}function R(n){let e=f(n),t="";if(e.startsWith("09")?t=e.substring(0,4):e.startsWith("9")?t="0"+e.substring(0,3):e.startsWith("+98")&&(t="0"+e.substring(3,6)),t.length!==4)return null;for(let[a,r]of Object.entries(h))if(r.prefixes.includes(t))return{name:a,label:r.label};return null}function I(n){if(!/^\d{10}$/.test(n)||/^(\d)\1+$/.test(n))return!1;let e=parseInt(n[9]),t=n.substring(0,9).split("").reduce((a,r,o)=>a+parseInt(r)*(10-o),0)%11;return t<2?e===t:e===11-t}function C(n){if(n.length!==11||!/^\d{11}$/.test(n))return!1;let e=parseInt(n[9]),t=parseInt(n[10]),a=[29,27,23,19,17,29,27,23,19,17],r=0;for(let c=0;c<10;c++){let m=parseInt(n[c]);r+=(m+e+2)*a[c]}let o=r%11;return(o===10?0:o)===t}function S(n){return/^[A-Za-z][0-9]{8,9}$/.test(n)}function B(n){let e=n.replace(/[\-\s]/g,"");if(!/^\d{16}$/.test(e))return!1;let t=0,a=!1;for(let r=e.length-1;r>=0;r--){let o=parseInt(e[r]);a&&(o*=2,o>9&&(o-=9)),t+=o,a=!a}return t%10===0}function x(n,{strictZero:e="optional"}={}){let t="9\\d{9}",a="";return e===!0?a=`^0${t}$`:e===!1?a=`^${t}$`:a=`^(?:0|\\+98)?${t}$`,new RegExp(a).test(n)}function A(n){let e=n.toUpperCase().replace(/[\-\s]/g,"");if(e.length!==26||!e.startsWith("IR"))return!1;let a=(e.substring(4)+e.substring(0,4)).split("").map(r=>{let o=r.charCodeAt(0);return o>=48&&o<=57?r:(o-55).toString()}).join("");try{return BigInt(a)%BigInt(97)===BigInt(1)}catch{return!1}}function E(n){return/^[1-9]\d{9}$/.test(n)}function M(n){return/^0\d{2}\d{8}$/.test(n)}var N={fa:{melliCode:"\u06A9\u062F \u0645\u0644\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",shenaseMelli:"\u0634\u0646\u0627\u0633\u0647 \u0645\u0644\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",passport:"\u0634\u0645\u0627\u0631\u0647 \u06AF\u0630\u0631\u0646\u0627\u0645\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",cardNumber:"\u0634\u0645\u0627\u0631\u0647 \u06A9\u0627\u0631\u062A \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",mobile:"\u0634\u0645\u0627\u0631\u0647 \u0645\u0648\u0628\u0627\u06CC\u0644 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",sheba:"\u0634\u0645\u0627\u0631\u0647 \u0634\u0628\u0627 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",postalCode:"\u06A9\u062F \u067E\u0633\u062A\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",landline:"\u0634\u0645\u0627\u0631\u0647 \u062A\u0644\u0641\u0646 \u062B\u0627\u0628\u062A \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A"},en:{melliCode:"Invalid national code",shenaseMelli:"Invalid legal person ID (Shenase Melli)",passport:"Invalid passport number",cardNumber:"Invalid card number",mobile:"Invalid mobile number",sheba:"Invalid Sheba (IBAN) number",postalCode:"Invalid postal code",landline:"Invalid landline number"}},l=(n,e)=>{if(e?.message)return e.message;let t=e?.locale||"fa";return N[t][n]};var v=n=>s.string().refine(e=>I(e),{message:l("melliCode",n)}),T=n=>s.string().refine(e=>C(e),{message:l("shenaseMelli",n)}),K=n=>s.string().refine(e=>S(e),{message:l("passport",n)}),Z=n=>s.string().refine(e=>B(e),{message:l("cardNumber",n)}),L=n=>s.string().refine(e=>x(e,{strictZero:n?.strictZero}),{message:l("mobile",n)}),j=n=>s.string().refine(e=>A(e),{message:l("sheba",n)}),G=n=>s.string().refine(e=>E(e),{message:l("postalCode",n)}),W=n=>s.string().refine(e=>M(e),{message:l("landline",n)}),w=n=>s.preprocess(e=>typeof e=="string"?f(e):e,n);export{O as getBankInfo,R as getMobileOperator,B as isCardNumber,x as isIranianMobile,M as isLandline,I as isMelliCode,S as isPassport,E as isPostalCode,A as isSheba,C as isShenaseMelli,w as preprocessNumber,f as verifyAndNormalize,Z as zCardNumber,L as zIranianMobile,W as zLandline,v as zMelliCode,K as zPassport,G as zPostalCode,j as zSheba,T as zShenaseMelli};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/constants.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n isMelliCode,\n isShenaseMelli,\n isPassport,\n isCardNumber,\n isIranianMobile,\n isSheba,\n isPostalCode,\n isLandline,\n verifyAndNormalize,\n} from \"./utils\";\nimport { getMessage, BaseOptions } from \"./constants\";\n\nexport const zMelliCode = (options?: BaseOptions) =>\n z.string().refine((val) => isMelliCode(val), {\n message: getMessage(\"melliCode\", options),\n });\n\nexport const zShenaseMelli = (options?: BaseOptions) =>\n z.string().refine((val) => isShenaseMelli(val), {\n message: getMessage(\"shenaseMelli\", options),\n });\n\nexport const zPassport = (options?: BaseOptions) =>\n z.string().refine((val) => isPassport(val), {\n message: getMessage(\"passport\", options),\n });\n\nexport const zCardNumber = (options?: BaseOptions) =>\n z.string().refine((val) => isCardNumber(val), {\n message: getMessage(\"cardNumber\", options),\n });\n\ninterface MobileOptions extends BaseOptions {\n strictZero?: boolean | \"optional\";\n}\n\nexport const zIranianMobile = (options?: MobileOptions) =>\n z\n .string()\n .refine(\n (val) => isIranianMobile(val, { strictZero: options?.strictZero }),\n {\n message: getMessage(\"mobile\", options),\n }\n );\n\nexport const zSheba = (options?: BaseOptions) =>\n z.string().refine((val) => isSheba(val), {\n message: getMessage(\"sheba\", options),\n });\n\nexport const zPostalCode = (options?: BaseOptions) =>\n z.string().refine((val) => isPostalCode(val), {\n message: getMessage(\"postalCode\", options),\n });\n\nexport const zLandline = (options?: BaseOptions) =>\n z.string().refine((val) => isLandline(val), {\n message: getMessage(\"landline\", options),\n });\n\nexport const preprocessNumber = (schema: z.ZodTypeAny) =>\n z.preprocess((val) => {\n if (typeof val === \"string\") {\n return verifyAndNormalize(val);\n }\n return val;\n }, schema);\n\nexport {\n isMelliCode,\n isShenaseMelli,\n isPassport,\n isCardNumber,\n isIranianMobile,\n isSheba,\n isPostalCode,\n isLandline,\n verifyAndNormalize,\n};\n","export function isMelliCode(code: string): boolean {\n if (!/^\\d{10}$/.test(code)) return false;\n if (/^(\\d)\\1+$/.test(code)) return false;\n\n const check = parseInt(code[9]);\n const sum =\n code\n .substring(0, 9)\n .split(\"\")\n .reduce((acc, x, i) => acc + parseInt(x) * (10 - i), 0) % 11;\n\n return sum < 2 ? check === sum : check === 11 - sum;\n}\n\nexport function isShenaseMelli(code: string): boolean {\n if (code.length !== 11 || !/^\\d{11}$/.test(code)) return false;\n\n const tenth = parseInt(code[9]);\n const inputCheck = parseInt(code[10]);\n const coefficients = [29, 27, 23, 19, 17, 29, 27, 23, 19, 17];\n\n let sum = 0;\n for (let i = 0; i < 10; i++) {\n const digit = parseInt(code[i]);\n sum += (digit + tenth + 2) * coefficients[i];\n }\n\n const remainder = sum % 11;\n const calculatedCheck = remainder === 10 ? 0 : remainder;\n\n return calculatedCheck === inputCheck;\n}\n\nexport function isPassport(code: string): boolean {\n return /^[A-Za-z][0-9]{8,9}$/.test(code);\n}\n\nexport function isCardNumber(code: string): boolean {\n const sanitized = code.replace(/[\\-\\s]/g, \"\");\n if (!/^\\d{16}$/.test(sanitized)) return false;\n\n let sum = 0;\n let shouldDouble = false;\n for (let i = sanitized.length - 1; i >= 0; i--) {\n let digit = parseInt(sanitized[i]);\n if (shouldDouble) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n sum += digit;\n shouldDouble = !shouldDouble;\n }\n return sum % 10 === 0;\n}\n\ninterface MobileValidationOptions {\n strictZero?: boolean | \"optional\";\n}\n\nexport function isIranianMobile(\n mobile: string,\n { strictZero = \"optional\" }: MobileValidationOptions = {}\n): boolean {\n const corePattern = \"9\\\\d{9}\";\n let pattern = \"\";\n if (strictZero === true) pattern = `^0${corePattern}$`;\n else if (strictZero === false) pattern = `^${corePattern}$`;\n else pattern = `^(?:0|\\\\+98)?${corePattern}$`;\n\n return new RegExp(pattern).test(mobile);\n}\n\nexport function isSheba(code: string): boolean {\n const iban = code.toUpperCase().replace(/[\\-\\s]/g, \"\");\n if (iban.length !== 26 || !iban.startsWith(\"IR\")) return false;\n\n const newStr = iban.substring(4) + iban.substring(0, 4);\n const numericString = newStr\n .split(\"\")\n .map((c) => {\n const code = c.charCodeAt(0);\n return code >= 48 && code <= 57 ? c : (code - 55).toString();\n })\n .join(\"\");\n\n try {\n return BigInt(numericString) % BigInt(97) === BigInt(1);\n } catch {\n return false;\n }\n}\n\nexport function isPostalCode(code: string): boolean {\n return /^[1-9]\\d{9}$/.test(code);\n}\n\nexport function isLandline(code: string): boolean {\n return /^0\\d{2}\\d{8}$/.test(code);\n}\n\nexport function verifyAndNormalize(value: string): string {\n return value\n .replace(/[۰-۹]/g, (d) => \"۰۱۲۳۴۵۶۷۸۹\".indexOf(d).toString())\n .replace(/[٠-٩]/g, (d) => \"٠١٢٣٤٥٦٧٨٩\".indexOf(d).toString());\n}\n","export const ERROR_MESSAGES = {\n fa: {\n melliCode: \"کد ملی نامعتبر است\",\n shenaseMelli: \"شناسه ملی نامعتبر است\",\n passport: \"شماره گذرنامه نامعتبر است\",\n cardNumber: \"شماره کارت نامعتبر است\",\n mobile: \"شماره موبایل نامعتبر است\",\n sheba: \"شماره شبا نامعتبر است\",\n postalCode: \"کد پستی نامعتبر است\",\n landline: \"شماره تلفن ثابت نامعتبر است\",\n },\n en: {\n melliCode: \"Invalid national code\",\n shenaseMelli: \"Invalid legal person ID (Shenase Melli)\",\n passport: \"Invalid passport number\",\n cardNumber: \"Invalid card number\",\n mobile: \"Invalid mobile number\",\n sheba: \"Invalid Sheba (IBAN) number\",\n postalCode: \"Invalid postal code\",\n landline: \"Invalid landline number\",\n },\n} as const;\n\nexport type Language = keyof typeof ERROR_MESSAGES;\n\nexport interface BaseOptions {\n message?: string;\n locale?: Language;\n}\n\nexport const getMessage = (\n key: keyof typeof ERROR_MESSAGES[\"fa\"],\n options?: BaseOptions\n): string => {\n if (options?.message) return options.message;\n const lang = options?.locale || \"fa\";\n return ERROR_MESSAGES[lang][key];\n};"],"mappings":"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","names":["z","isMelliCode","code","check","sum","acc","x","i","isShenaseMelli","tenth","inputCheck","coefficients","digit","remainder","isPassport","isCardNumber","sanitized","shouldDouble","isIranianMobile","mobile","strictZero","corePattern","pattern","isSheba","iban","numericString","c","isPostalCode","isLandline","verifyAndNormalize","value","d","ERROR_MESSAGES","getMessage","key","options","lang","zMelliCode","options","z","val","isMelliCode","getMessage","zShenaseMelli","isShenaseMelli","zPassport","isPassport","zCardNumber","isCardNumber","zIranianMobile","isIranianMobile","zSheba","isSheba","zPostalCode","isPostalCode","zLandline","isLandline","preprocessNumber","schema","verifyAndNormalize"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/data.ts","../src/utils.ts","../src/constants.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n isMelliCode,\n isShenaseMelli,\n isPassport,\n isCardNumber,\n isIranianMobile,\n isSheba,\n isPostalCode,\n isLandline,\n verifyAndNormalize,\n getBankInfo,\n getMobileOperator,\n} from \"./utils\";\nimport { getMessage, BaseOptions } from \"./constants\";\n\nexport const zMelliCode = (options?: BaseOptions) =>\n z.string().refine((val) => isMelliCode(val), {\n message: getMessage(\"melliCode\", options),\n });\n\nexport const zShenaseMelli = (options?: BaseOptions) =>\n z.string().refine((val) => isShenaseMelli(val), {\n message: getMessage(\"shenaseMelli\", options),\n });\n\nexport const zPassport = (options?: BaseOptions) =>\n z.string().refine((val) => isPassport(val), {\n message: getMessage(\"passport\", options),\n });\n\nexport const zCardNumber = (options?: BaseOptions) =>\n z.string().refine((val) => isCardNumber(val), {\n message: getMessage(\"cardNumber\", options),\n });\n\ninterface MobileOptions extends BaseOptions {\n strictZero?: boolean | \"optional\";\n}\n\nexport const zIranianMobile = (options?: MobileOptions) =>\n z\n .string()\n .refine(\n (val) => isIranianMobile(val, { strictZero: options?.strictZero }),\n {\n message: getMessage(\"mobile\", options),\n }\n );\n\nexport const zSheba = (options?: BaseOptions) =>\n z.string().refine((val) => isSheba(val), {\n message: getMessage(\"sheba\", options),\n });\n\nexport const zPostalCode = (options?: BaseOptions) =>\n z.string().refine((val) => isPostalCode(val), {\n message: getMessage(\"postalCode\", options),\n });\n\nexport const zLandline = (options?: BaseOptions) =>\n z.string().refine((val) => isLandline(val), {\n message: getMessage(\"landline\", options),\n });\n\nexport const preprocessNumber = (schema: z.ZodTypeAny) =>\n z.preprocess((val) => {\n if (typeof val === \"string\") {\n return verifyAndNormalize(val);\n }\n return val;\n }, schema);\n\nexport {\n isMelliCode,\n isShenaseMelli,\n isPassport,\n isCardNumber,\n isIranianMobile,\n isSheba,\n isPostalCode,\n isLandline,\n verifyAndNormalize,\n getBankInfo,\n getMobileOperator,\n};\n","export const BANKS = {\n \"603799\": { name: \"Melli\", label: \"ملی\", color: \"#EF3F3E\" },\n \"589210\": { name: \"Sepah\", label: \"سپه\", color: \"#FFC600\" },\n \"627648\": { name: \"ToseeSaderat\", label: \"توسعه صادرات\", color: \"#EDB12C\" },\n \"627961\": { name: \"SanatMadar\", label: \"صنعت و معدن\", color: \"#B3986D\" },\n \"603770\": { name: \"Keshavarzi\", label: \"کشاورزی\", color: \"#4E7A46\" },\n \"628023\": { name: \"Maskan\", label: \"مسکن\", color: \"#F05A23\" },\n \"627760\": { name: \"PostBank\", label: \"پست بانک\", color: \"#00764D\" },\n \"502908\": { name: \"ToseeTaavon\", label: \"توسعه تعاون\", color: \"#0064A6\" },\n \"627412\": { name: \"EghtesadNovin\", label: \"اقتصاد نوین\", color: \"#652D86\" },\n \"622106\": { name: \"Parsian\", label: \"پارسیان\", color: \"#B3282D\" },\n \"502229\": { name: \"Pasargad\", label: \"پاسارگاد\", color: \"#FFC72C\" },\n \"627488\": { name: \"Karafarin\", label: \"کارآفرین\", color: \"#3B9C56\" },\n \"621986\": { name: \"Saman\", label: \"سامان\", color: \"#006DB6\" },\n \"639346\": { name: \"Sina\", label: \"سینا\", color: \"#004E8A\" },\n \"639607\": { name: \"Sarmayeh\", label: \"سرمایه\", color: \"#0077B6\" },\n \"636214\": { name: \"Ayandeh\", label: \"آینده\", color: \"#8B5F34\" },\n \"502806\": { name: \"Shahr\", label: \"شهر\", color: \"#ED3438\" },\n \"502938\": { name: \"Day\", label: \"دی\", color: \"#0099CC\" },\n \"603769\": { name: \"Saderat\", label: \"صادرات\", color: \"#1A3266\" },\n \"610433\": { name: \"Mellat\", label: \"ملت\", color: \"#D70005\" },\n \"627353\": { name: \"Tejarat\", label: \"تجارت\", color: \"#005696\" },\n \"585983\": { name: \"Tejarat\", label: \"تجارت\", color: \"#005696\" },\n \"589463\": { name: \"Refah\", label: \"رفاه\", color: \"#2B3C8E\" },\n \"627381\": { name: \"Ansar\", label: \"انصار\", color: \"#F7B500\" },\n \"505785\": { name: \"IranZamin\", label: \"ایران زمین\", color: \"#92278F\" },\n \"505416\": { name: \"Gardeshgari\", label: \"گردشگری\", color: \"#1D3265\" },\n \"636949\": { name: \"Hekmat\", label: \"حکمت\", color: \"#5F2C83\" },\n \"505801\": { name: \"Kosar\", label: \"کوثر\", color: \"#C62828\" },\n \"606373\": { name: \"MehrIran\", label: \"مهر ایران\", color: \"#359E49\" },\n \"504172\": { name: \"Resalat\", label: \"رسالت\", color: \"#000000\" },\n \"523388\": { name: \"Pasargad\", label: \"پاسارگاد (ویپاد)\", color: \"#FFC72C\" },\n \"505809\": { name: \"Khavarmianeh\", label: \"خاورمیانه\", color: \"#1F2B5B\" },\n} as const;\n\nexport const MOBILE_OPERATORS = {\n MCI: {\n label: \"همراه اول\",\n prefixes: [\n \"0910\",\n \"0911\",\n \"0912\",\n \"0913\",\n \"0914\",\n \"0915\",\n \"0916\",\n \"0917\",\n \"0918\",\n \"0919\",\n \"0990\",\n \"0991\",\n \"0992\",\n \"0993\",\n \"0994\",\n ],\n },\n Irancell: {\n label: \"ایرانسل\",\n prefixes: [\n \"0930\",\n \"0933\",\n \"0935\",\n \"0936\",\n \"0937\",\n \"0938\",\n \"0939\",\n \"0901\",\n \"0902\",\n \"0903\",\n \"0904\",\n \"0905\",\n \"0941\",\n ],\n },\n Rightel: {\n label: \"رایتل\",\n prefixes: [\"0920\", \"0921\", \"0922\", \"0923\"],\n },\n Shatel: {\n label: \"شاتل موبایل\",\n prefixes: [\"0998\"],\n },\n Taliya: {\n label: \"تالیا\",\n prefixes: [\"0932\"],\n },\n} as const;\n","import { BANKS, MOBILE_OPERATORS } from \"./data\";\n\nexport function verifyAndNormalize(value: string): string {\n if (!value) return \"\";\n\n const PERSIAN_ZERO = 1776;\n const PERSIAN_NINE = 1785;\n const ARABIC_ZERO = 1632;\n const ARABIC_NINE = 1641;\n\n const ARABIC_YEH = 1610;\n const PERSIAN_YE = 1740;\n const ARABIC_KAF = 1603;\n const PERSIAN_KE = 1705;\n\n let result = \"\";\n\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n let char = value[i];\n\n if (code >= PERSIAN_ZERO && code <= PERSIAN_NINE) {\n char = String(code - PERSIAN_ZERO);\n } else if (code >= ARABIC_ZERO && code <= ARABIC_NINE) {\n char = String(code - ARABIC_ZERO);\n } else if (code === ARABIC_YEH) {\n char = String.fromCharCode(PERSIAN_YE);\n } else if (code === ARABIC_KAF) {\n char = String.fromCharCode(PERSIAN_KE);\n }\n\n result += char;\n }\n\n return result;\n}\n\nexport type BankInfo = {\n name: string;\n label: string;\n color: string;\n formatted: string;\n} | null;\n\nexport function getBankInfo(cardNumber: string): BankInfo {\n const normalized = verifyAndNormalize(cardNumber).replace(/[\\-\\s]/g, \"\");\n\n if (normalized.length < 6) return null;\n\n const bin = normalized.substring(0, 6);\n // @ts-ignore\n const bank = BANKS[bin];\n\n if (!bank) return null;\n\n return {\n ...bank,\n formatted: normalized.replace(/(\\d{4})(?=\\d)/g, \"$1-\"),\n };\n}\n\nexport type OperatorInfo = {\n name: string;\n label: string;\n} | null;\n\nexport function getMobileOperator(mobile: string): OperatorInfo {\n const normalized = verifyAndNormalize(mobile);\n\n let prefix = \"\";\n if (normalized.startsWith(\"09\")) {\n prefix = normalized.substring(0, 4);\n } else if (normalized.startsWith(\"9\")) {\n prefix = \"0\" + normalized.substring(0, 3);\n } else if (normalized.startsWith(\"+98\")) {\n prefix = \"0\" + normalized.substring(3, 6);\n }\n\n if (prefix.length !== 4) return null;\n\n for (const [key, op] of Object.entries(MOBILE_OPERATORS)) {\n // @ts-ignore\n if (op.prefixes.includes(prefix)) {\n return { name: key, label: op.label };\n }\n }\n\n return null;\n}\n\nexport function isMelliCode(code: string): boolean {\n if (!/^\\d{10}$/.test(code)) return false;\n if (/^(\\d)\\1+$/.test(code)) return false;\n\n const check = parseInt(code[9]);\n const sum =\n code\n .substring(0, 9)\n .split(\"\")\n .reduce((acc, x, i) => acc + parseInt(x) * (10 - i), 0) % 11;\n\n return sum < 2 ? check === sum : check === 11 - sum;\n}\n\nexport function isShenaseMelli(code: string): boolean {\n if (code.length !== 11 || !/^\\d{11}$/.test(code)) return false;\n\n const tenth = parseInt(code[9]);\n const inputCheck = parseInt(code[10]);\n const coefficients = [29, 27, 23, 19, 17, 29, 27, 23, 19, 17];\n\n let sum = 0;\n for (let i = 0; i < 10; i++) {\n const digit = parseInt(code[i]);\n sum += (digit + tenth + 2) * coefficients[i];\n }\n\n const remainder = sum % 11;\n const calculatedCheck = remainder === 10 ? 0 : remainder;\n\n return calculatedCheck === inputCheck;\n}\n\nexport function isPassport(code: string): boolean {\n return /^[A-Za-z][0-9]{8,9}$/.test(code);\n}\n\nexport function isCardNumber(code: string): boolean {\n const sanitized = code.replace(/[\\-\\s]/g, \"\");\n if (!/^\\d{16}$/.test(sanitized)) return false;\n\n let sum = 0;\n let shouldDouble = false;\n for (let i = sanitized.length - 1; i >= 0; i--) {\n let digit = parseInt(sanitized[i]);\n if (shouldDouble) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n sum += digit;\n shouldDouble = !shouldDouble;\n }\n return sum % 10 === 0;\n}\n\ninterface MobileValidationOptions {\n strictZero?: boolean | \"optional\";\n}\n\nexport function isIranianMobile(\n mobile: string,\n { strictZero = \"optional\" }: MobileValidationOptions = {}\n): boolean {\n const corePattern = \"9\\\\d{9}\";\n let pattern = \"\";\n if (strictZero === true) pattern = `^0${corePattern}$`;\n else if (strictZero === false) pattern = `^${corePattern}$`;\n else pattern = `^(?:0|\\\\+98)?${corePattern}$`;\n\n return new RegExp(pattern).test(mobile);\n}\n\nexport function isSheba(code: string): boolean {\n const iban = code.toUpperCase().replace(/[\\-\\s]/g, \"\");\n if (iban.length !== 26 || !iban.startsWith(\"IR\")) return false;\n\n const newStr = iban.substring(4) + iban.substring(0, 4);\n const numericString = newStr\n .split(\"\")\n .map((c) => {\n const code = c.charCodeAt(0);\n return code >= 48 && code <= 57 ? c : (code - 55).toString();\n })\n .join(\"\");\n\n try {\n return BigInt(numericString) % BigInt(97) === BigInt(1);\n } catch {\n return false;\n }\n}\n\nexport function isPostalCode(code: string): boolean {\n return /^[1-9]\\d{9}$/.test(code);\n}\n\nexport function isLandline(code: string): boolean {\n return /^0\\d{2}\\d{8}$/.test(code);\n}\n","export const ERROR_MESSAGES = {\n fa: {\n melliCode: \"کد ملی نامعتبر است\",\n shenaseMelli: \"شناسه ملی نامعتبر است\",\n passport: \"شماره گذرنامه نامعتبر است\",\n cardNumber: \"شماره کارت نامعتبر است\",\n mobile: \"شماره موبایل نامعتبر است\",\n sheba: \"شماره شبا نامعتبر است\",\n postalCode: \"کد پستی نامعتبر است\",\n landline: \"شماره تلفن ثابت نامعتبر است\",\n },\n en: {\n melliCode: \"Invalid national code\",\n shenaseMelli: \"Invalid legal person ID (Shenase Melli)\",\n passport: \"Invalid passport number\",\n cardNumber: \"Invalid card number\",\n mobile: \"Invalid mobile number\",\n sheba: \"Invalid Sheba (IBAN) number\",\n postalCode: \"Invalid postal code\",\n landline: \"Invalid landline number\",\n },\n} as const;\n\nexport type Language = keyof typeof ERROR_MESSAGES;\n\nexport interface BaseOptions {\n message?: string;\n locale?: Language;\n}\n\nexport const getMessage = (\n key: keyof typeof ERROR_MESSAGES[\"fa\"],\n options?: BaseOptions\n): string => {\n if (options?.message) return options.message;\n const lang = options?.locale || \"fa\";\n return ERROR_MESSAGES[lang][key];\n};"],"mappings":"AAAA,OAAS,KAAAA,MAAS,MCAX,IAAMC,EAAQ,CACnB,OAAU,CAAE,KAAM,QAAS,MAAO,qBAAO,MAAO,SAAU,EAC1D,OAAU,CAAE,KAAM,QAAS,MAAO,qBAAO,MAAO,SAAU,EAC1D,OAAU,CAAE,KAAM,eAAgB,MAAO,sEAAgB,MAAO,SAAU,EAC1E,OAAU,CAAE,KAAM,aAAc,MAAO,2DAAe,MAAO,SAAU,EACvE,OAAU,CAAE,KAAM,aAAc,MAAO,6CAAW,MAAO,SAAU,EACnE,OAAU,CAAE,KAAM,SAAU,MAAO,2BAAQ,MAAO,SAAU,EAC5D,OAAU,CAAE,KAAM,WAAY,MAAO,8CAAY,MAAO,SAAU,EAClE,OAAU,CAAE,KAAM,cAAe,MAAO,gEAAe,MAAO,SAAU,EACxE,OAAU,CAAE,KAAM,gBAAiB,MAAO,gEAAe,MAAO,SAAU,EAC1E,OAAU,CAAE,KAAM,UAAW,MAAO,6CAAW,MAAO,SAAU,EAChE,OAAU,CAAE,KAAM,WAAY,MAAO,mDAAY,MAAO,SAAU,EAClE,OAAU,CAAE,KAAM,YAAa,MAAO,mDAAY,MAAO,SAAU,EACnE,OAAU,CAAE,KAAM,QAAS,MAAO,iCAAS,MAAO,SAAU,EAC5D,OAAU,CAAE,KAAM,OAAQ,MAAO,2BAAQ,MAAO,SAAU,EAC1D,OAAU,CAAE,KAAM,WAAY,MAAO,uCAAU,MAAO,SAAU,EAChE,OAAU,CAAE,KAAM,UAAW,MAAO,iCAAS,MAAO,SAAU,EAC9D,OAAU,CAAE,KAAM,QAAS,MAAO,qBAAO,MAAO,SAAU,EAC1D,OAAU,CAAE,KAAM,MAAO,MAAO,eAAM,MAAO,SAAU,EACvD,OAAU,CAAE,KAAM,UAAW,MAAO,uCAAU,MAAO,SAAU,EAC/D,OAAU,CAAE,KAAM,SAAU,MAAO,qBAAO,MAAO,SAAU,EAC3D,OAAU,CAAE,KAAM,UAAW,MAAO,iCAAS,MAAO,SAAU,EAC9D,OAAU,CAAE,KAAM,UAAW,MAAO,iCAAS,MAAO,SAAU,EAC9D,OAAU,CAAE,KAAM,QAAS,MAAO,2BAAQ,MAAO,SAAU,EAC3D,OAAU,CAAE,KAAM,QAAS,MAAO,iCAAS,MAAO,SAAU,EAC5D,OAAU,CAAE,KAAM,YAAa,MAAO,0DAAc,MAAO,SAAU,EACrE,OAAU,CAAE,KAAM,cAAe,MAAO,6CAAW,MAAO,SAAU,EACpE,OAAU,CAAE,KAAM,SAAU,MAAO,2BAAQ,MAAO,SAAU,EAC5D,OAAU,CAAE,KAAM,QAAS,MAAO,2BAAQ,MAAO,SAAU,EAC3D,OAAU,CAAE,KAAM,WAAY,MAAO,oDAAa,MAAO,SAAU,EACnE,OAAU,CAAE,KAAM,UAAW,MAAO,iCAAS,MAAO,SAAU,EAC9D,OAAU,CAAE,KAAM,WAAY,MAAO,oFAAoB,MAAO,SAAU,EAC1E,OAAU,CAAE,KAAM,eAAgB,MAAO,yDAAa,MAAO,SAAU,CACzE,EAEaC,EAAmB,CAC9B,IAAK,CACH,MAAO,oDACP,SAAU,CACR,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACF,CACF,EACA,SAAU,CACR,MAAO,6CACP,SAAU,CACR,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACF,CACF,EACA,QAAS,CACP,MAAO,iCACP,SAAU,CAAC,OAAQ,OAAQ,OAAQ,MAAM,CAC3C,EACA,OAAQ,CACN,MAAO,gEACP,SAAU,CAAC,MAAM,CACnB,EACA,OAAQ,CACN,MAAO,iCACP,SAAU,CAAC,MAAM,CACnB,CACF,ECpFO,SAASC,EAAmBC,EAAuB,CACxD,GAAI,CAACA,EAAO,MAAO,GAEnB,IAAMC,EAAe,KACfC,EAAe,KACfC,EAAc,KACdC,EAAc,KAEdC,EAAa,KACbC,EAAa,KACbC,EAAa,KACbC,EAAa,KAEfC,EAAS,GAEb,QAASC,EAAI,EAAGA,EAAIV,EAAM,OAAQU,IAAK,CACrC,IAAMC,EAAOX,EAAM,WAAWU,CAAC,EAC3BE,EAAOZ,EAAMU,CAAC,EAEdC,GAAQV,GAAgBU,GAAQT,EAClCU,EAAO,OAAOD,EAAOV,CAAY,EACxBU,GAAQR,GAAeQ,GAAQP,EACxCQ,EAAO,OAAOD,EAAOR,CAAW,EACvBQ,IAASN,EAClBO,EAAO,OAAO,aAAaN,CAAU,EAC5BK,IAASJ,IAClBK,EAAO,OAAO,aAAaJ,CAAU,GAGvCC,GAAUG,CACZ,CAEA,OAAOH,CACT,CASO,SAASI,EAAYC,EAA8B,CACxD,IAAMC,EAAahB,EAAmBe,CAAU,EAAE,QAAQ,UAAW,EAAE,EAEvE,GAAIC,EAAW,OAAS,EAAG,OAAO,KAElC,IAAMC,EAAMD,EAAW,UAAU,EAAG,CAAC,EAE/BE,EAAOC,EAAMF,CAAG,EAEtB,OAAKC,EAEE,CACL,GAAGA,EACH,UAAWF,EAAW,QAAQ,iBAAkB,KAAK,CACvD,EALkB,IAMpB,CAOO,SAASI,EAAkBC,EAA8B,CAC9D,IAAML,EAAahB,EAAmBqB,CAAM,EAExCC,EAAS,GASb,GARIN,EAAW,WAAW,IAAI,EAC5BM,EAASN,EAAW,UAAU,EAAG,CAAC,EACzBA,EAAW,WAAW,GAAG,EAClCM,EAAS,IAAMN,EAAW,UAAU,EAAG,CAAC,EAC/BA,EAAW,WAAW,KAAK,IACpCM,EAAS,IAAMN,EAAW,UAAU,EAAG,CAAC,GAGtCM,EAAO,SAAW,EAAG,OAAO,KAEhC,OAAW,CAACC,EAAKC,CAAE,IAAK,OAAO,QAAQC,CAAgB,EAErD,GAAID,EAAG,SAAS,SAASF,CAAM,EAC7B,MAAO,CAAE,KAAMC,EAAK,MAAOC,EAAG,KAAM,EAIxC,OAAO,IACT,CAEO,SAASE,EAAYd,EAAuB,CAEjD,GADI,CAAC,WAAW,KAAKA,CAAI,GACrB,YAAY,KAAKA,CAAI,EAAG,MAAO,GAEnC,IAAMe,EAAQ,SAASf,EAAK,CAAC,CAAC,EACxBgB,EACJhB,EACG,UAAU,EAAG,CAAC,EACd,MAAM,EAAE,EACR,OAAO,CAACiB,EAAKC,EAAGnB,IAAMkB,EAAM,SAASC,CAAC,GAAK,GAAKnB,GAAI,CAAC,EAAI,GAE9D,OAAOiB,EAAM,EAAID,IAAUC,EAAMD,IAAU,GAAKC,CAClD,CAEO,SAASG,EAAenB,EAAuB,CACpD,GAAIA,EAAK,SAAW,IAAM,CAAC,WAAW,KAAKA,CAAI,EAAG,MAAO,GAEzD,IAAMoB,EAAQ,SAASpB,EAAK,CAAC,CAAC,EACxBqB,EAAa,SAASrB,EAAK,EAAE,CAAC,EAC9BsB,EAAe,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAExDN,EAAM,EACV,QAASjB,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,IAAMwB,EAAQ,SAASvB,EAAKD,CAAC,CAAC,EAC9BiB,IAAQO,EAAQH,EAAQ,GAAKE,EAAavB,CAAC,CAC7C,CAEA,IAAMyB,EAAYR,EAAM,GAGxB,OAFwBQ,IAAc,GAAK,EAAIA,KAEpBH,CAC7B,CAEO,SAASI,EAAWzB,EAAuB,CAChD,MAAO,uBAAuB,KAAKA,CAAI,CACzC,CAEO,SAAS0B,EAAa1B,EAAuB,CAClD,IAAM2B,EAAY3B,EAAK,QAAQ,UAAW,EAAE,EAC5C,GAAI,CAAC,WAAW,KAAK2B,CAAS,EAAG,MAAO,GAExC,IAAIX,EAAM,EACNY,EAAe,GACnB,QAAS7B,EAAI4B,EAAU,OAAS,EAAG5B,GAAK,EAAGA,IAAK,CAC9C,IAAIwB,EAAQ,SAASI,EAAU5B,CAAC,CAAC,EAC7B6B,IACFL,GAAS,EACLA,EAAQ,IAAGA,GAAS,IAE1BP,GAAOO,EACPK,EAAe,CAACA,CAClB,CACA,OAAOZ,EAAM,KAAO,CACtB,CAMO,SAASa,EACdpB,EACA,CAAE,WAAAqB,EAAa,UAAW,EAA6B,CAAC,EAC/C,CACT,IAAMC,EAAc,UAChBC,EAAU,GACd,OAAIF,IAAe,GAAME,EAAU,KAAKD,CAAW,IAC1CD,IAAe,GAAOE,EAAU,IAAID,CAAW,IACnDC,EAAU,gBAAgBD,CAAW,IAEnC,IAAI,OAAOC,CAAO,EAAE,KAAKvB,CAAM,CACxC,CAEO,SAASwB,EAAQjC,EAAuB,CAC7C,IAAMkC,EAAOlC,EAAK,YAAY,EAAE,QAAQ,UAAW,EAAE,EACrD,GAAIkC,EAAK,SAAW,IAAM,CAACA,EAAK,WAAW,IAAI,EAAG,MAAO,GAGzD,IAAMC,GADSD,EAAK,UAAU,CAAC,EAAIA,EAAK,UAAU,EAAG,CAAC,GAEnD,MAAM,EAAE,EACR,IAAKE,GAAM,CACV,IAAMpC,EAAOoC,EAAE,WAAW,CAAC,EAC3B,OAAOpC,GAAQ,IAAMA,GAAQ,GAAKoC,GAAKpC,EAAO,IAAI,SAAS,CAC7D,CAAC,EACA,KAAK,EAAE,EAEV,GAAI,CACF,OAAO,OAAOmC,CAAa,EAAI,OAAO,EAAE,IAAM,OAAO,CAAC,CACxD,MAAQ,CACN,MAAO,EACT,CACF,CAEO,SAASE,EAAarC,EAAuB,CAClD,MAAO,eAAe,KAAKA,CAAI,CACjC,CAEO,SAASsC,EAAWtC,EAAuB,CAChD,MAAO,gBAAgB,KAAKA,CAAI,CAClC,CC5LO,IAAMuC,EAAiB,CAC5B,GAAI,CACF,UAAW,gGACX,aAAc,kHACd,SAAU,0IACV,WAAY,wHACZ,OAAQ,oIACR,MAAO,kHACP,WAAY,sGACZ,SAAU,gJACZ,EACA,GAAI,CACF,UAAW,wBACX,aAAc,0CACd,SAAU,0BACV,WAAY,sBACZ,OAAQ,wBACR,MAAO,8BACP,WAAY,sBACZ,SAAU,yBACZ,CACF,EASaC,EAAa,CACxBC,EACAC,IACW,CACX,GAAIA,GAAS,QAAS,OAAOA,EAAQ,QACrC,IAAMC,EAAOD,GAAS,QAAU,KAChC,OAAOH,EAAeI,CAAI,EAAEF,CAAG,CACjC,EHrBO,IAAMG,EAAcC,GACzBC,EAAE,OAAO,EAAE,OAAQC,GAAQC,EAAYD,CAAG,EAAG,CAC3C,QAASE,EAAW,YAAaJ,CAAO,CAC1C,CAAC,EAEUK,EAAiBL,GAC5BC,EAAE,OAAO,EAAE,OAAQC,GAAQI,EAAeJ,CAAG,EAAG,CAC9C,QAASE,EAAW,eAAgBJ,CAAO,CAC7C,CAAC,EAEUO,EAAaP,GACxBC,EAAE,OAAO,EAAE,OAAQC,GAAQM,EAAWN,CAAG,EAAG,CAC1C,QAASE,EAAW,WAAYJ,CAAO,CACzC,CAAC,EAEUS,EAAeT,GAC1BC,EAAE,OAAO,EAAE,OAAQC,GAAQQ,EAAaR,CAAG,EAAG,CAC5C,QAASE,EAAW,aAAcJ,CAAO,CAC3C,CAAC,EAMUW,EAAkBX,GAC7BC,EACG,OAAO,EACP,OACEC,GAAQU,EAAgBV,EAAK,CAAE,WAAYF,GAAS,UAAW,CAAC,EACjE,CACE,QAASI,EAAW,SAAUJ,CAAO,CACvC,CACF,EAESa,EAAUb,GACrBC,EAAE,OAAO,EAAE,OAAQC,GAAQY,EAAQZ,CAAG,EAAG,CACvC,QAASE,EAAW,QAASJ,CAAO,CACtC,CAAC,EAEUe,EAAef,GAC1BC,EAAE,OAAO,EAAE,OAAQC,GAAQc,EAAad,CAAG,EAAG,CAC5C,QAASE,EAAW,aAAcJ,CAAO,CAC3C,CAAC,EAEUiB,EAAajB,GACxBC,EAAE,OAAO,EAAE,OAAQC,GAAQgB,EAAWhB,CAAG,EAAG,CAC1C,QAASE,EAAW,WAAYJ,CAAO,CACzC,CAAC,EAEUmB,EAAoBC,GAC/BnB,EAAE,WAAYC,GACR,OAAOA,GAAQ,SACVmB,EAAmBnB,CAAG,EAExBA,EACNkB,CAAM","names":["z","BANKS","MOBILE_OPERATORS","verifyAndNormalize","value","PERSIAN_ZERO","PERSIAN_NINE","ARABIC_ZERO","ARABIC_NINE","ARABIC_YEH","PERSIAN_YE","ARABIC_KAF","PERSIAN_KE","result","i","code","char","getBankInfo","cardNumber","normalized","bin","bank","BANKS","getMobileOperator","mobile","prefix","key","op","MOBILE_OPERATORS","isMelliCode","check","sum","acc","x","isShenaseMelli","tenth","inputCheck","coefficients","digit","remainder","isPassport","isCardNumber","sanitized","shouldDouble","isIranianMobile","strictZero","corePattern","pattern","isSheba","iban","numericString","c","isPostalCode","isLandline","ERROR_MESSAGES","getMessage","key","options","lang","zMelliCode","options","z","val","isMelliCode","getMessage","zShenaseMelli","isShenaseMelli","zPassport","isPassport","zCardNumber","isCardNumber","zIranianMobile","isIranianMobile","zSheba","isSheba","zPostalCode","isPostalCode","zLandline","isLandline","preprocessNumber","schema","verifyAndNormalize"]}
|