@react-vault/core 0.1.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.
Files changed (119) hide show
  1. package/LICENSE +12 -0
  2. package/README.md +41 -0
  3. package/dist/audit/auditClient.d.ts +40 -0
  4. package/dist/audit/auditClient.d.ts.map +1 -0
  5. package/dist/audit/auditClient.js +180 -0
  6. package/dist/audit/auditClient.js.map +1 -0
  7. package/dist/audit/index.d.ts +9 -0
  8. package/dist/audit/index.d.ts.map +1 -0
  9. package/dist/audit/index.js +9 -0
  10. package/dist/audit/index.js.map +1 -0
  11. package/dist/audit/scrubber.d.ts +27 -0
  12. package/dist/audit/scrubber.d.ts.map +1 -0
  13. package/dist/audit/scrubber.js +111 -0
  14. package/dist/audit/scrubber.js.map +1 -0
  15. package/dist/audit/types.d.ts +42 -0
  16. package/dist/audit/types.d.ts.map +1 -0
  17. package/dist/audit/types.js +2 -0
  18. package/dist/audit/types.js.map +1 -0
  19. package/dist/auth/crossTabSync.d.ts +15 -0
  20. package/dist/auth/crossTabSync.d.ts.map +1 -0
  21. package/dist/auth/crossTabSync.js +30 -0
  22. package/dist/auth/crossTabSync.js.map +1 -0
  23. package/dist/auth/idleTimer.d.ts +34 -0
  24. package/dist/auth/idleTimer.d.ts.map +1 -0
  25. package/dist/auth/idleTimer.js +54 -0
  26. package/dist/auth/idleTimer.js.map +1 -0
  27. package/dist/auth/index.d.ts +8 -0
  28. package/dist/auth/index.d.ts.map +1 -0
  29. package/dist/auth/index.js +8 -0
  30. package/dist/auth/index.js.map +1 -0
  31. package/dist/auth/tokenManager.d.ts +47 -0
  32. package/dist/auth/tokenManager.d.ts.map +1 -0
  33. package/dist/auth/tokenManager.js +75 -0
  34. package/dist/auth/tokenManager.js.map +1 -0
  35. package/dist/compliance/csp.d.ts +20 -0
  36. package/dist/compliance/csp.d.ts.map +1 -0
  37. package/dist/compliance/csp.js +34 -0
  38. package/dist/compliance/csp.js.map +1 -0
  39. package/dist/compliance/index.d.ts +8 -0
  40. package/dist/compliance/index.d.ts.map +1 -0
  41. package/dist/compliance/index.js +8 -0
  42. package/dist/compliance/index.js.map +1 -0
  43. package/dist/compliance/safeError.d.ts +12 -0
  44. package/dist/compliance/safeError.d.ts.map +1 -0
  45. package/dist/compliance/safeError.js +39 -0
  46. package/dist/compliance/safeError.js.map +1 -0
  47. package/dist/encryption/aesgcm.d.ts +22 -0
  48. package/dist/encryption/aesgcm.d.ts.map +1 -0
  49. package/dist/encryption/aesgcm.js +67 -0
  50. package/dist/encryption/aesgcm.js.map +1 -0
  51. package/dist/encryption/envelope.d.ts +30 -0
  52. package/dist/encryption/envelope.d.ts.map +1 -0
  53. package/dist/encryption/envelope.js +46 -0
  54. package/dist/encryption/envelope.js.map +1 -0
  55. package/dist/encryption/index.d.ts +19 -0
  56. package/dist/encryption/index.d.ts.map +1 -0
  57. package/dist/encryption/index.js +19 -0
  58. package/dist/encryption/index.js.map +1 -0
  59. package/dist/encryption/pbkdf2.d.ts +21 -0
  60. package/dist/encryption/pbkdf2.d.ts.map +1 -0
  61. package/dist/encryption/pbkdf2.js +48 -0
  62. package/dist/encryption/pbkdf2.js.map +1 -0
  63. package/dist/encryption/rsaoaep.d.ts +21 -0
  64. package/dist/encryption/rsaoaep.d.ts.map +1 -0
  65. package/dist/encryption/rsaoaep.js +43 -0
  66. package/dist/encryption/rsaoaep.js.map +1 -0
  67. package/dist/encryption/util.d.ts +17 -0
  68. package/dist/encryption/util.d.ts.map +1 -0
  69. package/dist/encryption/util.js +47 -0
  70. package/dist/encryption/util.js.map +1 -0
  71. package/dist/http/createAxios.d.ts +39 -0
  72. package/dist/http/createAxios.d.ts.map +1 -0
  73. package/dist/http/createAxios.js +58 -0
  74. package/dist/http/createAxios.js.map +1 -0
  75. package/dist/http/errors.d.ts +28 -0
  76. package/dist/http/errors.d.ts.map +1 -0
  77. package/dist/http/errors.js +57 -0
  78. package/dist/http/errors.js.map +1 -0
  79. package/dist/http/index.d.ts +10 -0
  80. package/dist/http/index.d.ts.map +1 -0
  81. package/dist/http/index.js +10 -0
  82. package/dist/http/index.js.map +1 -0
  83. package/dist/http/interceptors.d.ts +30 -0
  84. package/dist/http/interceptors.d.ts.map +1 -0
  85. package/dist/http/interceptors.js +112 -0
  86. package/dist/http/interceptors.js.map +1 -0
  87. package/dist/index.d.ts +17 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +17 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/pii/index.d.ts +10 -0
  92. package/dist/pii/index.d.ts.map +1 -0
  93. package/dist/pii/index.js +10 -0
  94. package/dist/pii/index.js.map +1 -0
  95. package/dist/pii/maskers.d.ts +63 -0
  96. package/dist/pii/maskers.d.ts.map +1 -0
  97. package/dist/pii/maskers.js +186 -0
  98. package/dist/pii/maskers.js.map +1 -0
  99. package/dist/pii/patterns.d.ts +20 -0
  100. package/dist/pii/patterns.d.ts.map +1 -0
  101. package/dist/pii/patterns.js +19 -0
  102. package/dist/pii/patterns.js.map +1 -0
  103. package/dist/pii/validators.d.ts +10 -0
  104. package/dist/pii/validators.d.ts.map +1 -0
  105. package/dist/pii/validators.js +66 -0
  106. package/dist/pii/validators.js.map +1 -0
  107. package/dist/storage/index.d.ts +14 -0
  108. package/dist/storage/index.d.ts.map +1 -0
  109. package/dist/storage/index.js +14 -0
  110. package/dist/storage/index.js.map +1 -0
  111. package/dist/storage/secureStorage.d.ts +28 -0
  112. package/dist/storage/secureStorage.d.ts.map +1 -0
  113. package/dist/storage/secureStorage.js +140 -0
  114. package/dist/storage/secureStorage.js.map +1 -0
  115. package/dist/storage/types.d.ts +13 -0
  116. package/dist/storage/types.d.ts.map +1 -0
  117. package/dist/storage/types.js +2 -0
  118. package/dist/storage/types.js.map +1 -0
  119. package/package.json +95 -0
