rehydra 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 (155) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +615 -0
  3. package/dist/crypto/index.d.ts +6 -0
  4. package/dist/crypto/index.d.ts.map +1 -0
  5. package/dist/crypto/index.js +6 -0
  6. package/dist/crypto/index.js.map +1 -0
  7. package/dist/crypto/pii-map-crypto.d.ts +114 -0
  8. package/dist/crypto/pii-map-crypto.d.ts.map +1 -0
  9. package/dist/crypto/pii-map-crypto.js +228 -0
  10. package/dist/crypto/pii-map-crypto.js.map +1 -0
  11. package/dist/index.d.ts +180 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +384 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/ner/bio-decoder.d.ts +64 -0
  16. package/dist/ner/bio-decoder.d.ts.map +1 -0
  17. package/dist/ner/bio-decoder.js +216 -0
  18. package/dist/ner/bio-decoder.js.map +1 -0
  19. package/dist/ner/index.d.ts +10 -0
  20. package/dist/ner/index.d.ts.map +1 -0
  21. package/dist/ner/index.js +10 -0
  22. package/dist/ner/index.js.map +1 -0
  23. package/dist/ner/model-manager.d.ts +111 -0
  24. package/dist/ner/model-manager.d.ts.map +1 -0
  25. package/dist/ner/model-manager.js +325 -0
  26. package/dist/ner/model-manager.js.map +1 -0
  27. package/dist/ner/ner-model.d.ts +114 -0
  28. package/dist/ner/ner-model.d.ts.map +1 -0
  29. package/dist/ner/ner-model.js +253 -0
  30. package/dist/ner/ner-model.js.map +1 -0
  31. package/dist/ner/onnx-runtime.d.ts +46 -0
  32. package/dist/ner/onnx-runtime.d.ts.map +1 -0
  33. package/dist/ner/onnx-runtime.js +130 -0
  34. package/dist/ner/onnx-runtime.js.map +1 -0
  35. package/dist/ner/tokenizer.d.ts +118 -0
  36. package/dist/ner/tokenizer.d.ts.map +1 -0
  37. package/dist/ner/tokenizer.js +332 -0
  38. package/dist/ner/tokenizer.js.map +1 -0
  39. package/dist/pipeline/index.d.ts +12 -0
  40. package/dist/pipeline/index.d.ts.map +1 -0
  41. package/dist/pipeline/index.js +12 -0
  42. package/dist/pipeline/index.js.map +1 -0
  43. package/dist/pipeline/prenormalize.d.ts +48 -0
  44. package/dist/pipeline/prenormalize.d.ts.map +1 -0
  45. package/dist/pipeline/prenormalize.js +94 -0
  46. package/dist/pipeline/prenormalize.js.map +1 -0
  47. package/dist/pipeline/resolver.d.ts +56 -0
  48. package/dist/pipeline/resolver.d.ts.map +1 -0
  49. package/dist/pipeline/resolver.js +239 -0
  50. package/dist/pipeline/resolver.js.map +1 -0
  51. package/dist/pipeline/semantic-data-loader.d.ts +165 -0
  52. package/dist/pipeline/semantic-data-loader.d.ts.map +1 -0
  53. package/dist/pipeline/semantic-data-loader.js +655 -0
  54. package/dist/pipeline/semantic-data-loader.js.map +1 -0
  55. package/dist/pipeline/semantic-enricher.d.ts +112 -0
  56. package/dist/pipeline/semantic-enricher.d.ts.map +1 -0
  57. package/dist/pipeline/semantic-enricher.js +318 -0
  58. package/dist/pipeline/semantic-enricher.js.map +1 -0
  59. package/dist/pipeline/tagger.d.ts +114 -0
  60. package/dist/pipeline/tagger.d.ts.map +1 -0
  61. package/dist/pipeline/tagger.js +374 -0
  62. package/dist/pipeline/tagger.js.map +1 -0
  63. package/dist/pipeline/title-extractor.d.ts +79 -0
  64. package/dist/pipeline/title-extractor.d.ts.map +1 -0
  65. package/dist/pipeline/title-extractor.js +801 -0
  66. package/dist/pipeline/title-extractor.js.map +1 -0
  67. package/dist/pipeline/validator.d.ts +65 -0
  68. package/dist/pipeline/validator.d.ts.map +1 -0
  69. package/dist/pipeline/validator.js +264 -0
  70. package/dist/pipeline/validator.js.map +1 -0
  71. package/dist/recognizers/base.d.ts +78 -0
  72. package/dist/recognizers/base.d.ts.map +1 -0
  73. package/dist/recognizers/base.js +100 -0
  74. package/dist/recognizers/base.js.map +1 -0
  75. package/dist/recognizers/bic-swift.d.ts +10 -0
  76. package/dist/recognizers/bic-swift.d.ts.map +1 -0
  77. package/dist/recognizers/bic-swift.js +107 -0
  78. package/dist/recognizers/bic-swift.js.map +1 -0
  79. package/dist/recognizers/credit-card.d.ts +32 -0
  80. package/dist/recognizers/credit-card.d.ts.map +1 -0
  81. package/dist/recognizers/credit-card.js +160 -0
  82. package/dist/recognizers/credit-card.js.map +1 -0
  83. package/dist/recognizers/custom-id.d.ts +28 -0
  84. package/dist/recognizers/custom-id.d.ts.map +1 -0
  85. package/dist/recognizers/custom-id.js +116 -0
  86. package/dist/recognizers/custom-id.js.map +1 -0
  87. package/dist/recognizers/email.d.ts +10 -0
  88. package/dist/recognizers/email.d.ts.map +1 -0
  89. package/dist/recognizers/email.js +75 -0
  90. package/dist/recognizers/email.js.map +1 -0
  91. package/dist/recognizers/iban.d.ts +14 -0
  92. package/dist/recognizers/iban.d.ts.map +1 -0
  93. package/dist/recognizers/iban.js +67 -0
  94. package/dist/recognizers/iban.js.map +1 -0
  95. package/dist/recognizers/index.d.ts +20 -0
  96. package/dist/recognizers/index.d.ts.map +1 -0
  97. package/dist/recognizers/index.js +42 -0
  98. package/dist/recognizers/index.js.map +1 -0
  99. package/dist/recognizers/ip-address.d.ts +14 -0
  100. package/dist/recognizers/ip-address.d.ts.map +1 -0
  101. package/dist/recognizers/ip-address.js +183 -0
  102. package/dist/recognizers/ip-address.js.map +1 -0
  103. package/dist/recognizers/phone.d.ts +10 -0
  104. package/dist/recognizers/phone.d.ts.map +1 -0
  105. package/dist/recognizers/phone.js +145 -0
  106. package/dist/recognizers/phone.js.map +1 -0
  107. package/dist/recognizers/registry.d.ts +59 -0
  108. package/dist/recognizers/registry.d.ts.map +1 -0
  109. package/dist/recognizers/registry.js +113 -0
  110. package/dist/recognizers/registry.js.map +1 -0
  111. package/dist/recognizers/url.d.ts +14 -0
  112. package/dist/recognizers/url.d.ts.map +1 -0
  113. package/dist/recognizers/url.js +121 -0
  114. package/dist/recognizers/url.js.map +1 -0
  115. package/dist/types/index.d.ts +197 -0
  116. package/dist/types/index.d.ts.map +1 -0
  117. package/dist/types/index.js +80 -0
  118. package/dist/types/index.js.map +1 -0
  119. package/dist/types/pii-types.d.ts +50 -0
  120. package/dist/types/pii-types.d.ts.map +1 -0
  121. package/dist/types/pii-types.js +114 -0
  122. package/dist/types/pii-types.js.map +1 -0
  123. package/dist/utils/iban-checksum.d.ts +23 -0
  124. package/dist/utils/iban-checksum.d.ts.map +1 -0
  125. package/dist/utils/iban-checksum.js +106 -0
  126. package/dist/utils/iban-checksum.js.map +1 -0
  127. package/dist/utils/index.d.ts +10 -0
  128. package/dist/utils/index.d.ts.map +1 -0
  129. package/dist/utils/index.js +10 -0
  130. package/dist/utils/index.js.map +1 -0
  131. package/dist/utils/luhn.d.ts +17 -0
  132. package/dist/utils/luhn.d.ts.map +1 -0
  133. package/dist/utils/luhn.js +55 -0
  134. package/dist/utils/luhn.js.map +1 -0
  135. package/dist/utils/offsets.d.ts +86 -0
  136. package/dist/utils/offsets.d.ts.map +1 -0
  137. package/dist/utils/offsets.js +124 -0
  138. package/dist/utils/offsets.js.map +1 -0
  139. package/dist/utils/path.d.ts +34 -0
  140. package/dist/utils/path.d.ts.map +1 -0
  141. package/dist/utils/path.js +96 -0
  142. package/dist/utils/path.js.map +1 -0
  143. package/dist/utils/storage-browser.d.ts +51 -0
  144. package/dist/utils/storage-browser.d.ts.map +1 -0
  145. package/dist/utils/storage-browser.js +381 -0
  146. package/dist/utils/storage-browser.js.map +1 -0
  147. package/dist/utils/storage-node.d.ts +43 -0
  148. package/dist/utils/storage-node.d.ts.map +1 -0
  149. package/dist/utils/storage-node.js +93 -0
  150. package/dist/utils/storage-node.js.map +1 -0
  151. package/dist/utils/storage.d.ts +70 -0
  152. package/dist/utils/storage.d.ts.map +1 -0
  153. package/dist/utils/storage.js +69 -0
  154. package/dist/utils/storage.js.map +1 -0
  155. package/package.json +66 -0
