zod-ir 1.6.0 → 1.6.6
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/LICENSE +2 -2
- package/README.md +153 -166
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +75 -78
- package/dist/index.d.mts +75 -78
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +78 -40
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) 2026 Reza Kheradmandi
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
18
18
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
19
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
<div align="center">
|
|
2
|
-
<img src="zod-ir-logo.png" width="250" alt="zod-ir logo"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
</p>
|
|
2
|
+
<img src="./assets/images/zod-ir-logo.png" width="250" alt="zod-ir logo" />
|
|
3
|
+
|
|
4
|
+
<h1>The Ultimate Zod Utility for Iranian Data Structures</h1>
|
|
6
5
|
<p>
|
|
7
|
-
Validation for
|
|
6
|
+
Validation for national code, bank cards, Sheba, bills, license plates, crypto, etc.
|
|
8
7
|
<br />
|
|
9
|
-
Lightweight
|
|
8
|
+
Lightweight • Zero Dependencies • Type-safe.
|
|
10
9
|
</p>
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
|
|
11
|
+
📖 [Read the Full Documentation on daxra.ir](https://daxra.ir/docs/zod-ir)
|
|
12
|
+
|
|
13
|
+
<div>
|
|
13
14
|
<a href="https://www.npmjs.com/package/zod-ir">
|
|
14
15
|
<img src="https://img.shields.io/npm/v/zod-ir?style=flat-square&color=3b82f6" alt="npm version" />
|
|
15
16
|
</a>
|
|
@@ -28,30 +29,30 @@
|
|
|
28
29
|
<a href="https://zod.dev/?id=ecosystem">
|
|
29
30
|
<img src="https://img.shields.io/badge/featured%20in-zod%20docs-3068b7?style=flat-square&logo=zod&logoColor=white" alt="Zod Ecosystem" />
|
|
30
31
|
</a>
|
|
31
|
-
</
|
|
32
|
+
</div>
|
|
32
33
|
</div>
|
|
33
34
|
|
|
34
|
-
<
|
|
35
|
+
<br />
|
|
35
36
|
|
|
36
37
|
## Why zod-ir? 🚀
|
|
37
38
|
|
|
38
|
-
Building forms
|
|
39
|
+
Building forms for Iranian applications often involves validating specific local data structures like national codes, bank cards, and Sheba numbers. `zod-ir` seamlessly integrates these validations into **Zod**, while also offering powerful **Data Extraction** tools and a superior **Developer Experience**.
|
|
39
40
|
|
|
40
41
|
### Key Features ✨
|
|
41
42
|
|
|
42
|
-
- 🧠 **Smart Extraction:**
|
|
43
|
-
- 🛠 **Standalone & Reusable:** Use validators inside Zod schemas
|
|
44
|
-
- ⚡ **Zero Dependencies:** No heavy dependencies
|
|
45
|
-
- 🔗 **
|
|
46
|
-
- 🧪 **Battle-Tested:** 100%
|
|
43
|
+
- 🧠 **Smart Extraction:** go beyound validation and extract metadata. (get bank name from card number and city from landline/postal code).
|
|
44
|
+
- 🛠 **Standalone & Reusable:** Use validators either inside Zod schemas or as standalone utility functions.
|
|
45
|
+
- ⚡ **Zero Dependencies:** No heavy dependencies— lightweight and tree-shakeable.
|
|
46
|
+
- 🔗 **Compatibility:** Fully compatible with your existing Zod version (v3 and v4).
|
|
47
|
+
- 🧪 **Battle-Tested:** 100% test coverage for critical algorithms (national code, IBAN, etc.).
|
|
47
48
|
|
|
48
|
-
### Feature Highlights
|
|
49
|
+
### Feature Highlights 🌟
|
|
49
50
|
|
|
50
|
-
- **Smart Financial:**
|
|
51
|
-
- **Jalali Date:**
|
|
52
|
-
- **Crypto Support:**
|
|
53
|
-
- **Vehicle:**
|
|
54
|
-
- **Contact:**
|
|
51
|
+
- **Smart Financial:** auto-detects **card number** vs. **Sheba (IBAN)** and returns the corresponding bank info and logo.
|
|
52
|
+
- **Jalali Date:** validates Persian dates with precise **Leap Year (Kabisa)** calculation.
|
|
53
|
+
- **Crypto Support:** native validation for **TRC20**, **ERC20**, and **Bitcoin**.
|
|
54
|
+
- **Vehicle:** validates license plates and detects **province/city**.
|
|
55
|
+
- **Contact:** smartly detect the phone number operator (MCI, Irancell), **landline**, and postal code (smart city detection).
|
|
55
56
|
|
|
56
57
|
---
|
|
57
58
|
|
|
@@ -65,156 +66,145 @@ pnpm add zod zod-ir
|
|
|
65
66
|
yarn add zod zod-ir
|
|
66
67
|
```
|
|
67
68
|
|
|
68
|
-
## Usage: Standalone Mode (Utilities)
|
|
69
|
+
## Usage: Standalone Mode (Utilities) ⚒️
|
|
69
70
|
|
|
70
|
-
You don't need to use Zod! zod-ir exports all validation logic as pure functions
|
|
71
|
+
You don't need to use Zod! zod-ir exports all validation logic as pure functions—perfect for backend utilities or non-form logic.
|
|
71
72
|
|
|
72
73
|
```typescript
|
|
73
|
-
import { isMelliCode, getBankInfo, getLandlineInfo } from
|
|
74
|
+
import { isMelliCode, getBankInfo, getLandlineInfo } from 'zod-ir';
|
|
74
75
|
|
|
75
|
-
//
|
|
76
|
-
if (isMelliCode(
|
|
77
|
-
console.log(
|
|
76
|
+
// Validate national code anywhere
|
|
77
|
+
if (isMelliCode('0023456789')) {
|
|
78
|
+
console.log('Valid user.');
|
|
78
79
|
}
|
|
79
80
|
|
|
80
|
-
//
|
|
81
|
-
const bank = getBankInfo(
|
|
81
|
+
// Extract details from bank card number
|
|
82
|
+
const bank = getBankInfo('6219861012345678');
|
|
82
83
|
console.log(bank.name); // "Saman"
|
|
83
84
|
console.log(bank.color); // "#46a0e6"
|
|
84
85
|
|
|
85
|
-
//
|
|
86
|
-
const location = getLandlineInfo(
|
|
86
|
+
// Extract location from landline phone number
|
|
87
|
+
const location = getLandlineInfo('02122334455');
|
|
87
88
|
console.log(location.province_fa); // "تهران"
|
|
88
89
|
```
|
|
89
90
|
|
|
90
91
|
## Usage: Zod Schema Mode 💡
|
|
91
92
|
|
|
92
|
-
1. Smart Contact
|
|
93
|
-
|
|
94
|
-
Validate Landlines and Postal Codes, and automatically extract Province/City in both Persian and English.
|
|
93
|
+
1. Smart Contact and Address <br />
|
|
94
|
+
Validate landlines and postal codes, and automatically extract province/city in both Persian and English.
|
|
95
95
|
|
|
96
96
|
```typescript
|
|
97
|
-
import
|
|
98
|
-
import {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
getPostalCodeInfo,
|
|
103
|
-
} from "zod-ir";
|
|
104
|
-
|
|
105
|
-
// 1. Validation Schema
|
|
106
|
-
const schema = z.object({
|
|
107
|
-
phone: zLandline({ message: "Invalid landline number" }),
|
|
97
|
+
import * as z from 'zod';
|
|
98
|
+
import { zLandline, zPostalCode, getLandlineInfo, getPostalCodeInfo } from 'zod-ir';
|
|
99
|
+
|
|
100
|
+
const ValidationSchema = z.object({
|
|
101
|
+
phone: zLandline({ message: 'Invalid landline number.' }),
|
|
108
102
|
zip: zPostalCode(),
|
|
109
103
|
});
|
|
110
104
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
/*
|
|
114
|
-
{
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
105
|
+
const phoneInfo = getLandlineInfo('02122334455');
|
|
106
|
+
console.log(phoneInfo);
|
|
107
|
+
/*
|
|
108
|
+
{
|
|
109
|
+
province: "Tehran",
|
|
110
|
+
city: "Tehran",
|
|
111
|
+
province_fa: "تهران",
|
|
112
|
+
city_fa: "تهران"
|
|
113
|
+
}
|
|
120
114
|
*/
|
|
121
115
|
|
|
122
|
-
//
|
|
123
|
-
const zipInfo = getPostalCodeInfo(
|
|
124
|
-
/*
|
|
125
|
-
{
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
116
|
+
// Extract metadata from postal code (smart range matching)
|
|
117
|
+
const zipInfo = getPostalCodeInfo('8391853612');
|
|
118
|
+
/*
|
|
119
|
+
{
|
|
120
|
+
province: { name: "اصفهان", slug: "Isfahan" },
|
|
121
|
+
city: { name_fa: "نائین", name_en: "Naein" }
|
|
122
|
+
}
|
|
129
123
|
*/
|
|
130
124
|
```
|
|
131
125
|
|
|
132
|
-
2. Smart Financial Validation
|
|
133
|
-
|
|
134
|
-
Don't ask users for "Card" or "Sheba" separately. Use zFinancial to accept both!
|
|
126
|
+
2. Smart Financial Validation <br />
|
|
127
|
+
Don't ask users for either card number or Sheba—use `zFinancial` to accept both!
|
|
135
128
|
|
|
136
129
|
```typescript
|
|
137
|
-
import
|
|
138
|
-
import { zFinancial, getFinancialInfo } from
|
|
130
|
+
import * as z from 'zod';
|
|
131
|
+
import { zFinancial, getFinancialInfo } from 'zod-ir';
|
|
139
132
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
destination: zFinancial({ message: "Invalid Card or Sheba" }),
|
|
133
|
+
const ValidationSchema = z.object({
|
|
134
|
+
destination: zFinancial({ message: 'Invalid card number or Sheba.' }),
|
|
143
135
|
});
|
|
144
136
|
|
|
145
|
-
//
|
|
146
|
-
const info = getFinancialInfo(
|
|
137
|
+
// Extract metadata (bank name, Logo, type)
|
|
138
|
+
const info = getFinancialInfo('6037991155667788');
|
|
147
139
|
// OR
|
|
148
|
-
const infoSheba = getFinancialInfo(
|
|
140
|
+
const infoSheba = getFinancialInfo('IR120170000000123456789012');
|
|
149
141
|
|
|
150
142
|
console.log(info);
|
|
151
|
-
/*
|
|
152
|
-
{
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
143
|
+
/*
|
|
144
|
+
{
|
|
145
|
+
type: "card", // or "sheba"
|
|
146
|
+
isValid: true,
|
|
147
|
+
bank: {
|
|
148
|
+
name: "Melli",
|
|
149
|
+
label: "ملی",
|
|
150
|
+
color: "#EF3F3E",
|
|
151
|
+
logo: "https://.../melli.svg",
|
|
152
|
+
formatted: "6037-9911-..."
|
|
153
|
+
}
|
|
161
154
|
}
|
|
162
|
-
}
|
|
163
155
|
*/
|
|
164
156
|
```
|
|
165
157
|
|
|
166
|
-
3. Crypto Wallet Validation
|
|
167
|
-
|
|
168
|
-
Perfect for Fintech and Exchange apps. Supports TRC20 (USDT), ERC20, and BTC.
|
|
158
|
+
3. Crypto Wallet Validation <br />
|
|
159
|
+
Perfect for Fintech and exchange apps. Supports TRC20 (USDT), ERC20, and BTC.
|
|
169
160
|
|
|
170
161
|
```typescript
|
|
171
|
-
import { zCrypto, getCryptoInfo } from
|
|
162
|
+
import { zCrypto, getCryptoInfo } from 'zod-ir';
|
|
172
163
|
|
|
173
|
-
const
|
|
164
|
+
const ValidationSchema = z.object({
|
|
174
165
|
// Accept any valid wallet (TRX, ETH, BTC)
|
|
175
166
|
anyWallet: zCrypto(),
|
|
176
167
|
|
|
177
|
-
// Strict:
|
|
168
|
+
// Strict: only accept Tether (TRC20)
|
|
178
169
|
usdtWallet: zCrypto({
|
|
179
|
-
ticker:
|
|
180
|
-
message:
|
|
170
|
+
ticker: 'TRX',
|
|
171
|
+
message: 'Only TRC20 addresses are allowed.',
|
|
181
172
|
}),
|
|
182
173
|
});
|
|
183
174
|
|
|
184
|
-
const details = getCryptoInfo(
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
175
|
+
const details = getCryptoInfo('TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t');
|
|
176
|
+
console.log(details);
|
|
177
|
+
/*
|
|
178
|
+
{
|
|
179
|
+
ticker: "TRX",
|
|
180
|
+
network: "TRC20",
|
|
181
|
+
isValid: true
|
|
182
|
+
}
|
|
191
183
|
*/
|
|
192
184
|
```
|
|
193
185
|
|
|
194
|
-
4. Jalali Date Validation
|
|
195
|
-
|
|
196
|
-
Validates Persian dates mathematically (checking days in month & leap years).
|
|
186
|
+
4. Jalali Date Validation <br />
|
|
187
|
+
Validates Persian dates mathematically, checking days in each month and leap years.
|
|
197
188
|
|
|
198
189
|
```typescript
|
|
199
|
-
import { zJalaliDate } from
|
|
190
|
+
import { zJalaliDate } from 'zod-ir';
|
|
200
191
|
|
|
201
|
-
const
|
|
202
|
-
birthDate: zJalaliDate({ message:
|
|
192
|
+
const ValidationSchema = z.object({
|
|
193
|
+
birthDate: zJalaliDate({ message: 'Invalid date.' }),
|
|
203
194
|
});
|
|
204
195
|
|
|
205
|
-
// ✅ Valid (Leap
|
|
206
|
-
|
|
196
|
+
// ✅ Valid (Leap Year)
|
|
197
|
+
ValidationSchema.parse({ birthDate: '1403/12/30' });
|
|
207
198
|
|
|
208
|
-
// ❌ Invalid (1402 is not a
|
|
209
|
-
|
|
199
|
+
// ❌ Invalid (1402 is not a Leap Year)
|
|
200
|
+
ValidationSchema.parse({ birthDate: '1402/12/30' });
|
|
210
201
|
```
|
|
211
202
|
|
|
212
|
-
5. Comprehensive Form Example
|
|
213
|
-
|
|
203
|
+
5. Comprehensive Form Example <br />
|
|
214
204
|
A full registration form handling Auto-fix (Persian digits), Mobile, and National Code.
|
|
215
205
|
|
|
216
206
|
```typescript
|
|
217
|
-
import
|
|
207
|
+
import * as z from 'zod';
|
|
218
208
|
import {
|
|
219
209
|
zMelliCode,
|
|
220
210
|
zIranianMobile,
|
|
@@ -222,8 +212,8 @@ import {
|
|
|
222
212
|
zBillId,
|
|
223
213
|
zPaymentId,
|
|
224
214
|
zPlateNumber,
|
|
225
|
-
preprocessNumber, // Converts ۱۲۳
|
|
226
|
-
} from
|
|
215
|
+
preprocessNumber, // Converts "۱۲۳" to 123
|
|
216
|
+
} from 'zod-ir';
|
|
227
217
|
|
|
228
218
|
const UserSchema = z.object({
|
|
229
219
|
// Auto-convert Persian digits before validation
|
|
@@ -231,7 +221,7 @@ const UserSchema = z.object({
|
|
|
231
221
|
|
|
232
222
|
mobile: zIranianMobile({ strictZero: true }),
|
|
233
223
|
card: zCardNumber(),
|
|
234
|
-
plate: zPlateNumber(), // e.g
|
|
224
|
+
plate: zPlateNumber(), // e.g., "12م345-11"
|
|
235
225
|
|
|
236
226
|
// Utility Bill
|
|
237
227
|
billId: zBillId(),
|
|
@@ -239,93 +229,90 @@ const UserSchema = z.object({
|
|
|
239
229
|
});
|
|
240
230
|
```
|
|
241
231
|
|
|
242
|
-
6. Smart Currency
|
|
243
|
-
|
|
244
|
-
Automatically validates, parses, and formats currency input. It handles Persian text, numbers, and formatted strings (mixed).
|
|
232
|
+
6. Smart Currency ₿ <br />
|
|
233
|
+
Automatically validates, parses, and formats currency input. It handles Persian text, numbers, and formatted strings (mixed).
|
|
245
234
|
|
|
246
235
|
```typescript
|
|
247
|
-
import { zToman, transformToCurrency, numberToText } from
|
|
236
|
+
import { zToman, transformToCurrency, numberToText } from 'zod-ir';
|
|
248
237
|
|
|
249
|
-
const
|
|
250
|
-
// Accepts inputs
|
|
238
|
+
const ValidationSchema = z.object({
|
|
239
|
+
// Accepts inputs such as "2.5 میلیون" ,"2,500,000" ,"دو میلیون و پانصد"
|
|
251
240
|
price: zToman({
|
|
252
241
|
min: 1000,
|
|
253
242
|
max: 50_000_000,
|
|
254
|
-
message:
|
|
243
|
+
message: 'Amount must be between 1,000 and 50 Million Tomans.',
|
|
255
244
|
}),
|
|
256
245
|
});
|
|
257
246
|
|
|
258
247
|
// --- Utility Functions for UI ---
|
|
259
248
|
|
|
260
|
-
// Convert
|
|
261
|
-
console.log(transformToCurrency(
|
|
262
|
-
console.log(transformToCurrency(
|
|
249
|
+
// Convert text/mixed to number (useful for database storage)
|
|
250
|
+
console.log(transformToCurrency('2 میلیون و پانصد')); // 2500000
|
|
251
|
+
console.log(transformToCurrency('سی صد')); // 300 (Auto-fixes typos)
|
|
263
252
|
|
|
264
|
-
// Convert
|
|
253
|
+
// Convert number to Persian text (useful for UI display)
|
|
265
254
|
console.log(numberToText(2500000)); // "دو میلیون و پانصد هزار"
|
|
266
255
|
```
|
|
267
256
|
|
|
268
257
|
## Metadata Helpers 🛠️
|
|
269
258
|
|
|
270
|
-
zod-ir isn't just for validation
|
|
259
|
+
zod-ir isn't just for validation—it also provides rich metadata for your UI.
|
|
271
260
|
| Function | Return Type | Description |
|
|
272
|
-
|
|
|
273
|
-
| `getFinancialInfo(val)` | `{ type, bank, isValid }` | Smart! Detects
|
|
274
|
-
| `getBankInfo(card)` | `{ name, label, logo... }` | Details for
|
|
275
|
-
| `getCryptoInfo(addr)` | `{ ticker, network }` | Detects TRC20, ERC20, BTC networks. |
|
|
276
|
-
| `getMobileOperator(num)` | `{ name, label, logo }` | Returns
|
|
277
|
-
| `getBillInfo(id, payId)` | `{ type, amount... }` | Bill
|
|
278
|
-
| `getPlateInfo(plate)` | `{ province, city }` | Province and
|
|
279
|
-
| `getJalaliDateInfo(date)` | `{ year, month, isLeap }` | Deconstructs Jalali date
|
|
280
|
-
| `getLandlineInfo(num)` | `{ province, city... }` | Returns
|
|
281
|
-
| `getPostalCodeInfo(code)` | `{ province, city }` | Returns
|
|
261
|
+
| :------------------------ | :--------------------------- | ------------------------------------------------------ |
|
|
262
|
+
| `getFinancialInfo(val)` | `{ type, bank, isValid }` | Smart! Detects card or Sheba, returns bank logo/color. |
|
|
263
|
+
| `getBankInfo(card)` | `{ name, label, logo, ... }` | Details for card numbers. |
|
|
264
|
+
| `getCryptoInfo(addr)` | `{ ticker, network }` | Detects TRC20, ERC20, and BTC networks. |
|
|
265
|
+
| `getMobileOperator(num)` | `{ name, label, logo }` | Returns the operator (MCI, Irancell) and the Logo. |
|
|
266
|
+
| `getBillInfo(id, payId)` | `{ type, amount, ... }` | Bill type (water, gas), amount calculation, validity. |
|
|
267
|
+
| `getPlateInfo(plate)` | `{ province, city }` | Province and city of the license plate. |
|
|
268
|
+
| `getJalaliDateInfo(date)` | `{ year, month, isLeap }` | Deconstructs Jalali date and checks for Leap Years. |
|
|
269
|
+
| `getLandlineInfo(num)` | `{ province, city, ... }` | Returns province/city (FA & EN) for landlines. |
|
|
270
|
+
| `getPostalCodeInfo(code)` | `{ province, city }` | Returns province/city based on the postal code. |
|
|
282
271
|
|
|
283
272
|
## API Reference 📚
|
|
284
273
|
|
|
285
274
|
Identity & Contact
|
|
286
275
|
| Validator | Description |
|
|
287
|
-
|
|
|
288
|
-
| `zMelliCode` | National
|
|
289
|
-
| `zShenaseMelli` | Legal
|
|
290
|
-
| `zPassport` | Iranian
|
|
291
|
-
| `zIranianMobile` | Mobile (09xx, +989xx) |
|
|
292
|
-
| `zPostalCode` | 10-digit
|
|
293
|
-
| `zLandline` | Landline
|
|
276
|
+
| :--------------- | :------------------------------- |
|
|
277
|
+
| `zMelliCode` | National code (Melli code) |
|
|
278
|
+
| `zShenaseMelli` | Legal person ID (company) |
|
|
279
|
+
| `zPassport` | Iranian passport |
|
|
280
|
+
| `zIranianMobile` | Mobile number (09xx, +989xx) |
|
|
281
|
+
| `zPostalCode` | 10-digit postal code |
|
|
282
|
+
| `zLandline` | Landline phone number (021xx...) |
|
|
294
283
|
|
|
295
284
|
Financial & Assets
|
|
296
285
|
| Validator | Description |
|
|
297
|
-
|
|
|
298
|
-
| `zFinancial` | Smart
|
|
299
|
-
| `zCardNumber` | Bank
|
|
286
|
+
| :------------- | :----------------------------------------- |
|
|
287
|
+
| `zFinancial` | Smart input (card number or Sheba) |
|
|
288
|
+
| `zCardNumber` | Bank card number (16 digits) |
|
|
300
289
|
| `zSheba` | IBAN (Sheba) |
|
|
301
|
-
| `zCrypto` | Crypto
|
|
302
|
-
| `zBillId` | Utility
|
|
303
|
-
| `zPaymentId` | Utility
|
|
304
|
-
| `zPlateNumber` | Vehicle
|
|
305
|
-
| `zJalaliDate` | Persian
|
|
306
|
-
| `zToman` | Automatically validates currency input |
|
|
290
|
+
| `zCrypto` | Crypto wallet (TRX, ETH, BTC) |
|
|
291
|
+
| `zBillId` | Utility bill ID |
|
|
292
|
+
| `zPaymentId` | Utility payment ID |
|
|
293
|
+
| `zPlateNumber` | Vehicle license plate |
|
|
294
|
+
| `zJalaliDate` | Persian date (YYYY/MM/DD) |
|
|
295
|
+
| `zToman` | Automatically validates the currency input |
|
|
307
296
|
|
|
308
|
-
##
|
|
297
|
+
## Versining Policy 🏷️
|
|
309
298
|
|
|
310
|
-
|
|
299
|
+
This project adheres to [The Semantic Versioning Standard](https://semver.org).
|
|
311
300
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
pnpm test
|
|
316
|
-
```
|
|
301
|
+
## Contributing 🤝🏻
|
|
302
|
+
|
|
303
|
+
Any form of contribution is always appreciated! Please refer to the [CONTRIBUTING.md](CONTRIBUTING.md) file.
|
|
317
304
|
|
|
318
|
-
## Credits
|
|
305
|
+
## Credits 🙏🏻
|
|
319
306
|
|
|
320
|
-
|
|
307
|
+
Bank and operator logos are courtesy of [Zegond's Logos Project](https://github.com/zegond).
|
|
321
308
|
|
|
322
|
-
##
|
|
309
|
+
## Funding 🌱
|
|
323
310
|
|
|
324
|
-
`zod-ir` is an open-source project and free to use. If it saved you some time and you'd like to say thanks, you can support its development via crypto. It's completely optional
|
|
311
|
+
`zod-ir` is an open-source project and free to use. If it saved you some time and you'd like to say thanks, you can support its development via crypto currency transactions. It's completely optional and highly appreciated!
|
|
325
312
|
|
|
326
313
|
- **USDT (TRC20) / TRX:** `TWtnFa4xpvH9BvciSzw4hqXUDCibWhcYxX`
|
|
327
314
|
- **Bitcoin:** `bc1qf2ry7mpnvncwapgu0al3wkxm4jxecac3s3pmf0`
|
|
328
315
|
|
|
329
|
-
## License
|
|
316
|
+
## License 📃
|
|
330
317
|
|
|
331
|
-
MIT
|
|
318
|
+
[MIT](LICENSE) License © 2026-PRESENT — [Reza Kheradmandi](https://github.com/Reza-kh80)
|