@@ -0,0 +1,10 @@
1
+ /**
2
+ * PII masking utilities. All functions take a value and return a masked string.
3
+ *
4
+ * Convention: masking happens at the display layer, NOT at storage. Always store
5
+ * the full value (encrypted via secureStorage) and mask only for render.
6
+ */
7
+ export * from './maskers.js';
8
+ export * from './validators.js';
9
+ export * from './patterns.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pii/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * PII masking utilities. All functions take a value and return a masked string.
3
+ *
4
+ * Convention: masking happens at the display layer, NOT at storage. Always store
5
+ * the full value (encrypted via secureStorage) and mask only for render.
6
+ */
7
+ export * from './maskers.js';
8
+ export * from './validators.js';
9
+ export * from './patterns.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pii/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * PII maskers.
3
+ *
4
+ * Each masker takes a value (possibly null/undefined) and returns a string safe
5
+ * for display. Maskers are PURE — same input always produces same output.
6
+ *
7
+ * For interactive click-to-reveal, use the UI component <PIIMaskedDisplay>
8
+ * from @react-vault/ui, which uses these maskers internally.
9
+ */
10
+ /**
11
+ * Mask a PAN. `ABCDE1234F` → `ABCDE****F`.
12
+ * Returns the input unchanged if it doesn't match PAN shape (defensive).
13
+ */
14
+ export declare function maskPan(value: string | null | undefined): string;
15
+ /**
16
+ * Mask an Aadhaar. `123456789012` → `XXXX XXXX 9012`.
17
+ */
18
+ export declare function maskAadhaar(value: string | null | undefined): string;
19
+ /**
20
+ * Mask an account number. Shows last 4 digits, masks the rest.
21
+ * `123456789012345` → `***********2345`.
22
+ */
23
+ export declare function maskAccountNumber(value: string | null | undefined): string;
24
+ /**
25
+ * Mask a card number. Shows last 4 digits in PCI-DSS-friendly format.
26
+ * `4111111111111234` → `**** **** **** 1234`.
27
+ */
28
+ export declare function maskCardLast4(value: string | null | undefined): string;
29
+ /**
30
+ * Mask an Indian mobile number. `+91 9876543210` or `9876543210` → `+91 ******3210`.
31
+ */
32
+ export declare function maskMobile(value: string | null | undefined): string;
33
+ /**
34
+ * Mask an email. `john.doe@example.com` → `j***@example.com`.
35
+ * If the local part is single-char, masks to `*@domain.com`.
36
+ */
37
+ export declare function maskEmail(value: string | null | undefined): string;
38
+ /**
39
+ * Mask a name to show initials only. `John Smith Doe` → `J. S. D.`.
40
+ */
41
+ export declare function maskName(value: string | null | undefined): string;
42
+ /**
43
+ * Mask an address. Shows first line + city; masks the rest.
44
+ * Useful when display needs *some* address context (locality) but not full.
45
+ */
46
+ export declare function maskAddress(value: string | null | undefined): string;
47
+ /**
48
+ * Mask a date of birth — show age range instead of date.
49
+ * Returns `25-30 yrs` style bucket. Useful for "I need to know roughly,
50
+ * but not exact DOB".
51
+ */
52
+ export declare function maskDobAsAgeRange(value: string | Date | null | undefined): string;
53
+ /**
54
+ * Mask a generic string. Replaces all but first and last char with `*`.
55
+ * Fallback when no specialised masker fits.
56
+ */
57
+ export declare function maskGeneric(value: string | null | undefined): string;
58
+ /**
59
+ * Convenience dispatcher. Pick a masker by name.
60
+ */
61
+ export type MaskerType = 'pan' | 'aadhaar' | 'account_number' | 'card_last4' | 'mobile' | 'email' | 'name' | 'address' | 'dob' | 'generic';
62
+ export declare function mask(type: MaskerType, value: string | null | undefined): string;
63
+ //# sourceMappingURL=maskers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maskers.d.ts","sourceRoot":"","sources":["../../src/pii/maskers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;GAGG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAQhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CASpE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAS1E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAStE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CASnE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAclE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CASjE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAgBpE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAYjF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAQpE;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,SAAS,GACT,gBAAgB,GAChB,YAAY,GACZ,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,KAAK,GACL,SAAS,CAAC;AAEd,wBAAgB,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAwB/E"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * PII maskers.
3
+ *
4
+ * Each masker takes a value (possibly null/undefined) and returns a string safe
5
+ * for display. Maskers are PURE — same input always produces same output.
6
+ *
7
+ * For interactive click-to-reveal, use the UI component <PIIMaskedDisplay>
8
+ * from @react-vault/ui, which uses these maskers internally.
9
+ */
10
+ /**
11
+ * Mask a PAN. `ABCDE1234F` → `ABCDE****F`.
12
+ * Returns the input unchanged if it doesn't match PAN shape (defensive).
13
+ */
14
+ export function maskPan(value) {
15
+ if (!value) {
16
+ return '';
17
+ }
18
+ if (value.length !== 10) {
19
+ return value;
20
+ }
21
+ return `${value.slice(0, 5)}****${value.slice(9, 10)}`;
22
+ }
23
+ /**
24
+ * Mask an Aadhaar. `123456789012` → `XXXX XXXX 9012`.
25
+ */
26
+ export function maskAadhaar(value) {
27
+ if (!value) {
28
+ return '';
29
+ }
30
+ const digits = value.replace(/\D/g, '');
31
+ if (digits.length !== 12) {
32
+ return value;
33
+ }
34
+ return `XXXX XXXX ${digits.slice(-4)}`;
35
+ }
36
+ /**
37
+ * Mask an account number. Shows last 4 digits, masks the rest.
38
+ * `123456789012345` → `***********2345`.
39
+ */
40
+ export function maskAccountNumber(value) {
41
+ if (!value) {
42
+ return '';
43
+ }
44
+ const digits = value.replace(/\D/g, '');
45
+ if (digits.length < 5) {
46
+ return value;
47
+ }
48
+ return `${'*'.repeat(digits.length - 4)}${digits.slice(-4)}`;
49
+ }
50
+ /**
51
+ * Mask a card number. Shows last 4 digits in PCI-DSS-friendly format.
52
+ * `4111111111111234` → `**** **** **** 1234`.
53
+ */
54
+ export function maskCardLast4(value) {
55
+ if (!value) {
56
+ return '';
57
+ }
58
+ const digits = value.replace(/\D/g, '');
59
+ if (digits.length < 4) {
60
+ return value;
61
+ }
62
+ return `**** **** **** ${digits.slice(-4)}`;
63
+ }
64
+ /**
65
+ * Mask an Indian mobile number. `+91 9876543210` or `9876543210` → `+91 ******3210`.
66
+ */
67
+ export function maskMobile(value) {
68
+ if (!value) {
69
+ return '';
70
+ }
71
+ const digits = value.replace(/\D/g, '');
72
+ if (digits.length < 4) {
73
+ return value;
74
+ }
75
+ return `+91 ******${digits.slice(-4)}`;
76
+ }
77
+ /**
78
+ * Mask an email. `john.doe@example.com` → `j***@example.com`.
79
+ * If the local part is single-char, masks to `*@domain.com`.
80
+ */
81
+ export function maskEmail(value) {
82
+ if (!value) {
83
+ return '';
84
+ }
85
+ const at = value.indexOf('@');
86
+ if (at < 1) {
87
+ return value;
88
+ }
89
+ const local = value.slice(0, at);
90
+ const domain = value.slice(at);
91
+ if (local.length === 1) {
92
+ return `*${domain}`;
93
+ }
94
+ return `${local[0]}***${domain}`;
95
+ }
96
+ /**
97
+ * Mask a name to show initials only. `John Smith Doe` → `J. S. D.`.
98
+ */
99
+ export function maskName(value) {
100
+ if (!value) {
101
+ return '';
102
+ }
103
+ return value
104
+ .trim()
105
+ .split(/\s+/)
106
+ .map((part) => `${(part[0] ?? '').toUpperCase()}.`)
107
+ .join(' ');
108
+ }
109
+ /**
110
+ * Mask an address. Shows first line + city; masks the rest.
111
+ * Useful when display needs *some* address context (locality) but not full.
112
+ */
113
+ export function maskAddress(value) {
114
+ if (!value) {
115
+ return '';
116
+ }
117
+ const lines = value
118
+ .split(/[,\n]/)
119
+ .map((l) => l.trim())
120
+ .filter(Boolean);
121
+ if (lines.length === 0) {
122
+ return '';
123
+ }
124
+ if (lines.length === 1) {
125
+ return `${lines[0]}…`;
126
+ }
127
+ const first = lines[0];
128
+ return `${first}, …`;
129
+ }
130
+ /**
131
+ * Mask a date of birth — show age range instead of date.
132
+ * Returns `25-30 yrs` style bucket. Useful for "I need to know roughly,
133
+ * but not exact DOB".
134
+ */
135
+ export function maskDobAsAgeRange(value) {
136
+ if (!value) {
137
+ return '';
138
+ }
139
+ const dob = value instanceof Date ? value : new Date(value);
140
+ if (Number.isNaN(dob.getTime())) {
141
+ return '';
142
+ }
143
+ const age = Math.floor((Date.now() - dob.getTime()) / (365.25 * 24 * 60 * 60 * 1000));
144
+ const bucketLo = Math.floor(age / 5) * 5;
145
+ const bucketHi = bucketLo + 4;
146
+ return `${bucketLo}-${bucketHi} yrs`;
147
+ }
148
+ /**
149
+ * Mask a generic string. Replaces all but first and last char with `*`.
150
+ * Fallback when no specialised masker fits.
151
+ */
152
+ export function maskGeneric(value) {
153
+ if (!value) {
154
+ return '';
155
+ }
156
+ if (value.length <= 2) {
157
+ return '*'.repeat(value.length);
158
+ }
159
+ return `${value[0]}${'*'.repeat(value.length - 2)}${value[value.length - 1]}`;
160
+ }
161
+ export function mask(type, value) {
162
+ switch (type) {
163
+ case 'pan':
164
+ return maskPan(value);
165
+ case 'aadhaar':
166
+ return maskAadhaar(value);
167
+ case 'account_number':
168
+ return maskAccountNumber(value);
169
+ case 'card_last4':
170
+ return maskCardLast4(value);
171
+ case 'mobile':
172
+ return maskMobile(value);
173
+ case 'email':
174
+ return maskEmail(value);
175
+ case 'name':
176
+ return maskName(value);
177
+ case 'address':
178
+ return maskAddress(value);
179
+ case 'dob':
180
+ return maskDobAsAgeRange(value);
181
+ case 'generic':
182
+ default:
183
+ return maskGeneric(value);
184
+ }
185
+ }
186
+ //# sourceMappingURL=maskers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maskers.js","sourceRoot":"","sources":["../../src/pii/maskers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * PII regex patterns. Mirror of packages/claude-toolkit/skills/bfsi-form/references/validation-regex.md.
3
+ * Keep this file as the single source of truth — Zod schemas import from here.
4
+ */
5
+ export declare const PII_PATTERNS: {
6
+ readonly pan: RegExp;
7
+ readonly aadhaar: RegExp;
8
+ readonly mobileIndia: RegExp;
9
+ readonly email: RegExp;
10
+ readonly pincodeIndia: RegExp;
11
+ readonly accountNumber: RegExp;
12
+ readonly ifsc: RegExp;
13
+ readonly micr: RegExp;
14
+ readonly upiVpa: RegExp;
15
+ readonly swiftBic: RegExp;
16
+ readonly gstin: RegExp;
17
+ readonly passportIndia: RegExp;
18
+ };
19
+ export type PiiPatternKey = keyof typeof PII_PATTERNS;
20
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/pii/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;CAaf,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,YAAY,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * PII regex patterns. Mirror of packages/claude-toolkit/skills/bfsi-form/references/validation-regex.md.
3
+ * Keep this file as the single source of truth — Zod schemas import from here.
4
+ */
5
+ export const PII_PATTERNS = {
6
+ pan: /^[A-Z]{5}[0-9]{4}[A-Z]$/,
7
+ aadhaar: /^\d{12}$/,
8
+ mobileIndia: /^[6-9]\d{9}$/,
9
+ email: /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/,
10
+ pincodeIndia: /^\d{6}$/,
11
+ accountNumber: /^\d{9,18}$/,
12
+ ifsc: /^[A-Z]{4}0[A-Z0-9]{6}$/,
13
+ micr: /^\d{9}$/,
14
+ upiVpa: /^[a-zA-Z0-9.\-_]{2,256}@[a-zA-Z]{2,64}$/,
15
+ swiftBic: /^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/,
16
+ gstin: /^\d{2}[A-Z]{5}\d{4}[A-Z][A-Z\d][Z][A-Z\d]$/,
17
+ passportIndia: /^[A-Z][0-9]{7}$/,
18
+ };
19
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/pii/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,EAAE,yBAAyB;IAC9B,OAAO,EAAE,UAAU;IACnB,WAAW,EAAE,cAAc;IAC3B,KAAK,EAAE,kDAAkD;IACzD,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,YAAY;IAC3B,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,yCAAyC;IACjD,QAAQ,EAAE,6CAA6C;IACvD,KAAK,EAAE,4CAA4C;IACnD,aAAa,EAAE,iBAAiB;CACxB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function aadhaarVerhoeff(value: string): boolean;
2
+ export declare function isValidPan(value: string): boolean;
3
+ export declare function isValidAadhaar(value: string): boolean;
4
+ export declare function isValidIndianMobile(value: string): boolean;
5
+ export declare function isValidIfsc(value: string): boolean;
6
+ export declare function isValidAccountNumber(value: string): boolean;
7
+ export declare function isValidEmail(value: string): boolean;
8
+ export declare function isValidUpiVpa(value: string): boolean;
9
+ export declare function isValidGstin(value: string): boolean;
10
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/pii/validators.ts"],"names":[],"mappings":"AAiCA,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAStD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * PII validators. Used by Zod schemas (via `.refine()`) and standalone.
3
+ */
4
+ import { PII_PATTERNS } from './patterns.js';
5
+ /**
6
+ * Verhoeff checksum verification for Aadhaar.
7
+ * Aadhaar's 12th digit is a Verhoeff check digit.
8
+ */
9
+ const VERHOEFF_D = [
10
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
11
+ [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],
12
+ [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],
13
+ [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],
14
+ [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],
15
+ [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],
16
+ [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],
17
+ [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],
18
+ [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],
19
+ [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
20
+ ];
21
+ const VERHOEFF_P = [
22
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
23
+ [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],
24
+ [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],
25
+ [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],
26
+ [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],
27
+ [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],
28
+ [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],
29
+ [7, 0, 4, 6, 9, 1, 3, 2, 5, 8],
30
+ ];
31
+ export function aadhaarVerhoeff(value) {
32
+ if (!PII_PATTERNS.aadhaar.test(value))
33
+ return false;
34
+ let c = 0;
35
+ const reversed = value.split('').reverse().map(Number);
36
+ for (let i = 0; i < reversed.length; i++) {
37
+ const digit = reversed[i];
38
+ c = VERHOEFF_D[c][VERHOEFF_P[i % 8][digit]];
39
+ }
40
+ return c === 0;
41
+ }
42
+ export function isValidPan(value) {
43
+ return PII_PATTERNS.pan.test(value);
44
+ }
45
+ export function isValidAadhaar(value) {
46
+ return PII_PATTERNS.aadhaar.test(value) && aadhaarVerhoeff(value);
47
+ }
48
+ export function isValidIndianMobile(value) {
49
+ return PII_PATTERNS.mobileIndia.test(value);
50
+ }
51
+ export function isValidIfsc(value) {
52
+ return PII_PATTERNS.ifsc.test(value);
53
+ }
54
+ export function isValidAccountNumber(value) {
55
+ return PII_PATTERNS.accountNumber.test(value);
56
+ }
57
+ export function isValidEmail(value) {
58
+ return PII_PATTERNS.email.test(value);
59
+ }
60
+ export function isValidUpiVpa(value) {
61
+ return PII_PATTERNS.upiVpa.test(value);
62
+ }
63
+ export function isValidGstin(value) {
64
+ return PII_PATTERNS.gstin.test(value);
65
+ }
66
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/pii/validators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tiered, policy-driven storage. Defaults to memory-only.
3
+ *
4
+ * Sensitivity levels:
5
+ * - `transient` — memory only, cleared on tab close
6
+ * - `session` — sessionStorage (per-tab, cleared on close)
7
+ * - `persistent` — encrypted IndexedDB (survives close)
8
+ *
9
+ * Never use raw localStorage. The BFSI principle: PII never sits in
10
+ * a place readable by `document.cookie` or `localStorage.getItem`.
11
+ */
12
+ export * from './secureStorage.js';
13
+ export * from './types.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tiered, policy-driven storage. Defaults to memory-only.
3
+ *
4
+ * Sensitivity levels:
5
+ * - `transient` — memory only, cleared on tab close
6
+ * - `session` — sessionStorage (per-tab, cleared on close)
7
+ * - `persistent` — encrypted IndexedDB (survives close)
8
+ *
9
+ * Never use raw localStorage. The BFSI principle: PII never sits in
10
+ * a place readable by `document.cookie` or `localStorage.getItem`.
11
+ */
12
+ export * from './secureStorage.js';
13
+ export * from './types.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Secure storage abstraction. In-memory by default; sessionStorage on opt-in;
3
+ * encrypted IndexedDB for persistent needs.
4
+ *
5
+ * v0.1: in-memory + sessionStorage tiers implemented. Persistent (encrypted IDB)
6
+ * is stubbed and throws — implement in a follow-up.
7
+ */
8
+ import type { Sensitivity, SecureStorageOptions } from './types.js';
9
+ /**
10
+ * Put a value into secure storage.
11
+ */
12
+ export declare function put<T>(key: string, value: T, opts?: SecureStorageOptions): void;
13
+ /**
14
+ * Get a value. Returns null if absent or expired.
15
+ */
16
+ export declare function get<T>(key: string, opts?: {
17
+ sensitivity?: Sensitivity;
18
+ }): T | null;
19
+ export declare function del(key: string, opts?: {
20
+ sensitivity?: Sensitivity;
21
+ }): void;
22
+ /**
23
+ * Clear ALL stored values in the given tier. For logout flows.
24
+ */
25
+ export declare function clearAll(opts?: {
26
+ sensitivity?: Sensitivity;
27
+ }): void;
28
+ //# sourceMappingURL=secureStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secureStorage.d.ts","sourceRoot":"","sources":["../../src/storage/secureStorage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAiB,MAAM,YAAY,CAAC;AA8EnF;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,GAAE,oBAAyB,GAAG,IAAI,CAcnF;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,CAAC,GAAG,IAAI,CAYtF;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,IAAI,CAc/E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,IAAI,CAoBvE"}
@@ -0,0 +1,140 @@
1
+ const PREFIX = 'bfsi:';
2
+ const memoryStore = new Map();
3
+ function nowMs() {
4
+ return Date.now();
5
+ }
6
+ function buildRecord(value, ttlMs) {
7
+ const storedAt = nowMs();
8
+ return {
9
+ value,
10
+ storedAt,
11
+ expiresAt: ttlMs ? storedAt + ttlMs : undefined,
12
+ };
13
+ }
14
+ function isExpired(rec) {
15
+ return rec.expiresAt !== undefined && rec.expiresAt < nowMs();
16
+ }
17
+ function memPut(key, value, ttlMs) {
18
+ memoryStore.set(key, buildRecord(value, ttlMs));
19
+ }
20
+ function memGet(key) {
21
+ const rec = memoryStore.get(key);
22
+ if (!rec)
23
+ return null;
24
+ if (isExpired(rec)) {
25
+ memoryStore.delete(key);
26
+ return null;
27
+ }
28
+ return rec.value;
29
+ }
30
+ function memDel(key) {
31
+ memoryStore.delete(key);
32
+ }
33
+ function sessionPut(key, value, ttlMs) {
34
+ if (typeof sessionStorage === 'undefined') {
35
+ memPut(key, value, ttlMs);
36
+ return;
37
+ }
38
+ try {
39
+ sessionStorage.setItem(PREFIX + key, JSON.stringify(buildRecord(value, ttlMs)));
40
+ }
41
+ catch {
42
+ // Quota or privacy mode — fall back to memory
43
+ memPut(key, value, ttlMs);
44
+ }
45
+ }
46
+ function sessionGet(key) {
47
+ if (typeof sessionStorage === 'undefined')
48
+ return memGet(key);
49
+ try {
50
+ const raw = sessionStorage.getItem(PREFIX + key);
51
+ if (!raw)
52
+ return null;
53
+ const rec = JSON.parse(raw);
54
+ if (isExpired(rec)) {
55
+ sessionStorage.removeItem(PREFIX + key);
56
+ return null;
57
+ }
58
+ return rec.value;
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ function sessionDel(key) {
65
+ if (typeof sessionStorage === 'undefined') {
66
+ memDel(key);
67
+ return;
68
+ }
69
+ sessionStorage.removeItem(PREFIX + key);
70
+ }
71
+ /**
72
+ * Put a value into secure storage.
73
+ */
74
+ export function put(key, value, opts = {}) {
75
+ const sensitivity = opts.sensitivity ?? 'transient';
76
+ switch (sensitivity) {
77
+ case 'transient':
78
+ memPut(key, value, opts.ttlMs);
79
+ return;
80
+ case 'session':
81
+ sessionPut(key, value, opts.ttlMs);
82
+ return;
83
+ case 'persistent':
84
+ throw new Error('persistent storage requires encrypted-IndexedDB adapter — not implemented in v0.1');
85
+ }
86
+ }
87
+ /**
88
+ * Get a value. Returns null if absent or expired.
89
+ */
90
+ export function get(key, opts = {}) {
91
+ const sensitivity = opts.sensitivity ?? 'transient';
92
+ switch (sensitivity) {
93
+ case 'transient':
94
+ return memGet(key);
95
+ case 'session':
96
+ return sessionGet(key);
97
+ case 'persistent':
98
+ throw new Error('persistent storage requires encrypted-IndexedDB adapter — not implemented in v0.1');
99
+ }
100
+ }
101
+ export function del(key, opts = {}) {
102
+ const sensitivity = opts.sensitivity ?? 'transient';
103
+ switch (sensitivity) {
104
+ case 'transient':
105
+ memDel(key);
106
+ return;
107
+ case 'session':
108
+ sessionDel(key);
109
+ return;
110
+ case 'persistent':
111
+ throw new Error('persistent storage requires encrypted-IndexedDB adapter — not implemented in v0.1');
112
+ }
113
+ }
114
+ /**
115
+ * Clear ALL stored values in the given tier. For logout flows.
116
+ */
117
+ export function clearAll(opts = {}) {
118
+ const sensitivity = opts.sensitivity ?? 'transient';
119
+ if (sensitivity === 'transient') {
120
+ memoryStore.clear();
121
+ return;
122
+ }
123
+ if (sensitivity === 'session') {
124
+ if (typeof sessionStorage === 'undefined') {
125
+ memoryStore.clear();
126
+ return;
127
+ }
128
+ const toRemove = [];
129
+ for (let i = 0; i < sessionStorage.length; i++) {
130
+ const k = sessionStorage.key(i);
131
+ if (k?.startsWith(PREFIX))
132
+ toRemove.push(k);
133
+ }
134
+ for (const k of toRemove)
135
+ sessionStorage.removeItem(k);
136
+ return;
137
+ }
138
+ throw new Error('persistent storage requires encrypted-IndexedDB adapter — not implemented in v0.1');
139
+ }
140
+ //# sourceMappingURL=secureStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secureStorage.js","sourceRoot":"","sources":["../../src/storage/secureStorage.ts"],"names":[],"mappings":"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"}