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.
- package/LICENSE +22 -0
- package/README.md +615 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +6 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/pii-map-crypto.d.ts +114 -0
- package/dist/crypto/pii-map-crypto.d.ts.map +1 -0
- package/dist/crypto/pii-map-crypto.js +228 -0
- package/dist/crypto/pii-map-crypto.js.map +1 -0
- package/dist/index.d.ts +180 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +384 -0
- package/dist/index.js.map +1 -0
- package/dist/ner/bio-decoder.d.ts +64 -0
- package/dist/ner/bio-decoder.d.ts.map +1 -0
- package/dist/ner/bio-decoder.js +216 -0
- package/dist/ner/bio-decoder.js.map +1 -0
- package/dist/ner/index.d.ts +10 -0
- package/dist/ner/index.d.ts.map +1 -0
- package/dist/ner/index.js +10 -0
- package/dist/ner/index.js.map +1 -0
- package/dist/ner/model-manager.d.ts +111 -0
- package/dist/ner/model-manager.d.ts.map +1 -0
- package/dist/ner/model-manager.js +325 -0
- package/dist/ner/model-manager.js.map +1 -0
- package/dist/ner/ner-model.d.ts +114 -0
- package/dist/ner/ner-model.d.ts.map +1 -0
- package/dist/ner/ner-model.js +253 -0
- package/dist/ner/ner-model.js.map +1 -0
- package/dist/ner/onnx-runtime.d.ts +46 -0
- package/dist/ner/onnx-runtime.d.ts.map +1 -0
- package/dist/ner/onnx-runtime.js +130 -0
- package/dist/ner/onnx-runtime.js.map +1 -0
- package/dist/ner/tokenizer.d.ts +118 -0
- package/dist/ner/tokenizer.d.ts.map +1 -0
- package/dist/ner/tokenizer.js +332 -0
- package/dist/ner/tokenizer.js.map +1 -0
- package/dist/pipeline/index.d.ts +12 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +12 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/prenormalize.d.ts +48 -0
- package/dist/pipeline/prenormalize.d.ts.map +1 -0
- package/dist/pipeline/prenormalize.js +94 -0
- package/dist/pipeline/prenormalize.js.map +1 -0
- package/dist/pipeline/resolver.d.ts +56 -0
- package/dist/pipeline/resolver.d.ts.map +1 -0
- package/dist/pipeline/resolver.js +239 -0
- package/dist/pipeline/resolver.js.map +1 -0
- package/dist/pipeline/semantic-data-loader.d.ts +165 -0
- package/dist/pipeline/semantic-data-loader.d.ts.map +1 -0
- package/dist/pipeline/semantic-data-loader.js +655 -0
- package/dist/pipeline/semantic-data-loader.js.map +1 -0
- package/dist/pipeline/semantic-enricher.d.ts +112 -0
- package/dist/pipeline/semantic-enricher.d.ts.map +1 -0
- package/dist/pipeline/semantic-enricher.js +318 -0
- package/dist/pipeline/semantic-enricher.js.map +1 -0
- package/dist/pipeline/tagger.d.ts +114 -0
- package/dist/pipeline/tagger.d.ts.map +1 -0
- package/dist/pipeline/tagger.js +374 -0
- package/dist/pipeline/tagger.js.map +1 -0
- package/dist/pipeline/title-extractor.d.ts +79 -0
- package/dist/pipeline/title-extractor.d.ts.map +1 -0
- package/dist/pipeline/title-extractor.js +801 -0
- package/dist/pipeline/title-extractor.js.map +1 -0
- package/dist/pipeline/validator.d.ts +65 -0
- package/dist/pipeline/validator.d.ts.map +1 -0
- package/dist/pipeline/validator.js +264 -0
- package/dist/pipeline/validator.js.map +1 -0
- package/dist/recognizers/base.d.ts +78 -0
- package/dist/recognizers/base.d.ts.map +1 -0
- package/dist/recognizers/base.js +100 -0
- package/dist/recognizers/base.js.map +1 -0
- package/dist/recognizers/bic-swift.d.ts +10 -0
- package/dist/recognizers/bic-swift.d.ts.map +1 -0
- package/dist/recognizers/bic-swift.js +107 -0
- package/dist/recognizers/bic-swift.js.map +1 -0
- package/dist/recognizers/credit-card.d.ts +32 -0
- package/dist/recognizers/credit-card.d.ts.map +1 -0
- package/dist/recognizers/credit-card.js +160 -0
- package/dist/recognizers/credit-card.js.map +1 -0
- package/dist/recognizers/custom-id.d.ts +28 -0
- package/dist/recognizers/custom-id.d.ts.map +1 -0
- package/dist/recognizers/custom-id.js +116 -0
- package/dist/recognizers/custom-id.js.map +1 -0
- package/dist/recognizers/email.d.ts +10 -0
- package/dist/recognizers/email.d.ts.map +1 -0
- package/dist/recognizers/email.js +75 -0
- package/dist/recognizers/email.js.map +1 -0
- package/dist/recognizers/iban.d.ts +14 -0
- package/dist/recognizers/iban.d.ts.map +1 -0
- package/dist/recognizers/iban.js +67 -0
- package/dist/recognizers/iban.js.map +1 -0
- package/dist/recognizers/index.d.ts +20 -0
- package/dist/recognizers/index.d.ts.map +1 -0
- package/dist/recognizers/index.js +42 -0
- package/dist/recognizers/index.js.map +1 -0
- package/dist/recognizers/ip-address.d.ts +14 -0
- package/dist/recognizers/ip-address.d.ts.map +1 -0
- package/dist/recognizers/ip-address.js +183 -0
- package/dist/recognizers/ip-address.js.map +1 -0
- package/dist/recognizers/phone.d.ts +10 -0
- package/dist/recognizers/phone.d.ts.map +1 -0
- package/dist/recognizers/phone.js +145 -0
- package/dist/recognizers/phone.js.map +1 -0
- package/dist/recognizers/registry.d.ts +59 -0
- package/dist/recognizers/registry.d.ts.map +1 -0
- package/dist/recognizers/registry.js +113 -0
- package/dist/recognizers/registry.js.map +1 -0
- package/dist/recognizers/url.d.ts +14 -0
- package/dist/recognizers/url.d.ts.map +1 -0
- package/dist/recognizers/url.js +121 -0
- package/dist/recognizers/url.js.map +1 -0
- package/dist/types/index.d.ts +197 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +80 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pii-types.d.ts +50 -0
- package/dist/types/pii-types.d.ts.map +1 -0
- package/dist/types/pii-types.js +114 -0
- package/dist/types/pii-types.js.map +1 -0
- package/dist/utils/iban-checksum.d.ts +23 -0
- package/dist/utils/iban-checksum.d.ts.map +1 -0
- package/dist/utils/iban-checksum.js +106 -0
- package/dist/utils/iban-checksum.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/luhn.d.ts +17 -0
- package/dist/utils/luhn.d.ts.map +1 -0
- package/dist/utils/luhn.js +55 -0
- package/dist/utils/luhn.js.map +1 -0
- package/dist/utils/offsets.d.ts +86 -0
- package/dist/utils/offsets.d.ts.map +1 -0
- package/dist/utils/offsets.js +124 -0
- package/dist/utils/offsets.js.map +1 -0
- package/dist/utils/path.d.ts +34 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +96 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/storage-browser.d.ts +51 -0
- package/dist/utils/storage-browser.d.ts.map +1 -0
- package/dist/utils/storage-browser.js +381 -0
- package/dist/utils/storage-browser.js.map +1 -0
- package/dist/utils/storage-node.d.ts +43 -0
- package/dist/utils/storage-node.d.ts.map +1 -0
- package/dist/utils/storage-node.js +93 -0
- package/dist/utils/storage-node.js.map +1 -0
- package/dist/utils/storage.d.ts +70 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +69 -0
- package/dist/utils/storage.js.map +1 -0
- 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":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,EAAE,EAAE,EAAE,EAAE,UAAU;IAClB,EAAE,EAAE,EAAE,EAAE,UAAU;IAClB,EAAE,EAAE,EAAE,EAAE,UAAU;IAClB,EAAE,EAAE,EAAE,EAAE,cAAc;IACtB,EAAE,EAAE,EAAE,EAAE,iBAAiB;IACzB,EAAE,EAAE,EAAE,EAAE,UAAU;IAClB,EAAE,EAAE,EAAE,EAAE,UAAU;IAClB,EAAE,EAAE,EAAE,EAAE,QAAQ;IAChB,EAAE,EAAE,EAAE,EAAE,UAAU;IAClB,EAAE,EAAE,EAAE,EAAE,SAAS;IACjB,EAAE,EAAE,EAAE,EAAE,iBAAiB;IACzB,EAAE,EAAE,EAAE,EAAE,SAAS;IACjB,EAAE,EAAE,EAAE,EAAE,UAAU;IAClB,EAAE,EAAE,EAAE,EAAE,UAAU;IAClB,EAAE,EAAE,EAAE,EAAE,QAAQ;IAChB,EAAE,EAAE,EAAE,EAAE,gBAAgB;IACxB,EAAE,EAAE,EAAE,EAAE,aAAa;IACrB,EAAE,EAAE,EAAE,EAAE,cAAc;IACtB,EAAE,EAAE,EAAE,EAAE,SAAS;IACjB,EAAE,EAAE,EAAE,EAAE,SAAS;IACjB,EAAE,EAAE,EAAE,EAAE,WAAW;IACnB,EAAE,EAAE,EAAE,EAAE,SAAS;IACjB,EAAE,EAAE,EAAE,EAAE,WAAW;CACpB,CAAC;AAEF;;;GAGG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QAC7B,MAAM;QACN,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,kBAAkB;AACjC,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1D,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,KAAK,CAAC,aAAqB;IAClC,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,SAAS,GAAG,CAAC,SAAS,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IAC1D,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAEtD,qBAAqB;IACrB,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mCAAmC;IACnC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,cAAc,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QACtE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,oDAAoD;IACpD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,oBAAoB;IACpB,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -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 @@
|
|
|
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"}
|