joopjs 2.0.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/CHANGELOG.md +678 -0
- package/README.md +583 -0
- package/dist/a11y.service-C-DQQfgO.d.mts +143 -0
- package/dist/a11y.service-CauEJrJe.d.ts +143 -0
- package/dist/adapters-B6slG6hQ.d.mts +84 -0
- package/dist/adapters-B6slG6hQ.d.ts +84 -0
- package/dist/aes.service-CkoupAww.d.mts +95 -0
- package/dist/aes.service-CkoupAww.d.ts +95 -0
- package/dist/ai/index.d.mts +99 -0
- package/dist/ai/index.d.ts +99 -0
- package/dist/ai/index.js +307 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/index.mjs +304 -0
- package/dist/ai/index.mjs.map +1 -0
- package/dist/analytics/index.d.mts +42 -0
- package/dist/analytics/index.d.ts +42 -0
- package/dist/analytics/index.js +139 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +136 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/angular/index.d.mts +148 -0
- package/dist/angular/index.d.ts +148 -0
- package/dist/angular/index.js +122 -0
- package/dist/angular/index.js.map +1 -0
- package/dist/angular/index.mjs +101 -0
- package/dist/angular/index.mjs.map +1 -0
- package/dist/api/index.d.mts +128 -0
- package/dist/api/index.d.ts +128 -0
- package/dist/api/index.js +1358 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/index.mjs +1332 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/auth/index.d.mts +105 -0
- package/dist/auth/index.d.ts +105 -0
- package/dist/auth/index.js +989 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +979 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth.service-DNVB-L4U.d.mts +16 -0
- package/dist/auth.service-PjUUSUIt.d.ts +16 -0
- package/dist/banking/index.d.mts +1530 -0
- package/dist/banking/index.d.ts +1530 -0
- package/dist/banking/index.js +4739 -0
- package/dist/banking/index.js.map +1 -0
- package/dist/banking/index.mjs +4661 -0
- package/dist/banking/index.mjs.map +1 -0
- package/dist/cache/index.d.mts +40 -0
- package/dist/cache/index.d.ts +40 -0
- package/dist/cache/index.js +174 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/index.mjs +172 -0
- package/dist/cache/index.mjs.map +1 -0
- package/dist/client-profile.service-BuPeXVp5.d.mts +28 -0
- package/dist/client-profile.service-D5bRRYQp.d.ts +28 -0
- package/dist/config.models-Cqg04fAQ.d.mts +84 -0
- package/dist/config.models-Cqg04fAQ.d.ts +84 -0
- package/dist/config.service-CrCvI-JS.d.ts +31 -0
- package/dist/config.service-Cz4QQLlf.d.mts +31 -0
- package/dist/core/index.d.mts +4 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +631 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +619 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/crypto-utils-DriNhLdx.d.mts +30 -0
- package/dist/crypto-utils-DriNhLdx.d.ts +30 -0
- package/dist/data-storage.service-DT6xaTxE.d.ts +51 -0
- package/dist/data-storage.service-LvhGRCmw.d.mts +51 -0
- package/dist/deeplink/index.d.mts +39 -0
- package/dist/deeplink/index.d.ts +39 -0
- package/dist/deeplink/index.js +268 -0
- package/dist/deeplink/index.js.map +1 -0
- package/dist/deeplink/index.mjs +265 -0
- package/dist/deeplink/index.mjs.map +1 -0
- package/dist/deeplink.service-Ctd5u243.d.mts +35 -0
- package/dist/deeplink.service-uUuTnY9_.d.ts +35 -0
- package/dist/dev/index.d.mts +20 -0
- package/dist/dev/index.d.ts +20 -0
- package/dist/dev/index.js +51 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/index.mjs +49 -0
- package/dist/dev/index.mjs.map +1 -0
- package/dist/device/index.d.mts +108 -0
- package/dist/device/index.d.ts +108 -0
- package/dist/device/index.js +960 -0
- package/dist/device/index.js.map +1 -0
- package/dist/device/index.mjs +951 -0
- package/dist/device/index.mjs.map +1 -0
- package/dist/differential-privacy-BcAv1G80.d.mts +210 -0
- package/dist/differential-privacy-C8mAUjZr.d.ts +210 -0
- package/dist/encryption/index.d.mts +75 -0
- package/dist/encryption/index.d.ts +75 -0
- package/dist/encryption/index.js +605 -0
- package/dist/encryption/index.js.map +1 -0
- package/dist/encryption/index.mjs +598 -0
- package/dist/encryption/index.mjs.map +1 -0
- package/dist/form-validator-3tkmzr_o.d.mts +72 -0
- package/dist/form-validator-3tkmzr_o.d.ts +72 -0
- package/dist/forms/index.d.mts +59 -0
- package/dist/forms/index.d.ts +59 -0
- package/dist/forms/index.js +446 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/index.mjs +442 -0
- package/dist/forms/index.mjs.map +1 -0
- package/dist/i18n/index.d.mts +37 -0
- package/dist/i18n/index.d.ts +37 -0
- package/dist/i18n/index.js +147 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/index.mjs +145 -0
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/idempotency.service-_6LqhivP.d.mts +372 -0
- package/dist/idempotency.service-eOKoISRD.d.ts +372 -0
- package/dist/index-B_ksKpS1.d.mts +202 -0
- package/dist/index-CqDKWTUP.d.mts +28 -0
- package/dist/index-CqDKWTUP.d.ts +28 -0
- package/dist/index-DFqEoX_l.d.ts +202 -0
- package/dist/index-Dz0gOur2.d.mts +36 -0
- package/dist/index-Dz0gOur2.d.ts +36 -0
- package/dist/index.d.mts +1336 -0
- package/dist/index.d.ts +1336 -0
- package/dist/index.js +19464 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +19155 -0
- package/dist/index.mjs.map +1 -0
- package/dist/india/index.d.mts +75 -0
- package/dist/india/index.d.ts +75 -0
- package/dist/india/index.js +325 -0
- package/dist/india/index.js.map +1 -0
- package/dist/india/index.mjs +303 -0
- package/dist/india/index.mjs.map +1 -0
- package/dist/joop-Bx7Iwj5p.d.mts +155 -0
- package/dist/joop-CA3DMeOO.d.ts +155 -0
- package/dist/native-bridge/index.d.mts +27 -0
- package/dist/native-bridge/index.d.ts +27 -0
- package/dist/native-bridge/index.js +98 -0
- package/dist/native-bridge/index.js.map +1 -0
- package/dist/native-bridge/index.mjs +96 -0
- package/dist/native-bridge/index.mjs.map +1 -0
- package/dist/network/index.d.mts +85 -0
- package/dist/network/index.d.ts +85 -0
- package/dist/network/index.js +454 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/index.mjs +451 -0
- package/dist/network/index.mjs.map +1 -0
- package/dist/network-monitor-BIwPSXme.d.mts +179 -0
- package/dist/network-monitor-Bqp2hvZr.d.ts +179 -0
- package/dist/notification.service-Dm4fvfZf.d.mts +25 -0
- package/dist/notification.service-tEMKatWJ.d.ts +25 -0
- package/dist/observability/index.d.mts +179 -0
- package/dist/observability/index.d.ts +179 -0
- package/dist/observability/index.js +559 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/index.mjs +552 -0
- package/dist/observability/index.mjs.map +1 -0
- package/dist/oidc-client-DIJcClmB.d.mts +190 -0
- package/dist/oidc-client-DxhyE59t.d.ts +190 -0
- package/dist/platform/index.d.mts +73 -0
- package/dist/platform/index.d.ts +73 -0
- package/dist/platform/index.js +127 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/index.mjs +125 -0
- package/dist/platform/index.mjs.map +1 -0
- package/dist/pwa/index.d.mts +31 -0
- package/dist/pwa/index.d.ts +31 -0
- package/dist/pwa/index.js +247 -0
- package/dist/pwa/index.js.map +1 -0
- package/dist/pwa/index.mjs +244 -0
- package/dist/pwa/index.mjs.map +1 -0
- package/dist/react/index.d.mts +133 -0
- package/dist/react/index.d.ts +133 -0
- package/dist/react/index.js +632 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +630 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/router/index.d.mts +39 -0
- package/dist/router/index.d.ts +39 -0
- package/dist/router/index.js +168 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/index.mjs +166 -0
- package/dist/router/index.mjs.map +1 -0
- package/dist/security/index.d.mts +206 -0
- package/dist/security/index.d.ts +206 -0
- package/dist/security/index.js +1297 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/index.mjs +1285 -0
- package/dist/security/index.mjs.map +1 -0
- package/dist/session/index.d.mts +115 -0
- package/dist/session/index.d.ts +115 -0
- package/dist/session/index.js +297 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/index.mjs +292 -0
- package/dist/session/index.mjs.map +1 -0
- package/dist/state/index.d.mts +43 -0
- package/dist/state/index.d.ts +43 -0
- package/dist/state/index.js +156 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/index.mjs +152 -0
- package/dist/state/index.mjs.map +1 -0
- package/dist/statement-parser-BHQtXwCM.d.ts +260 -0
- package/dist/statement-parser-C2qNmb49.d.mts +260 -0
- package/dist/storage/index.d.mts +40 -0
- package/dist/storage/index.d.ts +40 -0
- package/dist/storage/index.js +256 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/index.mjs +252 -0
- package/dist/storage/index.mjs.map +1 -0
- package/dist/sync/index.d.mts +69 -0
- package/dist/sync/index.d.ts +69 -0
- package/dist/sync/index.js +330 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/index.mjs +323 -0
- package/dist/sync/index.mjs.map +1 -0
- package/dist/sync-engine-DCIMRG5s.d.ts +61 -0
- package/dist/sync-engine-DZqyKHkK.d.mts +61 -0
- package/dist/theme/index.d.mts +53 -0
- package/dist/theme/index.d.ts +53 -0
- package/dist/theme/index.js +169 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/index.mjs +167 -0
- package/dist/theme/index.mjs.map +1 -0
- package/dist/ui/index.d.mts +66 -0
- package/dist/ui/index.d.ts +66 -0
- package/dist/ui/index.js +811 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/index.mjs +803 -0
- package/dist/ui/index.mjs.map +1 -0
- package/dist/utilities/index.d.mts +199 -0
- package/dist/utilities/index.d.ts +199 -0
- package/dist/utilities/index.js +1991 -0
- package/dist/utilities/index.js.map +1 -0
- package/dist/utilities/index.mjs +1923 -0
- package/dist/utilities/index.mjs.map +1 -0
- package/dist/validation/index.d.mts +60 -0
- package/dist/validation/index.d.ts +60 -0
- package/dist/validation/index.js +460 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/index.mjs +455 -0
- package/dist/validation/index.mjs.map +1 -0
- package/dist/vue/index.d.mts +135 -0
- package/dist/vue/index.d.ts +135 -0
- package/dist/vue/index.js +621 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/vue/index.mjs +619 -0
- package/dist/vue/index.mjs.map +1 -0
- package/dist/watermark.service-Detur5tq.d.ts +235 -0
- package/dist/watermark.service-QNegMeQZ.d.mts +235 -0
- package/dist/workers/index.d.mts +42 -0
- package/dist/workers/index.d.ts +42 -0
- package/dist/workers/index.js +359 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/index.mjs +356 -0
- package/dist/workers/index.mjs.map +1 -0
- package/dist/workflow/index.d.mts +99 -0
- package/dist/workflow/index.d.ts +99 -0
- package/dist/workflow/index.js +282 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/index.mjs +279 -0
- package/dist/workflow/index.mjs.map +1 -0
- package/package.json +226 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
interface JoopPanDetails {
|
|
2
|
+
pan: string;
|
|
3
|
+
holderTypeCode: string;
|
|
4
|
+
holderType: string;
|
|
5
|
+
holderInitial: string;
|
|
6
|
+
checkDigit: string;
|
|
7
|
+
isValid: boolean;
|
|
8
|
+
}
|
|
9
|
+
declare function validatePan(pan: string): boolean;
|
|
10
|
+
declare function maskPan(pan: string): string;
|
|
11
|
+
declare function formatPan(pan: string): string;
|
|
12
|
+
declare function getPanType(pan: string): string | null;
|
|
13
|
+
declare function getPanDetails(pan: string): JoopPanDetails;
|
|
14
|
+
|
|
15
|
+
type JoopAadhaarMaskStyle = 'standard' | 'full' | 'last4';
|
|
16
|
+
interface JoopAadhaarDetails {
|
|
17
|
+
aadhaar: string;
|
|
18
|
+
isValid: boolean;
|
|
19
|
+
masked: string;
|
|
20
|
+
}
|
|
21
|
+
declare function validateAadhaar(aadhaar: string): boolean;
|
|
22
|
+
declare function maskAadhaar(aadhaar: string, style?: JoopAadhaarMaskStyle): string;
|
|
23
|
+
declare function formatAadhaar(aadhaar: string): string;
|
|
24
|
+
declare function getAadhaarDetails(aadhaar: string): JoopAadhaarDetails;
|
|
25
|
+
|
|
26
|
+
interface JoopIfscDetails {
|
|
27
|
+
ifsc: string;
|
|
28
|
+
bankCode: string;
|
|
29
|
+
bankName: string | null;
|
|
30
|
+
branchCode: string;
|
|
31
|
+
isValid: boolean;
|
|
32
|
+
}
|
|
33
|
+
declare function validateIfsc(ifsc: string): boolean;
|
|
34
|
+
declare function formatIfsc(ifsc: string): string;
|
|
35
|
+
declare function getIfscBank(ifsc: string): string | null;
|
|
36
|
+
declare function getIfscDetails(ifsc: string): JoopIfscDetails;
|
|
37
|
+
|
|
38
|
+
interface JoopUpiDetails {
|
|
39
|
+
vpa: string;
|
|
40
|
+
username: string;
|
|
41
|
+
handle: string;
|
|
42
|
+
provider: string | null;
|
|
43
|
+
isValid: boolean;
|
|
44
|
+
}
|
|
45
|
+
interface JoopUpiLinkOptions {
|
|
46
|
+
pa: string;
|
|
47
|
+
pn?: string;
|
|
48
|
+
am?: string | number;
|
|
49
|
+
cu?: string;
|
|
50
|
+
tn?: string;
|
|
51
|
+
tr?: string;
|
|
52
|
+
mc?: string;
|
|
53
|
+
mode?: string;
|
|
54
|
+
purpose?: string;
|
|
55
|
+
}
|
|
56
|
+
declare function validateUpi(vpa: string): boolean;
|
|
57
|
+
declare function formatUpi(vpa: string): string;
|
|
58
|
+
declare function getUpiDetails(vpa: string): JoopUpiDetails;
|
|
59
|
+
declare function generateUpiLink(options: JoopUpiLinkOptions): string;
|
|
60
|
+
|
|
61
|
+
interface JoopGstDetails {
|
|
62
|
+
gstin: string;
|
|
63
|
+
stateCode: string;
|
|
64
|
+
stateName: string | null;
|
|
65
|
+
pan: string;
|
|
66
|
+
entityNumber: string;
|
|
67
|
+
checkDigit: string;
|
|
68
|
+
isValid: boolean;
|
|
69
|
+
}
|
|
70
|
+
declare function validateGst(gstin: string): boolean;
|
|
71
|
+
declare function maskGst(gstin: string): string;
|
|
72
|
+
declare function getGstState(gstin: string): string | null;
|
|
73
|
+
declare function getGstDetails(gstin: string): JoopGstDetails;
|
|
74
|
+
|
|
75
|
+
export { type JoopAadhaarDetails, type JoopAadhaarMaskStyle, type JoopGstDetails, type JoopIfscDetails, type JoopPanDetails, type JoopUpiDetails, type JoopUpiLinkOptions, formatAadhaar, formatIfsc, formatPan, formatUpi, generateUpiLink, getAadhaarDetails, getGstDetails, getGstState, getIfscBank, getIfscDetails, getPanDetails, getPanType, getUpiDetails, maskAadhaar, maskGst, maskPan, validateAadhaar, validateGst, validateIfsc, validatePan, validateUpi };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
interface JoopPanDetails {
|
|
2
|
+
pan: string;
|
|
3
|
+
holderTypeCode: string;
|
|
4
|
+
holderType: string;
|
|
5
|
+
holderInitial: string;
|
|
6
|
+
checkDigit: string;
|
|
7
|
+
isValid: boolean;
|
|
8
|
+
}
|
|
9
|
+
declare function validatePan(pan: string): boolean;
|
|
10
|
+
declare function maskPan(pan: string): string;
|
|
11
|
+
declare function formatPan(pan: string): string;
|
|
12
|
+
declare function getPanType(pan: string): string | null;
|
|
13
|
+
declare function getPanDetails(pan: string): JoopPanDetails;
|
|
14
|
+
|
|
15
|
+
type JoopAadhaarMaskStyle = 'standard' | 'full' | 'last4';
|
|
16
|
+
interface JoopAadhaarDetails {
|
|
17
|
+
aadhaar: string;
|
|
18
|
+
isValid: boolean;
|
|
19
|
+
masked: string;
|
|
20
|
+
}
|
|
21
|
+
declare function validateAadhaar(aadhaar: string): boolean;
|
|
22
|
+
declare function maskAadhaar(aadhaar: string, style?: JoopAadhaarMaskStyle): string;
|
|
23
|
+
declare function formatAadhaar(aadhaar: string): string;
|
|
24
|
+
declare function getAadhaarDetails(aadhaar: string): JoopAadhaarDetails;
|
|
25
|
+
|
|
26
|
+
interface JoopIfscDetails {
|
|
27
|
+
ifsc: string;
|
|
28
|
+
bankCode: string;
|
|
29
|
+
bankName: string | null;
|
|
30
|
+
branchCode: string;
|
|
31
|
+
isValid: boolean;
|
|
32
|
+
}
|
|
33
|
+
declare function validateIfsc(ifsc: string): boolean;
|
|
34
|
+
declare function formatIfsc(ifsc: string): string;
|
|
35
|
+
declare function getIfscBank(ifsc: string): string | null;
|
|
36
|
+
declare function getIfscDetails(ifsc: string): JoopIfscDetails;
|
|
37
|
+
|
|
38
|
+
interface JoopUpiDetails {
|
|
39
|
+
vpa: string;
|
|
40
|
+
username: string;
|
|
41
|
+
handle: string;
|
|
42
|
+
provider: string | null;
|
|
43
|
+
isValid: boolean;
|
|
44
|
+
}
|
|
45
|
+
interface JoopUpiLinkOptions {
|
|
46
|
+
pa: string;
|
|
47
|
+
pn?: string;
|
|
48
|
+
am?: string | number;
|
|
49
|
+
cu?: string;
|
|
50
|
+
tn?: string;
|
|
51
|
+
tr?: string;
|
|
52
|
+
mc?: string;
|
|
53
|
+
mode?: string;
|
|
54
|
+
purpose?: string;
|
|
55
|
+
}
|
|
56
|
+
declare function validateUpi(vpa: string): boolean;
|
|
57
|
+
declare function formatUpi(vpa: string): string;
|
|
58
|
+
declare function getUpiDetails(vpa: string): JoopUpiDetails;
|
|
59
|
+
declare function generateUpiLink(options: JoopUpiLinkOptions): string;
|
|
60
|
+
|
|
61
|
+
interface JoopGstDetails {
|
|
62
|
+
gstin: string;
|
|
63
|
+
stateCode: string;
|
|
64
|
+
stateName: string | null;
|
|
65
|
+
pan: string;
|
|
66
|
+
entityNumber: string;
|
|
67
|
+
checkDigit: string;
|
|
68
|
+
isValid: boolean;
|
|
69
|
+
}
|
|
70
|
+
declare function validateGst(gstin: string): boolean;
|
|
71
|
+
declare function maskGst(gstin: string): string;
|
|
72
|
+
declare function getGstState(gstin: string): string | null;
|
|
73
|
+
declare function getGstDetails(gstin: string): JoopGstDetails;
|
|
74
|
+
|
|
75
|
+
export { type JoopAadhaarDetails, type JoopAadhaarMaskStyle, type JoopGstDetails, type JoopIfscDetails, type JoopPanDetails, type JoopUpiDetails, type JoopUpiLinkOptions, formatAadhaar, formatIfsc, formatPan, formatUpi, generateUpiLink, getAadhaarDetails, getGstDetails, getGstState, getIfscBank, getIfscDetails, getPanDetails, getPanType, getUpiDetails, maskAadhaar, maskGst, maskPan, validateAadhaar, validateGst, validateIfsc, validatePan, validateUpi };
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/india/pan.utility.ts
|
|
4
|
+
var PAN_REGEX = /^[A-Z]{5}[0-9]{4}[A-Z]$/;
|
|
5
|
+
var PAN_TYPE_CODES = {
|
|
6
|
+
P: "Individual",
|
|
7
|
+
C: "Company",
|
|
8
|
+
H: "HUF (Hindu Undivided Family)",
|
|
9
|
+
F: "Firm / Partnership",
|
|
10
|
+
A: "AOP (Association of Persons)",
|
|
11
|
+
B: "BOI (Body of Individuals)",
|
|
12
|
+
L: "Local Authority",
|
|
13
|
+
J: "Artificial Juridical Person",
|
|
14
|
+
G: "Government",
|
|
15
|
+
T: "Trust"
|
|
16
|
+
};
|
|
17
|
+
function validatePan(pan) {
|
|
18
|
+
const clean = pan.trim().toUpperCase();
|
|
19
|
+
if (!PAN_REGEX.test(clean)) return false;
|
|
20
|
+
const typeCode = clean[3];
|
|
21
|
+
return typeCode in PAN_TYPE_CODES;
|
|
22
|
+
}
|
|
23
|
+
function maskPan(pan) {
|
|
24
|
+
const clean = pan.trim().toUpperCase();
|
|
25
|
+
if (!validatePan(clean)) return pan;
|
|
26
|
+
return clean.slice(0, 2) + "***" + clean.slice(5, 9).replace(/\d/g, "X") + clean.slice(-1);
|
|
27
|
+
}
|
|
28
|
+
function formatPan(pan) {
|
|
29
|
+
return pan.trim().toUpperCase().replace(/\s/g, "");
|
|
30
|
+
}
|
|
31
|
+
function getPanType(pan) {
|
|
32
|
+
const clean = pan.trim().toUpperCase();
|
|
33
|
+
if (!validatePan(clean)) return null;
|
|
34
|
+
return PAN_TYPE_CODES[clean[3]] ?? null;
|
|
35
|
+
}
|
|
36
|
+
function getPanDetails(pan) {
|
|
37
|
+
const clean = pan.trim().toUpperCase();
|
|
38
|
+
const isValid = validatePan(clean);
|
|
39
|
+
return {
|
|
40
|
+
pan: clean,
|
|
41
|
+
holderTypeCode: clean[3] ?? "",
|
|
42
|
+
holderType: PAN_TYPE_CODES[clean[3]] ?? "Unknown",
|
|
43
|
+
holderInitial: clean[4] ?? "",
|
|
44
|
+
checkDigit: clean[9] ?? "",
|
|
45
|
+
isValid
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// src/india/aadhaar.utility.ts
|
|
50
|
+
var D_TABLE = [
|
|
51
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
52
|
+
[1, 2, 3, 4, 0, 6, 7, 8, 9, 5],
|
|
53
|
+
[2, 3, 4, 0, 1, 7, 8, 9, 5, 6],
|
|
54
|
+
[3, 4, 0, 1, 2, 8, 9, 5, 6, 7],
|
|
55
|
+
[4, 0, 1, 2, 3, 9, 5, 6, 7, 8],
|
|
56
|
+
[5, 9, 8, 7, 6, 0, 4, 3, 2, 1],
|
|
57
|
+
[6, 5, 9, 8, 7, 1, 0, 4, 3, 2],
|
|
58
|
+
[7, 6, 5, 9, 8, 2, 1, 0, 4, 3],
|
|
59
|
+
[8, 7, 6, 5, 9, 3, 2, 1, 0, 4],
|
|
60
|
+
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
|
|
61
|
+
];
|
|
62
|
+
var P_TABLE = [
|
|
63
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
64
|
+
[1, 5, 7, 6, 2, 8, 3, 0, 9, 4],
|
|
65
|
+
[5, 8, 0, 3, 7, 9, 6, 1, 4, 2],
|
|
66
|
+
[8, 9, 1, 6, 0, 4, 3, 5, 2, 7],
|
|
67
|
+
[9, 4, 5, 3, 1, 2, 6, 8, 7, 0],
|
|
68
|
+
[4, 2, 8, 6, 5, 7, 3, 9, 0, 1],
|
|
69
|
+
[2, 7, 9, 3, 8, 0, 6, 4, 1, 5],
|
|
70
|
+
[7, 0, 4, 6, 9, 1, 3, 2, 5, 8]
|
|
71
|
+
];
|
|
72
|
+
function verhoeff(numStr) {
|
|
73
|
+
let c = 0;
|
|
74
|
+
const reversed = numStr.split("").reverse();
|
|
75
|
+
for (let i = 0; i < reversed.length; i++) {
|
|
76
|
+
const digit = parseInt(reversed[i], 10);
|
|
77
|
+
c = D_TABLE[c][P_TABLE[i % 8][digit]];
|
|
78
|
+
}
|
|
79
|
+
return c === 0;
|
|
80
|
+
}
|
|
81
|
+
var AADHAAR_REGEX = /^\d{12}$/;
|
|
82
|
+
function validateAadhaar(aadhaar) {
|
|
83
|
+
const clean = aadhaar.replace(/\s/g, "");
|
|
84
|
+
if (!AADHAAR_REGEX.test(clean)) return false;
|
|
85
|
+
if (clean[0] === "0" || clean[0] === "1") return false;
|
|
86
|
+
return verhoeff(clean);
|
|
87
|
+
}
|
|
88
|
+
function maskAadhaar(aadhaar, style = "standard") {
|
|
89
|
+
const clean = aadhaar.replace(/\s/g, "");
|
|
90
|
+
if (clean.length !== 12) return aadhaar;
|
|
91
|
+
if (style === "full") return "XXXX XXXX XXXX";
|
|
92
|
+
if (style === "last4") return "XXXX XXXX " + clean.slice(8);
|
|
93
|
+
return "XXXX XXXX " + clean.slice(8);
|
|
94
|
+
}
|
|
95
|
+
function formatAadhaar(aadhaar) {
|
|
96
|
+
const clean = aadhaar.replace(/\s/g, "");
|
|
97
|
+
return clean.replace(/(\d{4})(\d{4})(\d{4})/, "$1 $2 $3");
|
|
98
|
+
}
|
|
99
|
+
function getAadhaarDetails(aadhaar) {
|
|
100
|
+
const clean = aadhaar.replace(/\s/g, "");
|
|
101
|
+
const isValid = validateAadhaar(clean);
|
|
102
|
+
return {
|
|
103
|
+
aadhaar: formatAadhaar(clean),
|
|
104
|
+
isValid,
|
|
105
|
+
masked: maskAadhaar(clean)
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// src/india/ifsc.utility.ts
|
|
110
|
+
var IFSC_REGEX = /^[A-Z]{4}0[A-Z0-9]{6}$/;
|
|
111
|
+
var BANK_CODES = {
|
|
112
|
+
SBIN: "State Bank of India",
|
|
113
|
+
HDFC: "HDFC Bank",
|
|
114
|
+
ICIC: "ICICI Bank",
|
|
115
|
+
AXIS: "Axis Bank",
|
|
116
|
+
KKBK: "Kotak Mahindra Bank",
|
|
117
|
+
PUNB: "Punjab National Bank",
|
|
118
|
+
UBIN: "Union Bank of India",
|
|
119
|
+
BKID: "Bank of India",
|
|
120
|
+
BARB: "Bank of Baroda",
|
|
121
|
+
CNRB: "Canara Bank",
|
|
122
|
+
IOBA: "Indian Overseas Bank",
|
|
123
|
+
UCBA: "UCO Bank",
|
|
124
|
+
ANDB: "Andhra Bank",
|
|
125
|
+
VIJB: "Vijaya Bank",
|
|
126
|
+
IDIB: "Indian Bank",
|
|
127
|
+
ALLA: "Allahabad Bank",
|
|
128
|
+
CORP: "Corporation Bank",
|
|
129
|
+
DEUT: "Deutsche Bank",
|
|
130
|
+
CITI: "Citibank",
|
|
131
|
+
HSBC: "HSBC Bank",
|
|
132
|
+
SCBL: "Standard Chartered Bank",
|
|
133
|
+
RATN: "RBL Bank",
|
|
134
|
+
YESB: "Yes Bank",
|
|
135
|
+
IDFC: "IDFC First Bank",
|
|
136
|
+
FDRL: "Federal Bank",
|
|
137
|
+
KARB: "Karnataka Bank",
|
|
138
|
+
KVBL: "Karur Vysya Bank",
|
|
139
|
+
DLXB: "Dhanlaxmi Bank",
|
|
140
|
+
SIBL: "South Indian Bank",
|
|
141
|
+
LAVB: "Lakshmi Vilas Bank",
|
|
142
|
+
NKGS: "NKGSB Co-operative Bank",
|
|
143
|
+
APGB: "Andhra Pradesh Grameena Vikas Bank",
|
|
144
|
+
MAHB: "Bank of Maharashtra",
|
|
145
|
+
PSIB: "Punjab & Sind Bank",
|
|
146
|
+
UTBI: "United Bank of India",
|
|
147
|
+
ORBC: "Oriental Bank of Commerce",
|
|
148
|
+
SYNB: "Syndicate Bank"
|
|
149
|
+
};
|
|
150
|
+
function validateIfsc(ifsc) {
|
|
151
|
+
return IFSC_REGEX.test(ifsc.trim().toUpperCase());
|
|
152
|
+
}
|
|
153
|
+
function formatIfsc(ifsc) {
|
|
154
|
+
return ifsc.trim().toUpperCase();
|
|
155
|
+
}
|
|
156
|
+
function getIfscBank(ifsc) {
|
|
157
|
+
const clean = ifsc.trim().toUpperCase();
|
|
158
|
+
if (!validateIfsc(clean)) return null;
|
|
159
|
+
const code = clean.slice(0, 4);
|
|
160
|
+
return BANK_CODES[code] ?? null;
|
|
161
|
+
}
|
|
162
|
+
function getIfscDetails(ifsc) {
|
|
163
|
+
const clean = ifsc.trim().toUpperCase();
|
|
164
|
+
const isValid = validateIfsc(clean);
|
|
165
|
+
const bankCode = clean.slice(0, 4);
|
|
166
|
+
return {
|
|
167
|
+
ifsc: clean,
|
|
168
|
+
bankCode,
|
|
169
|
+
bankName: BANK_CODES[bankCode] ?? null,
|
|
170
|
+
branchCode: clean.slice(5),
|
|
171
|
+
isValid
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// src/india/upi.utility.ts
|
|
176
|
+
var UPI_REGEX = /^[a-zA-Z0-9.\-_]{2,256}@[a-zA-Z][a-zA-Z]{2,64}$/;
|
|
177
|
+
var KNOWN_HANDLES = {
|
|
178
|
+
oksbi: "SBI Pay (Google Pay)",
|
|
179
|
+
okhdfcbank: "HDFC Bank (Google Pay)",
|
|
180
|
+
okicici: "ICICI Bank (Google Pay)",
|
|
181
|
+
okaxis: "Axis Bank (Google Pay)",
|
|
182
|
+
paytm: "Paytm",
|
|
183
|
+
ybl: "PhonePe (Yes Bank)",
|
|
184
|
+
ibl: "PhonePe (ICICI Bank)",
|
|
185
|
+
axl: "PhonePe (Axis Bank)",
|
|
186
|
+
upi: "NPCI Generic UPI",
|
|
187
|
+
apl: "Amazon Pay",
|
|
188
|
+
fam: "FamPay",
|
|
189
|
+
ikwik: "MobiKwik",
|
|
190
|
+
kotak: "Kotak Mahindra Bank",
|
|
191
|
+
sbi: "State Bank of India",
|
|
192
|
+
hdfc: "HDFC Bank",
|
|
193
|
+
icici: "ICICI Bank",
|
|
194
|
+
axis: "Axis Bank",
|
|
195
|
+
federal: "Federal Bank",
|
|
196
|
+
rbl: "RBL Bank",
|
|
197
|
+
indus: "IndusInd Bank",
|
|
198
|
+
cnrb: "Canara Bank",
|
|
199
|
+
barodampay: "Bank of Baroda"
|
|
200
|
+
};
|
|
201
|
+
function validateUpi(vpa) {
|
|
202
|
+
return UPI_REGEX.test(vpa.trim());
|
|
203
|
+
}
|
|
204
|
+
function formatUpi(vpa) {
|
|
205
|
+
return vpa.trim().toLowerCase();
|
|
206
|
+
}
|
|
207
|
+
function getUpiDetails(vpa) {
|
|
208
|
+
const clean = vpa.trim().toLowerCase();
|
|
209
|
+
const [username = "", handle = ""] = clean.split("@");
|
|
210
|
+
return {
|
|
211
|
+
vpa: clean,
|
|
212
|
+
username,
|
|
213
|
+
handle,
|
|
214
|
+
provider: KNOWN_HANDLES[handle] ?? null,
|
|
215
|
+
isValid: validateUpi(clean)
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
function generateUpiLink(options) {
|
|
219
|
+
const params = new URLSearchParams();
|
|
220
|
+
params.set("pa", options.pa);
|
|
221
|
+
if (options.pn) params.set("pn", options.pn);
|
|
222
|
+
if (options.am) params.set("am", String(options.am));
|
|
223
|
+
if (options.cu) params.set("cu", options.cu);
|
|
224
|
+
if (options.tn) params.set("tn", options.tn);
|
|
225
|
+
if (options.tr) params.set("tr", options.tr);
|
|
226
|
+
if (options.mc) params.set("mc", options.mc);
|
|
227
|
+
if (options.mode) params.set("mode", options.mode);
|
|
228
|
+
if (options.purpose) params.set("purpose", options.purpose);
|
|
229
|
+
return `upi://pay?${params.toString()}`;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// src/india/gst.utility.ts
|
|
233
|
+
var GST_REGEX = /^([0][1-9]|[1-9][0-9])[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$/;
|
|
234
|
+
var STATE_CODES = {
|
|
235
|
+
"01": "Jammu & Kashmir",
|
|
236
|
+
"02": "Himachal Pradesh",
|
|
237
|
+
"03": "Punjab",
|
|
238
|
+
"04": "Chandigarh",
|
|
239
|
+
"05": "Uttarakhand",
|
|
240
|
+
"06": "Haryana",
|
|
241
|
+
"07": "Delhi",
|
|
242
|
+
"08": "Rajasthan",
|
|
243
|
+
"09": "Uttar Pradesh",
|
|
244
|
+
"10": "Bihar",
|
|
245
|
+
"11": "Sikkim",
|
|
246
|
+
"12": "Arunachal Pradesh",
|
|
247
|
+
"13": "Nagaland",
|
|
248
|
+
"14": "Manipur",
|
|
249
|
+
"15": "Mizoram",
|
|
250
|
+
"16": "Tripura",
|
|
251
|
+
"17": "Meghalaya",
|
|
252
|
+
"18": "Assam",
|
|
253
|
+
"19": "West Bengal",
|
|
254
|
+
"20": "Jharkhand",
|
|
255
|
+
"21": "Odisha",
|
|
256
|
+
"22": "Chhattisgarh",
|
|
257
|
+
"23": "Madhya Pradesh",
|
|
258
|
+
"24": "Gujarat",
|
|
259
|
+
"25": "Daman & Diu",
|
|
260
|
+
"26": "Dadra & Nagar Haveli",
|
|
261
|
+
"27": "Maharashtra",
|
|
262
|
+
"28": "Andhra Pradesh (old)",
|
|
263
|
+
"29": "Karnataka",
|
|
264
|
+
"30": "Goa",
|
|
265
|
+
"31": "Lakshadweep",
|
|
266
|
+
"32": "Kerala",
|
|
267
|
+
"33": "Tamil Nadu",
|
|
268
|
+
"34": "Puducherry",
|
|
269
|
+
"35": "Andaman & Nicobar Islands",
|
|
270
|
+
"36": "Telangana",
|
|
271
|
+
"37": "Andhra Pradesh",
|
|
272
|
+
"38": "Ladakh",
|
|
273
|
+
"97": "Other Territory",
|
|
274
|
+
"99": "Centre Jurisdiction"
|
|
275
|
+
};
|
|
276
|
+
function validateGst(gstin) {
|
|
277
|
+
return GST_REGEX.test(gstin.trim().toUpperCase());
|
|
278
|
+
}
|
|
279
|
+
function maskGst(gstin) {
|
|
280
|
+
const clean = gstin.trim().toUpperCase();
|
|
281
|
+
if (clean.length !== 15) return gstin;
|
|
282
|
+
return clean.slice(0, 2) + "*****" + clean.slice(7, 11).replace(/./g, "X") + clean.slice(11);
|
|
283
|
+
}
|
|
284
|
+
function getGstState(gstin) {
|
|
285
|
+
const clean = gstin.trim().toUpperCase();
|
|
286
|
+
const code = clean.slice(0, 2);
|
|
287
|
+
return STATE_CODES[code] ?? null;
|
|
288
|
+
}
|
|
289
|
+
function getGstDetails(gstin) {
|
|
290
|
+
const clean = gstin.trim().toUpperCase();
|
|
291
|
+
const isValid = validateGst(clean);
|
|
292
|
+
return {
|
|
293
|
+
gstin: clean,
|
|
294
|
+
stateCode: clean.slice(0, 2),
|
|
295
|
+
stateName: STATE_CODES[clean.slice(0, 2)] ?? null,
|
|
296
|
+
pan: clean.slice(2, 12),
|
|
297
|
+
entityNumber: clean.slice(12, 13),
|
|
298
|
+
checkDigit: clean.slice(14),
|
|
299
|
+
isValid
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
exports.formatAadhaar = formatAadhaar;
|
|
304
|
+
exports.formatIfsc = formatIfsc;
|
|
305
|
+
exports.formatPan = formatPan;
|
|
306
|
+
exports.formatUpi = formatUpi;
|
|
307
|
+
exports.generateUpiLink = generateUpiLink;
|
|
308
|
+
exports.getAadhaarDetails = getAadhaarDetails;
|
|
309
|
+
exports.getGstDetails = getGstDetails;
|
|
310
|
+
exports.getGstState = getGstState;
|
|
311
|
+
exports.getIfscBank = getIfscBank;
|
|
312
|
+
exports.getIfscDetails = getIfscDetails;
|
|
313
|
+
exports.getPanDetails = getPanDetails;
|
|
314
|
+
exports.getPanType = getPanType;
|
|
315
|
+
exports.getUpiDetails = getUpiDetails;
|
|
316
|
+
exports.maskAadhaar = maskAadhaar;
|
|
317
|
+
exports.maskGst = maskGst;
|
|
318
|
+
exports.maskPan = maskPan;
|
|
319
|
+
exports.validateAadhaar = validateAadhaar;
|
|
320
|
+
exports.validateGst = validateGst;
|
|
321
|
+
exports.validateIfsc = validateIfsc;
|
|
322
|
+
exports.validatePan = validatePan;
|
|
323
|
+
exports.validateUpi = validateUpi;
|
|
324
|
+
//# sourceMappingURL=index.js.map
|
|
325
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/india/pan.utility.ts","../../src/india/aadhaar.utility.ts","../../src/india/ifsc.utility.ts","../../src/india/upi.utility.ts","../../src/india/gst.utility.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// PAN: Permanent Account Number (India)\n// Format: AAAAA9999A — 5 letters, 4 digits, 1 letter\n\nconst PAN_REGEX = /^[A-Z]{5}[0-9]{4}[A-Z]$/;\n\nconst PAN_TYPE_CODES: Record<string, string> = {\n P: 'Individual',\n C: 'Company',\n H: 'HUF (Hindu Undivided Family)',\n F: 'Firm / Partnership',\n A: 'AOP (Association of Persons)',\n B: 'BOI (Body of Individuals)',\n L: 'Local Authority',\n J: 'Artificial Juridical Person',\n G: 'Government',\n T: 'Trust',\n};\n\nexport interface JoopPanDetails {\n pan: string;\n holderTypeCode: string;\n holderType: string;\n holderInitial: string;\n checkDigit: string;\n isValid: boolean;\n}\n\nexport function validatePan(pan: string): boolean {\n const clean = pan.trim().toUpperCase();\n if (!PAN_REGEX.test(clean)) return false;\n const typeCode = clean[3];\n return typeCode in PAN_TYPE_CODES;\n}\n\nexport function maskPan(pan: string): string {\n const clean = pan.trim().toUpperCase();\n if (!validatePan(clean)) return pan;\n return clean.slice(0, 2) + '***' + clean.slice(5, 9).replace(/\\d/g, 'X') + clean.slice(-1);\n}\n\nexport function formatPan(pan: string): string {\n return pan.trim().toUpperCase().replace(/\\s/g, '');\n}\n\nexport function getPanType(pan: string): string | null {\n const clean = pan.trim().toUpperCase();\n if (!validatePan(clean)) return null;\n return PAN_TYPE_CODES[clean[3]] ?? null;\n}\n\nexport function getPanDetails(pan: string): JoopPanDetails {\n const clean = pan.trim().toUpperCase();\n const isValid = validatePan(clean);\n return {\n pan: clean,\n holderTypeCode: clean[3] ?? '',\n holderType: PAN_TYPE_CODES[clean[3]] ?? 'Unknown',\n holderInitial: clean[4] ?? '',\n checkDigit: clean[9] ?? '',\n isValid,\n };\n}\n","// Aadhaar: 12-digit unique identity number (India)\n// Validation uses Verhoeff checksum algorithm\n\n// Verhoeff multiplication table\nconst D_TABLE: number[][] = [\n [0,1,2,3,4,5,6,7,8,9],\n [1,2,3,4,0,6,7,8,9,5],\n [2,3,4,0,1,7,8,9,5,6],\n [3,4,0,1,2,8,9,5,6,7],\n [4,0,1,2,3,9,5,6,7,8],\n [5,9,8,7,6,0,4,3,2,1],\n [6,5,9,8,7,1,0,4,3,2],\n [7,6,5,9,8,2,1,0,4,3],\n [8,7,6,5,9,3,2,1,0,4],\n [9,8,7,6,5,4,3,2,1,0],\n];\n\nconst P_TABLE: number[][] = [\n [0,1,2,3,4,5,6,7,8,9],\n [1,5,7,6,2,8,3,0,9,4],\n [5,8,0,3,7,9,6,1,4,2],\n [8,9,1,6,0,4,3,5,2,7],\n [9,4,5,3,1,2,6,8,7,0],\n [4,2,8,6,5,7,3,9,0,1],\n [2,7,9,3,8,0,6,4,1,5],\n [7,0,4,6,9,1,3,2,5,8],\n];\n\nconst INV_TABLE = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9];\n\nfunction verhoeff(numStr: string): boolean {\n let c = 0;\n const reversed = numStr.split('').reverse();\n for (let i = 0; i < reversed.length; i++) {\n const digit = parseInt(reversed[i], 10);\n c = D_TABLE[c][P_TABLE[i % 8][digit]];\n }\n return c === 0;\n}\n\nconst AADHAAR_REGEX = /^\\d{12}$/;\n\nexport type JoopAadhaarMaskStyle = 'standard' | 'full' | 'last4';\n\nexport interface JoopAadhaarDetails {\n aadhaar: string;\n isValid: boolean;\n masked: string;\n}\n\nexport function validateAadhaar(aadhaar: string): boolean {\n const clean = aadhaar.replace(/\\s/g, '');\n if (!AADHAAR_REGEX.test(clean)) return false;\n // First digit cannot be 0 or 1\n if (clean[0] === '0' || clean[0] === '1') return false;\n return verhoeff(clean);\n}\n\nexport function maskAadhaar(aadhaar: string, style: JoopAadhaarMaskStyle = 'standard'): string {\n const clean = aadhaar.replace(/\\s/g, '');\n if (clean.length !== 12) return aadhaar;\n if (style === 'full') return 'XXXX XXXX XXXX';\n if (style === 'last4') return 'XXXX XXXX ' + clean.slice(8);\n // standard: show last 4\n return 'XXXX XXXX ' + clean.slice(8);\n}\n\nexport function formatAadhaar(aadhaar: string): string {\n const clean = aadhaar.replace(/\\s/g, '');\n return clean.replace(/(\\d{4})(\\d{4})(\\d{4})/, '$1 $2 $3');\n}\n\nexport function getAadhaarDetails(aadhaar: string): JoopAadhaarDetails {\n const clean = aadhaar.replace(/\\s/g, '');\n const isValid = validateAadhaar(clean);\n return {\n aadhaar: formatAadhaar(clean),\n isValid,\n masked: maskAadhaar(clean),\n };\n}\n","// IFSC: Indian Financial System Code\n// Format: AAAA0XXXXXX — 4 alpha (bank), 0 (literal), 6 alphanumeric (branch)\n\nconst IFSC_REGEX = /^[A-Z]{4}0[A-Z0-9]{6}$/;\n\nconst BANK_CODES: Record<string, string> = {\n SBIN: 'State Bank of India',\n HDFC: 'HDFC Bank',\n ICIC: 'ICICI Bank',\n AXIS: 'Axis Bank',\n KKBK: 'Kotak Mahindra Bank',\n PUNB: 'Punjab National Bank',\n UBIN: 'Union Bank of India',\n BKID: 'Bank of India',\n BARB: 'Bank of Baroda',\n CNRB: 'Canara Bank',\n IOBA: 'Indian Overseas Bank',\n UCBA: 'UCO Bank',\n ANDB: 'Andhra Bank',\n VIJB: 'Vijaya Bank',\n IDIB: 'Indian Bank',\n ALLA: 'Allahabad Bank',\n CORP: 'Corporation Bank',\n DEUT: 'Deutsche Bank',\n CITI: 'Citibank',\n HSBC: 'HSBC Bank',\n SCBL: 'Standard Chartered Bank',\n RATN: 'RBL Bank',\n YESB: 'Yes Bank',\n IDFC: 'IDFC First Bank',\n FDRL: 'Federal Bank',\n KARB: 'Karnataka Bank',\n KVBL: 'Karur Vysya Bank',\n DLXB: 'Dhanlaxmi Bank',\n SIBL: 'South Indian Bank',\n LAVB: 'Lakshmi Vilas Bank',\n NKGS: 'NKGSB Co-operative Bank',\n APGB: 'Andhra Pradesh Grameena Vikas Bank',\n MAHB: 'Bank of Maharashtra',\n PSIB: 'Punjab & Sind Bank',\n UTBI: 'United Bank of India',\n ORBC: 'Oriental Bank of Commerce',\n SYNB: 'Syndicate Bank',\n};\n\nexport interface JoopIfscDetails {\n ifsc: string;\n bankCode: string;\n bankName: string | null;\n branchCode: string;\n isValid: boolean;\n}\n\nexport function validateIfsc(ifsc: string): boolean {\n return IFSC_REGEX.test(ifsc.trim().toUpperCase());\n}\n\nexport function formatIfsc(ifsc: string): string {\n return ifsc.trim().toUpperCase();\n}\n\nexport function getIfscBank(ifsc: string): string | null {\n const clean = ifsc.trim().toUpperCase();\n if (!validateIfsc(clean)) return null;\n const code = clean.slice(0, 4);\n return BANK_CODES[code] ?? null;\n}\n\nexport function getIfscDetails(ifsc: string): JoopIfscDetails {\n const clean = ifsc.trim().toUpperCase();\n const isValid = validateIfsc(clean);\n const bankCode = clean.slice(0, 4);\n return {\n ifsc: clean,\n bankCode,\n bankName: BANK_CODES[bankCode] ?? null,\n branchCode: clean.slice(5),\n isValid,\n };\n}\n","// UPI: Unified Payments Interface VPA (Virtual Payment Address)\n// Format: user@handle\n\nconst UPI_REGEX = /^[a-zA-Z0-9.\\-_]{2,256}@[a-zA-Z][a-zA-Z]{2,64}$/;\n\nconst KNOWN_HANDLES: Record<string, string> = {\n oksbi: 'SBI Pay (Google Pay)',\n okhdfcbank:'HDFC Bank (Google Pay)',\n okicici: 'ICICI Bank (Google Pay)',\n okaxis: 'Axis Bank (Google Pay)',\n paytm: 'Paytm',\n ybl: 'PhonePe (Yes Bank)',\n ibl: 'PhonePe (ICICI Bank)',\n axl: 'PhonePe (Axis Bank)',\n upi: 'NPCI Generic UPI',\n apl: 'Amazon Pay',\n fam: 'FamPay',\n ikwik: 'MobiKwik',\n kotak: 'Kotak Mahindra Bank',\n sbi: 'State Bank of India',\n hdfc: 'HDFC Bank',\n icici: 'ICICI Bank',\n axis: 'Axis Bank',\n federal: 'Federal Bank',\n rbl: 'RBL Bank',\n indus: 'IndusInd Bank',\n cnrb: 'Canara Bank',\n barodampay:'Bank of Baroda',\n};\n\nexport interface JoopUpiDetails {\n vpa: string;\n username: string;\n handle: string;\n provider: string | null;\n isValid: boolean;\n}\n\nexport interface JoopUpiLinkOptions {\n pa: string; // payee VPA\n pn?: string; // payee name\n am?: string | number; // amount\n cu?: string; // currency (default INR)\n tn?: string; // transaction note\n tr?: string; // transaction reference\n mc?: string; // merchant code\n mode?: string; // '00' QR, '01' intent\n purpose?: string;\n}\n\nexport function validateUpi(vpa: string): boolean {\n return UPI_REGEX.test(vpa.trim());\n}\n\nexport function formatUpi(vpa: string): string {\n return vpa.trim().toLowerCase();\n}\n\nexport function getUpiDetails(vpa: string): JoopUpiDetails {\n const clean = vpa.trim().toLowerCase();\n const [username = '', handle = ''] = clean.split('@');\n return {\n vpa: clean,\n username,\n handle,\n provider: KNOWN_HANDLES[handle] ?? null,\n isValid: validateUpi(clean),\n };\n}\n\nexport function generateUpiLink(options: JoopUpiLinkOptions): string {\n const params = new URLSearchParams();\n params.set('pa', options.pa);\n if (options.pn) params.set('pn', options.pn);\n if (options.am) params.set('am', String(options.am));\n if (options.cu) params.set('cu', options.cu);\n if (options.tn) params.set('tn', options.tn);\n if (options.tr) params.set('tr', options.tr);\n if (options.mc) params.set('mc', options.mc);\n if (options.mode) params.set('mode', options.mode);\n if (options.purpose) params.set('purpose', options.purpose);\n return `upi://pay?${params.toString()}`;\n}\n","// GST: Goods and Services Tax Identification Number (India)\n// Format: 22AAAAA0000A1Z5 — 15 chars\n// Pos 1-2: state code (01-37), 3-12: PAN, 13: entity number, 14: Z (default), 15: checksum\n\nconst GST_REGEX = /^([0][1-9]|[1-9][0-9])[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$/;\n\nconst STATE_CODES: Record<string, string> = {\n '01': 'Jammu & Kashmir',\n '02': 'Himachal Pradesh',\n '03': 'Punjab',\n '04': 'Chandigarh',\n '05': 'Uttarakhand',\n '06': 'Haryana',\n '07': 'Delhi',\n '08': 'Rajasthan',\n '09': 'Uttar Pradesh',\n '10': 'Bihar',\n '11': 'Sikkim',\n '12': 'Arunachal Pradesh',\n '13': 'Nagaland',\n '14': 'Manipur',\n '15': 'Mizoram',\n '16': 'Tripura',\n '17': 'Meghalaya',\n '18': 'Assam',\n '19': 'West Bengal',\n '20': 'Jharkhand',\n '21': 'Odisha',\n '22': 'Chhattisgarh',\n '23': 'Madhya Pradesh',\n '24': 'Gujarat',\n '25': 'Daman & Diu',\n '26': 'Dadra & Nagar Haveli',\n '27': 'Maharashtra',\n '28': 'Andhra Pradesh (old)',\n '29': 'Karnataka',\n '30': 'Goa',\n '31': 'Lakshadweep',\n '32': 'Kerala',\n '33': 'Tamil Nadu',\n '34': 'Puducherry',\n '35': 'Andaman & Nicobar Islands',\n '36': 'Telangana',\n '37': 'Andhra Pradesh',\n '38': 'Ladakh',\n '97': 'Other Territory',\n '99': 'Centre Jurisdiction',\n};\n\nexport interface JoopGstDetails {\n gstin: string;\n stateCode: string;\n stateName: string | null;\n pan: string;\n entityNumber: string;\n checkDigit: string;\n isValid: boolean;\n}\n\nexport function validateGst(gstin: string): boolean {\n return GST_REGEX.test(gstin.trim().toUpperCase());\n}\n\nexport function maskGst(gstin: string): string {\n const clean = gstin.trim().toUpperCase();\n if (clean.length !== 15) return gstin;\n return clean.slice(0, 2) + '*****' + clean.slice(7, 11).replace(/./g, 'X') + clean.slice(11);\n}\n\nexport function getGstState(gstin: string): string | null {\n const clean = gstin.trim().toUpperCase();\n const code = clean.slice(0, 2);\n return STATE_CODES[code] ?? null;\n}\n\nexport function getGstDetails(gstin: string): JoopGstDetails {\n const clean = gstin.trim().toUpperCase();\n const isValid = validateGst(clean);\n return {\n gstin: clean,\n stateCode: clean.slice(0, 2),\n stateName: STATE_CODES[clean.slice(0, 2)] ?? null,\n pan: clean.slice(2, 12),\n entityNumber: clean.slice(12, 13),\n checkDigit: clean.slice(14),\n isValid,\n };\n}\n"]}
|