@@ -0,0 +1,114 @@
1
+ /**
2
+ * PII Type Enumeration
3
+ * Defines all supported PII categories for detection and anonymization
4
+ */
5
+ export var PIIType;
6
+ (function (PIIType) {
7
+ // Personal identifiers
8
+ PIIType["PERSON"] = "PERSON";
9
+ PIIType["ORG"] = "ORG";
10
+ PIIType["LOCATION"] = "LOCATION";
11
+ PIIType["ADDRESS"] = "ADDRESS";
12
+ // Contact information
13
+ PIIType["EMAIL"] = "EMAIL";
14
+ PIIType["PHONE"] = "PHONE";
15
+ PIIType["URL"] = "URL";
16
+ PIIType["IP_ADDRESS"] = "IP_ADDRESS";
17
+ // Financial identifiers
18
+ PIIType["IBAN"] = "IBAN";
19
+ PIIType["BIC_SWIFT"] = "BIC_SWIFT";
20
+ PIIType["ACCOUNT_NUMBER"] = "ACCOUNT_NUMBER";
21
+ PIIType["CREDIT_CARD"] = "CREDIT_CARD";
22
+ // Government/Tax identifiers
23
+ PIIType["TAX_ID"] = "TAX_ID";
24
+ PIIType["NATIONAL_ID"] = "NATIONAL_ID";
25
+ PIIType["DATE_OF_BIRTH"] = "DATE_OF_BIRTH";
26
+ // Custom/Business identifiers
27
+ PIIType["CASE_ID"] = "CASE_ID";
28
+ PIIType["CUSTOMER_ID"] = "CUSTOMER_ID";
29
+ })(PIIType || (PIIType = {}));
30
+ /**
31
+ * All PII types as a readonly array for iteration
32
+ */
33
+ export const ALL_PII_TYPES = Object.values(PIIType);
34
+ /**
35
+ * PII types that are detected via regex (structured PII)
36
+ */
37
+ export const REGEX_PII_TYPES = [
38
+ PIIType.EMAIL,
39
+ PIIType.PHONE,
40
+ PIIType.IBAN,
41
+ PIIType.BIC_SWIFT,
42
+ PIIType.CREDIT_CARD,
43
+ PIIType.IP_ADDRESS,
44
+ PIIType.URL,
45
+ PIIType.ACCOUNT_NUMBER,
46
+ PIIType.TAX_ID,
47
+ PIIType.NATIONAL_ID,
48
+ PIIType.CASE_ID,
49
+ PIIType.CUSTOMER_ID,
50
+ ];
51
+ /**
52
+ * PII types that are detected via NER model (soft PII)
53
+ */
54
+ export const NER_PII_TYPES = [
55
+ PIIType.PERSON,
56
+ PIIType.ORG,
57
+ PIIType.LOCATION,
58
+ PIIType.ADDRESS,
59
+ PIIType.DATE_OF_BIRTH,
60
+ ];
61
+ /**
62
+ * Default priority order for resolving overlapping entities
63
+ * Higher index = higher priority
64
+ */
65
+ export const DEFAULT_TYPE_PRIORITY = [
66
+ // Lower priority (generic)
67
+ PIIType.URL,
68
+ PIIType.IP_ADDRESS,
69
+ PIIType.LOCATION,
70
+ PIIType.ORG,
71
+ PIIType.PERSON,
72
+ // Medium priority
73
+ PIIType.DATE_OF_BIRTH,
74
+ PIIType.PHONE,
75
+ PIIType.EMAIL,
76
+ PIIType.ADDRESS,
77
+ // Higher priority (specific identifiers)
78
+ PIIType.CASE_ID,
79
+ PIIType.CUSTOMER_ID,
80
+ PIIType.ACCOUNT_NUMBER,
81
+ PIIType.BIC_SWIFT,
82
+ PIIType.IBAN,
83
+ PIIType.CREDIT_CARD,
84
+ PIIType.TAX_ID,
85
+ PIIType.NATIONAL_ID,
86
+ ];
87
+ /**
88
+ * Maps NER model labels to PIIType
89
+ * Common label formats from NER models (B-PER, I-PER, B-ORG, etc.)
90
+ */
91
+ export const NER_LABEL_TO_PII_TYPE = {
92
+ PER: PIIType.PERSON,
93
+ PERSON: PIIType.PERSON,
94
+ ORG: PIIType.ORG,
95
+ ORGANIZATION: PIIType.ORG,
96
+ LOC: PIIType.LOCATION,
97
+ LOCATION: PIIType.LOCATION,
98
+ GPE: PIIType.LOCATION, // Geo-Political Entity
99
+ DATE: PIIType.DATE_OF_BIRTH,
100
+ // Some models use MISC for addresses
101
+ MISC: PIIType.ADDRESS,
102
+ };
103
+ /**
104
+ * Get PIIType from NER label (handles B-/I- prefixes)
105
+ */
106
+ export function getPIITypeFromNERLabel(label) {
107
+ // Remove B-/I- prefix if present
108
+ const cleanLabel = label.replace(/^[BI]-/, '').toUpperCase();
109
+ if (cleanLabel === 'O') {
110
+ return null; // Outside any entity
111
+ }
112
+ return NER_LABEL_TO_PII_TYPE[cleanLabel] ?? null;
113
+ }
114
+ //# sourceMappingURL=pii-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pii-types.js","sourceRoot":"","sources":["../../src/types/pii-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * IBAN Checksum Validation (ISO 13616)
3
+ * Uses Mod-97 algorithm
4
+ */
5
+ /**
6
+ * Country code to IBAN length mapping (partial list of common countries)
7
+ */
8
+ export declare const IBAN_LENGTHS: Record<string, number>;
9
+ /**
10
+ * Validates an IBAN using the mod-97 algorithm
11
+ * @param iban - IBAN string (spaces allowed)
12
+ * @returns true if checksum is valid
13
+ */
14
+ export declare function validateIBAN(iban: string): boolean;
15
+ /**
16
+ * Normalizes an IBAN by removing spaces and converting to uppercase
17
+ */
18
+ export declare function normalizeIBAN(iban: string): string;
19
+ /**
20
+ * Formats an IBAN with spaces every 4 characters for readability
21
+ */
22
+ export declare function formatIBAN(iban: string): string;
23
+ //# sourceMappingURL=iban-checksum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iban-checksum.d.ts","sourceRoot":"","sources":["../../src/utils/iban-checksum.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAwB/C,CAAC;AA4CF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAuBlD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/C"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * IBAN Checksum Validation (ISO 13616)
3
+ * Uses Mod-97 algorithm
4
+ */
5
+ /**
6
+ * Country code to IBAN length mapping (partial list of common countries)
7
+ */
8
+ export const IBAN_LENGTHS = {
9
+ AD: 24, // Andorra
10
+ AT: 20, // Austria
11
+ BE: 16, // Belgium
12
+ CH: 21, // Switzerland
13
+ CZ: 24, // Czech Republic
14
+ DE: 22, // Germany
15
+ DK: 18, // Denmark
16
+ ES: 24, // Spain
17
+ FI: 18, // Finland
18
+ FR: 27, // France
19
+ GB: 22, // United Kingdom
20
+ GR: 27, // Greece
21
+ HU: 28, // Hungary
22
+ IE: 22, // Ireland
23
+ IT: 27, // Italy
24
+ LI: 21, // Liechtenstein
25
+ LU: 20, // Luxembourg
26
+ NL: 18, // Netherlands
27
+ NO: 15, // Norway
28
+ PL: 28, // Poland
29
+ PT: 25, // Portugal
30
+ SE: 24, // Sweden
31
+ SK: 24, // Slovakia
32
+ };
33
+ /**
34
+ * Convert a character to its numeric value for IBAN calculation
35
+ * A=10, B=11, ..., Z=35
36
+ */
37
+ function charToNumber(char) {
38
+ const code = char.toUpperCase().charCodeAt(0);
39
+ if (code >= 65 && code <= 90) {
40
+ // A-Z
41
+ return (code - 55).toString();
42
+ }
43
+ return char; // Already a digit
44
+ }
45
+ /**
46
+ * Rearranges IBAN for checksum calculation:
47
+ * Move first 4 chars to end, convert letters to numbers
48
+ */
49
+ function rearrangeForChecksum(iban) {
50
+ const cleaned = iban.replace(/\s/g, '').toUpperCase();
51
+ const rearranged = cleaned.slice(4) + cleaned.slice(0, 4);
52
+ let numeric = '';
53
+ for (const char of rearranged) {
54
+ numeric += charToNumber(char);
55
+ }
56
+ return numeric;
57
+ }
58
+ /**
59
+ * Calculate mod 97 for a large number represented as a string
60
+ */
61
+ function mod97(numericString) {
62
+ let remainder = 0;
63
+ for (const digit of numericString) {
64
+ remainder = (remainder * 10 + parseInt(digit, 10)) % 97;
65
+ }
66
+ return remainder;
67
+ }
68
+ /**
69
+ * Validates an IBAN using the mod-97 algorithm
70
+ * @param iban - IBAN string (spaces allowed)
71
+ * @returns true if checksum is valid
72
+ */
73
+ export function validateIBAN(iban) {
74
+ const cleaned = iban.replace(/\s/g, '').toUpperCase();
75
+ // Basic format check
76
+ if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]+$/.test(cleaned)) {
77
+ return false;
78
+ }
79
+ // Check length for known countries
80
+ const countryCode = cleaned.slice(0, 2);
81
+ const expectedLength = IBAN_LENGTHS[countryCode];
82
+ if (expectedLength !== undefined && cleaned.length !== expectedLength) {
83
+ return false;
84
+ }
85
+ // General length check (IBANs are 15-34 characters)
86
+ if (cleaned.length < 15 || cleaned.length > 34) {
87
+ return false;
88
+ }
89
+ // Mod-97 validation
90
+ const numericString = rearrangeForChecksum(cleaned);
91
+ return mod97(numericString) === 1;
92
+ }
93
+ /**
94
+ * Normalizes an IBAN by removing spaces and converting to uppercase
95
+ */
96
+ export function normalizeIBAN(iban) {
97
+ return iban.replace(/\s/g, '').toUpperCase();
98
+ }
99
+ /**
100
+ * Formats an IBAN with spaces every 4 characters for readability
101
+ */
102
+ export function formatIBAN(iban) {
103
+ const normalized = normalizeIBAN(iban);
104
+ return normalized.replace(/(.{4})/g, '$1 ').trim();
105
+ }
106
+ //# sourceMappingURL=iban-checksum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iban-checksum.js","sourceRoot":"","sources":["../../src/utils/iban-checksum.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Utils Module
3
+ * Exports utility functions
4
+ */
5
+ export * from "./luhn.js";
6
+ export * from "./iban-checksum.js";
7
+ export * from "./offsets.js";
8
+ export * from "./path.js";
9
+ export * from "./storage.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Utils Module
3
+ * Exports utility functions
4
+ */
5
+ export * from "./luhn.js";
6
+ export * from "./iban-checksum.js";
7
+ export * from "./offsets.js";
8
+ export * from "./path.js";
9
+ export * from "./storage.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Luhn Algorithm (Mod 10) Implementation
3
+ * Used for validating credit card numbers and other identifier checksums
4
+ */
5
+ /**
6
+ * Validates a number string using the Luhn algorithm
7
+ * @param input - String of digits (spaces and dashes are stripped)
8
+ * @returns true if the checksum is valid
9
+ */
10
+ export declare function validateLuhn(input: string): boolean;
11
+ /**
12
+ * Calculates the Luhn check digit for a partial number
13
+ * @param partialNumber - String of digits without the check digit
14
+ * @returns The check digit (0-9)
15
+ */
16
+ export declare function calculateLuhnCheckDigit(partialNumber: string): number;
17
+ //# sourceMappingURL=luhn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"luhn.d.ts","sourceRoot":"","sources":["../../src/utils/luhn.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CA2BnD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAsBrE"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Luhn Algorithm (Mod 10) Implementation
3
+ * Used for validating credit card numbers and other identifier checksums
4
+ */
5
+ /**
6
+ * Validates a number string using the Luhn algorithm
7
+ * @param input - String of digits (spaces and dashes are stripped)
8
+ * @returns true if the checksum is valid
9
+ */
10
+ export function validateLuhn(input) {
11
+ // Remove spaces, dashes, and other non-digit characters
12
+ const digits = input.replace(/\D/g, '');
13
+ if (digits.length === 0) {
14
+ return false;
15
+ }
16
+ let sum = 0;
17
+ let isEven = false;
18
+ // Process digits from right to left
19
+ for (let i = digits.length - 1; i >= 0; i--) {
20
+ let digit = parseInt(digits[i], 10);
21
+ if (isEven) {
22
+ digit *= 2;
23
+ if (digit > 9) {
24
+ digit -= 9;
25
+ }
26
+ }
27
+ sum += digit;
28
+ isEven = !isEven;
29
+ }
30
+ return sum % 10 === 0;
31
+ }
32
+ /**
33
+ * Calculates the Luhn check digit for a partial number
34
+ * @param partialNumber - String of digits without the check digit
35
+ * @returns The check digit (0-9)
36
+ */
37
+ export function calculateLuhnCheckDigit(partialNumber) {
38
+ const digits = partialNumber.replace(/\D/g, '');
39
+ let sum = 0;
40
+ let isEven = true; // Start with true since we're adding a digit
41
+ // Process digits from right to left
42
+ for (let i = digits.length - 1; i >= 0; i--) {
43
+ let digit = parseInt(digits[i], 10);
44
+ if (isEven) {
45
+ digit *= 2;
46
+ if (digit > 9) {
47
+ digit -= 9;
48
+ }
49
+ }
50
+ sum += digit;
51
+ isEven = !isEven;
52
+ }
53
+ return (10 - (sum % 10)) % 10;
54
+ }
55
+ //# sourceMappingURL=luhn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"luhn.js","sourceRoot":"","sources":["../../src/utils/luhn.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,wDAAwD;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAExC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,oCAAoC;IACpC,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QAErC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;QACH,CAAC;QAED,GAAG,IAAI,KAAK,CAAC;QACb,MAAM,GAAG,CAAC,MAAM,CAAC;IACnB,CAAC;IAED,OAAO,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,aAAqB;IAC3D,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEhD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,MAAM,GAAG,IAAI,CAAC,CAAC,6CAA6C;IAEhE,oCAAoC;IACpC,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QAErC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;QACH,CAAC;QAED,GAAG,IAAI,KAAK,CAAC;QACb,MAAM,GAAG,CAAC,MAAM,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Character Offset Utilities
3
+ * Handles character offset calculations for text manipulation
4
+ */
5
+ import type { SpanMatch } from '../types/index.js';
6
+ /**
7
+ * Checks if two spans overlap
8
+ */
9
+ export declare function spansOverlap(a: {
10
+ start: number;
11
+ end: number;
12
+ }, b: {
13
+ start: number;
14
+ end: number;
15
+ }): boolean;
16
+ /**
17
+ * Checks if span A contains span B
18
+ */
19
+ export declare function spanContains(outer: {
20
+ start: number;
21
+ end: number;
22
+ }, inner: {
23
+ start: number;
24
+ end: number;
25
+ }): boolean;
26
+ /**
27
+ * Gets the length of a span
28
+ */
29
+ export declare function spanLength(span: {
30
+ start: number;
31
+ end: number;
32
+ }): number;
33
+ /**
34
+ * Extracts text for a span from the original text
35
+ */
36
+ export declare function getSpanText(text: string, span: {
37
+ start: number;
38
+ end: number;
39
+ }): string;
40
+ /**
41
+ * Sorts spans by start position (ascending) then by length (descending)
42
+ */
43
+ export declare function sortSpansByPosition<T extends {
44
+ start: number;
45
+ end: number;
46
+ }>(spans: T[]): T[];
47
+ /**
48
+ * Sorts spans by start position descending (for replacement operations)
49
+ */
50
+ export declare function sortSpansByPositionDescending<T extends {
51
+ start: number;
52
+ end: number;
53
+ }>(spans: T[]): T[];
54
+ /**
55
+ * Removes overlapping spans, keeping the preferred ones based on a comparator
56
+ * @param spans - Array of spans to deduplicate
57
+ * @param prefer - Comparator that returns positive if 'a' should be preferred over 'b'
58
+ */
59
+ export declare function removeOverlappingSpans<T extends SpanMatch>(spans: T[], prefer: (a: T, b: T) => number): T[];
60
+ /**
61
+ * Validates that spans don't overlap (for final validation)
62
+ */
63
+ export declare function validateNoOverlaps(spans: {
64
+ start: number;
65
+ end: number;
66
+ }[]): boolean;
67
+ /**
68
+ * Calculates offset adjustments for replacements
69
+ * Used when you need to map positions between original and modified text
70
+ */
71
+ export interface OffsetAdjustment {
72
+ originalStart: number;
73
+ originalEnd: number;
74
+ newStart: number;
75
+ newEnd: number;
76
+ delta: number;
77
+ }
78
+ /**
79
+ * Builds a list of offset adjustments from replacements
80
+ */
81
+ export declare function buildOffsetAdjustments(replacements: Array<{
82
+ start: number;
83
+ end: number;
84
+ replacement: string;
85
+ }>): OffsetAdjustment[];
86
+ //# sourceMappingURL=offsets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offsets.d.ts","sourceRoot":"","sources":["../../src/utils/offsets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAE1G;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAElH;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEvE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEtF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAQ7F;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAEvG;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,SAAS,EACxD,KAAK,EAAE,CAAC,EAAE,EACV,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,GAC7B,CAAC,EAAE,CA0CL;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,OAAO,CAanF;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GACvE,gBAAgB,EAAE,CAsBpB"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Character Offset Utilities
3
+ * Handles character offset calculations for text manipulation
4
+ */
5
+ /**
6
+ * Checks if two spans overlap
7
+ */
8
+ export function spansOverlap(a, b) {
9
+ return a.start < b.end && b.start < a.end;
10
+ }
11
+ /**
12
+ * Checks if span A contains span B
13
+ */
14
+ export function spanContains(outer, inner) {
15
+ return outer.start <= inner.start && outer.end >= inner.end;
16
+ }
17
+ /**
18
+ * Gets the length of a span
19
+ */
20
+ export function spanLength(span) {
21
+ return span.end - span.start;
22
+ }
23
+ /**
24
+ * Extracts text for a span from the original text
25
+ */
26
+ export function getSpanText(text, span) {
27
+ return text.slice(span.start, span.end);
28
+ }
29
+ /**
30
+ * Sorts spans by start position (ascending) then by length (descending)
31
+ */
32
+ export function sortSpansByPosition(spans) {
33
+ return [...spans].sort((a, b) => {
34
+ if (a.start !== b.start) {
35
+ return a.start - b.start;
36
+ }
37
+ // For same start, longer spans first
38
+ return spanLength(b) - spanLength(a);
39
+ });
40
+ }
41
+ /**
42
+ * Sorts spans by start position descending (for replacement operations)
43
+ */
44
+ export function sortSpansByPositionDescending(spans) {
45
+ return [...spans].sort((a, b) => b.start - a.start);
46
+ }
47
+ /**
48
+ * Removes overlapping spans, keeping the preferred ones based on a comparator
49
+ * @param spans - Array of spans to deduplicate
50
+ * @param prefer - Comparator that returns positive if 'a' should be preferred over 'b'
51
+ */
52
+ export function removeOverlappingSpans(spans, prefer) {
53
+ if (spans.length === 0) {
54
+ return [];
55
+ }
56
+ // Sort by start position
57
+ const sorted = sortSpansByPosition(spans);
58
+ const result = [];
59
+ for (const span of sorted) {
60
+ // Check if this span overlaps with any already-selected span
61
+ let shouldAdd = true;
62
+ let indexToRemove = null;
63
+ for (let i = 0; i < result.length; i++) {
64
+ const existing = result[i];
65
+ if (spansOverlap(span, existing)) {
66
+ // Determine which to keep
67
+ const preference = prefer(span, existing);
68
+ if (preference > 0) {
69
+ // New span is preferred, mark old one for removal
70
+ indexToRemove = i;
71
+ }
72
+ else {
73
+ // Existing span is preferred, don't add new one
74
+ shouldAdd = false;
75
+ }
76
+ break;
77
+ }
78
+ }
79
+ if (indexToRemove !== null) {
80
+ result.splice(indexToRemove, 1);
81
+ }
82
+ if (shouldAdd) {
83
+ result.push(span);
84
+ }
85
+ }
86
+ return sortSpansByPosition(result);
87
+ }
88
+ /**
89
+ * Validates that spans don't overlap (for final validation)
90
+ */
91
+ export function validateNoOverlaps(spans) {
92
+ const sorted = sortSpansByPosition(spans);
93
+ for (let i = 0; i < sorted.length - 1; i++) {
94
+ const current = sorted[i];
95
+ const next = sorted[i + 1];
96
+ if (current.end > next.start) {
97
+ return false;
98
+ }
99
+ }
100
+ return true;
101
+ }
102
+ /**
103
+ * Builds a list of offset adjustments from replacements
104
+ */
105
+ export function buildOffsetAdjustments(replacements) {
106
+ const sorted = sortSpansByPosition(replacements);
107
+ const adjustments = [];
108
+ let cumulativeDelta = 0;
109
+ for (const rep of sorted) {
110
+ const originalLength = rep.end - rep.start;
111
+ const newLength = rep.replacement.length;
112
+ const delta = newLength - originalLength;
113
+ adjustments.push({
114
+ originalStart: rep.start,
115
+ originalEnd: rep.end,
116
+ newStart: rep.start + cumulativeDelta,
117
+ newEnd: rep.start + cumulativeDelta + newLength,
118
+ delta,
119
+ });
120
+ cumulativeDelta += delta;
121
+ }
122
+ return adjustments;
123
+ }
124
+ //# sourceMappingURL=offsets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offsets.js","sourceRoot":"","sources":["../../src/utils/offsets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Browser-safe path utilities
3
+ * Replaces Node.js path module for cross-platform compatibility
4
+ */
5
+ /**
6
+ * Joins path segments with forward slashes
7
+ * Normalizes the result to remove redundant separators
8
+ */
9
+ export declare function join(...parts: string[]): string;
10
+ /**
11
+ * Returns the directory name of a path
12
+ * @example dirname('/foo/bar/baz.txt') => '/foo/bar'
13
+ */
14
+ export declare function dirname(path: string): string;
15
+ /**
16
+ * Returns the last portion of a path (the filename)
17
+ * @example basename('/foo/bar/baz.txt') => 'baz.txt'
18
+ */
19
+ export declare function basename(path: string): string;
20
+ /**
21
+ * Normalizes a path by resolving . and .. segments
22
+ * and removing redundant slashes
23
+ */
24
+ export declare function normalize(path: string): string;
25
+ /**
26
+ * Returns the extension of a path
27
+ * @example extname('/foo/bar/baz.txt') => '.txt'
28
+ */
29
+ export declare function extname(path: string): string;
30
+ /**
31
+ * Checks if a path is absolute
32
+ */
33
+ export declare function isAbsolute(path: string): boolean;
34
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAO/C;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAa5C;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS7C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA6B9C;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS5C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQhD"}