@socprime/logtotal-sanitizer 0.2.0-beta.2 → 0.2.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/{chunk-M4CEAFAP.js → chunk-SGF4CYUV.js} +13 -4
- package/chunk-SGF4CYUV.js.map +1 -0
- package/{chunk-XPVOBYVK.cjs → chunk-YPHS5NO7.cjs} +13 -4
- package/chunk-YPHS5NO7.cjs.map +1 -0
- package/cli.js +11 -2
- package/cli.js.map +1 -1
- package/index.cjs +13 -13
- package/index.js +1 -1
- package/node.cjs +15 -15
- package/node.js +2 -2
- package/package.json +1 -1
- package/chunk-M4CEAFAP.js.map +0 -1
- package/chunk-XPVOBYVK.cjs.map +0 -1
package/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/constants.ts","../src/core/errors.ts","../src/core/hmac.ts","../src/core/key.ts","../src/rules/alwaysRedact.ts","../src/rules/definitions/geoLocation.ts","../src/rules/definitions/govIdentifiers.ts","../src/rules/definitions/healthInfo.ts","../src/rules/definitions/homePaths.ts","../src/rules/shared/windowsAccounts.ts","../src/rules/definitions/hostnames.ts","../src/rules/definitions/ipAddresses.ts","../src/rules/shared/hmacSha256.ts","../src/rules/definitions/paymentInfo.ts","../src/rules/definitions/phoneNumbers.ts","../src/rules/definitions/secrets.ts","../src/rules/definitions/sessionCookies.ts","../src/rules/definitions/users.ts","../src/rules/registry.ts","../src/core/allowlist.ts","../src/core/pseudonymize.ts","../src/core/regexSource.ts","../src/core/compile.ts","../src/core/lineSplitter.ts","../src/core/redactLine.ts","../src/core/redactJsonLine.ts","../src/core/report.ts","../src/rules/validateRule.ts","../src/core/resolveRules.ts","../src/core/sanitizer.ts","../src/io/sinks.ts","../src/node/index.ts","../src/cli.ts"],"names":["BLOCK_BYTES","DIGEST_BYTES","K","INITIAL_STATE","rotr","padMessage","sha256","luhnCheck","normalizeKey"],"mappings":"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EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAC,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","file":"cli.js","sourcesContent":["export const DEFAULT_PREVIEW_BYTES = 256 * 1024;\n\nexport const DEFAULT_RANGE_PROBE_BYTES = 256 * 1024;\n\nexport const DEFAULT_RANGE_MAX_PROBE_BYTES = 16 * 1024 * 1024;\n\nexport const DEFAULT_MAX_LINE_CHARS = 1024 * 1024;\n\nexport const DEFAULT_LINE_OVERLAP_CHARS = 1024;\n\nexport const DEFAULT_KEY_BYTES = 32;\n\nexport const MASK_TOKEN_PREFIX = 'R';\n\nexport const ALWAYS_REDACT_RULE_ID = 'custom';\n\nexport const ALWAYS_REDACT_TOKEN = 'CUSTOM';\n","const ERROR_BRAND = Symbol.for('@socprime/logtotal-sanitizer/error');\n\n/**\n * Machine-readable cause of a {@link SanitizerError}.\n */\nexport type SanitizerErrorCode =\n | 'INVALID_RULE'\n | 'UNKNOWN_RULE'\n | 'INVALID_KEY'\n | 'INVALID_OPTION'\n | 'ABORTED';\n\n/**\n * Base class for every error this package throws.\n */\nexport class SanitizerError extends Error {\n /** Machine-readable cause, stable across releases. */\n readonly code: SanitizerErrorCode;\n\n constructor(code: SanitizerErrorCode, message: string) {\n super(message);\n this.name = 'SanitizerError';\n this.code = code;\n Object.defineProperty(this, ERROR_BRAND, { value: true, enumerable: false });\n }\n}\n\n/** A rule object is malformed. */\nexport class InvalidRuleError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_RULE', message);\n this.name = 'InvalidRuleError';\n }\n}\n\n/** A rule identifier does not match any built-in rule. */\nexport class UnknownRuleError extends SanitizerError {\n constructor(message: string) {\n super('UNKNOWN_RULE', message);\n this.name = 'UnknownRuleError';\n }\n}\n\n/** A key is malformed, or no secure random source is available to generate one. */\nexport class InvalidKeyError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_KEY', message);\n this.name = 'InvalidKeyError';\n }\n}\n\n/** An option value is outside its allowed range. */\nexport class InvalidOptionError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_OPTION', message);\n this.name = 'InvalidOptionError';\n }\n}\n\n/** A streaming run was stopped through its `AbortSignal`. */\nexport class SanitizationAbortedError extends SanitizerError {\n constructor(message = 'Sanitization was aborted.') {\n super('ABORTED', message);\n this.name = 'SanitizationAbortedError';\n }\n}\n\n/**\n * Whether a caught value is an error thrown by this package.\n *\n * Prefer this over `instanceof` when the value may have crossed a bundle, worker or realm\n * boundary, where class identity is not preserved.\n */\nexport function isSanitizerError(value: unknown): value is SanitizerError {\n return typeof value === 'object' && value !== null && ERROR_BRAND in value;\n}\n","const BLOCK_BYTES = 64;\nconst DIGEST_BYTES = 32;\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nconst INITIAL_STATE = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\nfunction rotr(value: number, bits: number): number {\n return ((value >>> bits) | (value << (32 - bits))) >>> 0;\n}\n\nfunction concatBytes(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n\nfunction padMessage(message: Uint8Array): Uint8Array {\n const bitLength = message.length * 8;\n const paddedLength = Math.ceil((message.length + 9) / BLOCK_BYTES) * BLOCK_BYTES;\n const padded = new Uint8Array(paddedLength);\n\n padded.set(message);\n padded[message.length] = 0x80;\n\n const view = new DataView(padded.buffer);\n view.setUint32(paddedLength - 8, Math.floor(bitLength / 2 ** 32), false);\n view.setUint32(paddedLength - 4, bitLength >>> 0, false);\n\n return padded;\n}\n\nexport function sha256(message: Uint8Array): Uint8Array {\n const padded = padMessage(message);\n const view = new DataView(padded.buffer);\n const state = Uint32Array.from(INITIAL_STATE);\n const w = new Uint32Array(64);\n\n for (let offset = 0; offset < padded.length; offset += BLOCK_BYTES) {\n for (let i = 0; i < 16; i += 1) {\n w[i] = view.getUint32(offset + i * 4, false);\n }\n\n for (let i = 16; i < 64; i += 1) {\n const s0 = rotr(w[i - 15]!, 7) ^ rotr(w[i - 15]!, 18) ^ (w[i - 15]! >>> 3);\n const s1 = rotr(w[i - 2]!, 17) ^ rotr(w[i - 2]!, 19) ^ (w[i - 2]! >>> 10);\n w[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0;\n }\n\n let a = state[0]!;\n let b = state[1]!;\n let c = state[2]!;\n let d = state[3]!;\n let e = state[4]!;\n let f = state[5]!;\n let g = state[6]!;\n let h = state[7]!;\n\n for (let i = 0; i < 64; i += 1) {\n const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + ch + K[i]! + w[i]!) >>> 0;\n const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n state[0] = (state[0]! + a) >>> 0;\n state[1] = (state[1]! + b) >>> 0;\n state[2] = (state[2]! + c) >>> 0;\n state[3] = (state[3]! + d) >>> 0;\n state[4] = (state[4]! + e) >>> 0;\n state[5] = (state[5]! + f) >>> 0;\n state[6] = (state[6]! + g) >>> 0;\n state[7] = (state[7]! + h) >>> 0;\n }\n\n const digest = new Uint8Array(DIGEST_BYTES);\n const digestView = new DataView(digest.buffer);\n\n for (let i = 0; i < 8; i += 1) {\n digestView.setUint32(i * 4, state[i]!, false);\n }\n\n return digest;\n}\n\nfunction normalizeKey(key: Uint8Array): Uint8Array {\n const hashed = key.length > BLOCK_BYTES ? sha256(key) : key;\n\n if (hashed.length === BLOCK_BYTES) {\n return hashed;\n }\n\n const padded = new Uint8Array(BLOCK_BYTES);\n padded.set(hashed);\n return padded;\n}\n\nexport type KeyedHmacSha256 = (message: Uint8Array) => Uint8Array;\n\nexport function createHmacSha256(key: Uint8Array): KeyedHmacSha256 {\n const block = normalizeKey(key);\n const ipad = new Uint8Array(BLOCK_BYTES);\n const opad = new Uint8Array(BLOCK_BYTES);\n\n for (let i = 0; i < BLOCK_BYTES; i += 1) {\n ipad[i] = block[i]! ^ 0x36;\n opad[i] = block[i]! ^ 0x5c;\n }\n\n return (message: Uint8Array): Uint8Array =>\n sha256(concatBytes(opad, sha256(concatBytes(ipad, message))));\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n\n for (let i = 0; i < bytes.length; i += 1) {\n bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n\n return bytes;\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n","import type { KeyEncoding } from '../types';\nimport { DEFAULT_KEY_BYTES } from './constants';\nimport { InvalidKeyError } from './errors';\nimport { bytesToHex } from './hmac';\n\nconst HEX_PATTERN = /^(?:[0-9a-fA-F]{2})+$/;\n\n/**\n * Generates a random hex-encoded key for token derivation.\n *\n * Persist the returned value if tokens have to stay comparable across runs or files; discard it if\n * they should not. There is no way to recover the original values from the tokens, with or without\n * the key — the key only determines which token a given value maps to.\n *\n * @param byteLength Key length in bytes, at least 16.\n * @throws {InvalidKeyError} When `byteLength` is too small or no secure random source is available.\n *\n * @example\n * ```ts\n * const key = generateKey();\n * const sanitizer = createSanitizer({ key });\n * ```\n */\nexport function generateKey(byteLength: number = DEFAULT_KEY_BYTES): string {\n if (!Number.isInteger(byteLength) || byteLength < 16) {\n throw new InvalidKeyError(`Key length must be an integer of at least 16 bytes, got ${byteLength}.`);\n }\n\n const source = globalThis.crypto;\n\n if (typeof source?.getRandomValues !== 'function') {\n throw new InvalidKeyError(\n 'No secure random source available. Pass an explicit `key` or provide a Web Crypto implementation on globalThis.crypto.',\n );\n }\n\n const bytes = new Uint8Array(byteLength);\n source.getRandomValues(bytes);\n\n return bytesToHex(bytes);\n}\n\nexport function assertKey(key: string, encoding: KeyEncoding): void {\n if (key.length === 0) {\n throw new InvalidKeyError('Key must not be empty.');\n }\n\n if (encoding === 'hex' && !HEX_PATTERN.test(key)) {\n throw new InvalidKeyError(\n 'A hex key must contain an even number of hexadecimal characters. Pass `keyEncoding: \"utf8\"` for a passphrase.',\n );\n }\n}\n","import { ALWAYS_REDACT_RULE_ID, ALWAYS_REDACT_TOKEN } from '../core/constants';\nimport { InvalidOptionError } from '../core/errors';\nimport type { AlwaysRedactOptions, SanitizeRule } from '../types';\n\nexport function escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction normalizeValues(values: readonly string[]): string[] {\n const unique = new Set(values.map((value) => value.trim()).filter((value) => value.length > 0));\n\n return [...unique].sort((left, right) => right.length - left.length || left.localeCompare(right));\n}\n\nfunction normalizePatterns(patterns: readonly (string | RegExp)[]): string[] {\n return patterns.map((pattern) => {\n const source = typeof pattern === 'string' ? pattern : pattern.source;\n\n try {\n new RegExp(source, 'u');\n } catch (cause) {\n throw new InvalidOptionError(\n `alwaysRedact.patterns contains an invalid regular expression: ${String(cause)}`,\n );\n }\n\n return `(?:${source})`;\n });\n}\n\nexport function createAlwaysRedactRule(\n options: AlwaysRedactOptions | undefined,\n): SanitizeRule | null {\n if (!options) {\n return null;\n }\n\n const patterns = [\n ...normalizeValues(options.values ?? []).map((value) => `(?:${escapeRegExp(value)})`),\n ...normalizePatterns(options.patterns ?? []),\n ];\n\n if (patterns.length === 0) {\n return null;\n }\n\n return {\n id: options.ruleId ?? ALWAYS_REDACT_RULE_ID,\n label: 'Always redacted',\n description: 'Values and patterns the caller marked as always sensitive.',\n mode: options.mode ?? 'pseudo',\n token: options.token ?? ALWAYS_REDACT_TOKEN,\n patterns,\n };\n}\n","import type { SanitizeRule } from '../../types';\n\nfunction parseLatLonPair(match: string): { lat: number; lon: number } | null {\n const stripped = match.replace(/[()\\s]/g, '');\n\n if (!/^-?\\d+\\.\\d+[,;]-?\\d+\\.\\d+$/.test(stripped)) {\n return null;\n }\n\n const [latStr, lonStr] = stripped.split(/[,;]/);\n const lat = Number(latStr);\n const lon = Number(lonStr);\n\n if (!Number.isFinite(lat) || !Number.isFinite(lon)) {\n return null;\n }\n\n return { lat, lon };\n}\n\nfunction isPlausibleLatLon(lat: number, lon: number): boolean {\n if (lat === 0 && lon === 0) {\n return false;\n }\n\n return lat >= -90 && lat <= 90 && lon >= -180 && lon <= 180;\n}\n\nfunction validateGeo(match: string): boolean {\n const pair = parseLatLonPair(match);\n\n if (pair) {\n return isPlausibleLatLon(pair.lat, pair.lon);\n }\n\n return true;\n}\n\nconst LAT_KEY = '(?:latitude|lat)';\nconst LON_KEY = '(?:longitude|long|lon|lng)';\nconst ZIP_KEY = '(?:zipCode|postalCode|postcode|zip)';\nconst ADDR_KEY = '(?:addressLine1|address|street)';\nconst OLC = '[23456789CFGHJMPQRVWXcfghjmpqrvwx]';\nconst GEOHASH = '[0-9b-hjkmnp-zB-HJKMNP-Z]';\n\nexport const geoLocationRule: SanitizeRule = {\n id: 'geoLocation',\n label: 'Geo location',\n description:\n 'Coordinates, geohashes, plus codes, postcodes and context-anchored addresses become a stable <GEO:…> token — the same value maps to the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'GEO',\n patterns: [\n '(?:\\\\(\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*\\\\))',\n '(?:(?<![\\\\d.])-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}(?!\\\\d))',\n `(?:\\\\b${LAT_KEY}\\\\s*[=:]\\\\s*)(-?\\\\d{1,3}\\\\.\\\\d+)`,\n `(?:\\\\b${LON_KEY}\\\\s*[=:]\\\\s*)(-?\\\\d{1,3}\\\\.\\\\d+)`,\n `(?:\\\\bgeohash\\\\s*[=:]\\\\s*)(${GEOHASH}{5,12}\\\\b)`,\n `(?:(?<![\\\\w+])${OLC}{4,8}\\\\+${OLC}{2,3}(?![\\\\w+]))`,\n '(?:\\\\b\\\\d{1,3}°\\\\d{1,2}\\'\\\\d{1,2}(?:\\\\.\\\\d+)?\"[NSEW]\\\\b)',\n '(?:\\\\b[A-Za-z]{1,2}\\\\d{1,2}[A-Za-z]?\\\\s\\\\d[A-Za-z]{2}\\\\b)',\n `(?:\\\\b${ZIP_KEY}\\\\s*[=:]\\\\s*)(\\\\d{5}(?:-\\\\d{4})?\\\\b)`,\n ],\n aggressivePatterns: [\n '(?:\\\\(\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*\\\\))',\n '(?:(?<![\\\\d.])-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}(?!\\\\d))',\n `(?:(?<=\\\\b${ADDR_KEY}\\\\s*[=:]\\\\s*)[^\\\\n\"'<>]{5,80})`,\n ],\n validate: validateGeo,\n jsonKeys: [\n 'latitude',\n 'longitude',\n 'lat',\n 'lon',\n 'lng',\n 'long',\n 'coordinates',\n 'coords',\n 'geo',\n 'streetAddress',\n 'addressLine1',\n 'addressLine2',\n 'postalCode',\n 'postcode',\n 'zip',\n 'zipCode',\n 'geohash',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction luhnCheck(digits: string): boolean {\n if (!/^\\d+$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n let doubleIt = false;\n\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let digit = Number(digits[i]);\n\n if (doubleIt) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n doubleIt = !doubleIt;\n }\n\n return sum % 10 === 0;\n}\n\nfunction isValidSsn(area: string, group: string, serial: string): boolean {\n if (area === '000' || area === '666' || area.startsWith('9')) {\n return false;\n }\n\n return group !== '00' && serial !== '0000';\n}\n\nfunction isValidItin(area: string, group: string, serial: string): boolean {\n if (!area.startsWith('9') || serial === '0000') {\n return false;\n }\n\n const groupNum = Number(group);\n\n return (\n (groupNum >= 70 && groupNum <= 88) ||\n (groupNum >= 90 && groupNum <= 92) ||\n (groupNum >= 94 && groupNum <= 99)\n );\n}\n\nfunction isValidNhs(digits: string): boolean {\n if (!/^\\d{10}$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n\n for (let i = 0; i < 9; i += 1) {\n sum += Number(digits[i]) * (10 - i);\n }\n\n const remainder = sum % 11;\n let check = 11 - remainder;\n\n if (check === 11) {\n check = 0;\n }\n\n if (check === 10) {\n return false;\n }\n\n return check === Number(digits[9]);\n}\n\nfunction validateGovId(match: string): boolean {\n const dashed = /^(\\d{3})-(\\d{2})-(\\d{4})$/.exec(match);\n\n if (dashed?.[1] && dashed[2] && dashed[3]) {\n return (\n isValidSsn(dashed[1], dashed[2], dashed[3]) || isValidItin(dashed[1], dashed[2], dashed[3])\n );\n }\n\n if (/^\\d{3}-\\d{3}-\\d{3}$/.test(match)) {\n return luhnCheck(match.replace(/-/g, ''));\n }\n\n if (/^\\d{3} \\d{3} \\d{4}$/.test(match)) {\n return isValidNhs(match.replace(/ /g, ''));\n }\n\n const nhsPrefixed = /(?:NHS|nhs)(?:[_-]?number)?\\s*[=:]\\s*(\\d{10})$/.exec(match);\n const nhsDigits = nhsPrefixed?.[1];\n\n if (nhsDigits) {\n return isValidNhs(nhsDigits);\n }\n\n return true;\n}\n\nconst SSN_CTX =\n '(?:[Ss][Ss][Nn]|[Ee][Ii][Nn]|[Ss][Ii][Nn]|tax[_-]?id|social[_ -]?security(?:[_ -]?number)?)';\nconst ID_CTX = '(?:passport(?:_no|_number)?|driver[_-]?license|national[_-]?id|tax[_-]?id)';\n\nexport const govIdentifiersRule: SanitizeRule = {\n id: 'govIds',\n label: 'Government identifiers',\n description: 'Passport numbers, tax numbers, SSNs and similar IDs are redacted outright.',\n mode: 'mask',\n token: 'GOV_ID',\n patterns: [\n '(?:(?<![A-Z0-9<])P<[A-Z0-9<]{42}(?![A-Z0-9<]))',\n '(?:\\\\b\\\\d{3}-\\\\d{2}-\\\\d{4}\\\\b)',\n '(?:\\\\b\\\\d{3}-\\\\d{3}-\\\\d{3}\\\\b)',\n '(?:\\\\b\\\\d{3} \\\\d{3} \\\\d{4}\\\\b)',\n '(?:\\\\b(?:NHS|nhs)(?:[_-]?number)?\\\\s*[=:]\\\\s*\\\\d{10}\\\\b)',\n '(?:\\\\b(?!BG|GB|NK|KN|TN|NT|ZZ)[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]\\\\d{6}\\\\s?[A-D]\\\\b)',\n '(?:(?<![A-Za-z0-9А-ЯІЇЄҐа-яіїєґ])[А-ЯІЇЄҐ]{2}\\\\d{6}\\\\b)',\n `(?:\\\\b${SSN_CTX}\\\\s*[=:]?\\\\s*)(\\\\d{9})\\\\b`,\n '(?:(?:ІПН|РНОКПП|tax[_-]?id)\\\\s*[=:]?\\\\s*)(\\\\d{10})\\\\b',\n `(?:\\\\b${ID_CTX}\\\\s*[=:]\\\\s*)([A-Za-z0-9<]{5,32})`,\n ],\n aggressivePatterns: ['(?:\\\\b[A-Z]{1,2}\\\\d{6,9}\\\\b)', '(?:\\\\b\\\\d{9,11}\\\\b)'],\n validate: validateGovId,\n jsonKeys: [\n 'ssn',\n 'passportNumber',\n 'taxId',\n 'nationalId',\n 'socialSecurityNumber',\n 'passport',\n 'nino',\n 'nhsNumber',\n 'driverLicense',\n 'licenseNumber',\n 'personalId',\n 'dob',\n 'dateOfBirth',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction isValidDea(match: string): boolean {\n if (!/^[ABFGMPRX][A-Z9]\\d{7}$/.test(match)) {\n return false;\n }\n\n const digits = match.slice(2);\n const sum =\n Number(digits[0]) +\n Number(digits[2]) +\n Number(digits[4]) +\n 2 * (Number(digits[1]) + Number(digits[3]) + Number(digits[5]));\n\n return sum % 10 === Number(digits[6]);\n}\n\nfunction validateHealth(match: string): boolean {\n if (/^[ABFGMPRX][A-Z9]\\d{7}$/.test(match)) {\n return isValidDea(match);\n }\n\n return true;\n}\n\nconst MRN_KEY = '(?:[Mm][Rr][Nn]|medical[_-]?record(?:[_-]?number)?)';\n\nexport const healthInfoRule: SanitizeRule = {\n id: 'healthInfo',\n label: 'Protected health information',\n description:\n 'PHI in SOC logs is almost always structured: JSON field names (diagnosis, medication, MRN, …) carry most of the coverage. Freeform patterns only match context-anchored medical codes (ICD, SNOMED, LOINC, NDC, DEA, MRN).',\n mode: 'mask',\n token: 'PHI',\n patterns: [\n '(?:\\\\b(?:[Ii][Cc][Dd]-10|[Ii][Cc][Dd]10):?\\\\s*[A-Z]\\\\d{2}(?:\\\\.\\\\d{1,4})?\\\\b)',\n '(?:\\\\b(?:[Ii][Cc][Dd]-9|[Ii][Cc][Dd]9):?\\\\s*(?:[VE]\\\\d{2,3}|\\\\d{3})(?:\\\\.\\\\d{1,2})?\\\\b)',\n '(?:\\\\b(?:SNOMED(?:\\\\s*CT)?|[Ss]nomed(?:\\\\s*CT)?)[:\\\\s]+\\\\d{6,18}\\\\b)',\n '(?:\\\\b(?:LOINC|[Ll]oinc)[:\\\\s]+\\\\d{1,5}-\\\\d\\\\b)',\n '(?:\\\\b(?:NDC|[Nn]dc)[:\\\\s]+\\\\d{4,5}-\\\\d{3,4}-\\\\d{1,2}\\\\b)',\n '(?:\\\\b[ABFGMPRX][A-Z9]\\\\d{7}\\\\b)',\n '(?:\\\\b(?:[Nn][Pp][Ii])\\\\s*[=:]\\\\s*\\\\d{10}\\\\b)',\n `(?:\\\\b${MRN_KEY}\\\\s*[=:]\\\\s*)([A-Za-z0-9-]{4,})\\\\b`,\n ],\n aggressivePatterns: ['(?:(?<![A-Za-z0-9])[A-TV-Z]\\\\d{2}(?:\\\\.\\\\w{1,4})?(?![A-Za-z0-9:]))'],\n validate: validateHealth,\n jsonKeys: [\n 'diagnosis',\n 'prescription',\n 'medication',\n 'icd10',\n 'icd9',\n 'snomed',\n 'condition',\n 'allergy',\n 'allergies',\n 'bloodType',\n 'patientId',\n 'mrn',\n 'medicalRecordNumber',\n 'insuranceNumber',\n 'labResult',\n 'observation',\n 'vitalSigns',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst USER_SEG = '[^/\\\\\\\\\\\\s\"\\'<>]+';\n\nfunction validateHomeUser(match: string): boolean {\n return match !== '.' && match !== '..';\n}\n\nexport const homePathsRule: SanitizeRule = {\n id: 'paths',\n label: 'Home-directory usernames',\n description:\n 'Only the username segment of a home-directory path is redacted (e.g. /home/jdoe/app → /home/<R:…>/app); the rest of the path stays visible.',\n mode: 'mask',\n token: 'PATH',\n patterns: [\n `(?:/export/home/(${USER_SEG}))`,\n `(?:/usr/home/(${USER_SEG}))`,\n `(?:/var/home/(${USER_SEG}))`,\n `(?:/home/(${USER_SEG}))`,\n `(?:/Users/(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\Users\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:/Users/(${USER_SEG}))`,\n `(?:\\\\\\\\\\\\\\\\\\\\?\\\\\\\\[A-Za-z]:\\\\\\\\Users\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\Documents and Settings\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\(${USER_SEG}))`,\n `(?:/mnt/[A-Za-z]/Users/(${USER_SEG}))`,\n `(?://wsl\\\\$/(?:[A-Za-z0-9_-]+)/home/(${USER_SEG}))`,\n ],\n validate: validateHomeUser,\n};\n","export const BACKSLASH = '\\\\\\\\';\n\nexport const JSON_BACKSLASH = '\\\\\\\\\\\\\\\\';\n\nexport const WINDOWS_FILE_EXT =\n 'exe|dll|sys|bat|cmd|ps1|vbs|msi|tmp|hiv|log|dat|txt|ini|xml|json|lnk|cpl|ocx|drv';\n\nexport const NOT_WINDOWS_FILENAME = `(?![A-Za-z0-9_$.-]*\\\\.(?:${WINDOWS_FILE_EXT})(?![A-Za-z0-9]))`;\n\nexport const WELL_KNOWN_DOMAIN = '(?:BUILTIN|NT SERVICE|NT AUTHORITY|Users|Settings|Files)';\n\nexport const NETBIOS_DOMAIN = '[A-Za-z0-9](?:[A-Za-z0-9.-]{0,13}[A-Za-z0-9])?';\n\nexport const ACCOUNT_SEGMENT = '[A-Za-z0-9_](?:[A-Za-z0-9_.$-]*[A-Za-z0-9$])';\n","import type { SanitizeRule } from '../../types';\nimport {\n ACCOUNT_SEGMENT,\n BACKSLASH,\n JSON_BACKSLASH,\n NETBIOS_DOMAIN,\n NOT_WINDOWS_FILENAME,\n WELL_KNOWN_DOMAIN,\n} from '../shared/windowsAccounts';\n\nconst GTLD = [\n 'abbott',\n 'abogado',\n 'ac',\n 'academy',\n 'accountant',\n 'accountants',\n 'active',\n 'actor',\n 'ad',\n 'ads',\n 'adult',\n 'ae',\n 'aero',\n 'af',\n 'afl',\n 'ag',\n 'agency',\n 'ai',\n 'airforce',\n 'al',\n 'allfinanz',\n 'alsace',\n 'am',\n 'amsterdam',\n 'an',\n 'android',\n 'ao',\n 'apartments',\n 'aq',\n 'aquarelle',\n 'ar',\n 'archi',\n 'army',\n 'arpa',\n 'as',\n 'asia',\n 'associates',\n 'at',\n 'attorney',\n 'au',\n 'auction',\n 'audio',\n 'autos',\n 'aw',\n 'ax',\n 'axa',\n 'az',\n 'ba',\n 'band',\n 'bank',\n 'bar',\n 'barclaycard',\n 'barclays',\n 'bargains',\n 'bauhaus',\n 'bayern',\n 'bb',\n 'bbc',\n 'bd',\n 'be',\n 'beer',\n 'berlin',\n 'best',\n 'bf',\n 'bg',\n 'bh',\n 'bi',\n 'bid',\n 'bike',\n 'bingo',\n 'bio',\n 'biz',\n 'bj',\n 'bl',\n 'black',\n 'blackfriday',\n 'bloomberg',\n 'blue',\n 'bm',\n 'bmw',\n 'bn',\n 'bnpparibas',\n 'bo',\n 'boats',\n 'bond',\n 'boo',\n 'boutique',\n 'bq',\n 'br',\n 'brussels',\n 'bs',\n 'bt',\n 'budapest',\n 'build',\n 'builders',\n 'business',\n 'buzz',\n 'bv',\n 'bw',\n 'by',\n 'bz',\n 'bzh',\n 'ca',\n 'cab',\n 'cafe',\n 'cal',\n 'camera',\n 'camp',\n 'cancerresearch',\n 'canon',\n 'capetown',\n 'capital',\n 'caravan',\n 'cards',\n 'care',\n 'career',\n 'careers',\n 'cartier',\n 'casa',\n 'cash',\n 'casino',\n 'cat',\n 'catering',\n 'cbn',\n 'cc',\n 'cd',\n 'center',\n 'ceo',\n 'cern',\n 'cf',\n 'cfd',\n 'cg',\n 'ch',\n 'channel',\n 'chat',\n 'cheap',\n 'chloe',\n 'christmas',\n 'chrome',\n 'church',\n 'ci',\n 'citic',\n 'city',\n 'ck',\n 'cl',\n 'claims',\n 'cleaning',\n 'click',\n 'clinic',\n 'clothing',\n 'club',\n 'cm',\n 'cn',\n 'co',\n 'coach',\n 'codes',\n 'coffee',\n 'college',\n 'cologne',\n 'com',\n 'community',\n 'company',\n 'computer',\n 'condos',\n 'construction',\n 'consulting',\n 'contractors',\n 'cooking',\n 'cool',\n 'coop',\n 'country',\n 'courses',\n 'cr',\n 'credit',\n 'creditcard',\n 'cricket',\n 'crs',\n 'cruises',\n 'cu',\n 'cuisinella',\n 'cv',\n 'cw',\n 'cx',\n 'cy',\n 'cymru',\n 'cyou',\n 'cz',\n 'dabur',\n 'dad',\n 'dance',\n 'date',\n 'dating',\n 'datsun',\n 'day',\n 'dclk',\n 'de',\n 'deals',\n 'degree',\n 'delivery',\n 'democrat',\n 'dental',\n 'dentist',\n 'desi',\n 'design',\n 'dev',\n 'diamonds',\n 'diet',\n 'digital',\n 'direct',\n 'directory',\n 'discount',\n 'dj',\n 'dk',\n 'dm',\n 'dnp',\n 'do',\n 'docs',\n 'doha',\n 'domains',\n 'doosan',\n 'download',\n 'durban',\n 'dvag',\n 'dz',\n 'eat',\n 'ec',\n 'edu',\n 'education',\n 'ee',\n 'eg',\n 'eh',\n 'email',\n 'emerck',\n 'energy',\n 'engineer',\n 'engineering',\n 'enterprises',\n 'epson',\n 'equipment',\n 'er',\n 'erni',\n 'es',\n 'esq',\n 'estate',\n 'et',\n 'eu',\n 'eurovision',\n 'eus',\n 'events',\n 'everbank',\n 'exchange',\n 'expert',\n 'exposed',\n 'express',\n 'fail',\n 'faith',\n 'fan',\n 'fans',\n 'farm',\n 'fashion',\n 'feedback',\n 'fi',\n 'film',\n 'finance',\n 'financial',\n 'firmdale',\n 'fish',\n 'fishing',\n 'fit',\n 'fitness',\n 'fj',\n 'fk',\n 'flights',\n 'florist',\n 'flowers',\n 'flsmidth',\n 'fly',\n 'fm',\n 'fo',\n 'foo',\n 'football',\n 'forex',\n 'forsale',\n 'foundation',\n 'fr',\n 'frl',\n 'frogans',\n 'fund',\n 'furniture',\n 'futbol',\n 'ga',\n 'gal',\n 'gallery',\n 'garden',\n 'gb',\n 'gbiz',\n 'gd',\n 'gdn',\n 'ge',\n 'gent',\n 'gf',\n 'gg',\n 'ggee',\n 'gh',\n 'gi',\n 'gift',\n 'gifts',\n 'gives',\n 'gl',\n 'glass',\n 'gle',\n 'global',\n 'globo',\n 'gm',\n 'gmail',\n 'gmo',\n 'gmx',\n 'gn',\n 'gold',\n 'goldpoint',\n 'golf',\n 'goo',\n 'goog',\n 'google',\n 'gop',\n 'gov',\n 'gp',\n 'gq',\n 'gr',\n 'graphics',\n 'gratis',\n 'green',\n 'gripe',\n 'gs',\n 'gt',\n 'gu',\n 'guge',\n 'guide',\n 'guitars',\n 'guru',\n 'gw',\n 'gy',\n 'hamburg',\n 'hangout',\n 'haus',\n 'healthcare',\n 'help',\n 'here',\n 'hermes',\n 'hiphop',\n 'hiv',\n 'hk',\n 'hm',\n 'hn',\n 'holdings',\n 'holiday',\n 'homes',\n 'horse',\n 'host',\n 'hosting',\n 'house',\n 'how',\n 'hr',\n 'ht',\n 'hu',\n 'ibm',\n 'id',\n 'ie',\n 'ifm',\n 'il',\n 'im',\n 'immo',\n 'immobilien',\n 'in',\n 'industries',\n 'infiniti',\n 'info',\n 'ing',\n 'ink',\n 'institute',\n 'insure',\n 'int',\n 'international',\n 'investments',\n 'io',\n 'iq',\n 'ir',\n 'irish',\n 'is',\n 'it',\n 'iwc',\n 'java',\n 'jcb',\n 'je',\n 'jetzt',\n 'jm',\n 'jo',\n 'jobs',\n 'joburg',\n 'jp',\n 'juegos',\n 'kaufen',\n 'kddi',\n 'ke',\n 'kg',\n 'kh',\n 'ki',\n 'kim',\n 'kitchen',\n 'kiwi',\n 'km',\n 'kn',\n 'koeln',\n 'komatsu',\n 'kp',\n 'kr',\n 'krd',\n 'kred',\n 'kw',\n 'ky',\n 'kyoto',\n 'kz',\n 'la',\n 'lacaixa',\n 'land',\n 'lat',\n 'latrobe',\n 'lawyer',\n 'lb',\n 'lc',\n 'lds',\n 'lease',\n 'leclerc',\n 'legal',\n 'lgbt',\n 'li',\n 'lidl',\n 'life',\n 'lighting',\n 'limited',\n 'limo',\n 'link',\n 'lk',\n 'loan',\n 'loans',\n 'london',\n 'lotte',\n 'lotto',\n 'love',\n 'lr',\n 'ls',\n 'lt',\n 'ltda',\n 'lu',\n 'luxe',\n 'luxury',\n 'lv',\n 'ly',\n 'ma',\n 'madrid',\n 'maif',\n 'maison',\n 'management',\n 'mango',\n 'market',\n 'marketing',\n 'markets',\n 'marriott',\n 'mc',\n 'md',\n 'me',\n 'media',\n 'meet',\n 'melbourne',\n 'meme',\n 'memorial',\n 'menu',\n 'mf',\n 'mg',\n 'mh',\n 'miami',\n 'mil',\n 'mini',\n 'mk',\n 'ml',\n 'mm',\n 'mma',\n 'mn',\n 'mo',\n 'mobi',\n 'moda',\n 'moe',\n 'monash',\n 'money',\n 'mormon',\n 'mortgage',\n 'moscow',\n 'motorcycles',\n 'mov',\n 'movie',\n 'mp',\n 'mq',\n 'mr',\n 'ms',\n 'mt',\n 'mtn',\n 'mtpc',\n 'mu',\n 'museum',\n 'mv',\n 'mw',\n 'mx',\n 'my',\n 'mz',\n 'na',\n 'nagoya',\n 'name',\n 'navy',\n 'nc',\n 'ne',\n 'net',\n 'network',\n 'neustar',\n 'new',\n 'news',\n 'nexus',\n 'nf',\n 'ng',\n 'ngo',\n 'nhk',\n 'ni',\n 'nico',\n 'ninja',\n 'nissan',\n 'nl',\n 'no',\n 'np',\n 'nr',\n 'nra',\n 'nrw',\n 'ntt',\n 'nu',\n 'nyc',\n 'nz',\n 'okinawa',\n 'om',\n 'one',\n 'ong',\n 'onl',\n 'online',\n 'ooo',\n 'org',\n 'organic',\n 'osaka',\n 'otsuka',\n 'ovh',\n 'pa',\n 'page',\n 'panerai',\n 'paris',\n 'partners',\n 'parts',\n 'party',\n 'pe',\n 'pf',\n 'pg',\n 'ph',\n 'pharmacy',\n 'photo',\n 'photography',\n 'photos',\n 'physio',\n 'piaget',\n 'pics',\n 'pictet',\n 'pictures',\n 'pink',\n 'pizza',\n 'pk',\n 'pl',\n 'place',\n 'plumbing',\n 'plus',\n 'pm',\n 'pn',\n 'pohl',\n 'poker',\n 'porn',\n 'post',\n 'pr',\n 'praxi',\n 'press',\n 'pro',\n 'prod',\n 'productions',\n 'prof',\n 'properties',\n 'property',\n 'ps',\n 'pt',\n 'pub',\n 'pw',\n 'py',\n 'qa',\n 'qpon',\n 'quebec',\n 'racing',\n 're',\n 'realtor',\n 'recipes',\n 'red',\n 'redstone',\n 'rehab',\n 'reise',\n 'reisen',\n 'reit',\n 'ren',\n 'rentals',\n 'repair',\n 'report',\n 'republican',\n 'rest',\n 'restaurant',\n 'review',\n 'reviews',\n 'rich',\n 'rio',\n 'rip',\n 'ro',\n 'rocks',\n 'rodeo',\n 'rs',\n 'rsvp',\n 'ru',\n 'ruhr',\n 'rw',\n 'ryukyu',\n 'sa',\n 'saarland',\n 'sale',\n 'samsung',\n 'sap',\n 'sarl',\n 'saxo',\n 'sb',\n 'sc',\n 'sca',\n 'scb',\n 'schmidt',\n 'scholarships',\n 'school',\n 'schule',\n 'schwarz',\n 'science',\n 'scot',\n 'sd',\n 'se',\n 'services',\n 'sew',\n 'sexy',\n 'sg',\n 'sh',\n 'shiksha',\n 'shoes',\n 'shriram',\n 'si',\n 'singles',\n 'site',\n 'sj',\n 'sk',\n 'sky',\n 'sl',\n 'sm',\n 'sn',\n 'so',\n 'social',\n 'software',\n 'sohu',\n 'solar',\n 'solutions',\n 'soy',\n 'space',\n 'spiegel',\n 'spreadbetting',\n 'sr',\n 'ss',\n 'st',\n 'study',\n 'style',\n 'su',\n 'sucks',\n 'supplies',\n 'supply',\n 'support',\n 'surf',\n 'surgery',\n 'suzuki',\n 'sv',\n 'sx',\n 'sy',\n 'sydney',\n 'systems',\n 'sz',\n 'taipei',\n 'tatar',\n 'tattoo',\n 'tax',\n 'tc',\n 'td',\n 'tech',\n 'technology',\n 'tel',\n 'temasek',\n 'tennis',\n 'tf',\n 'tg',\n 'th',\n 'tickets',\n 'tienda',\n 'tips',\n 'tires',\n 'tirol',\n 'tj',\n 'tk',\n 'tl',\n 'tm',\n 'tn',\n 'to',\n 'today',\n 'tokyo',\n 'tools',\n 'top',\n 'toshiba',\n 'tours',\n 'town',\n 'toys',\n 'tp',\n 'tr',\n 'trade',\n 'trading',\n 'training',\n 'travel',\n 'trust',\n 'tt',\n 'tui',\n 'tv',\n 'tw',\n 'tz',\n 'ua',\n 'ug',\n 'uk',\n 'um',\n 'university',\n 'uno',\n 'uol',\n 'us',\n 'uy',\n 'uz',\n 'va',\n 'vacations',\n 'vc',\n 've',\n 'vegas',\n 'ventures',\n 'versicherung',\n 'vet',\n 'vg',\n 'vi',\n 'viajes',\n 'video',\n 'villas',\n 'vision',\n 'vlaanderen',\n 'vn',\n 'vodka',\n 'vote',\n 'voting',\n 'voto',\n 'voyage',\n 'vu',\n 'wales',\n 'wang',\n 'watch',\n 'webcam',\n 'website',\n 'wed',\n 'wedding',\n 'wf',\n 'whoswho',\n 'wien',\n 'wiki',\n 'williamhill',\n 'win',\n 'wme',\n 'work',\n 'works',\n 'world',\n 'ws',\n 'wtc',\n 'wtf',\n 'xin',\n '测试',\n 'परीक्षा',\n '佛山',\n '慈善',\n '集团',\n '在线',\n '한국',\n 'ভারত',\n '八卦',\n 'موقع',\n 'বাংলা',\n '公益',\n '公司',\n '移动',\n '我爱你',\n 'москва',\n 'испытание',\n 'қаз',\n 'онлайн',\n 'сайт',\n 'срб',\n 'бел',\n '时尚',\n '테스트',\n '淡马锡',\n 'орг',\n '삼성',\n 'சிங்கப்பூர்',\n '商标',\n '商店',\n '商城',\n 'дети',\n 'мкд',\n 'טעסט',\n '中文网',\n '中信',\n '中国',\n '中國',\n '谷歌',\n 'భారత్',\n 'ලංකා',\n '測試',\n 'ભારત',\n 'भारत',\n 'آزمایشی',\n 'பரிட்சை',\n '网店',\n 'संगठन',\n '网络',\n 'укр',\n '香港',\n 'δοκιμή',\n '飞利浦',\n 'إختبار',\n '台湾',\n '台灣',\n '手机',\n 'мон',\n 'الجزائر',\n 'عمان',\n 'ایران',\n 'امارات',\n 'بازار',\n 'پاکستان',\n 'الاردن',\n 'بھارت',\n 'المغرب',\n 'السعودية',\n 'سودان',\n 'عراق',\n 'مليسيا',\n '政府',\n 'شبكة',\n 'გე',\n '机构',\n '组织机构',\n '健康',\n 'ไทย',\n 'سورية',\n 'рус',\n 'рф',\n 'تونس',\n 'みんな',\n 'グーグル',\n '世界',\n 'ਭਾਰਤ',\n '网址',\n '游戏',\n 'vermögensberater',\n 'vermögensberatung',\n '企业',\n '信息',\n 'مصر',\n 'قطر',\n '广东',\n 'இலங்கை',\n 'இந்தியா',\n 'հայ',\n '新加坡',\n 'فلسطين',\n 'テスト',\n '政务',\n 'xxx',\n 'xyz',\n 'yachts',\n 'yandex',\n 'ye',\n 'yodobashi',\n 'yoga',\n 'yokohama',\n 'youtube',\n 'yt',\n 'za',\n 'zm',\n 'zone',\n 'zuerich',\n 'zw',\n];\nconst INTERNAL_SUFFIXES = [\n 'local',\n 'internal',\n 'intranet',\n 'corp',\n 'lan',\n 'home',\n 'localdomain',\n 'arpa',\n];\nconst INTERNAL_COMPOUND_SUFFIXES = [\n 'svc\\\\.cluster\\\\.local',\n 'ec2\\\\.internal',\n 'compute\\\\.internal',\n];\n\nconst FILE_EXT_COLLISION_TLDS = [\n 'ac',\n 'am',\n 'cc',\n 'gs',\n 'hiv',\n 'in',\n 'is',\n 'it',\n 'java',\n 'la',\n 'md',\n 'ml',\n 'pl',\n 'py',\n 'rs',\n 'sh',\n 'so',\n 'tf',\n];\nconst COLLISION_TLD_SET = new Set(FILE_EXT_COLLISION_TLDS);\nconst GTLD_UNRESTRICTED = GTLD.filter((tld) => !COLLISION_TLD_SET.has(tld));\n\nconst TLD_EXACT = [...INTERNAL_COMPOUND_SUFFIXES, ...GTLD_UNRESTRICTED, ...INTERNAL_SUFFIXES].join(\n '|',\n);\nconst TLD_COLLISION = FILE_EXT_COLLISION_TLDS.join('|');\nconst LABEL = '[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?';\n\nconst HOST_EXACT = `(?:(?<![\\\\w.$-])(?<![^:/\\\\\\\\][/\\\\\\\\])(?:${LABEL}\\\\.)+(?:${TLD_EXACT})(?!\\\\.?\\\\w))`;\n\nconst HOST_COLLISION = `(?:(?:https?|sftp|ftps?|wss?)://(?:[^/@\\\\s]+@)?)((?:${LABEL}\\\\.)+(?:${TLD_COLLISION}))(?!\\\\.?\\\\w)`;\n\nfunction uncComputerPattern(separator: string): string {\n return `(?:${separator}${separator})([A-Za-z][A-Za-z0-9-]{0,14})(?=${separator}[A-Za-z0-9$])`;\n}\n\nconst UNC_COMPUTER = uncComputerPattern(BACKSLASH);\nconst UNC_COMPUTER_JSON = uncComputerPattern(JSON_BACKSLASH);\n\nconst SPN_HOST = '(?:\\\\b[A-Za-z][A-Za-z0-9]*/)([A-Za-z0-9][A-Za-z0-9.-]*)(?=@[A-Z0-9.-]+\\\\b)';\n\nconst HOST_CTX_KEY = '(?:host|hostname|computer)';\nconst HOST_VALUE = '[A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?';\nconst HOST_CTX = `(?:\\\\b${HOST_CTX_KEY}\\\\s*[=:]\\\\s*)(${HOST_VALUE})`;\n\nfunction anyCase(word: string): string {\n let pattern = '';\n\n for (const char of word) {\n const lower = char.toLowerCase();\n const upper = char.toUpperCase();\n pattern += lower === upper ? char : `[${lower}${upper}]`;\n }\n\n return pattern;\n}\n\nconst QUOTED_DOMAIN_ACCOUNT = `(?:\")(?!${WELL_KNOWN_DOMAIN}\\\\\\\\{1,2})(${NETBIOS_DOMAIN})(?=\\\\\\\\{1,2}${NOT_WINDOWS_FILENAME}${ACCOUNT_SEGMENT}\")`;\n\nconst KEY_WORD = '[A-Za-z_]*';\nconst JSON_HOST_KEY = [\n `${KEY_WORD}${anyCase('computer')}${KEY_WORD}`,\n `${KEY_WORD}${anyCase('domain')}[_-]?${anyCase('name')}`,\n `${anyCase('host')}(?:[_-]?${anyCase('name')})?`,\n anyCase('fqdn'),\n anyCase('domain'),\n `${anyCase('server')}[_-]?${anyCase('name')}`,\n `${anyCase('node')}[_-]?${anyCase('name')}`,\n `${anyCase('dns')}[_-]?${anyCase('name')}`,\n `${anyCase('machine')}[_-]?${anyCase('name')}`,\n `${anyCase('target')}[_-]?${anyCase('host')}`,\n].join('|');\nconst HOST_JSON_CTX = `(?:\"(?:${JSON_HOST_KEY})\"\\\\s*:\\\\s*\")(${HOST_VALUE})(?=\")`;\n\nconst NETBIOS_AGGRESSIVE = '(?:\\\\b(?:WIN|DESKTOP)-[A-Z0-9]{7,10}\\\\b)';\n\nconst SYSLOG_MONTH = '(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)';\nconst SYSLOG_BSD_TS = `${SYSLOG_MONTH}\\\\s+\\\\d{1,2}\\\\s+\\\\d{2}:\\\\d{2}:\\\\d{2}`;\nconst SYSLOG_ISO_TS =\n '\\\\d{4}-\\\\d{2}-\\\\d{2}[T ]\\\\d{2}:\\\\d{2}:\\\\d{2}(?:\\\\.\\\\d+)?(?:Z|[+-]\\\\d{2}:?\\\\d{2})?';\nconst SYSLOG_HOST_NAME = `${LABEL}(?:\\\\.${LABEL})*`;\nconst SYSLOG_HOST_LOOKAHEAD = '(?=\\\\s+[A-Za-z][A-Za-z0-9_.@-]*(?:\\\\[\\\\d+\\\\])?:)';\nconst SYSLOG_HOST = `(?:(?:${SYSLOG_BSD_TS}|${SYSLOG_ISO_TS})\\\\s+)(${SYSLOG_HOST_NAME})${SYSLOG_HOST_LOOKAHEAD}`;\n\nconst INVENTORY_PREFIX =\n '(?:[Ss][Rr][Vv]|[Ww][Ee][Bb]|[Dd][Bb]|[Aa][Pp][Pp]|[Hh][Oo][Ss][Tt]|[Nn][Oo][Dd][Ee]|[Pp][Oo][Dd])';\nconst INVENTORY_HOST = `(?:\\\\b${INVENTORY_PREFIX}-[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*-\\\\d+\\\\b)`;\n\nexport const hostnamesRule: SanitizeRule = {\n id: 'hosts',\n label: 'Hostnames & domains',\n description:\n 'FQDNs, UNC computer names, Kerberos SPN hosts, quoted JSON host fields, the domain half of a quoted DOMAIN\\\\account value and syslog host fields become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'HOST',\n patterns: [\n HOST_EXACT,\n HOST_COLLISION,\n UNC_COMPUTER,\n UNC_COMPUTER_JSON,\n SPN_HOST,\n HOST_CTX,\n HOST_JSON_CTX,\n QUOTED_DOMAIN_ACCOUNT,\n SYSLOG_HOST,\n ],\n aggressivePatterns: [NETBIOS_AGGRESSIVE, INVENTORY_HOST],\n jsonKeys: [\n 'hostname',\n 'host',\n 'fqdn',\n 'domain',\n 'computer',\n 'computerName',\n 'serverName',\n 'nodeName',\n 'dnsName',\n 'machineName',\n 'targetHost',\n ],\n jsonKeyContains: ['computer', 'domainname'],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst IPV4_OCTET = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)';\nconst IPV4 = `(?:(?<![\\\\d.])\\\\b${IPV4_OCTET}(?:\\\\.${IPV4_OCTET}){3}\\\\b(?!\\\\.\\\\d))`;\n\nconst IPV6_SEG = '[0-9a-fA-F]{1,4}';\nconst IPV6_FULL = `(?:${IPV6_SEG}:){7}${IPV6_SEG}`;\nconst IPV6_COMPRESSED = `(?:(?:${IPV6_SEG}:){1,7}:|(?:${IPV6_SEG}:){1,6}:${IPV6_SEG}|(?:${IPV6_SEG}:){1,5}(?::${IPV6_SEG}){1,2}|(?:${IPV6_SEG}:){1,4}(?::${IPV6_SEG}){1,3}|(?:${IPV6_SEG}:){1,3}(?::${IPV6_SEG}){1,4}|(?:${IPV6_SEG}:){1,2}(?::${IPV6_SEG}){1,5}|${IPV6_SEG}:(?::${IPV6_SEG}){1,6}|:(?:(?::${IPV6_SEG}){1,7}|:))`;\nconst IPV4_MAPPED = `(?:::ffff:${IPV4})`;\nconst IPV6 = `(?:(?<![A-Za-z0-9])(?:${IPV4_MAPPED}|${IPV6_FULL}|${IPV6_COMPRESSED})(?![A-Za-z0-9:])(?!\\\\.\\\\d)(?:%[A-Za-z0-9_.-]+)?)`;\n\nconst PTR_V4 = '(?:\\\\b(?:\\\\d{1,3}\\\\.){4}in-addr\\\\.arpa\\\\b)';\nconst PTR_V6 = '(?:\\\\b(?:[0-9a-fA-F]\\\\.){4,32}ip6\\\\.arpa\\\\b)';\n\nconst MAC_COLON = '(?:(?<!&)\\\\b[0-9A-Fa-f]{2}(?::[0-9A-Fa-f]{2}){5}\\\\b)';\nconst MAC_DASH = '(?:\\\\b[0-9A-Fa-f]{2}(?:-[0-9A-Fa-f]{2}){5}\\\\b)';\nconst MAC_CISCO = '(?:\\\\b[0-9A-Fa-f]{4}(?:\\\\.[0-9A-Fa-f]{4}){2}\\\\b)';\n\nfunction ipv4ToOctets(ip: string): number[] {\n return ip.split('.').map(Number);\n}\n\nfunction isNetmaskShape(octets: number[]): boolean {\n const bin = octets.map((octet) => octet.toString(2).padStart(8, '0')).join('');\n return /^1*0*$/.test(bin);\n}\n\nfunction isReservedIpv4(ip: string): boolean {\n const octets = ipv4ToOctets(ip);\n\n if (octets.length !== 4 || octets.some((octet) => Number.isNaN(octet))) {\n return false;\n }\n\n if (octets[0] === 127) {\n return true;\n }\n\n if (octets[0] === 0) {\n return true;\n }\n\n if (octets[0] === 169 && octets[1] === 254) {\n return true;\n }\n\n if (octets[0] >= 224 && octets[0] <= 239) {\n return true;\n }\n\n return isNetmaskShape(octets);\n}\n\nfunction validateIp(match: string): boolean {\n if (/^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(match)) {\n return !isReservedIpv4(match);\n }\n\n const withoutZone = match.split('%')[0] ?? match;\n\n if (withoutZone === '::' || withoutZone === '::1') {\n return false;\n }\n\n const mapped = /^::ffff:(\\d{1,3}(?:\\.\\d{1,3}){3})$/.exec(withoutZone);\n\n if (mapped?.[1]) {\n return !isReservedIpv4(mapped[1]);\n }\n\n return true;\n}\n\nexport const ipAddressesRule: SanitizeRule = {\n id: 'ips',\n label: 'Network addresses',\n description:\n 'IPv4/IPv6 addresses, MAC addresses and reverse-DNS (PTR) names become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'IP',\n patterns: [PTR_V4, PTR_V6, IPV6, IPV4, MAC_COLON, MAC_DASH, MAC_CISCO],\n validate: validateIp,\n jsonKeys: [\n 'ip',\n 'ipAddress',\n 'ip_address',\n 'clientIp',\n 'remoteAddr',\n 'srcIp',\n 'dstIp',\n 'sourceIp',\n 'destinationIp',\n 'xForwardedFor',\n 'mac',\n 'macAddress',\n ],\n};\n","const BLOCK_BYTES = 64;\nconst DIGEST_BYTES = 32;\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nconst INITIAL_STATE = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\nfunction rotr(value: number, bits: number): number {\n return ((value >>> bits) | (value << (32 - bits))) >>> 0;\n}\n\nfunction padMessage(message: Uint8Array): Uint8Array {\n const bitLength = message.length * 8;\n const paddedLength = Math.ceil((message.length + 9) / BLOCK_BYTES) * BLOCK_BYTES;\n const padded = new Uint8Array(paddedLength);\n\n padded.set(message);\n padded[message.length] = 0x80;\n\n const view = new DataView(padded.buffer);\n view.setUint32(paddedLength - 8, Math.floor(bitLength / 2 ** 32), false);\n view.setUint32(paddedLength - 4, bitLength >>> 0, false);\n\n return padded;\n}\n\nexport function sha256(message: Uint8Array): Uint8Array {\n const padded = padMessage(message);\n const view = new DataView(padded.buffer);\n const state = Uint32Array.from(INITIAL_STATE);\n const w = new Uint32Array(64);\n\n for (let offset = 0; offset < padded.length; offset += BLOCK_BYTES) {\n for (let i = 0; i < 16; i += 1) {\n w[i] = view.getUint32(offset + i * 4, false);\n }\n\n for (let i = 16; i < 64; i += 1) {\n const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ (w[i - 15] >>> 3);\n const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ (w[i - 2] >>> 10);\n w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;\n }\n\n let [a, b, c, d, e, f, g, h] = state;\n\n for (let i = 0; i < 64; i += 1) {\n const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + ch + K[i] + w[i]) >>> 0;\n const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n state[0] = (state[0] + a) >>> 0;\n state[1] = (state[1] + b) >>> 0;\n state[2] = (state[2] + c) >>> 0;\n state[3] = (state[3] + d) >>> 0;\n state[4] = (state[4] + e) >>> 0;\n state[5] = (state[5] + f) >>> 0;\n state[6] = (state[6] + g) >>> 0;\n state[7] = (state[7] + h) >>> 0;\n }\n\n const digest = new Uint8Array(DIGEST_BYTES);\n const digestView = new DataView(digest.buffer);\n\n for (let i = 0; i < 8; i += 1) {\n digestView.setUint32(i * 4, state[i], false);\n }\n\n return digest;\n}\n","import { sha256 } from '../shared/hmacSha256';\nimport type { SanitizeRule } from '../../types';\n\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\nfunction luhnCheck(digits: string): boolean {\n if (!/^\\d{13,19}$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n let doubleIt = false;\n\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let digit = Number(digits[i]);\n\n if (doubleIt) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n doubleIt = !doubleIt;\n }\n\n return sum % 10 === 0;\n}\n\nfunction ibanMod97(iban: string): boolean {\n const compact = iban.replace(/\\s/g, '').toUpperCase();\n\n if (!/^[A-Z]{2}\\d{2}[A-Z0-9]{10,30}$/.test(compact)) {\n return false;\n }\n\n const rearranged = compact.slice(4) + compact.slice(0, 4);\n const numeric = rearranged.replace(/[A-Z]/g, (char) => String(char.charCodeAt(0) - 55));\n let remainder = 0;\n\n for (let i = 0; i < numeric.length; i += 1) {\n remainder = (remainder * 10 + Number(numeric[i])) % 97;\n }\n\n return remainder === 1;\n}\n\nconst IBAN_COUNTRY_CODES = new Set([\n 'AD',\n 'AE',\n 'AL',\n 'AO',\n 'AT',\n 'AZ',\n 'BA',\n 'BE',\n 'BF',\n 'BG',\n 'BH',\n 'BI',\n 'BJ',\n 'BR',\n 'BY',\n 'CF',\n 'CG',\n 'CH',\n 'CI',\n 'CM',\n 'CR',\n 'CV',\n 'CY',\n 'CZ',\n 'DE',\n 'DJ',\n 'DK',\n 'DO',\n 'DZ',\n 'EE',\n 'EG',\n 'ES',\n 'FI',\n 'FO',\n 'FR',\n 'GA',\n 'GB',\n 'GE',\n 'GI',\n 'GL',\n 'GQ',\n 'GR',\n 'GT',\n 'GW',\n 'HN',\n 'HR',\n 'HU',\n 'IE',\n 'IL',\n 'IQ',\n 'IR',\n 'IS',\n 'IT',\n 'JO',\n 'KM',\n 'KW',\n 'KZ',\n 'LB',\n 'LC',\n 'LI',\n 'LT',\n 'LU',\n 'LV',\n 'LY',\n 'MA',\n 'MC',\n 'MD',\n 'ME',\n 'MG',\n 'MK',\n 'ML',\n 'MR',\n 'MT',\n 'MU',\n 'MZ',\n 'NE',\n 'NI',\n 'NL',\n 'NO',\n 'PK',\n 'PL',\n 'PS',\n 'PT',\n 'QA',\n 'RO',\n 'RS',\n 'RU',\n 'SA',\n 'SC',\n 'SD',\n 'SE',\n 'SI',\n 'SK',\n 'SM',\n 'SN',\n 'ST',\n 'SV',\n 'TD',\n 'TG',\n 'TL',\n 'TN',\n 'TR',\n 'UA',\n 'VA',\n 'VG',\n 'XK',\n]);\n\nfunction isIbanCountry(compact: string): boolean {\n return IBAN_COUNTRY_CODES.has(compact.slice(0, 2).toUpperCase());\n}\n\nfunction isHexHashLength(value: string): boolean {\n return /^(?:[A-Fa-f0-9]{32}|[A-Fa-f0-9]{40}|[A-Fa-f0-9]{64})$/.test(value);\n}\n\nfunction isCardSeparatorLayout(match: string): boolean {\n if (!/[ -]/.test(match)) {\n return true;\n }\n\n const groups = match.split(/[ -]/).map((group) => group.length);\n\n if (groups.some((length) => length === 0)) {\n return false;\n }\n\n if (\n groups.length === 3 &&\n groups[0] === 4 &&\n groups[1] === 6 &&\n (groups[2] === 4 || groups[2] === 5)\n ) {\n return true;\n }\n\n const last = groups[groups.length - 1];\n\n return (\n groups.length >= 2 &&\n groups.slice(0, -1).every((length) => length === 4) &&\n last >= 1 &&\n last <= 7\n );\n}\n\nfunction bitcoinBase58Check(address: string): boolean {\n const decoded = decodeBase58(address);\n\n if (!decoded || decoded.length < 5) {\n return false;\n }\n\n const payload = decoded.subarray(0, decoded.length - 4);\n const checksum = decoded.subarray(decoded.length - 4);\n const digest = sha256(sha256(payload));\n\n return (\n digest[0] === checksum[0] &&\n digest[1] === checksum[1] &&\n digest[2] === checksum[2] &&\n digest[3] === checksum[3]\n );\n}\n\nfunction decodeBase58(input: string): Uint8Array | null {\n const bytes: number[] = [0];\n\n for (let i = 0; i < input.length; i += 1) {\n let carry = BASE58_ALPHABET.indexOf(input[i]);\n\n if (carry === -1) {\n return null;\n }\n\n for (let j = 0; j < bytes.length; j += 1) {\n carry += bytes[j] * 58;\n bytes[j] = carry % 256;\n carry = Math.floor(carry / 256);\n }\n\n while (carry > 0) {\n bytes.push(carry % 256);\n carry = Math.floor(carry / 256);\n }\n }\n\n let leadingOnes = 0;\n\n while (leadingOnes < input.length && input[leadingOnes] === '1') {\n leadingOnes += 1;\n }\n\n let end = bytes.length;\n\n while (end > 0 && bytes[end - 1] === 0) {\n end -= 1;\n }\n\n const out = new Uint8Array(leadingOnes + end);\n\n for (let i = 0; i < end; i += 1) {\n out[leadingOnes + end - 1 - i] = bytes[i];\n }\n\n return out;\n}\n\nfunction isKnownCardIin(digits: string): boolean {\n const { length } = digits;\n const d2 = Number(digits.slice(0, 2));\n const d4 = Number(digits.slice(0, 4));\n\n switch (digits[0]) {\n case '4':\n return length === 13 || length === 16 || length === 19;\n case '5':\n return length === 16 && d2 >= 51 && d2 <= 55;\n case '2':\n return length === 16 && d4 >= 2221 && d4 <= 2720;\n case '3':\n if (length === 15) {\n return d2 === 34 || d2 === 37;\n }\n\n if (length === 14) {\n return d2 === 36 || d2 === 38 || d2 === 39 || (d4 >= 3000 && d4 <= 3059) || d4 === 3095;\n }\n\n return length >= 16 && length <= 19 && d4 >= 3528 && d4 <= 3589;\n case '6':\n return (\n length >= 16 &&\n length <= 19 &&\n (digits.startsWith('6011') ||\n digits.startsWith('62') ||\n digits.startsWith('64') ||\n digits.startsWith('65'))\n );\n default:\n return false;\n }\n}\n\nfunction validatePayment(match: string): boolean {\n const compactIban = match.replace(/\\s/g, '');\n\n if (/^[A-Za-z]{2}\\d{2}[A-Za-z0-9]+$/.test(compactIban)) {\n return !isHexHashLength(compactIban) && isIbanCountry(compactIban) && ibanMod97(match);\n }\n\n const compactPan = match.replace(/[ -]/g, '');\n\n if (/^[\\d -]+$/.test(match) && /^\\d{13,19}$/.test(compactPan)) {\n const grouped = /[ -]/.test(match);\n\n if (!grouped && compactPan.length > 16) {\n return false;\n }\n\n return isCardSeparatorLayout(match) && isKnownCardIin(compactPan) && luhnCheck(compactPan);\n }\n\n if (/^[13][A-HJ-NP-Za-km-z1-9]{25,34}$/.test(match)) {\n return bitcoinBase58Check(match);\n }\n\n return true;\n}\n\nconst CVV_KEY = '(?:[Cc][Vv][Vv]2?|[Cc][Vv][Cc]2?|[Cc][Ii][Dd])';\nconst EXP_KEY = '(?:[Ee]xp(?:iry|iration)?|[Ee]xp[_-]?[Dd]ate)';\nconst ROUTING_KEY = '(?:[Rr]outing(?:[_-]?[Nn]umber)?|[Aa][Bb][Aa])';\nconst ACCOUNT_KEY = '(?:[Aa]ccount[_-]?[Nn]umber|[Aa]cct)';\n\nexport const paymentInfoRule: SanitizeRule = {\n id: 'paymentInfo',\n label: 'Payment info',\n description:\n 'IBANs, card numbers (PAN, Luhn-checked), CVV/CVC, expiry dates and crypto addresses are redacted outright.',\n mode: 'mask',\n token: 'PAYMENT',\n patterns: [\n '(?:(?<![.\\\\d])\\\\b\\\\d(?:[ -]?\\\\d){12,18}\\\\b)',\n '(?:\\\\b[A-Z]{2}\\\\d{2}[A-Z0-9]{10,30}\\\\b)',\n '(?:\\\\b[A-Z]{2}\\\\d{2}(?: [A-Z0-9]{4}){2,7}(?: [A-Z0-9]{1,4})?\\\\b)',\n `(?:\\\\b${CVV_KEY}\\\\s*[=:]\\\\s*)(\\\\d{3,4}\\\\b)`,\n `(?:\\\\b${EXP_KEY}\\\\s*[=:]\\\\s*)((?:0[1-9]|1[0-2])[/-](?:\\\\d{2}|\\\\d{4})\\\\b)`,\n '(?:\\\\bbc1[a-z0-9]{25,39}\\\\b)',\n '(?:(?<![A-Za-z0-9])[13][A-HJ-NP-Za-km-z1-9]{25,34}(?![A-Za-z0-9]))',\n '(?:\\\\b0x[A-Fa-f0-9]{40}\\\\b)',\n ],\n aggressivePatterns: [\n '(?:(?<![\\\\\\\\/])\\\\b[A-Z]{6}[A-Z0-9]{2}(?:[A-Z0-9]{3})?\\\\b(?![\\\\\\\\/]))',\n `(?:\\\\b${ROUTING_KEY}\\\\s*[=:]\\\\s*)(\\\\d{9}\\\\b)`,\n `(?:\\\\b${ACCOUNT_KEY}\\\\s*[=:]\\\\s*)(\\\\d{8,12}\\\\b)`,\n ],\n validate: validatePayment,\n jsonKeys: [\n 'iban',\n 'cardNumber',\n 'pan',\n 'cvv',\n 'cvc',\n 'card_number',\n 'creditCard',\n 'cvv2',\n 'accountNumber',\n 'routingNumber',\n 'bic',\n 'swift',\n 'expiryDate',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction validatePhone(match: string): boolean {\n const digits = match.replace(/\\D/g, '');\n const national = digits.startsWith('00') ? digits.slice(2) : digits;\n return national.length >= 7 && national.length <= 15;\n}\n\nconst PHONE_KEY = '(?:telephone|phone|mobile|msisdn|cell|fax|tel)';\n\nexport const phoneNumbersRule: SanitizeRule = {\n id: 'phoneNumbers',\n label: 'Phone numbers',\n description:\n 'Phone numbers become a stable <PHONE:…> token — the same number maps to the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'PHONE',\n patterns: [\n '(?:(?<![A-Za-z0-9])\\\\+[1-9](?:[\\\\s().-]*\\\\d){6,14}(?!\\\\d))',\n '(?:\\\\(\\\\d{3}\\\\)\\\\s?\\\\d{3}-\\\\d{4}(?!\\\\d))',\n '(?:\\\\b\\\\d{3}-\\\\d{3}-\\\\d{4}\\\\b)',\n '(?:\\\\b1-\\\\d{3}-\\\\d{3}-\\\\d{4}\\\\b)',\n '(?:\\\\b0\\\\d{2}-\\\\d{3}-\\\\d{2}-\\\\d{2}\\\\b)',\n '(?:\\\\b0\\\\d{2}\\\\s\\\\d{3}\\\\s\\\\d{2}\\\\s\\\\d{2}\\\\b)',\n '(?:(?<![.\\\\d-])\\\\b00[1-9](?:[\\\\s().-]*\\\\d){7,13}(?!\\\\w)(?!-[\\\\dA-Fa-f]))',\n '(?:\\\\b(?:tel|sms):)(\\\\+?[1-9](?:[\\\\s().-]*\\\\d){6,14})(?!\\\\d)',\n `(?:\\\\b${PHONE_KEY}\\\\s*[=:]\\\\s*)(\\\\+?[0-9](?:[\\\\s().-]*\\\\d){6,14})(?!\\\\d)`,\n ],\n validate: validatePhone,\n jsonKeys: [\n 'phone',\n 'phoneNumber',\n 'phone_number',\n 'mobile',\n 'mobileNumber',\n 'cell',\n 'telephone',\n 'tel',\n 'fax',\n 'msisdn',\n 'contactNumber',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst ENTROPY_THRESHOLD = 3.5;\n\nfunction shannonEntropy(value: string): number {\n const { length } = value;\n\n if (length === 0) {\n return 0;\n }\n\n const freq: Record<string, number> = {};\n\n for (let i = 0; i < length; i += 1) {\n const char = value[i];\n freq[char] = (freq[char] ?? 0) + 1;\n }\n\n return Object.values(freq).reduce((entropy, count) => {\n const p = count / length;\n\n return entropy - p * Math.log2(p);\n }, 0);\n}\n\nfunction isHexBlob(match: string): boolean {\n return match.length >= 32 && /^[A-Fa-f0-9]+$/.test(match);\n}\n\nfunction isBase64Blob(match: string): boolean {\n return match.length >= 40 && /^[A-Za-z0-9+/]+=*$/.test(match);\n}\n\nfunction validateSecret(match: string): boolean {\n if (isHexBlob(match)) {\n return shannonEntropy(match) > ENTROPY_THRESHOLD;\n }\n\n if (isBase64Blob(match)) {\n return (\n shannonEntropy(match) > ENTROPY_THRESHOLD && /[A-Za-z]/.test(match) && /[0-9+/]/.test(match)\n );\n }\n\n return true;\n}\n\nconst CONTEXT_KEYS =\n '(?:api[_-]?key|apikey|access[_-]?token|refresh[_-]?token|id[_-]?token|client[_-]?secret|secret[_-]?key|private[_-]?key|password|passwd|pwd|pass|auth[_-]?token|signing[_-]?key)';\n\nconst CONTEXT_VALUE = '[^\\\\s,;}\"\\']{4,}';\n\nconst CLI_FLAGS = '(?:password|secret|token|api-key|apikey|access-token|client-secret)';\n\nexport const secretsRule: SanitizeRule = {\n id: 'secrets',\n label: 'Tokens & credentials',\n description:\n 'Bearer tokens, JWTs and API keys are redacted outright — they are not meant to be traced.',\n mode: 'mask',\n token: 'SECRET',\n patterns: [\n '(?:(?:Bearer|bearer|BEARER)\\\\s+)([A-Za-z0-9._\\\\-+/=]{8,})',\n '(?:(?:Basic|basic|BASIC)\\\\s+)([A-Za-z0-9+/]{8,}={0,2})',\n '(?:(?<![A-Za-z0-9_-])eyJ[A-Za-z0-9_-]{8,}\\\\.[A-Za-z0-9_-]{8,}(?:\\\\.[A-Za-z0-9_-]{8,})?)',\n '(?:-----BEGIN (?:(?:RSA |EC |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY|CERTIFICATE)-----[A-Za-z0-9+/=\\\\s\\\\\\\\]+?-----END (?:(?:RSA |EC |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY|CERTIFICATE)-----)',\n '(?:\\\\b(?:AKIA|ASIA|ABIA|ACCA)[A-Z0-9]{16}\\\\b)',\n '(?:(?:aws_secret_access_key|AWS_SECRET_ACCESS_KEY)\\\\s*[=:]\\\\s*)([A-Za-z0-9/+=]{30,})',\n '(?:github_pat_[A-Za-z0-9_]{22,})',\n '(?:gh[pousr]_[A-Za-z0-9]{36,})',\n '(?:xox[abprs]-[A-Za-z0-9-]{10,})',\n '(?:hooks\\\\.slack\\\\.com/services/[A-Za-z0-9/_-]{16,})',\n '(?:AIza[A-Za-z0-9_-]{35})',\n '(?:(?:sk_live_|sk_test_|rk_live_|rk_test_)[A-Za-z0-9]{16,})',\n '(?:sk-proj-[A-Za-z0-9_-]{16,})',\n '(?:sk-[A-Za-z0-9]{20,})',\n // Kept as a lookbehind: `.{0,60}` asserts a nearby keyword rather than an adjacent prefix, so\n // one `Twilio` has to stay reusable by every identifier that follows it.\n '(?:(?<=(?:[Tt]wilio.{0,60}|\\\\b(?:[Aa]ccount[Ss]id|[Aa]uth[Tt]oken|[Ss]id)\\\\s*[=:]\\\\s*))(?:AC|SK)[0-9A-Fa-f]{32})',\n '(?:SG\\\\.[A-Za-z0-9_-]{10,}\\\\.[A-Za-z0-9_-]{10,})',\n '(?:npm_[A-Za-z0-9]{36,})',\n '(?:[?&][Ss]ig=)([^&\\\\s\"\\']{16,})',\n '(?:[a-zA-Z][a-zA-Z0-9+.-]*://)([^/@\\\\s:]+:[^/@\\\\s]+@)',\n `(?:--${CLI_FLAGS}(?:\\\\s+|=)\"?)([^\\\\s\"']{4,})`,\n `(?:\\\\b${CONTEXT_KEYS}\"?\\\\s*[=:]\\\\s*\"?)(${CONTEXT_VALUE})`,\n ],\n aggressivePatterns: [\n '(?:(?<![A-Za-z0-9+/])[A-Za-z0-9+/]{40,}={0,2}(?![A-Za-z0-9+/=]))',\n '(?:\\\\b[A-Fa-f0-9]{32,}\\\\b)',\n ],\n validate: validateSecret,\n jsonKeys: [\n 'password',\n 'token',\n 'authorization',\n 'apiKey',\n 'secret',\n 'accessToken',\n 'refreshToken',\n 'passwd',\n 'pwd',\n 'pass',\n 'clientSecret',\n 'privateKey',\n 'secretKey',\n 'apiSecret',\n 'credentials',\n 'auth',\n 'xApiKey',\n 'idToken',\n 'awsSecretAccessKey',\n 'signature',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst COOKIE_VALUE = '[^;\\\\s]{8,}';\n\nexport const sessionCookiesRule: SanitizeRule = {\n id: 'sessionCookies',\n label: 'Session cookies',\n description: 'Session identifiers (sessionid, sid, JSESSIONID, PHPSESSID) are redacted outright.',\n mode: 'mask',\n token: 'SESSION',\n patterns: [\n `(?:(?<![\\\\w-])(?:[Ss]essionid|[Ss]ession_id|sessionId|SESSIONID)=${COOKIE_VALUE})`,\n `(?:(?<![\\\\w-])sid=${COOKIE_VALUE})`,\n `(?:PHPSESSID=${COOKIE_VALUE})`,\n `(?:JSESSIONID=${COOKIE_VALUE})`,\n `(?:ASP\\\\.NET_SessionId=${COOKIE_VALUE})`,\n `(?:ASPSESSIONID[A-Za-z0-9]*=${COOKIE_VALUE})`,\n `(?:connect\\\\.sid=${COOKIE_VALUE})`,\n `(?:laravel_session=${COOKIE_VALUE})`,\n `(?:_session_id=${COOKIE_VALUE})`,\n `(?:(?:csrftoken|csrf_token|XSRF-TOKEN|xsrf-token)=${COOKIE_VALUE})`,\n `(?:remember_token=${COOKIE_VALUE})`,\n `(?:(?:SSESS|SESS)[A-Fa-f0-9]{32}=${COOKIE_VALUE})`,\n `(?:[Ss]et-[Cc]ookie:\\\\s*)([^;=\\\\s]+=${COOKIE_VALUE})`,\n ],\n aggressivePatterns: [\n `(?:(?<![\\\\w-])[\\\\w-]*session[\\\\w-]*=${COOKIE_VALUE})`,\n `(?:(?<![\\\\w-])[\\\\w-]*token=${COOKIE_VALUE})`,\n ],\n jsonKeys: ['sessionId', 'sid', 'cookie', 'cookies', 'setCookie', 'jsessionid', 'csrfToken'],\n};\n","import type { SanitizeRule } from '../../types';\nimport {\n ACCOUNT_SEGMENT,\n BACKSLASH,\n JSON_BACKSLASH,\n NETBIOS_DOMAIN,\n NOT_WINDOWS_FILENAME,\n WELL_KNOWN_DOMAIN,\n} from '../shared/windowsAccounts';\n\nconst EMAIL_LOCAL = '[A-Za-z0-9._%+-]+';\nconst EMAIL_DOMAIN = '[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}';\nconst EMAIL = `(?:\\\\b${EMAIL_LOCAL}@${EMAIL_DOMAIN})`;\nconst EMAIL_IP_LITERAL = `(?:\\\\b${EMAIL_LOCAL}@\\\\[[0-9a-fA-F.:]+\\\\])`;\n\nconst USER_SEG_SIMPLE = ACCOUNT_SEGMENT;\n\nconst NOT_GUID = '(?![0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-)';\nconst ACCOUNT_END = '(?![A-Za-z0-9_$\\\\\\\\/-])';\n\nfunction domainUserPattern(separator: string): string {\n const winDomainExclude = `${WELL_KNOWN_DOMAIN}${separator}`;\n const pathRoot = `(?:\\\\b(?:HKLM|HKCU|HKU|HKCR|HKEY_[A-Z_]+)|\\\\b[A-Za-z]:)${separator}`;\n const notUnderPathRoot = `(?<!${pathRoot}(?:(?! [-/])[^<>'\"\\\\n])*)`;\n const domain = `(?:^|[^\\\\\\\\.-])\\\\b${NETBIOS_DOMAIN}${separator}`;\n\n return `(?:(?:${domain})(?<!${winDomainExclude})${NOT_WINDOWS_FILENAME}${NOT_GUID}(${USER_SEG_SIMPLE})${ACCOUNT_END}${notUnderPathRoot})`;\n}\n\nconst DOMAIN_USER = domainUserPattern(BACKSLASH);\nconst DOMAIN_USER_JSON = domainUserPattern(JSON_BACKSLASH);\n\nconst SID = '(?:\\\\bS-1-(?:\\\\d+-){1,14}\\\\d+\\\\b)';\n\nconst VALUE_WITH_LETTER = '[\\\\w.@+-]*[A-Za-z][\\\\w.@+-]*';\nconst LDAP_DN_SINGLE = `(?:\\\\b(?:uid|sAMAccountName)=)(${VALUE_WITH_LETTER})`;\nconst CN_VALUE = \"(?:[A-Za-z0-9.'-]+(?: [A-Za-z0-9.'-]+){0,3})\";\nconst LDAP_DN_CN = `(?:\\\\bcn=)(${CN_VALUE})`;\n\nconst ARN_USER = '(?::user/)([\\\\w.@+=,-]+)';\nconst ARN_ASSUMED_ROLE_SESSION = '(?::assumed-role/[\\\\w+=,.@-]+/)([\\\\w.@+=,-]+)';\n\nconst K8S_SERVICE_ACCOUNT = '(?:\\\\bsystem:serviceaccount:[A-Za-z0-9-]+:)([A-Za-z0-9-]+)';\n\nconst SSHD_FOR_USER = '(?:(?:\\\\bfor (?:invalid )?user|\\\\b[Ii]nvalid user)\\\\s+)([A-Za-z0-9._-]+)';\nconst SSHD_RUSER = '(?:\\\\bruser=)([A-Za-z0-9._-]+)';\nconst SSHD_LOGNAME = '(?:\\\\blogname=)([A-Za-z0-9._-]+)';\nconst SUDO_USER = '(?:\\\\bsudo:\\\\s+)([A-Za-z0-9._-]+)(?=\\\\s+:)';\n\nconst GENERIC_KEY =\n '(?:user|username|login|account|owner|actor|principal|requester|createdBy|modifiedBy|assignee|operator)';\nconst GENERIC_CTX = `(?:\\\\b${GENERIC_KEY}\\\\s*[=:]\\\\s*)(${VALUE_WITH_LETTER})`;\n\nconst SLACK_USER_ID_AGGRESSIVE = '(?:\\\\bU[A-Z0-9]{8,10}\\\\b)';\n\nconst SYSTEM_ACCOUNTS = new Set([\n 'root',\n 'system',\n 'daemon',\n 'nobody',\n 'www-data',\n 'nginx',\n 'sshd',\n 'syslog',\n]);\n\nfunction isWellKnownWindowsAccount(match: string): boolean {\n const upper = match.toUpperCase();\n\n if (upper === 'SYSTEM' || upper === 'LOCAL' || upper === 'NETWORK' || upper === 'ANONYMOUS') {\n return true;\n }\n\n return match.endsWith('$');\n}\n\nfunction isWellKnownSid(match: string): boolean {\n if (match === 'S-1-1-0') {\n return true;\n }\n\n if (/^S-1-5-(?:18|19|20)$/.test(match)) {\n return true;\n }\n\n return /^S-1-5-32-\\d+$/.test(match);\n}\n\nfunction validateUser(match: string): boolean {\n if (isWellKnownWindowsAccount(match)) {\n return false;\n }\n\n if (isWellKnownSid(match)) {\n return false;\n }\n\n return !SYSTEM_ACCOUNTS.has(match.toLowerCase());\n}\n\nexport const usersRule: SanitizeRule = {\n id: 'users',\n label: 'Usernames & emails',\n description:\n 'Email addresses and account identifiers (DOMAIN\\\\user, SIDs, ARNs, LDAP DNs, sshd/PAM context) become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'USER',\n patterns: [\n EMAIL_IP_LITERAL,\n EMAIL,\n DOMAIN_USER,\n DOMAIN_USER_JSON,\n SID,\n LDAP_DN_SINGLE,\n LDAP_DN_CN,\n ARN_USER,\n ARN_ASSUMED_ROLE_SESSION,\n K8S_SERVICE_ACCOUNT,\n SSHD_FOR_USER,\n SSHD_RUSER,\n SSHD_LOGNAME,\n SUDO_USER,\n GENERIC_CTX,\n ],\n aggressivePatterns: [SLACK_USER_ID_AGGRESSIVE],\n validate: validateUser,\n jsonKeys: [\n 'email',\n 'username',\n 'user',\n 'emailAddress',\n 'mail',\n 'userEmail',\n 'user_name',\n 'login',\n 'account',\n 'samAccountName',\n 'userPrincipalName',\n 'upn',\n 'actor',\n 'principal',\n 'owner',\n 'createdBy',\n 'modifiedBy',\n 'firstName',\n 'lastName',\n 'fullName',\n 'displayName',\n 'givenName',\n 'surname',\n 'userId',\n 'uid',\n ],\n jsonKeyContains: ['owner', 'username'],\n};\n","import type { BuiltinRuleId, SanitizeRule } from '../types';\nimport { geoLocationRule } from './definitions/geoLocation';\nimport { govIdentifiersRule } from './definitions/govIdentifiers';\nimport { healthInfoRule } from './definitions/healthInfo';\nimport { homePathsRule } from './definitions/homePaths';\nimport { hostnamesRule } from './definitions/hostnames';\nimport { ipAddressesRule } from './definitions/ipAddresses';\nimport { paymentInfoRule } from './definitions/paymentInfo';\nimport { phoneNumbersRule } from './definitions/phoneNumbers';\nimport { secretsRule } from './definitions/secrets';\nimport { sessionCookiesRule } from './definitions/sessionCookies';\nimport { usersRule } from './definitions/users';\n\n/**\n * Every rule shipped with this package, in default priority order.\n *\n * Order matters: when two rules could match at the same position, the one listed first wins.\n * Credential-shaped rules come first so a token is not partially consumed by a broader\n * identifier rule.\n */\nexport const builtinRules: readonly SanitizeRule[] = [\n secretsRule,\n sessionCookiesRule,\n paymentInfoRule,\n govIdentifiersRule,\n healthInfoRule,\n phoneNumbersRule,\n ipAddressesRule,\n hostnamesRule,\n usersRule,\n geoLocationRule,\n homePathsRule,\n];\n\n/** Identifiers of {@link builtinRules}, in the same order. */\nexport const builtinRuleIds: readonly BuiltinRuleId[] = builtinRules.map(\n (rule) => rule.id as BuiltinRuleId,\n);\n\nconst builtinsById = new Map<string, SanitizeRule>(builtinRules.map((rule) => [rule.id, rule]));\n\n/**\n * Looks up a built-in rule by identifier.\n *\n * @returns The rule, or `undefined` when the identifier is not built in.\n */\nexport function getBuiltinRule(id: string): SanitizeRule | undefined {\n return builtinsById.get(id);\n}\n","import type { NeverRedactOptions } from '../types';\nimport { InvalidOptionError } from './errors';\n\nexport interface AllowList {\n empty: boolean;\n values: ReadonlySet<string>;\n pattern: RegExp | null;\n byRule: ReadonlyMap<string, ReadonlySet<string>>;\n}\n\nexport function patternSource(pattern: string | RegExp): string {\n return typeof pattern === 'string' ? pattern : pattern.source;\n}\n\nfunction compileAnchored(patterns: readonly (string | RegExp)[]): RegExp | null {\n const sources = patterns.map(patternSource).filter((source) => source.length > 0);\n\n if (sources.length === 0) {\n return null;\n }\n\n const combined = sources.map((source) => `(?:${source})`).join('|');\n\n try {\n return new RegExp(`^(?:${combined})$`, 'u');\n } catch (cause) {\n throw new InvalidOptionError(\n `neverRedact.patterns contains an invalid regular expression: ${String(cause)}`,\n );\n }\n}\n\nexport function createAllowList(options: NeverRedactOptions | undefined): AllowList {\n const values = new Set((options?.values ?? []).filter((value) => value.length > 0));\n const pattern = compileAnchored(options?.patterns ?? []);\n const byRule = new Map<string, Set<string>>();\n\n for (const entry of options?.byRule ?? []) {\n const existing = byRule.get(entry.ruleId) ?? new Set<string>();\n\n for (const value of entry.values) {\n if (value.length > 0) {\n existing.add(value);\n }\n }\n\n byRule.set(entry.ruleId, existing);\n }\n\n return {\n empty: values.size === 0 && pattern === null && byRule.size === 0,\n values,\n pattern,\n byRule,\n };\n}\n\nexport function isAllowed(allow: AllowList, ruleId: string, value: string): boolean {\n if (allow.empty) {\n return false;\n }\n\n if (allow.values.has(value)) {\n return true;\n }\n\n if (allow.byRule.get(ruleId)?.has(value) === true) {\n return true;\n }\n\n return allow.pattern !== null && allow.pattern.test(value);\n}\n","import type { KeyEncoding, SanitizeRule } from '../types';\nimport { MASK_TOKEN_PREFIX } from './constants';\nimport { bytesToHex, createHmacSha256, hexToBytes } from './hmac';\n\nconst TOKEN_HEX_LENGTH = 16;\nconst TOKEN_BYTES = TOKEN_HEX_LENGTH / 2;\n\nconst textEncoder = new TextEncoder();\n\nexport type Pseudonymizer = (ruleId: string, value: string) => string;\n\nexport function createPseudonymizer(key: string, encoding: KeyEncoding): Pseudonymizer {\n const keyBytes = encoding === 'utf8' ? textEncoder.encode(key) : hexToBytes(key);\n const sign = createHmacSha256(keyBytes);\n const cache = new Map<string, string>();\n\n return (ruleId, value) => {\n const cacheKey = `${ruleId}\\u0000${value}`;\n const cached = cache.get(cacheKey);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const digest = sign(textEncoder.encode(cacheKey));\n const token = bytesToHex(digest.subarray(0, TOKEN_BYTES));\n\n cache.set(cacheKey, token);\n return token;\n };\n}\n\nexport function replacementPrefix(rule: SanitizeRule): string {\n if (rule.mode === 'mask') {\n return MASK_TOKEN_PREFIX;\n }\n\n return rule.token ?? rule.id.toUpperCase();\n}\n","export function matchParen(source: string, openIndex: number): number {\n let depth = 0;\n let inClass = false;\n\n for (let index = openIndex; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n\n if (inClass) {\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n continue;\n }\n\n if (char === '(') {\n depth += 1;\n } else if (char === ')') {\n depth -= 1;\n\n if (depth === 0) {\n return index;\n }\n }\n }\n\n return -1;\n}\n\nexport function countCapturingGroups(source: string): number {\n let count = 0;\n let inClass = false;\n\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n\n if (inClass) {\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n continue;\n }\n\n if (char !== '(') {\n continue;\n }\n\n const next = source.slice(index, index + 4);\n\n if (\n next.startsWith('(?:') ||\n next.startsWith('(?=') ||\n next.startsWith('(?!') ||\n next.startsWith('(?<=') ||\n next.startsWith('(?<!')\n ) {\n continue;\n }\n\n count += 1;\n }\n\n return count;\n}\n\nexport function deriveGateSource(source: string): string {\n let output = '';\n let inClass = false;\n\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n output += source.slice(index, index + 2);\n index += 1;\n continue;\n }\n\n if (inClass) {\n output += char;\n\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n output += char;\n continue;\n }\n\n if (char === '(' && source.startsWith('(?<=', index)) {\n const close = matchParen(source, index);\n\n if (close === -1) {\n output += char;\n continue;\n }\n\n output += `(?:${source.slice(index + 4, close)})`;\n index = close;\n continue;\n }\n\n if (\n char === '(' &&\n (source.startsWith('(?<!', index) ||\n source.startsWith('(?=', index) ||\n source.startsWith('(?!', index))\n ) {\n const close = matchParen(source, index);\n\n if (close === -1) {\n output += char;\n continue;\n }\n\n index = close;\n continue;\n }\n\n output += char;\n }\n\n return output;\n}\n\nexport function lineHasAnyChar(line: string, chars: string): boolean {\n for (let index = 0; index < line.length; index += 1) {\n if (chars.includes(line[index]!)) {\n return true;\n }\n }\n\n return false;\n}\n","import type { SanitizeRule } from '../types';\nimport type { AllowList } from './allowlist';\nimport { InvalidRuleError } from './errors';\nimport { replacementPrefix, type Pseudonymizer } from './pseudonymize';\nimport { countCapturingGroups, deriveGateSource } from './regexSource';\n\nexport interface CompiledFragment {\n regex: RegExp;\n hasValueGroup: boolean;\n}\n\nexport interface CompiledRule {\n id: string;\n fragments: CompiledFragment[];\n gate: RegExp | null;\n gateChars: string | null;\n}\n\nexport interface RuleContext {\n compiled: CompiledRule[];\n rules: SanitizeRule[];\n ruleIds: string[];\n rulesById: Map<string, SanitizeRule>;\n prefixById: Map<string, string>;\n pseudonymize: Pseudonymizer;\n allow: AllowList;\n contextChars: number;\n json: boolean;\n}\n\nconst SKIP_REGEX_GATE = new Set(['ips', 'hosts']);\n\nfunction gateCharsFor(ruleId: string, aggressive: boolean): string | null {\n if (ruleId === 'phoneNumbers') {\n return '0123456789';\n }\n\n if (ruleId === 'paymentInfo' && !aggressive) {\n return '0123456789';\n }\n\n return null;\n}\n\nfunction compileOne(rule: SanitizeRule, aggressive: boolean): CompiledRule | null {\n const patterns = aggressive\n ? [...rule.patterns, ...(rule.aggressivePatterns ?? [])]\n : rule.patterns;\n\n if (patterns.length === 0) {\n return null;\n }\n\n const source = patterns.join('|');\n const fragments: CompiledFragment[] = [];\n\n for (const pattern of patterns) {\n try {\n fragments.push({\n regex: new RegExp(pattern, 'gu'),\n hasValueGroup: countCapturingGroups(pattern) === 1,\n });\n } catch (cause) {\n throw new InvalidRuleError(`Failed to compile rule \"${rule.id}\": ${String(cause)}`);\n }\n }\n\n const gateSource = patterns.map(deriveGateSource).join('|');\n let gate: RegExp | null = null;\n\n if (!SKIP_REGEX_GATE.has(rule.id) && gateSource.length > 0 && gateSource !== source) {\n try {\n gate = new RegExp(gateSource, 'gu');\n } catch {\n gate = null;\n }\n }\n\n return {\n id: rule.id,\n fragments,\n gate,\n gateChars: gateCharsFor(rule.id, aggressive),\n };\n}\n\nexport function compileRules(rules: SanitizeRule[], aggressive: boolean): CompiledRule[] {\n const compiled: CompiledRule[] = [];\n\n for (const rule of rules) {\n const one = compileOne(rule, aggressive);\n\n if (one) {\n compiled.push(one);\n }\n }\n\n return compiled;\n}\n\nexport interface RuleContextInput {\n rules: SanitizeRule[];\n aggressive: boolean;\n pseudonymize: Pseudonymizer;\n allow: AllowList;\n contextChars: number;\n json: boolean;\n}\n\nexport function createRuleContext(input: RuleContextInput): RuleContext {\n const { rules } = input;\n\n return {\n compiled: compileRules(rules, input.aggressive),\n rules,\n ruleIds: rules.map((rule) => rule.id),\n rulesById: new Map(rules.map((rule) => [rule.id, rule])),\n prefixById: new Map(rules.map((rule) => [rule.id, replacementPrefix(rule)])),\n pseudonymize: input.pseudonymize,\n allow: input.allow,\n contextChars: input.contextChars,\n json: input.json,\n };\n}\n\nexport function buildReplacement(ctx: RuleContext, ruleId: string, value: string): string {\n return `<${ctx.prefixById.get(ruleId) ?? ruleId.toUpperCase()}:${ctx.pseudonymize(ruleId, value)}>`;\n}\n","import type { LineOptions } from '../types';\nimport { DEFAULT_LINE_OVERLAP_CHARS, DEFAULT_MAX_LINE_CHARS } from './constants';\nimport { InvalidOptionError } from './errors';\n\nexport interface LineSplitter {\n push(chunk: string): string[];\n flush(): string[];\n}\n\nfunction extractLines(buffer: string): { lines: string[]; rest: string } {\n const lines: string[] = [];\n let start = 0;\n\n for (let i = 0; i < buffer.length; i += 1) {\n if (buffer[i] === '\\n') {\n lines.push(buffer.slice(start, i + 1));\n start = i + 1;\n }\n }\n\n return { lines, rest: buffer.slice(start) };\n}\n\nexport function createLineSplitter(options: LineOptions = {}): LineSplitter {\n const maxLineChars = options.maxLineChars ?? DEFAULT_MAX_LINE_CHARS;\n const overlapChars = options.overlapChars ?? DEFAULT_LINE_OVERLAP_CHARS;\n\n if (maxLineChars < 1) {\n throw new InvalidOptionError('lines.maxLineChars must be at least 1.');\n }\n\n if (overlapChars < 0 || overlapChars >= maxLineChars) {\n throw new InvalidOptionError(\n `lines.overlapChars must be between 0 and lines.maxLineChars - 1 (${maxLineChars - 1}), got ${overlapChars}.`,\n );\n }\n\n let carry = '';\n\n function push(chunk: string): string[] {\n carry += chunk;\n\n const { lines, rest } = extractLines(carry);\n carry = rest;\n\n while (carry.length > maxLineChars) {\n const cut = carry.length - overlapChars;\n lines.push(carry.slice(0, cut));\n carry = carry.slice(cut);\n }\n\n return lines;\n }\n\n function flush(): string[] {\n if (carry.length === 0) {\n return [];\n }\n\n const rest = carry;\n carry = '';\n return [rest];\n }\n\n return { push, flush };\n}\n","import type { SanitizeSegment } from '../types';\nimport { isAllowed } from './allowlist';\nimport { buildReplacement, type CompiledRule, type RuleContext } from './compile';\nimport { lineHasAnyChar } from './regexSource';\n\nexport interface RedactMatch {\n ruleId: string;\n original: string;\n replacement: string;\n index: number;\n contextBefore?: string;\n contextAfter?: string;\n}\n\nexport interface RedactResult {\n output: string;\n counts: Record<string, number>;\n matches: RedactMatch[];\n segments?: {\n before: SanitizeSegment[];\n after: SanitizeSegment[];\n };\n}\n\nexport interface RedactOptions {\n withSegments?: boolean;\n withMatches?: boolean;\n}\n\nexport function sliceContext(\n text: string,\n index: number,\n length: number,\n chars: number,\n): { contextBefore: string; contextAfter: string } {\n return {\n contextBefore: text.slice(Math.max(0, index - chars), index),\n contextAfter: text.slice(index + length, index + length + chars),\n };\n}\n\n/**\n * One live match per pattern fragment. Fragments are scanned separately rather than as a single\n * alternation, so that a fragment whose consumed prefix begins earlier cannot pre-empt a\n * higher-priority fragment that matches the same value offset.\n */\ninterface FragmentCursor {\n ruleIndex: number;\n fragmentIndex: number;\n ruleId: string;\n regex: RegExp;\n hasValueGroup: boolean;\n active: boolean;\n start: number;\n original: string;\n}\n\n/** Moves a cursor to its next match whose value starts at or after `minStart`. */\nfunction advance(cursor: FragmentCursor, line: string, minStart: number): void {\n const { regex } = cursor;\n\n for (;;) {\n // Never scan past the floor: a fragment that overshot it would hide a shorter match starting\n // inside the text its own previous match covered.\n if (regex.lastIndex > minStart) {\n regex.lastIndex = minStart;\n }\n\n const match = regex.exec(line);\n\n if (match === null) {\n cursor.active = false;\n return;\n }\n\n const original = (cursor.hasValueGroup ? match[1] : undefined) ?? match[0];\n const start = match.index + match[0].length - original.length;\n\n if (match[0].length === 0) {\n regex.lastIndex += 1;\n } else if (start > match.index) {\n // Resume at the value rather than past it: a consumed prefix has to stay available to the\n // next occurrence, the way a lookbehind can re-read text the scan already passed.\n regex.lastIndex = start;\n }\n\n if (start >= minStart) {\n cursor.active = true;\n cursor.start = start;\n cursor.original = original;\n return;\n }\n }\n}\n\nfunction openCursors(line: string, compiled: CompiledRule[]): FragmentCursor[] {\n const cursors: FragmentCursor[] = [];\n\n for (let ruleIndex = 0; ruleIndex < compiled.length; ruleIndex += 1) {\n const rule = compiled[ruleIndex]!;\n\n if (rule.gateChars !== null && !lineHasAnyChar(line, rule.gateChars)) {\n continue;\n }\n\n if (rule.gate !== null) {\n rule.gate.lastIndex = 0;\n\n if (!rule.gate.test(line)) {\n continue;\n }\n }\n\n for (let fragmentIndex = 0; fragmentIndex < rule.fragments.length; fragmentIndex += 1) {\n const fragment = rule.fragments[fragmentIndex]!;\n fragment.regex.lastIndex = 0;\n\n const cursor: FragmentCursor = {\n ruleIndex,\n fragmentIndex,\n ruleId: rule.id,\n regex: fragment.regex,\n hasValueGroup: fragment.hasValueGroup,\n active: false,\n start: 0,\n original: '',\n };\n\n advance(cursor, line, 0);\n\n if (cursor.active) {\n cursors.push(cursor);\n }\n }\n }\n\n return cursors;\n}\n\n/** Leftmost value wins; ties go to the earlier rule, then the earlier pattern fragment. */\nfunction pickNext(cursors: FragmentCursor[]): FragmentCursor | null {\n let best: FragmentCursor | null = null;\n\n for (const cursor of cursors) {\n if (!cursor.active) {\n continue;\n }\n\n if (\n best === null ||\n cursor.start < best.start ||\n (cursor.start === best.start &&\n (cursor.ruleIndex < best.ruleIndex ||\n (cursor.ruleIndex === best.ruleIndex && cursor.fragmentIndex < best.fragmentIndex)))\n ) {\n best = cursor;\n }\n }\n\n return best;\n}\n\nexport function redactLine(\n line: string,\n ctx: RuleContext,\n options: RedactOptions = {},\n): RedactResult {\n const { compiled, rulesById, allow, contextChars } = ctx;\n const withSegments = options.withSegments ?? false;\n const withMatches = options.withMatches ?? false;\n\n if (compiled.length === 0) {\n return {\n output: line,\n counts: {},\n matches: [],\n segments: withSegments\n ? { before: [{ text: line, changed: false }], after: [{ text: line, changed: false }] }\n : undefined,\n };\n }\n\n const cursors = openCursors(line, compiled);\n const counts: Record<string, number> = {};\n const matches: RedactMatch[] = [];\n const before: SanitizeSegment[] = [];\n const after: SanitizeSegment[] = [];\n let output = '';\n let cursor = 0;\n\n for (;;) {\n const next = pickNext(cursors);\n\n if (next === null) {\n break;\n }\n\n const { start, original, ruleId } = next;\n // A rejected candidate still occupies its span, so a lower-priority match inside it is not\n // retried. Empty values advance by one so the walk always makes progress.\n const spanEnd = start + Math.max(original.length, 1);\n const rule = rulesById.get(ruleId);\n const accepted =\n rule !== undefined &&\n !(rule.validate !== undefined && !rule.validate(original)) &&\n !isAllowed(allow, rule.id, original);\n\n if (accepted) {\n const replacement = buildReplacement(ctx, rule.id, original);\n\n if (withSegments) {\n if (start > cursor) {\n const gap = line.slice(cursor, start);\n before.push({ text: gap, changed: false });\n after.push({ text: gap, changed: false });\n }\n\n before.push({ text: original, changed: true });\n after.push({ text: replacement, changed: true });\n }\n\n output += line.slice(cursor, start) + replacement;\n cursor = start + original.length;\n counts[rule.id] = (counts[rule.id] ?? 0) + 1;\n\n if (withMatches) {\n matches.push({\n ruleId: rule.id,\n original,\n replacement,\n index: start,\n ...(contextChars > 0 ? sliceContext(line, start, original.length, contextChars) : {}),\n });\n }\n }\n\n for (const candidate of cursors) {\n if (candidate.active && candidate.start < spanEnd) {\n advance(candidate, line, spanEnd);\n }\n }\n }\n\n output += line.slice(cursor);\n\n if (withSegments && cursor < line.length) {\n const tail = line.slice(cursor);\n before.push({ text: tail, changed: false });\n after.push({ text: tail, changed: false });\n }\n\n return {\n output,\n counts,\n matches,\n segments: withSegments ? { before, after } : undefined,\n };\n}\n","import type { SanitizeRule, SanitizeSegment } from '../types';\nimport { isAllowed } from './allowlist';\nimport { buildReplacement, type RuleContext } from './compile';\nimport {\n redactLine,\n sliceContext,\n type RedactMatch,\n type RedactOptions,\n type RedactResult,\n} from './redactLine';\n\nconst REPLACEMENT_TOKEN_RE = /<[A-Z][A-Z0-9]*:[0-9a-f]+>/g;\n\nexport function looksLikeJson(line: string): boolean {\n const trimmed = line.trim();\n return trimmed.length > 0 && (trimmed.startsWith('{') || trimmed.startsWith('['));\n}\n\nfunction normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[-_]/g, '');\n}\n\nfunction shouldPreserveJsonValue(value: string): boolean {\n return value.length === 0 || value === '-';\n}\n\ninterface JsonKeyMatcher {\n exact: Map<string, SanitizeRule>;\n contains: Array<{ fragment: string; rule: SanitizeRule }>;\n}\n\nfunction buildJsonKeyMatcher(rules: SanitizeRule[]): JsonKeyMatcher {\n const exact = new Map<string, SanitizeRule>();\n const contains: Array<{ fragment: string; rule: SanitizeRule }> = [];\n\n for (const rule of rules) {\n for (const key of rule.jsonKeys ?? []) {\n const normalized = normalizeKey(key);\n\n if (!exact.has(normalized)) {\n exact.set(normalized, rule);\n }\n }\n\n for (const fragment of rule.jsonKeyContains ?? []) {\n contains.push({ fragment: normalizeKey(fragment), rule });\n }\n }\n\n return { exact, contains };\n}\n\nfunction resolveJsonKeyRule(matcher: JsonKeyMatcher, key: string): SanitizeRule | undefined {\n const normalized = normalizeKey(key);\n const exact = matcher.exact.get(normalized);\n\n if (exact) {\n return exact;\n }\n\n for (const entry of matcher.contains) {\n if (normalized.includes(entry.fragment)) {\n return entry.rule;\n }\n }\n\n return undefined;\n}\n\nconst jsonKeyMatcherCache = new WeakMap<SanitizeRule[], JsonKeyMatcher>();\n\nfunction jsonKeyMatcher(rules: SanitizeRule[]): JsonKeyMatcher {\n const cached = jsonKeyMatcherCache.get(rules);\n\n if (cached) {\n return cached;\n }\n\n const matcher = buildJsonKeyMatcher(rules);\n jsonKeyMatcherCache.set(rules, matcher);\n return matcher;\n}\n\nfunction mergeCounts(target: Record<string, number>, source: Record<string, number>): void {\n for (const [id, count] of Object.entries(source)) {\n target[id] = (target[id] ?? 0) + count;\n }\n}\n\nfunction highlightReplacements(text: string): SanitizeSegment[] {\n const segments: SanitizeSegment[] = [];\n let cursor = 0;\n\n REPLACEMENT_TOKEN_RE.lastIndex = 0;\n let match = REPLACEMENT_TOKEN_RE.exec(text);\n\n while (match !== null) {\n if (match.index > cursor) {\n segments.push({ text: text.slice(cursor, match.index), changed: false });\n }\n\n segments.push({ text: match[0], changed: true });\n cursor = match.index + match[0].length;\n match = REPLACEMENT_TOKEN_RE.exec(text);\n }\n\n if (cursor < text.length) {\n segments.push({ text: text.slice(cursor), changed: false });\n }\n\n return segments.length > 0 ? segments : [{ text, changed: false }];\n}\n\ninterface PreviewOriginal {\n value: string;\n wholeValue: boolean;\n}\n\nfunction jsonStringContent(value: string): string {\n return JSON.stringify(value).slice(1, -1);\n}\n\nfunction findOriginal(\n text: string,\n original: PreviewOriginal,\n from: number,\n): { index: number; length: number } | null {\n const encoded = jsonStringContent(original.value);\n\n if (original.wholeValue) {\n const quoted = `\"${encoded}\"`;\n const quotedIndex = text.indexOf(quoted, from);\n\n if (quotedIndex !== -1) {\n return { index: quotedIndex + 1, length: encoded.length };\n }\n }\n\n const needles = encoded === original.value ? [encoded] : [encoded, original.value];\n\n for (const needle of needles) {\n const index = text.indexOf(needle, from);\n\n if (index !== -1) {\n return { index, length: needle.length };\n }\n }\n\n return null;\n}\n\nfunction highlightOriginals(text: string, originals: PreviewOriginal[]): SanitizeSegment[] {\n if (originals.length === 0) {\n return [{ text, changed: false }];\n }\n\n const segments: SanitizeSegment[] = [];\n let cursor = 0;\n\n for (const original of originals) {\n if (original.value.length === 0) {\n continue;\n }\n\n const found = findOriginal(text, original, cursor);\n\n if (found === null) {\n continue;\n }\n\n if (found.index > cursor) {\n segments.push({ text: text.slice(cursor, found.index), changed: false });\n }\n\n segments.push({\n text: text.slice(found.index, found.index + found.length),\n changed: true,\n });\n cursor = found.index + found.length;\n }\n\n if (cursor < text.length) {\n segments.push({ text: text.slice(cursor), changed: false });\n }\n\n return segments.length > 0 ? segments : [{ text, changed: false }];\n}\n\nexport function redactJsonLine(\n line: string,\n ctx: RuleContext,\n options: RedactOptions = {},\n): RedactResult | null {\n const terminatorMatch = /(\\r\\n|\\r|\\n)$/.exec(line);\n const terminator = terminatorMatch ? terminatorMatch[0] : '';\n const content = terminator ? line.slice(0, -terminator.length) : line;\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(content);\n } catch {\n return null;\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n return null;\n }\n\n const withSegments = options.withSegments ?? false;\n const withMatches = options.withMatches ?? false;\n const collectOriginals = withMatches || withSegments;\n const keyMatcher = jsonKeyMatcher(ctx.rules);\n const counts: Record<string, number> = {};\n const matches: RedactMatch[] = [];\n const originals: PreviewOriginal[] = [];\n\n const contextFor = (value: string): Partial<RedactMatch> => {\n if (ctx.contextChars <= 0) {\n return {};\n }\n\n const encoded = jsonStringContent(value);\n const encodedIndex = content.indexOf(encoded);\n\n if (encodedIndex >= 0) {\n return sliceContext(content, encodedIndex, encoded.length, ctx.contextChars);\n }\n\n if (encoded !== value) {\n const rawIndex = content.indexOf(value);\n\n if (rawIndex >= 0) {\n return sliceContext(content, rawIndex, value.length, ctx.contextChars);\n }\n }\n\n return { contextBefore: '', contextAfter: '' };\n };\n\n const redactValue = (value: unknown, key?: string): unknown => {\n if (typeof value === 'string') {\n if (key !== undefined && shouldPreserveJsonValue(value)) {\n return value;\n }\n\n const fieldRule = key === undefined ? undefined : resolveJsonKeyRule(keyMatcher, key);\n\n if (fieldRule) {\n if (isAllowed(ctx.allow, fieldRule.id, value)) {\n return value;\n }\n\n const replacement = buildReplacement(ctx, fieldRule.id, value);\n counts[fieldRule.id] = (counts[fieldRule.id] ?? 0) + 1;\n\n if (withSegments) {\n originals.push({ value, wholeValue: true });\n }\n\n if (withMatches) {\n matches.push({\n ruleId: fieldRule.id,\n original: value,\n replacement,\n index: Math.max(content.indexOf(jsonStringContent(value)), 0),\n ...contextFor(value),\n });\n }\n\n return replacement;\n }\n\n const result = redactLine(value, ctx, { withMatches: collectOriginals });\n mergeCounts(counts, result.counts);\n\n if (collectOriginals) {\n for (const match of result.matches) {\n if (withSegments) {\n originals.push({ value: match.original, wholeValue: false });\n }\n\n if (withMatches) {\n matches.push({ ...match, ...contextFor(match.original) });\n }\n }\n }\n\n return result.output;\n }\n\n if (Array.isArray(value)) {\n return value.map((item: unknown) => redactValue(item));\n }\n\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n\n for (const [entryKey, entryValue] of Object.entries(value)) {\n out[entryKey] = redactValue(entryValue, entryKey);\n }\n\n return out;\n }\n\n return value;\n };\n\n const output = JSON.stringify(redactValue(parsed)) + terminator;\n\n if (!withSegments) {\n return { output, counts, matches };\n }\n\n return {\n output,\n counts,\n matches,\n segments: {\n before: highlightOriginals(line, originals),\n after: highlightReplacements(output),\n },\n };\n}\n","import type { RuleCounts, SanitizeReplacement, SanitizeReport, SanitizeSegment } from '../types';\nimport { DEFAULT_PREVIEW_BYTES } from './constants';\nimport { InvalidOptionError } from './errors';\nimport type { RedactResult } from './redactLine';\n\nexport interface ReportCollectorOptions {\n previewBytes?: number;\n replacements?: boolean;\n maxReplacementsPerRule?: number;\n}\n\nexport interface ReportSnapshotOptions {\n includeReplacements?: boolean;\n}\n\nexport interface ReportCollector {\n needsSegments(): boolean;\n needsMatches(): boolean;\n record(result: RedactResult): void;\n build(options?: ReportSnapshotOptions): SanitizeReport;\n}\n\nexport function createReportCollector(options: ReportCollectorOptions = {}): ReportCollector {\n const previewBytes = options.previewBytes ?? DEFAULT_PREVIEW_BYTES;\n const collectReplacements = options.replacements ?? true;\n const maxPerRule = options.maxReplacementsPerRule;\n const limited = maxPerRule !== undefined;\n\n if (previewBytes < 0) {\n throw new InvalidOptionError('report.previewBytes must not be negative.');\n }\n\n if (limited && (maxPerRule < 0 || !Number.isInteger(maxPerRule))) {\n throw new InvalidOptionError('report.maxReplacementsPerRule must be a non-negative integer.');\n }\n\n const counts: Record<string, number> = {};\n const replacements = new Map<string, SanitizeReplacement>();\n const perRuleDistinct = limited ? new Map<string, number>() : null;\n const before: SanitizeSegment[] = [];\n const after: SanitizeSegment[] = [];\n let lineCount = 0;\n let previewBytesUsed = 0;\n let previewClosed = previewBytes === 0;\n let truncated = false;\n\n function needsSegments(): boolean {\n return !previewClosed;\n }\n\n function needsMatches(): boolean {\n return collectReplacements;\n }\n\n function record(result: RedactResult): void {\n lineCount += 1;\n\n for (const [id, count] of Object.entries(result.counts)) {\n counts[id] = (counts[id] ?? 0) + count;\n }\n\n if (collectReplacements) {\n for (const match of result.matches) {\n const key = `${match.ruleId}\\u0000${match.original}`;\n const existing = replacements.get(key);\n\n if (existing) {\n existing.count += 1;\n continue;\n }\n\n if (perRuleDistinct) {\n const n = perRuleDistinct.get(match.ruleId) ?? 0;\n\n if (n >= maxPerRule!) {\n truncated = true;\n continue;\n }\n\n perRuleDistinct.set(match.ruleId, n + 1);\n }\n\n replacements.set(key, {\n ruleId: match.ruleId,\n original: match.original,\n replacement: match.replacement,\n count: 1,\n ...(match.contextBefore !== undefined\n ? { contextBefore: match.contextBefore, contextAfter: match.contextAfter }\n : {}),\n });\n }\n }\n\n if (previewClosed) {\n return;\n }\n\n if (result.segments) {\n before.push(...result.segments.before);\n after.push(...result.segments.after);\n }\n\n previewBytesUsed += result.output.length;\n\n if (previewBytesUsed >= previewBytes) {\n previewClosed = true;\n }\n }\n\n function build(snapshot?: ReportSnapshotOptions): SanitizeReport {\n const includeReplacements = snapshot?.includeReplacements ?? true;\n let totalMatches = 0;\n\n for (const count of Object.values(counts)) {\n totalMatches += count;\n }\n\n return {\n counts: { ...counts } as RuleCounts,\n totalMatches,\n lineCount,\n replacements: includeReplacements ? [...replacements.values()] : [],\n preview: { before: [...before], after: [...after] },\n ...(truncated && includeReplacements ? { replacementsTruncated: true } : {}),\n };\n }\n\n return { needsSegments, needsMatches, record, build };\n}\n","import { InvalidRuleError } from '../core/errors';\nimport { countCapturingGroups } from '../core/regexSource';\nimport type { SanitizeRule } from '../types';\n\nconst RULE_ID_PATTERN = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\nconst TOKEN_PATTERN = /^[A-Z][A-Z0-9]*$/;\nconst NAMED_GROUP_PATTERN = /\\(\\?<[^=!]/;\n\nfunction requireText(value: unknown, rule: string, field: string): string {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new InvalidRuleError(`Rule \"${rule}\": \\`${field}\\` must be a non-empty string.`);\n }\n\n return value;\n}\n\nfunction assertPatterns(patterns: unknown, ruleId: string, field: string): string[] {\n if (patterns === undefined) {\n return [];\n }\n\n if (!Array.isArray(patterns)) {\n throw new InvalidRuleError(`Rule \"${ruleId}\": \\`${field}\\` must be an array of strings.`);\n }\n\n return patterns.map((pattern: unknown, index) => {\n if (typeof pattern !== 'string' || pattern.length === 0) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must be a non-empty regular expression source.`,\n );\n }\n\n if (NAMED_GROUP_PATTERN.test(pattern)) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must not declare a named capture group.`,\n );\n }\n\n try {\n new RegExp(pattern, 'u');\n } catch (cause) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` is not a valid Unicode regular expression: ${String(cause)}`,\n );\n }\n\n if (countCapturingGroups(pattern) > 1) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must contain at most one capturing group, which marks the value to replace.`,\n );\n }\n\n return pattern;\n });\n}\n\nexport function validateRule(rule: SanitizeRule): SanitizeRule {\n if (typeof rule !== 'object' || rule === null) {\n throw new InvalidRuleError('A rule must be an object.');\n }\n\n const id = requireText(rule.id, String(rule.id), 'id');\n\n if (!RULE_ID_PATTERN.test(id)) {\n throw new InvalidRuleError(\n `Rule \"${id}\": \\`id\\` must be a valid ASCII identifier matching ${RULE_ID_PATTERN.source}.`,\n );\n }\n\n requireText(rule.label, id, 'label');\n requireText(rule.description, id, 'description');\n\n if (rule.mode !== 'pseudo' && rule.mode !== 'mask') {\n throw new InvalidRuleError(`Rule \"${id}\": \\`mode\\` must be either \"pseudo\" or \"mask\".`);\n }\n\n if (rule.token !== undefined && !TOKEN_PATTERN.test(rule.token)) {\n throw new InvalidRuleError(\n `Rule \"${id}\": \\`token\\` must match ${TOKEN_PATTERN.source}, so replacement tokens stay recognizable.`,\n );\n }\n\n const patterns = assertPatterns(rule.patterns, id, 'patterns');\n const aggressivePatterns = assertPatterns(rule.aggressivePatterns, id, 'aggressivePatterns');\n\n if (patterns.length === 0 && aggressivePatterns.length === 0) {\n throw new InvalidRuleError(`Rule \"${id}\": at least one pattern is required.`);\n }\n\n if (rule.jsonKeys !== undefined) {\n if (!Array.isArray(rule.jsonKeys)) {\n throw new InvalidRuleError(`Rule \"${id}\": \\`jsonKeys\\` must be an array of strings.`);\n }\n\n for (const [index, key] of rule.jsonKeys.entries()) {\n requireText(key, id, `jsonKeys[${index}]`);\n }\n }\n\n if (rule.jsonKeyContains !== undefined) {\n if (!Array.isArray(rule.jsonKeyContains)) {\n throw new InvalidRuleError(`Rule \"${id}\": \\`jsonKeyContains\\` must be an array of strings.`);\n }\n\n for (const [index, fragment] of rule.jsonKeyContains.entries()) {\n requireText(fragment, id, `jsonKeyContains[${index}]`);\n }\n }\n\n if (rule.validate !== undefined && typeof rule.validate !== 'function') {\n throw new InvalidRuleError(`Rule \"${id}\": \\`validate\\` must be a function.`);\n }\n\n return rule;\n}\n","import { getBuiltinRule } from '../rules/registry';\nimport { validateRule } from '../rules/validateRule';\nimport type { RuleSelector, SanitizeRule } from '../types';\nimport { UnknownRuleError } from './errors';\n\nfunction toRule(selector: RuleSelector): SanitizeRule {\n if (typeof selector === 'string') {\n const builtin = getBuiltinRule(selector);\n\n if (!builtin) {\n throw new UnknownRuleError(\n `Unknown rule \"${selector}\". Pass a rule object for custom rules, or one of the built-in identifiers.`,\n );\n }\n\n return builtin;\n }\n\n return validateRule(selector);\n}\n\nexport function resolveRules(\n selectors: readonly RuleSelector[],\n extraRules: readonly SanitizeRule[] = [],\n): SanitizeRule[] {\n const resolved: SanitizeRule[] = [];\n const positions = new Map<string, number>();\n\n for (const selector of [...selectors, ...extraRules]) {\n const rule = toRule(selector);\n const existing = positions.get(rule.id);\n\n if (existing === undefined) {\n positions.set(rule.id, resolved.length);\n resolved.push(rule);\n } else {\n resolved[existing] = rule;\n }\n }\n\n return resolved;\n}\n","import { createAlwaysRedactRule } from '../rules/alwaysRedact';\nimport { builtinRuleIds } from '../rules/registry';\nimport type {\n RuleInfo,\n Sanitizer,\n SanitizerOptions,\n SanitizeReport,\n SanitizeRule,\n SanitizeStreamOptions,\n SanitizeTextResult,\n TextSink,\n TextSource,\n} from '../types';\nimport { createAllowList } from './allowlist';\nimport { createRuleContext, type RuleContext } from './compile';\nimport { InvalidOptionError, SanitizationAbortedError } from './errors';\nimport { assertKey, generateKey } from './key';\nimport { createLineSplitter } from './lineSplitter';\nimport { createPseudonymizer } from './pseudonymize';\nimport { looksLikeJson, redactJsonLine } from './redactJsonLine';\nimport { redactLine } from './redactLine';\nimport { createReportCollector, type ReportCollector } from './report';\nimport { resolveRules } from './resolveRules';\n\nasync function* toAsyncIterable(source: TextSource): AsyncIterable<string> {\n yield* source as AsyncIterable<string>;\n}\n\nfunction processLine(line: string, ctx: RuleContext, collector: ReportCollector): string {\n const options = {\n withSegments: collector.needsSegments(),\n withMatches: collector.needsMatches(),\n };\n\n const parsed = ctx.json && looksLikeJson(line) ? redactJsonLine(line, ctx, options) : null;\n const result = parsed ?? redactLine(line, ctx, options);\n\n collector.record(result);\n return result.output;\n}\n\nexport function createSanitizer(options: SanitizerOptions = {}): Sanitizer {\n const keyEncoding = options.keyEncoding ?? 'hex';\n const key = options.key ?? generateKey();\n assertKey(key, keyEncoding);\n\n const contextChars = options.report?.contextChars ?? 0;\n\n if (contextChars < 0) {\n throw new InvalidOptionError('report.contextChars must not be negative.');\n }\n\n const selected = resolveWithAlwaysRedact(options);\n\n const ctx = createRuleContext({\n rules: selected,\n aggressive: options.aggressive ?? false,\n pseudonymize: createPseudonymizer(key, keyEncoding),\n allow: createAllowList(options.neverRedact),\n contextChars,\n json: options.json !== false,\n });\n\n const collectorOptions = {\n previewBytes: options.report?.previewBytes,\n replacements: options.report?.replacements,\n maxReplacementsPerRule: options.report?.maxReplacementsPerRule,\n };\n\n const rules: readonly RuleInfo[] = selected.map((rule) => ({\n id: rule.id,\n label: rule.label,\n description: rule.description,\n mode: rule.mode,\n }));\n\n function sanitizeText(text: string): SanitizeTextResult {\n const collector = createReportCollector(collectorOptions);\n const splitter = createLineSplitter(options.lines);\n let output = '';\n\n for (const line of splitter.push(text)) {\n output += processLine(line, ctx, collector);\n }\n\n for (const line of splitter.flush()) {\n output += processLine(line, ctx, collector);\n }\n\n return { output, report: collector.build() };\n }\n\n async function sanitizeStream(\n source: TextSource,\n sink: TextSink,\n streamOptions: SanitizeStreamOptions = {},\n ): Promise<SanitizeReport> {\n const collector = createReportCollector({\n ...collectorOptions,\n ...(streamOptions.previewBytes !== undefined\n ? { previewBytes: streamOptions.previewBytes }\n : {}),\n });\n const splitter = createLineSplitter(options.lines);\n const { signal, onProgress } = streamOptions;\n let charsRead = 0;\n\n const writeLine = async (line: string): Promise<void> => {\n if (signal?.aborted === true) {\n throw new SanitizationAbortedError();\n }\n\n await sink.write(processLine(line, ctx, collector));\n };\n\n for await (const chunk of toAsyncIterable(source)) {\n charsRead += chunk.length;\n\n for (const line of splitter.push(chunk)) {\n await writeLine(line);\n }\n\n onProgress?.({ charsRead, report: collector.build({ includeReplacements: false }) });\n }\n\n for (const line of splitter.flush()) {\n await writeLine(line);\n }\n\n await sink.close?.();\n\n return collector.build();\n }\n\n return { key, rules, sanitizeText, sanitizeStream };\n}\n\nfunction resolveWithAlwaysRedact(options: SanitizerOptions): SanitizeRule[] {\n const selected = resolveRules(options.rules ?? builtinRuleIds, options.extraRules);\n const alwaysRule = createAlwaysRedactRule(options.alwaysRedact);\n\n if (!alwaysRule) {\n return selected;\n }\n\n if (selected.some((rule) => rule.id === alwaysRule.id)) {\n throw new InvalidOptionError(\n `alwaysRedact.ruleId \"${alwaysRule.id}\" collides with an active rule. Choose an identifier that is not in use.`,\n );\n }\n\n return [alwaysRule, ...selected];\n}\n\n/**\n * Sanitizes a string with a one-off configuration.\n *\n * Convenient for scripts and tests. Each call builds a new sanitizer, so unless `options.key` is\n * supplied the tokens are not comparable between calls. For repeated use, create a sanitizer with\n * {@link createSanitizer} instead.\n */\nexport function sanitizeText(text: string, options?: SanitizerOptions): SanitizeTextResult {\n return createSanitizer(options).sanitizeText(text);\n}\n\nexport function sanitizeStream(\n source: TextSource,\n sink: TextSink,\n options?: SanitizerOptions & SanitizeStreamOptions,\n): Promise<SanitizeReport> {\n const { onProgress, signal, previewBytes, ...sanitizerOptions } = options ?? {};\n\n return createSanitizer(sanitizerOptions).sanitizeStream(source, sink, {\n onProgress,\n signal,\n previewBytes,\n });\n}\n","import type { TextSink } from '../types';\n\n/** A sink that accumulates everything in memory. */\nexport interface StringSink extends TextSink {\n /** Everything written so far, joined. */\n readonly text: string;\n}\n\n/**\n * Collects sanitized output into a string.\n *\n * Only appropriate when the output is known to fit in memory — the point of the streaming API is\n * usually to avoid that.\n *\n * @example\n * ```ts\n * const sink = toStringSink();\n * const report = await sanitizer.sanitizeStream(fromString(input), sink);\n * console.log(sink.text, report.totalMatches);\n * ```\n */\nexport function toStringSink(): StringSink {\n const chunks: string[] = [];\n\n return {\n write(chunk: string): void {\n chunks.push(chunk);\n },\n get text(): string {\n return chunks.join('');\n },\n };\n}\n\n/**\n * Sends sanitized output to a callback, one line at a time.\n *\n * The callback may return a promise; it is awaited before the next line is written, so\n * backpressure propagates to the source.\n */\nexport function toCallbackSink(\n onChunk: (chunk: string) => void | Promise<void>,\n onClose?: () => void | Promise<void>,\n): TextSink {\n return {\n write: onChunk,\n ...(onClose ? { close: onClose } : {}),\n };\n}\n\n/** A sink that discards everything, for report-only runs. */\nexport function toNullSink(): TextSink {\n return { write: () => undefined };\n}\n","import { createReadStream, createWriteStream } from 'node:fs';\nimport { once } from 'node:events';\nimport type { Readable, Writable } from 'node:stream';\nimport { finished } from 'node:stream/promises';\n\nimport { createSanitizer } from '../core/sanitizer';\nimport { toNullSink } from '../io/sinks';\nimport type {\n AbortSignalLike,\n SanitizeProgress,\n SanitizeReport,\n SanitizerOptions,\n TextSink,\n TextSource,\n} from '../types';\n\nconst DEFAULT_CHUNK_BYTES = 4 * 1024 * 1024;\n\n/**\n * Reads a Node readable stream as UTF-8 text.\n *\n * Byte chunks are decoded across chunk boundaries, so multi-byte characters are never split.\n */\nexport function fromNodeStream(stream: Readable | AsyncIterable<string | Uint8Array>): TextSource {\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<string> {\n const decoder = new TextDecoder('utf-8');\n\n for await (const chunk of stream as AsyncIterable<string | Uint8Array>) {\n const text = typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });\n\n if (text.length > 0) {\n yield text;\n }\n }\n\n const tail = decoder.decode();\n\n if (tail.length > 0) {\n yield tail;\n }\n },\n };\n}\n\n/**\n * Reads a file as UTF-8 text.\n *\n * @param path Path to the file to read.\n * @param chunkBytes Read buffer size.\n */\nexport function fromFile(path: string, chunkBytes = DEFAULT_CHUNK_BYTES): TextSource {\n return fromNodeStream(createReadStream(path, { highWaterMark: chunkBytes }));\n}\n\n/**\n * Writes sanitized text to a Node writable stream, respecting backpressure.\n *\n * The stream is not ended when the run finishes, so it is safe to pass `process.stdout`.\n */\nexport function toNodeStream(stream: Writable): TextSink {\n return {\n async write(chunk: string): Promise<void> {\n if (!stream.write(chunk)) {\n await once(stream, 'drain');\n }\n },\n };\n}\n\n/**\n * Writes sanitized text to a file, creating or truncating it.\n *\n * The file is closed and flushed when the run finishes.\n */\nexport function toFile(path: string): TextSink {\n const stream = createWriteStream(path, { encoding: 'utf-8' });\n const target = toNodeStream(stream);\n\n return {\n write: target.write.bind(target),\n async close(): Promise<void> {\n stream.end();\n await finished(stream);\n },\n };\n}\n\n/** Options for {@link sanitizeFile}. */\nexport interface SanitizeFileOptions extends SanitizerOptions {\n /** Path of the file to read. */\n input: string;\n /** Path to write the sanitized result to. Omit for a report-only run. */\n output?: string;\n /** Read buffer size, in bytes. */\n chunkBytes?: number;\n /** Called after each chunk with a live snapshot of progress. */\n onProgress?: (progress: SanitizeProgress) => void;\n /** Aborts the run between lines. A partially written output file is left in place. */\n signal?: AbortSignalLike;\n}\n\n/**\n * Sanitizes a file on disk, streaming it so memory use stays flat regardless of file size.\n *\n * @returns The report for the whole file.\n * @throws {SanitizationAbortedError} When `options.signal` is aborted.\n *\n * @example\n * ```ts\n * const report = await sanitizeFile({\n * input: 'app.log',\n * output: 'app.sanitized.log',\n * rules: ['secrets', 'ips'],\n * });\n *\n * console.log(`${report.totalMatches} values redacted`);\n * ```\n */\nexport async function sanitizeFile(options: SanitizeFileOptions): Promise<SanitizeReport> {\n const { input, output, chunkBytes, onProgress, signal, ...sanitizerOptions } = options;\n const sanitizer = createSanitizer(sanitizerOptions);\n const sink = output === undefined ? toNullSink() : toFile(output);\n\n return sanitizer.sanitizeStream(fromFile(input, chunkBytes), sink, { onProgress, signal });\n}\n\nexport * from '../index';\n","import { realpathSync } from 'node:fs';\nimport { readFile, stat, writeFile } from 'node:fs/promises';\nimport { basename, dirname, join } from 'node:path';\nimport { type Readable, type Writable } from 'node:stream';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { parseArgs } from 'node:util';\n\nimport { generateKey } from './core/key';\nimport { createSanitizer } from './core/sanitizer';\nimport { toNullSink } from './io/sinks';\nimport { fromFile, fromNodeStream, toFile, toNodeStream } from './node';\nimport { builtinRuleIds } from './rules/registry';\nimport type {\n BuiltinRuleId,\n KeyEncoding,\n SanitizeReport,\n SanitizeRule,\n SanitizerOptions,\n TextSink,\n TextSource,\n} from './types';\n\nexport const EXIT_OK = 0;\nexport const EXIT_ERROR = 1;\nexport const EXIT_USAGE = 2;\n\nconst HELP = `Usage: logtotal-sanitize [options] <input>\n\nRedact secrets, identifiers and PII from a log file. Input \"-\" reads stdin.\n\nOptions:\n -o, --out <path> Output file (default: <input>.sanitized)\n --stdout Write sanitized text to stdout\n --report <path> Write a JSON report to <path>\n --report-format <fmt> json | text (default: json)\n --rules <ids> Comma-separated built-in rule ids (default: all)\n --exclude-rules <ids> Comma-separated built-in rule ids to skip\n --rules-file <path> Load extra rules from a JS/JSON module\n --exclude <value> Never redact this exact value (repeatable)\n --exclude-file <path> Newline-separated never-redact values\n --redact <value> Always redact this exact value (repeatable)\n --redact-file <path> Newline-separated always-redact values\n --aggressive Enable broader, noisier patterns\n --key <value> HMAC key (reuse to correlate tokens across files)\n --key-file <path> Read HMAC key from a file\n --key-encoding <enc> hex | utf8\n --print-key Print the key to stderr\n --dry-run Report only; do not write sanitized output\n --fail-on-match Exit 1 if anything was redacted\n --progress Show a live progress bar on stderr\n --no-progress Do not show a progress bar\n -q, --quiet Suppress the text summary\n -h, --help Show this help\n -v, --version Show version\n`;\n\ninterface CliFlags {\n out?: string;\n stdout: boolean;\n report?: string;\n reportFormat: 'json' | 'text';\n rules?: string;\n excludeRules?: string;\n rulesFile?: string;\n exclude: string[];\n excludeFile?: string;\n redact: string[];\n redactFile?: string;\n aggressive: boolean;\n key?: string;\n keyFile?: string;\n keyEncoding?: KeyEncoding;\n printKey: boolean;\n dryRun: boolean;\n failOnMatch: boolean;\n progress: boolean;\n noProgress: boolean;\n quiet: boolean;\n help: boolean;\n version: boolean;\n input?: string;\n}\n\nfunction parseCli(argv: string[]): CliFlags {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n out: { type: 'string', short: 'o' },\n stdout: { type: 'boolean', default: false },\n report: { type: 'string' },\n 'report-format': { type: 'string', default: 'json' },\n rules: { type: 'string' },\n 'exclude-rules': { type: 'string' },\n 'rules-file': { type: 'string' },\n exclude: { type: 'string', multiple: true },\n 'exclude-file': { type: 'string' },\n redact: { type: 'string', multiple: true },\n 'redact-file': { type: 'string' },\n aggressive: { type: 'boolean', default: false },\n key: { type: 'string' },\n 'key-file': { type: 'string' },\n 'key-encoding': { type: 'string' },\n 'print-key': { type: 'boolean', default: false },\n 'dry-run': { type: 'boolean', default: false },\n 'fail-on-match': { type: 'boolean', default: false },\n progress: { type: 'boolean', default: false },\n 'no-progress': { type: 'boolean', default: false },\n quiet: { type: 'boolean', short: 'q', default: false },\n help: { type: 'boolean', short: 'h', default: false },\n version: { type: 'boolean', short: 'v', default: false },\n },\n });\n\n const keyEncoding =\n values['key-encoding'] === 'hex' || values['key-encoding'] === 'utf8'\n ? values['key-encoding']\n : undefined;\n\n return {\n out: values.out,\n stdout: Boolean(values.stdout),\n report: values.report,\n reportFormat: values['report-format'] === 'text' ? 'text' : 'json',\n rules: values.rules,\n excludeRules: values['exclude-rules'],\n rulesFile: values['rules-file'],\n exclude: values.exclude ?? [],\n excludeFile: values['exclude-file'],\n redact: values.redact ?? [],\n redactFile: values['redact-file'],\n aggressive: Boolean(values.aggressive),\n key: values.key,\n keyFile: values['key-file'],\n keyEncoding,\n printKey: Boolean(values['print-key']),\n dryRun: Boolean(values['dry-run']),\n failOnMatch: Boolean(values['fail-on-match']),\n progress: Boolean(values.progress),\n noProgress: Boolean(values['no-progress']),\n quiet: Boolean(values.quiet),\n help: Boolean(values.help),\n version: Boolean(values.version),\n input: positionals[0],\n };\n}\n\nasync function readLines(path: string): Promise<string[]> {\n const text = await readFile(path, 'utf8');\n return text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n}\n\nasync function loadRulesFile(path: string): Promise<SanitizeRule[]> {\n if (path.endsWith('.json')) {\n const parsed = JSON.parse(await readFile(path, 'utf8')) as unknown;\n return Array.isArray(parsed) ? (parsed as SanitizeRule[]) : [parsed as SanitizeRule];\n }\n\n const mod = (await import(pathToFileURL(path).href)) as { default?: unknown };\n const value = mod.default;\n if (Array.isArray(value)) {\n return value as SanitizeRule[];\n }\n return [value as SanitizeRule];\n}\n\nfunction formatReportText(report: SanitizeReport): string {\n const lines = [`lines: ${report.lineCount}`, `matches: ${report.totalMatches}`];\n for (const [id, count] of Object.entries(report.counts)) {\n lines.push(` ${id}: ${count}`);\n }\n return `${lines.join('\\n')}\\n`;\n}\n\nconst PROGRESS_BAR_WIDTH = 20;\n\nfunction streamIsTty(stream: Writable): boolean {\n return Boolean((stream as NodeJS.WriteStream).isTTY);\n}\n\nfunction progressLabel(input: string, useStdin: boolean): string {\n if (useStdin) {\n return 'stdin';\n }\n const name = basename(input);\n return name.length > 32 ? `${name.slice(0, 29)}...` : name;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${Math.round(bytes)} B`;\n }\n\n const units = ['KB', 'MB', 'GB', 'TB'] as const;\n let value = bytes / 1024;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit += 1;\n }\n const digits = value >= 10 ? 1 : 2;\n return `${value.toFixed(digits)} ${units[unit]}`;\n}\n\nfunction formatBar(ratio: number): string {\n const clamped = Math.min(1, Math.max(0, ratio));\n const filled = Math.round(clamped * PROGRESS_BAR_WIDTH);\n const head =\n filled > 0 && filled < PROGRESS_BAR_WIDTH ? '>' : filled === PROGRESS_BAR_WIDTH ? '=' : '';\n const body = '='.repeat(Math.max(0, filled - head.length));\n const empty = ' '.repeat(PROGRESS_BAR_WIDTH - body.length - head.length);\n return `[${body}${head}${empty}]`;\n}\n\nfunction formatProgressLine(state: {\n label: string;\n bytesRead: number;\n totalBytes?: number;\n lineCount: number;\n totalMatches: number;\n}): string {\n const stats = `${formatBytes(state.bytesRead)}${\n state.totalBytes !== undefined ? ` / ${formatBytes(state.totalBytes)}` : ''\n } ${state.lineCount} lines ${state.totalMatches} matches`;\n\n if (state.totalBytes === undefined) {\n return `${state.label} ${stats}`;\n }\n\n const ratio = state.totalBytes === 0 ? 1 : Math.min(1, state.bytesRead / state.totalBytes);\n const pct = String(Math.min(100, Math.floor(ratio * 100))).padStart(3, ' ');\n return `${state.label} ${formatBar(ratio)} ${pct}% ${stats}`;\n}\n\nfunction withByteTracking(source: TextSource, tracked: { bytes: number }): TextSource {\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<string> {\n for await (const chunk of source as AsyncIterable<string>) {\n tracked.bytes += Buffer.byteLength(chunk, 'utf8');\n yield chunk;\n }\n },\n };\n}\n\nfunction createProgressPrinter(\n stderr: Writable,\n options: { tty: boolean; label: string; totalBytes?: number },\n): {\n update(bytesRead: number, report: Pick<SanitizeReport, 'lineCount' | 'totalMatches'>): void;\n finish(bytesRead: number, report: Pick<SanitizeReport, 'lineCount' | 'totalMatches'>): void;\n} {\n const minIntervalMs = options.tty ? 80 : 500;\n let lastAt = 0;\n let lastLen = 0;\n let lastText = '';\n\n const lineFor = (\n bytesRead: number,\n report: Pick<SanitizeReport, 'lineCount' | 'totalMatches'>,\n ): string =>\n formatProgressLine({\n label: options.label,\n bytesRead,\n totalBytes: options.totalBytes,\n lineCount: report.lineCount,\n totalMatches: report.totalMatches,\n });\n\n const paint = (text: string, newline: boolean): void => {\n lastText = text;\n if (options.tty) {\n const padded = text.length < lastLen ? `${text}${' '.repeat(lastLen - text.length)}` : text;\n stderr.write(`\\r${padded}`);\n lastLen = text.length;\n if (newline) {\n stderr.write('\\n');\n }\n } else {\n stderr.write(`${text}\\n`);\n }\n };\n\n return {\n update(bytesRead, report) {\n const now = Date.now();\n if (now - lastAt < minIntervalMs) {\n return;\n }\n lastAt = now;\n paint(lineFor(bytesRead, report), false);\n },\n finish(bytesRead, report) {\n const text = lineFor(bytesRead, report);\n if (!options.tty && text === lastText) {\n return;\n }\n paint(text, true);\n },\n };\n}\n\nexport async function runCli(\n argv: string[],\n io: {\n stdin: Readable;\n stdout: Writable;\n stderr: Writable;\n } = {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n },\n): Promise<number> {\n let flags: CliFlags;\n try {\n flags = parseCli(argv);\n } catch (error) {\n io.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n return EXIT_USAGE;\n }\n\n if (flags.help) {\n io.stdout.write(HELP);\n return EXIT_OK;\n }\n\n if (flags.version) {\n const pkgUrl = new URL('../package.json', import.meta.url);\n const pkg = JSON.parse(await readFile(pkgUrl, 'utf8')) as { version: string };\n io.stdout.write(`${pkg.version}\\n`);\n return EXIT_OK;\n }\n\n if (!flags.input) {\n io.stderr.write('Missing input path. Use \"-\" for stdin.\\n');\n io.stderr.write(HELP);\n return EXIT_USAGE;\n }\n\n const extraRules = flags.rulesFile ? await loadRulesFile(flags.rulesFile) : [];\n let ruleIds: BuiltinRuleId[] = [...builtinRuleIds];\n if (flags.rules) {\n ruleIds = flags.rules.split(',').map((id) => id.trim()) as BuiltinRuleId[];\n }\n if (flags.excludeRules) {\n const skip = new Set(flags.excludeRules.split(',').map((id) => id.trim()));\n ruleIds = ruleIds.filter((id) => !skip.has(id));\n }\n\n const neverValues = [...flags.exclude];\n if (flags.excludeFile) {\n neverValues.push(...(await readLines(flags.excludeFile)));\n }\n const alwaysValues = [...flags.redact];\n if (flags.redactFile) {\n alwaysValues.push(...(await readLines(flags.redactFile)));\n }\n\n const suppliedKey = Boolean(flags.key || flags.keyFile);\n let key = flags.key;\n if (flags.keyFile) {\n key = (await readFile(flags.keyFile, 'utf8')).trim();\n }\n if (!key) {\n key = generateKey();\n }\n if (flags.printKey) {\n io.stderr.write(`${key}\\n`);\n }\n\n const options: SanitizerOptions = {\n rules: ruleIds,\n extraRules: extraRules.length > 0 ? extraRules : undefined,\n aggressive: flags.aggressive,\n key,\n keyEncoding: flags.keyEncoding ?? (suppliedKey ? 'utf8' : 'hex'),\n alwaysRedact: alwaysValues.length > 0 ? { values: alwaysValues } : undefined,\n neverRedact: neverValues.length > 0 ? { values: neverValues } : undefined,\n // Normal output, progress, and text reports only consume aggregate counts. Preserve the\n // detailed replacement list and preview for the explicit JSON report surface.\n report:\n flags.report && flags.reportFormat === 'json'\n ? undefined\n : { previewBytes: 0, replacements: false },\n };\n\n const sanitizer = createSanitizer(options);\n const useStdin = flags.input === '-';\n const source = useStdin ? fromNodeStream(io.stdin) : fromFile(flags.input);\n const tty = streamIsTty(io.stderr);\n const showProgress = flags.noProgress ? false : flags.progress || (tty && !flags.quiet);\n const totalBytes = showProgress && !useStdin ? (await stat(flags.input)).size : undefined;\n const tracked = { bytes: 0 };\n const trackedSource = showProgress ? withByteTracking(source, tracked) : source;\n const progress = showProgress\n ? createProgressPrinter(io.stderr, {\n tty,\n label: progressLabel(flags.input, useStdin),\n totalBytes,\n })\n : undefined;\n\n const writeStdout = flags.stdout || (useStdin && !flags.out);\n let outputPath = flags.out;\n if (!writeStdout && !flags.dryRun && !outputPath && !useStdin) {\n outputPath = join(dirname(flags.input), `${basename(flags.input)}.sanitized`);\n }\n\n const sink: TextSink = flags.dryRun\n ? toNullSink()\n : writeStdout\n ? toNodeStream(io.stdout)\n : toFile(outputPath!);\n\n const report = await sanitizer.sanitizeStream(trackedSource, sink, {\n onProgress: progress\n ? (snapshot) => {\n progress.update(tracked.bytes, snapshot.report);\n }\n : undefined,\n });\n\n progress?.finish(tracked.bytes, report);\n\n if (flags.report) {\n const body =\n flags.reportFormat === 'text'\n ? formatReportText(report)\n : `${JSON.stringify(report, null, 2)}\\n`;\n await writeFile(flags.report, body, 'utf8');\n }\n\n if (!flags.quiet && !writeStdout) {\n io.stderr.write(formatReportText(report));\n }\n\n if (flags.failOnMatch && report.totalMatches > 0) {\n return EXIT_ERROR;\n }\n\n return EXIT_OK;\n}\n\nasync function main(): Promise<void> {\n try {\n process.exitCode = await runCli(process.argv.slice(2));\n } catch (error) {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = EXIT_ERROR;\n }\n}\n\n/** True when this module is the Node process entry (including npm/npx bin shims). */\nexport function isCliEntryPoint(entryPath: string | undefined = process.argv[1]): boolean {\n if (!entryPath) {\n return false;\n }\n\n try {\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(entryPath);\n } catch {\n return false;\n }\n}\n\nif (isCliEntryPoint()) {\n void main();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/constants.ts","../src/core/errors.ts","../src/core/hmac.ts","../src/core/key.ts","../src/rules/alwaysRedact.ts","../src/rules/definitions/geoLocation.ts","../src/rules/definitions/govIdentifiers.ts","../src/rules/definitions/healthInfo.ts","../src/rules/definitions/homePaths.ts","../src/rules/shared/windowsAccounts.ts","../src/rules/definitions/hostnames.ts","../src/rules/definitions/ipAddresses.ts","../src/rules/shared/hmacSha256.ts","../src/rules/definitions/paymentInfo.ts","../src/rules/definitions/phoneNumbers.ts","../src/rules/definitions/secrets.ts","../src/rules/definitions/sessionCookies.ts","../src/rules/definitions/users.ts","../src/rules/registry.ts","../src/core/allowlist.ts","../src/core/pseudonymize.ts","../src/core/regexSource.ts","../src/core/compile.ts","../src/core/lineSplitter.ts","../src/core/redactLine.ts","../src/core/redactJsonLine.ts","../src/core/report.ts","../src/rules/validateRule.ts","../src/core/resolveRules.ts","../src/core/sanitizer.ts","../src/io/sinks.ts","../src/node/index.ts","../src/cli.ts"],"names":["BLOCK_BYTES","DIGEST_BYTES","K","INITIAL_STATE","rotr","padMessage","sha256","luhnCheck","normalizeKey"],"mappings":"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EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAC,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","file":"cli.js","sourcesContent":["export const DEFAULT_PREVIEW_BYTES = 256 * 1024;\n\nexport const DEFAULT_RANGE_PROBE_BYTES = 256 * 1024;\n\nexport const DEFAULT_RANGE_MAX_PROBE_BYTES = 16 * 1024 * 1024;\n\nexport const DEFAULT_MAX_LINE_CHARS = 1024 * 1024;\n\nexport const DEFAULT_LINE_OVERLAP_CHARS = 1024;\n\nexport const DEFAULT_KEY_BYTES = 32;\n\nexport const MASK_TOKEN_PREFIX = 'R';\n\nexport const ALWAYS_REDACT_RULE_ID = 'custom';\n\nexport const ALWAYS_REDACT_TOKEN = 'CUSTOM';\n","const ERROR_BRAND = Symbol.for('@socprime/logtotal-sanitizer/error');\n\n/**\n * Machine-readable cause of a {@link SanitizerError}.\n */\nexport type SanitizerErrorCode =\n | 'INVALID_RULE'\n | 'UNKNOWN_RULE'\n | 'INVALID_KEY'\n | 'INVALID_OPTION'\n | 'ABORTED';\n\n/**\n * Base class for every error this package throws.\n */\nexport class SanitizerError extends Error {\n /** Machine-readable cause, stable across releases. */\n readonly code: SanitizerErrorCode;\n\n constructor(code: SanitizerErrorCode, message: string) {\n super(message);\n this.name = 'SanitizerError';\n this.code = code;\n Object.defineProperty(this, ERROR_BRAND, { value: true, enumerable: false });\n }\n}\n\n/** A rule object is malformed. */\nexport class InvalidRuleError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_RULE', message);\n this.name = 'InvalidRuleError';\n }\n}\n\n/** A rule identifier does not match any built-in rule. */\nexport class UnknownRuleError extends SanitizerError {\n constructor(message: string) {\n super('UNKNOWN_RULE', message);\n this.name = 'UnknownRuleError';\n }\n}\n\n/** A key is malformed, or no secure random source is available to generate one. */\nexport class InvalidKeyError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_KEY', message);\n this.name = 'InvalidKeyError';\n }\n}\n\n/** An option value is outside its allowed range. */\nexport class InvalidOptionError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_OPTION', message);\n this.name = 'InvalidOptionError';\n }\n}\n\n/** A streaming run was stopped through its `AbortSignal`. */\nexport class SanitizationAbortedError extends SanitizerError {\n constructor(message = 'Sanitization was aborted.') {\n super('ABORTED', message);\n this.name = 'SanitizationAbortedError';\n }\n}\n\n/**\n * Whether a caught value is an error thrown by this package.\n *\n * Prefer this over `instanceof` when the value may have crossed a bundle, worker or realm\n * boundary, where class identity is not preserved.\n */\nexport function isSanitizerError(value: unknown): value is SanitizerError {\n return typeof value === 'object' && value !== null && ERROR_BRAND in value;\n}\n","const BLOCK_BYTES = 64;\nconst DIGEST_BYTES = 32;\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nconst INITIAL_STATE = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\nfunction rotr(value: number, bits: number): number {\n return ((value >>> bits) | (value << (32 - bits))) >>> 0;\n}\n\nfunction concatBytes(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n\nfunction padMessage(message: Uint8Array): Uint8Array {\n const bitLength = message.length * 8;\n const paddedLength = Math.ceil((message.length + 9) / BLOCK_BYTES) * BLOCK_BYTES;\n const padded = new Uint8Array(paddedLength);\n\n padded.set(message);\n padded[message.length] = 0x80;\n\n const view = new DataView(padded.buffer);\n view.setUint32(paddedLength - 8, Math.floor(bitLength / 2 ** 32), false);\n view.setUint32(paddedLength - 4, bitLength >>> 0, false);\n\n return padded;\n}\n\nexport function sha256(message: Uint8Array): Uint8Array {\n const padded = padMessage(message);\n const view = new DataView(padded.buffer);\n const state = Uint32Array.from(INITIAL_STATE);\n const w = new Uint32Array(64);\n\n for (let offset = 0; offset < padded.length; offset += BLOCK_BYTES) {\n for (let i = 0; i < 16; i += 1) {\n w[i] = view.getUint32(offset + i * 4, false);\n }\n\n for (let i = 16; i < 64; i += 1) {\n const s0 = rotr(w[i - 15]!, 7) ^ rotr(w[i - 15]!, 18) ^ (w[i - 15]! >>> 3);\n const s1 = rotr(w[i - 2]!, 17) ^ rotr(w[i - 2]!, 19) ^ (w[i - 2]! >>> 10);\n w[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0;\n }\n\n let a = state[0]!;\n let b = state[1]!;\n let c = state[2]!;\n let d = state[3]!;\n let e = state[4]!;\n let f = state[5]!;\n let g = state[6]!;\n let h = state[7]!;\n\n for (let i = 0; i < 64; i += 1) {\n const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + ch + K[i]! + w[i]!) >>> 0;\n const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n state[0] = (state[0]! + a) >>> 0;\n state[1] = (state[1]! + b) >>> 0;\n state[2] = (state[2]! + c) >>> 0;\n state[3] = (state[3]! + d) >>> 0;\n state[4] = (state[4]! + e) >>> 0;\n state[5] = (state[5]! + f) >>> 0;\n state[6] = (state[6]! + g) >>> 0;\n state[7] = (state[7]! + h) >>> 0;\n }\n\n const digest = new Uint8Array(DIGEST_BYTES);\n const digestView = new DataView(digest.buffer);\n\n for (let i = 0; i < 8; i += 1) {\n digestView.setUint32(i * 4, state[i]!, false);\n }\n\n return digest;\n}\n\nfunction normalizeKey(key: Uint8Array): Uint8Array {\n const hashed = key.length > BLOCK_BYTES ? sha256(key) : key;\n\n if (hashed.length === BLOCK_BYTES) {\n return hashed;\n }\n\n const padded = new Uint8Array(BLOCK_BYTES);\n padded.set(hashed);\n return padded;\n}\n\nexport type KeyedHmacSha256 = (message: Uint8Array) => Uint8Array;\n\nexport function createHmacSha256(key: Uint8Array): KeyedHmacSha256 {\n const block = normalizeKey(key);\n const ipad = new Uint8Array(BLOCK_BYTES);\n const opad = new Uint8Array(BLOCK_BYTES);\n\n for (let i = 0; i < BLOCK_BYTES; i += 1) {\n ipad[i] = block[i]! ^ 0x36;\n opad[i] = block[i]! ^ 0x5c;\n }\n\n return (message: Uint8Array): Uint8Array =>\n sha256(concatBytes(opad, sha256(concatBytes(ipad, message))));\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n\n for (let i = 0; i < bytes.length; i += 1) {\n bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n\n return bytes;\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n","import type { KeyEncoding } from '../types';\nimport { DEFAULT_KEY_BYTES } from './constants';\nimport { InvalidKeyError } from './errors';\nimport { bytesToHex } from './hmac';\n\nconst HEX_PATTERN = /^(?:[0-9a-fA-F]{2})+$/;\n\n/**\n * Generates a random hex-encoded key for token derivation.\n *\n * Persist the returned value if tokens have to stay comparable across runs or files; discard it if\n * they should not. There is no way to recover the original values from the tokens, with or without\n * the key — the key only determines which token a given value maps to.\n *\n * @param byteLength Key length in bytes, at least 16.\n * @throws {InvalidKeyError} When `byteLength` is too small or no secure random source is available.\n *\n * @example\n * ```ts\n * const key = generateKey();\n * const sanitizer = createSanitizer({ key });\n * ```\n */\nexport function generateKey(byteLength: number = DEFAULT_KEY_BYTES): string {\n if (!Number.isInteger(byteLength) || byteLength < 16) {\n throw new InvalidKeyError(`Key length must be an integer of at least 16 bytes, got ${byteLength}.`);\n }\n\n const source = globalThis.crypto;\n\n if (typeof source?.getRandomValues !== 'function') {\n throw new InvalidKeyError(\n 'No secure random source available. Pass an explicit `key` or provide a Web Crypto implementation on globalThis.crypto.',\n );\n }\n\n const bytes = new Uint8Array(byteLength);\n source.getRandomValues(bytes);\n\n return bytesToHex(bytes);\n}\n\nexport function assertKey(key: string, encoding: KeyEncoding): void {\n if (key.length === 0) {\n throw new InvalidKeyError('Key must not be empty.');\n }\n\n if (encoding === 'hex' && !HEX_PATTERN.test(key)) {\n throw new InvalidKeyError(\n 'A hex key must contain an even number of hexadecimal characters. Pass `keyEncoding: \"utf8\"` for a passphrase.',\n );\n }\n}\n","import { ALWAYS_REDACT_RULE_ID, ALWAYS_REDACT_TOKEN } from '../core/constants';\nimport { InvalidOptionError } from '../core/errors';\nimport type { AlwaysRedactOptions, SanitizeRule } from '../types';\n\nexport function escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction normalizeValues(values: readonly string[]): string[] {\n const unique = new Set(values.map((value) => value.trim()).filter((value) => value.length > 0));\n\n return [...unique].sort((left, right) => right.length - left.length || left.localeCompare(right));\n}\n\nfunction normalizePatterns(patterns: readonly (string | RegExp)[]): string[] {\n return patterns.map((pattern) => {\n const source = typeof pattern === 'string' ? pattern : pattern.source;\n\n try {\n new RegExp(source, 'u');\n } catch (cause) {\n throw new InvalidOptionError(\n `alwaysRedact.patterns contains an invalid regular expression: ${String(cause)}`,\n );\n }\n\n return `(?:${source})`;\n });\n}\n\nexport function createAlwaysRedactRule(\n options: AlwaysRedactOptions | undefined,\n): SanitizeRule | null {\n if (!options) {\n return null;\n }\n\n const patterns = [\n ...normalizeValues(options.values ?? []).map((value) => `(?:${escapeRegExp(value)})`),\n ...normalizePatterns(options.patterns ?? []),\n ];\n\n if (patterns.length === 0) {\n return null;\n }\n\n return {\n id: options.ruleId ?? ALWAYS_REDACT_RULE_ID,\n label: 'Always redacted',\n description: 'Values and patterns the caller marked as always sensitive.',\n mode: options.mode ?? 'pseudo',\n token: options.token ?? ALWAYS_REDACT_TOKEN,\n patterns,\n };\n}\n","import type { SanitizeRule } from '../../types';\n\nfunction parseLatLonPair(match: string): { lat: number; lon: number } | null {\n const stripped = match.replace(/[()\\s]/g, '');\n\n if (!/^-?\\d+\\.\\d+[,;]-?\\d+\\.\\d+$/.test(stripped)) {\n return null;\n }\n\n const [latStr, lonStr] = stripped.split(/[,;]/);\n const lat = Number(latStr);\n const lon = Number(lonStr);\n\n if (!Number.isFinite(lat) || !Number.isFinite(lon)) {\n return null;\n }\n\n return { lat, lon };\n}\n\nfunction isPlausibleLatLon(lat: number, lon: number): boolean {\n if (lat === 0 && lon === 0) {\n return false;\n }\n\n return lat >= -90 && lat <= 90 && lon >= -180 && lon <= 180;\n}\n\nfunction validateGeo(match: string): boolean {\n const pair = parseLatLonPair(match);\n\n if (pair) {\n return isPlausibleLatLon(pair.lat, pair.lon);\n }\n\n return true;\n}\n\nconst LAT_KEY = '(?:latitude|lat)';\nconst LON_KEY = '(?:longitude|long|lon|lng)';\nconst ZIP_KEY = '(?:zipCode|postalCode|postcode|zip)';\nconst ADDR_KEY = '(?:addressLine1|address|street)';\nconst OLC = '[23456789CFGHJMPQRVWXcfghjmpqrvwx]';\nconst GEOHASH = '[0-9b-hjkmnp-zB-HJKMNP-Z]';\n\nexport const geoLocationRule: SanitizeRule = {\n id: 'geoLocation',\n label: 'Geo location',\n description:\n 'Coordinates, geohashes, plus codes, postcodes and context-anchored addresses become a stable <GEO:…> token — the same value maps to the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'GEO',\n patterns: [\n '(?:\\\\(\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*\\\\))',\n '(?:(?<![\\\\d.])-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}(?!\\\\d))',\n `(?:\\\\b${LAT_KEY}\\\\s*[=:]\\\\s*)(-?\\\\d{1,3}\\\\.\\\\d+)`,\n `(?:\\\\b${LON_KEY}\\\\s*[=:]\\\\s*)(-?\\\\d{1,3}\\\\.\\\\d+)`,\n `(?:\\\\bgeohash\\\\s*[=:]\\\\s*)(${GEOHASH}{5,12}\\\\b)`,\n `(?:(?<![\\\\w+])${OLC}{4,8}\\\\+${OLC}{2,3}(?![\\\\w+]))`,\n '(?:\\\\b\\\\d{1,3}°\\\\d{1,2}\\'\\\\d{1,2}(?:\\\\.\\\\d+)?\"[NSEW]\\\\b)',\n '(?:\\\\b[A-Za-z]{1,2}\\\\d{1,2}[A-Za-z]?\\\\s\\\\d[A-Za-z]{2}\\\\b)',\n `(?:\\\\b${ZIP_KEY}\\\\s*[=:]\\\\s*)(\\\\d{5}(?:-\\\\d{4})?\\\\b)`,\n ],\n aggressivePatterns: [\n '(?:\\\\(\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*\\\\))',\n '(?:(?<![\\\\d.])-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}(?!\\\\d))',\n `(?:(?<=\\\\b${ADDR_KEY}\\\\s*[=:]\\\\s*)[^\\\\n\"'<>]{5,80})`,\n ],\n validate: validateGeo,\n jsonKeys: [\n 'latitude',\n 'longitude',\n 'lat',\n 'lon',\n 'lng',\n 'long',\n 'coordinates',\n 'coords',\n 'geo',\n 'streetAddress',\n 'addressLine1',\n 'addressLine2',\n 'postalCode',\n 'postcode',\n 'zip',\n 'zipCode',\n 'geohash',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction luhnCheck(digits: string): boolean {\n if (!/^\\d+$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n let doubleIt = false;\n\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let digit = Number(digits[i]);\n\n if (doubleIt) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n doubleIt = !doubleIt;\n }\n\n return sum % 10 === 0;\n}\n\nfunction isValidSsn(area: string, group: string, serial: string): boolean {\n if (area === '000' || area === '666' || area.startsWith('9')) {\n return false;\n }\n\n return group !== '00' && serial !== '0000';\n}\n\nfunction isValidItin(area: string, group: string, serial: string): boolean {\n if (!area.startsWith('9') || serial === '0000') {\n return false;\n }\n\n const groupNum = Number(group);\n\n return (\n (groupNum >= 70 && groupNum <= 88) ||\n (groupNum >= 90 && groupNum <= 92) ||\n (groupNum >= 94 && groupNum <= 99)\n );\n}\n\nfunction isValidNhs(digits: string): boolean {\n if (!/^\\d{10}$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n\n for (let i = 0; i < 9; i += 1) {\n sum += Number(digits[i]) * (10 - i);\n }\n\n const remainder = sum % 11;\n let check = 11 - remainder;\n\n if (check === 11) {\n check = 0;\n }\n\n if (check === 10) {\n return false;\n }\n\n return check === Number(digits[9]);\n}\n\nfunction validateGovId(match: string): boolean {\n const dashed = /^(\\d{3})-(\\d{2})-(\\d{4})$/.exec(match);\n\n if (dashed?.[1] && dashed[2] && dashed[3]) {\n return (\n isValidSsn(dashed[1], dashed[2], dashed[3]) || isValidItin(dashed[1], dashed[2], dashed[3])\n );\n }\n\n if (/^\\d{3}-\\d{3}-\\d{3}$/.test(match)) {\n return luhnCheck(match.replace(/-/g, ''));\n }\n\n if (/^\\d{3} \\d{3} \\d{4}$/.test(match)) {\n return isValidNhs(match.replace(/ /g, ''));\n }\n\n const nhsPrefixed = /(?:NHS|nhs)(?:[_-]?number)?\\s*[=:]\\s*(\\d{10})$/.exec(match);\n const nhsDigits = nhsPrefixed?.[1];\n\n if (nhsDigits) {\n return isValidNhs(nhsDigits);\n }\n\n return true;\n}\n\nconst SSN_CTX =\n '(?:[Ss][Ss][Nn]|[Ee][Ii][Nn]|[Ss][Ii][Nn]|tax[_-]?id|social[_ -]?security(?:[_ -]?number)?)';\nconst ID_CTX = '(?:passport(?:_no|_number)?|driver[_-]?license|national[_-]?id|tax[_-]?id)';\n\nexport const govIdentifiersRule: SanitizeRule = {\n id: 'govIds',\n label: 'Government identifiers',\n description: 'Passport numbers, tax numbers, SSNs and similar IDs are redacted outright.',\n mode: 'mask',\n token: 'GOV_ID',\n patterns: [\n '(?:(?<![A-Z0-9<])P<[A-Z0-9<]{42}(?![A-Z0-9<]))',\n '(?:\\\\b\\\\d{3}-\\\\d{2}-\\\\d{4}\\\\b)',\n '(?:\\\\b\\\\d{3}-\\\\d{3}-\\\\d{3}\\\\b)',\n '(?:\\\\b\\\\d{3} \\\\d{3} \\\\d{4}\\\\b)',\n '(?:\\\\b(?:NHS|nhs)(?:[_-]?number)?\\\\s*[=:]\\\\s*\\\\d{10}\\\\b)',\n '(?:\\\\b(?!BG|GB|NK|KN|TN|NT|ZZ)[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]\\\\d{6}\\\\s?[A-D]\\\\b)',\n '(?:(?<![A-Za-z0-9А-ЯІЇЄҐа-яіїєґ])[А-ЯІЇЄҐ]{2}\\\\d{6}\\\\b)',\n `(?:\\\\b${SSN_CTX}\\\\s*[=:]?\\\\s*)(\\\\d{9})\\\\b`,\n '(?:(?:ІПН|РНОКПП|tax[_-]?id)\\\\s*[=:]?\\\\s*)(\\\\d{10})\\\\b',\n `(?:\\\\b${ID_CTX}\\\\s*[=:]\\\\s*)([A-Za-z0-9<]{5,32})`,\n ],\n aggressivePatterns: ['(?:\\\\b[A-Z]{1,2}\\\\d{6,9}\\\\b)', '(?:\\\\b\\\\d{9,11}\\\\b)'],\n validate: validateGovId,\n jsonKeys: [\n 'ssn',\n 'passportNumber',\n 'taxId',\n 'nationalId',\n 'socialSecurityNumber',\n 'passport',\n 'nino',\n 'nhsNumber',\n 'driverLicense',\n 'licenseNumber',\n 'personalId',\n 'dob',\n 'dateOfBirth',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction isValidDea(match: string): boolean {\n if (!/^[ABFGMPRX][A-Z9]\\d{7}$/.test(match)) {\n return false;\n }\n\n const digits = match.slice(2);\n const sum =\n Number(digits[0]) +\n Number(digits[2]) +\n Number(digits[4]) +\n 2 * (Number(digits[1]) + Number(digits[3]) + Number(digits[5]));\n\n return sum % 10 === Number(digits[6]);\n}\n\nfunction validateHealth(match: string): boolean {\n if (/^[ABFGMPRX][A-Z9]\\d{7}$/.test(match)) {\n return isValidDea(match);\n }\n\n return true;\n}\n\nconst MRN_KEY = '(?:[Mm][Rr][Nn]|medical[_-]?record(?:[_-]?number)?)';\n\nexport const healthInfoRule: SanitizeRule = {\n id: 'healthInfo',\n label: 'Protected health information',\n description:\n 'PHI in SOC logs is almost always structured: JSON field names (diagnosis, medication, MRN, …) carry most of the coverage. Freeform patterns only match context-anchored medical codes (ICD, SNOMED, LOINC, NDC, DEA, MRN).',\n mode: 'mask',\n token: 'PHI',\n patterns: [\n '(?:\\\\b(?:[Ii][Cc][Dd]-10|[Ii][Cc][Dd]10):?\\\\s*[A-Z]\\\\d{2}(?:\\\\.\\\\d{1,4})?\\\\b)',\n '(?:\\\\b(?:[Ii][Cc][Dd]-9|[Ii][Cc][Dd]9):?\\\\s*(?:[VE]\\\\d{2,3}|\\\\d{3})(?:\\\\.\\\\d{1,2})?\\\\b)',\n '(?:\\\\b(?:SNOMED(?:\\\\s*CT)?|[Ss]nomed(?:\\\\s*CT)?)[:\\\\s]+\\\\d{6,18}\\\\b)',\n '(?:\\\\b(?:LOINC|[Ll]oinc)[:\\\\s]+\\\\d{1,5}-\\\\d\\\\b)',\n '(?:\\\\b(?:NDC|[Nn]dc)[:\\\\s]+\\\\d{4,5}-\\\\d{3,4}-\\\\d{1,2}\\\\b)',\n '(?:\\\\b[ABFGMPRX][A-Z9]\\\\d{7}\\\\b)',\n '(?:\\\\b(?:[Nn][Pp][Ii])\\\\s*[=:]\\\\s*\\\\d{10}\\\\b)',\n `(?:\\\\b${MRN_KEY}\\\\s*[=:]\\\\s*)([A-Za-z0-9-]{4,})\\\\b`,\n ],\n aggressivePatterns: ['(?:(?<![A-Za-z0-9])[A-TV-Z]\\\\d{2}(?:\\\\.\\\\w{1,4})?(?![A-Za-z0-9:]))'],\n validate: validateHealth,\n jsonKeys: [\n 'diagnosis',\n 'prescription',\n 'medication',\n 'icd10',\n 'icd9',\n 'snomed',\n 'condition',\n 'allergy',\n 'allergies',\n 'bloodType',\n 'patientId',\n 'mrn',\n 'medicalRecordNumber',\n 'insuranceNumber',\n 'labResult',\n 'observation',\n 'vitalSigns',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst USER_SEG = '[^/\\\\\\\\\\\\s\"\\'<>]+';\n\nfunction validateHomeUser(match: string): boolean {\n return match !== '.' && match !== '..';\n}\n\nexport const homePathsRule: SanitizeRule = {\n id: 'paths',\n label: 'Home-directory usernames',\n description:\n 'Only the username segment of a home-directory path is redacted (e.g. /home/jdoe/app → /home/<R:…>/app); the rest of the path stays visible.',\n mode: 'mask',\n token: 'PATH',\n patterns: [\n `(?:/export/home/(${USER_SEG}))`,\n `(?:/usr/home/(${USER_SEG}))`,\n `(?:/var/home/(${USER_SEG}))`,\n `(?:/home/(${USER_SEG}))`,\n `(?:/Users/(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\Users\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:/Users/(${USER_SEG}))`,\n `(?:\\\\\\\\\\\\\\\\\\\\?\\\\\\\\[A-Za-z]:\\\\\\\\Users\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\Documents and Settings\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\(${USER_SEG}))`,\n `(?:/mnt/[A-Za-z]/Users/(${USER_SEG}))`,\n `(?://wsl\\\\$/(?:[A-Za-z0-9_-]+)/home/(${USER_SEG}))`,\n ],\n validate: validateHomeUser,\n};\n","export const BACKSLASH = '\\\\\\\\';\n\nexport const JSON_BACKSLASH = '\\\\\\\\\\\\\\\\';\n\nexport const WINDOWS_FILE_EXT =\n 'exe|dll|sys|bat|cmd|ps1|vbs|msi|tmp|hiv|log|dat|txt|ini|xml|json|lnk|cpl|ocx|drv';\n\nexport const NOT_WINDOWS_FILENAME = `(?![A-Za-z0-9_$.-]*\\\\.(?:${WINDOWS_FILE_EXT})(?![A-Za-z0-9]))`;\n\nexport const WELL_KNOWN_DOMAIN = '(?:BUILTIN|NT SERVICE|NT AUTHORITY|Users|Settings|Files)';\n\nexport const NETBIOS_DOMAIN = '[A-Za-z0-9](?:[A-Za-z0-9.-]{0,13}[A-Za-z0-9])?';\n\nexport const ACCOUNT_SEGMENT = '[A-Za-z0-9_](?:[A-Za-z0-9_.$-]*[A-Za-z0-9$])';\n","import type { SanitizeRule } from '../../types';\nimport {\n ACCOUNT_SEGMENT,\n BACKSLASH,\n JSON_BACKSLASH,\n NETBIOS_DOMAIN,\n NOT_WINDOWS_FILENAME,\n WELL_KNOWN_DOMAIN,\n} from '../shared/windowsAccounts';\n\nconst GTLD = [\n 'abbott',\n 'abogado',\n 'ac',\n 'academy',\n 'accountant',\n 'accountants',\n 'active',\n 'actor',\n 'ad',\n 'ads',\n 'adult',\n 'ae',\n 'aero',\n 'af',\n 'afl',\n 'ag',\n 'agency',\n 'ai',\n 'airforce',\n 'al',\n 'allfinanz',\n 'alsace',\n 'am',\n 'amsterdam',\n 'an',\n 'android',\n 'ao',\n 'apartments',\n 'aq',\n 'aquarelle',\n 'ar',\n 'archi',\n 'army',\n 'arpa',\n 'as',\n 'asia',\n 'associates',\n 'at',\n 'attorney',\n 'au',\n 'auction',\n 'audio',\n 'autos',\n 'aw',\n 'ax',\n 'axa',\n 'az',\n 'ba',\n 'band',\n 'bank',\n 'bar',\n 'barclaycard',\n 'barclays',\n 'bargains',\n 'bauhaus',\n 'bayern',\n 'bb',\n 'bbc',\n 'bd',\n 'be',\n 'beer',\n 'berlin',\n 'best',\n 'bf',\n 'bg',\n 'bh',\n 'bi',\n 'bid',\n 'bike',\n 'bingo',\n 'bio',\n 'biz',\n 'bj',\n 'bl',\n 'black',\n 'blackfriday',\n 'bloomberg',\n 'blue',\n 'bm',\n 'bmw',\n 'bn',\n 'bnpparibas',\n 'bo',\n 'boats',\n 'bond',\n 'boo',\n 'boutique',\n 'bq',\n 'br',\n 'brussels',\n 'bs',\n 'bt',\n 'budapest',\n 'build',\n 'builders',\n 'business',\n 'buzz',\n 'bv',\n 'bw',\n 'by',\n 'bz',\n 'bzh',\n 'ca',\n 'cab',\n 'cafe',\n 'cal',\n 'camera',\n 'camp',\n 'cancerresearch',\n 'canon',\n 'capetown',\n 'capital',\n 'caravan',\n 'cards',\n 'care',\n 'career',\n 'careers',\n 'cartier',\n 'casa',\n 'cash',\n 'casino',\n 'cat',\n 'catering',\n 'cbn',\n 'cc',\n 'cd',\n 'center',\n 'ceo',\n 'cern',\n 'cf',\n 'cfd',\n 'cg',\n 'ch',\n 'channel',\n 'chat',\n 'cheap',\n 'chloe',\n 'christmas',\n 'chrome',\n 'church',\n 'ci',\n 'citic',\n 'city',\n 'ck',\n 'cl',\n 'claims',\n 'cleaning',\n 'click',\n 'clinic',\n 'clothing',\n 'club',\n 'cm',\n 'cn',\n 'co',\n 'coach',\n 'codes',\n 'coffee',\n 'college',\n 'cologne',\n 'com',\n 'community',\n 'company',\n 'computer',\n 'condos',\n 'construction',\n 'consulting',\n 'contractors',\n 'cooking',\n 'cool',\n 'coop',\n 'country',\n 'courses',\n 'cr',\n 'credit',\n 'creditcard',\n 'cricket',\n 'crs',\n 'cruises',\n 'cu',\n 'cuisinella',\n 'cv',\n 'cw',\n 'cx',\n 'cy',\n 'cymru',\n 'cyou',\n 'cz',\n 'dabur',\n 'dad',\n 'dance',\n 'date',\n 'dating',\n 'datsun',\n 'day',\n 'dclk',\n 'de',\n 'deals',\n 'degree',\n 'delivery',\n 'democrat',\n 'dental',\n 'dentist',\n 'desi',\n 'design',\n 'dev',\n 'diamonds',\n 'diet',\n 'digital',\n 'direct',\n 'directory',\n 'discount',\n 'dj',\n 'dk',\n 'dm',\n 'dnp',\n 'do',\n 'docs',\n 'doha',\n 'domains',\n 'doosan',\n 'download',\n 'durban',\n 'dvag',\n 'dz',\n 'eat',\n 'ec',\n 'edu',\n 'education',\n 'ee',\n 'eg',\n 'eh',\n 'email',\n 'emerck',\n 'energy',\n 'engineer',\n 'engineering',\n 'enterprises',\n 'epson',\n 'equipment',\n 'er',\n 'erni',\n 'es',\n 'esq',\n 'estate',\n 'et',\n 'eu',\n 'eurovision',\n 'eus',\n 'events',\n 'everbank',\n 'exchange',\n 'expert',\n 'exposed',\n 'express',\n 'fail',\n 'faith',\n 'fan',\n 'fans',\n 'farm',\n 'fashion',\n 'feedback',\n 'fi',\n 'film',\n 'finance',\n 'financial',\n 'firmdale',\n 'fish',\n 'fishing',\n 'fit',\n 'fitness',\n 'fj',\n 'fk',\n 'flights',\n 'florist',\n 'flowers',\n 'flsmidth',\n 'fly',\n 'fm',\n 'fo',\n 'foo',\n 'football',\n 'forex',\n 'forsale',\n 'foundation',\n 'fr',\n 'frl',\n 'frogans',\n 'fund',\n 'furniture',\n 'futbol',\n 'ga',\n 'gal',\n 'gallery',\n 'garden',\n 'gb',\n 'gbiz',\n 'gd',\n 'gdn',\n 'ge',\n 'gent',\n 'gf',\n 'gg',\n 'ggee',\n 'gh',\n 'gi',\n 'gift',\n 'gifts',\n 'gives',\n 'gl',\n 'glass',\n 'gle',\n 'global',\n 'globo',\n 'gm',\n 'gmail',\n 'gmo',\n 'gmx',\n 'gn',\n 'gold',\n 'goldpoint',\n 'golf',\n 'goo',\n 'goog',\n 'google',\n 'gop',\n 'gov',\n 'gp',\n 'gq',\n 'gr',\n 'graphics',\n 'gratis',\n 'green',\n 'gripe',\n 'gs',\n 'gt',\n 'gu',\n 'guge',\n 'guide',\n 'guitars',\n 'guru',\n 'gw',\n 'gy',\n 'hamburg',\n 'hangout',\n 'haus',\n 'healthcare',\n 'help',\n 'here',\n 'hermes',\n 'hiphop',\n 'hiv',\n 'hk',\n 'hm',\n 'hn',\n 'holdings',\n 'holiday',\n 'homes',\n 'horse',\n 'host',\n 'hosting',\n 'house',\n 'how',\n 'hr',\n 'ht',\n 'hu',\n 'ibm',\n 'id',\n 'ie',\n 'ifm',\n 'il',\n 'im',\n 'immo',\n 'immobilien',\n 'in',\n 'industries',\n 'infiniti',\n 'info',\n 'ing',\n 'ink',\n 'institute',\n 'insure',\n 'int',\n 'international',\n 'investments',\n 'io',\n 'iq',\n 'ir',\n 'irish',\n 'is',\n 'it',\n 'iwc',\n 'java',\n 'jcb',\n 'je',\n 'jetzt',\n 'jm',\n 'jo',\n 'jobs',\n 'joburg',\n 'jp',\n 'juegos',\n 'kaufen',\n 'kddi',\n 'ke',\n 'kg',\n 'kh',\n 'ki',\n 'kim',\n 'kitchen',\n 'kiwi',\n 'km',\n 'kn',\n 'koeln',\n 'komatsu',\n 'kp',\n 'kr',\n 'krd',\n 'kred',\n 'kw',\n 'ky',\n 'kyoto',\n 'kz',\n 'la',\n 'lacaixa',\n 'land',\n 'lat',\n 'latrobe',\n 'lawyer',\n 'lb',\n 'lc',\n 'lds',\n 'lease',\n 'leclerc',\n 'legal',\n 'lgbt',\n 'li',\n 'lidl',\n 'life',\n 'lighting',\n 'limited',\n 'limo',\n 'link',\n 'lk',\n 'loan',\n 'loans',\n 'london',\n 'lotte',\n 'lotto',\n 'love',\n 'lr',\n 'ls',\n 'lt',\n 'ltda',\n 'lu',\n 'luxe',\n 'luxury',\n 'lv',\n 'ly',\n 'ma',\n 'madrid',\n 'maif',\n 'maison',\n 'management',\n 'mango',\n 'market',\n 'marketing',\n 'markets',\n 'marriott',\n 'mc',\n 'md',\n 'me',\n 'media',\n 'meet',\n 'melbourne',\n 'meme',\n 'memorial',\n 'menu',\n 'mf',\n 'mg',\n 'mh',\n 'miami',\n 'mil',\n 'mini',\n 'mk',\n 'ml',\n 'mm',\n 'mma',\n 'mn',\n 'mo',\n 'mobi',\n 'moda',\n 'moe',\n 'monash',\n 'money',\n 'mormon',\n 'mortgage',\n 'moscow',\n 'motorcycles',\n 'mov',\n 'movie',\n 'mp',\n 'mq',\n 'mr',\n 'ms',\n 'mt',\n 'mtn',\n 'mtpc',\n 'mu',\n 'museum',\n 'mv',\n 'mw',\n 'mx',\n 'my',\n 'mz',\n 'na',\n 'nagoya',\n 'name',\n 'navy',\n 'nc',\n 'ne',\n 'net',\n 'network',\n 'neustar',\n 'new',\n 'news',\n 'nexus',\n 'nf',\n 'ng',\n 'ngo',\n 'nhk',\n 'ni',\n 'nico',\n 'ninja',\n 'nissan',\n 'nl',\n 'no',\n 'np',\n 'nr',\n 'nra',\n 'nrw',\n 'ntt',\n 'nu',\n 'nyc',\n 'nz',\n 'okinawa',\n 'om',\n 'one',\n 'ong',\n 'onl',\n 'online',\n 'ooo',\n 'org',\n 'organic',\n 'osaka',\n 'otsuka',\n 'ovh',\n 'pa',\n 'page',\n 'panerai',\n 'paris',\n 'partners',\n 'parts',\n 'party',\n 'pe',\n 'pf',\n 'pg',\n 'ph',\n 'pharmacy',\n 'photo',\n 'photography',\n 'photos',\n 'physio',\n 'piaget',\n 'pics',\n 'pictet',\n 'pictures',\n 'pink',\n 'pizza',\n 'pk',\n 'pl',\n 'place',\n 'plumbing',\n 'plus',\n 'pm',\n 'pn',\n 'pohl',\n 'poker',\n 'porn',\n 'post',\n 'pr',\n 'praxi',\n 'press',\n 'pro',\n 'prod',\n 'productions',\n 'prof',\n 'properties',\n 'property',\n 'ps',\n 'pt',\n 'pub',\n 'pw',\n 'py',\n 'qa',\n 'qpon',\n 'quebec',\n 'racing',\n 're',\n 'realtor',\n 'recipes',\n 'red',\n 'redstone',\n 'rehab',\n 'reise',\n 'reisen',\n 'reit',\n 'ren',\n 'rentals',\n 'repair',\n 'report',\n 'republican',\n 'rest',\n 'restaurant',\n 'review',\n 'reviews',\n 'rich',\n 'rio',\n 'rip',\n 'ro',\n 'rocks',\n 'rodeo',\n 'rs',\n 'rsvp',\n 'ru',\n 'ruhr',\n 'rw',\n 'ryukyu',\n 'sa',\n 'saarland',\n 'sale',\n 'samsung',\n 'sap',\n 'sarl',\n 'saxo',\n 'sb',\n 'sc',\n 'sca',\n 'scb',\n 'schmidt',\n 'scholarships',\n 'school',\n 'schule',\n 'schwarz',\n 'science',\n 'scot',\n 'sd',\n 'se',\n 'services',\n 'sew',\n 'sexy',\n 'sg',\n 'sh',\n 'shiksha',\n 'shoes',\n 'shriram',\n 'si',\n 'singles',\n 'site',\n 'sj',\n 'sk',\n 'sky',\n 'sl',\n 'sm',\n 'sn',\n 'so',\n 'social',\n 'software',\n 'sohu',\n 'solar',\n 'solutions',\n 'soy',\n 'space',\n 'spiegel',\n 'spreadbetting',\n 'sr',\n 'ss',\n 'st',\n 'study',\n 'style',\n 'su',\n 'sucks',\n 'supplies',\n 'supply',\n 'support',\n 'surf',\n 'surgery',\n 'suzuki',\n 'sv',\n 'sx',\n 'sy',\n 'sydney',\n 'systems',\n 'sz',\n 'taipei',\n 'tatar',\n 'tattoo',\n 'tax',\n 'tc',\n 'td',\n 'tech',\n 'technology',\n 'tel',\n 'temasek',\n 'tennis',\n 'tf',\n 'tg',\n 'th',\n 'tickets',\n 'tienda',\n 'tips',\n 'tires',\n 'tirol',\n 'tj',\n 'tk',\n 'tl',\n 'tm',\n 'tn',\n 'to',\n 'today',\n 'tokyo',\n 'tools',\n 'top',\n 'toshiba',\n 'tours',\n 'town',\n 'toys',\n 'tp',\n 'tr',\n 'trade',\n 'trading',\n 'training',\n 'travel',\n 'trust',\n 'tt',\n 'tui',\n 'tv',\n 'tw',\n 'tz',\n 'ua',\n 'ug',\n 'uk',\n 'um',\n 'university',\n 'uno',\n 'uol',\n 'us',\n 'uy',\n 'uz',\n 'va',\n 'vacations',\n 'vc',\n 've',\n 'vegas',\n 'ventures',\n 'versicherung',\n 'vet',\n 'vg',\n 'vi',\n 'viajes',\n 'video',\n 'villas',\n 'vision',\n 'vlaanderen',\n 'vn',\n 'vodka',\n 'vote',\n 'voting',\n 'voto',\n 'voyage',\n 'vu',\n 'wales',\n 'wang',\n 'watch',\n 'webcam',\n 'website',\n 'wed',\n 'wedding',\n 'wf',\n 'whoswho',\n 'wien',\n 'wiki',\n 'williamhill',\n 'win',\n 'wme',\n 'work',\n 'works',\n 'world',\n 'ws',\n 'wtc',\n 'wtf',\n 'xin',\n '测试',\n 'परीक्षा',\n '佛山',\n '慈善',\n '集团',\n '在线',\n '한국',\n 'ভারত',\n '八卦',\n 'موقع',\n 'বাংলা',\n '公益',\n '公司',\n '移动',\n '我爱你',\n 'москва',\n 'испытание',\n 'қаз',\n 'онлайн',\n 'сайт',\n 'срб',\n 'бел',\n '时尚',\n '테스트',\n '淡马锡',\n 'орг',\n '삼성',\n 'சிங்கப்பூர்',\n '商标',\n '商店',\n '商城',\n 'дети',\n 'мкд',\n 'טעסט',\n '中文网',\n '中信',\n '中国',\n '中國',\n '谷歌',\n 'భారత్',\n 'ලංකා',\n '測試',\n 'ભારત',\n 'भारत',\n 'آزمایشی',\n 'பரிட்சை',\n '网店',\n 'संगठन',\n '网络',\n 'укр',\n '香港',\n 'δοκιμή',\n '飞利浦',\n 'إختبار',\n '台湾',\n '台灣',\n '手机',\n 'мон',\n 'الجزائر',\n 'عمان',\n 'ایران',\n 'امارات',\n 'بازار',\n 'پاکستان',\n 'الاردن',\n 'بھارت',\n 'المغرب',\n 'السعودية',\n 'سودان',\n 'عراق',\n 'مليسيا',\n '政府',\n 'شبكة',\n 'გე',\n '机构',\n '组织机构',\n '健康',\n 'ไทย',\n 'سورية',\n 'рус',\n 'рф',\n 'تونس',\n 'みんな',\n 'グーグル',\n '世界',\n 'ਭਾਰਤ',\n '网址',\n '游戏',\n 'vermögensberater',\n 'vermögensberatung',\n '企业',\n '信息',\n 'مصر',\n 'قطر',\n '广东',\n 'இலங்கை',\n 'இந்தியா',\n 'հայ',\n '新加坡',\n 'فلسطين',\n 'テスト',\n '政务',\n 'xxx',\n 'xyz',\n 'yachts',\n 'yandex',\n 'ye',\n 'yodobashi',\n 'yoga',\n 'yokohama',\n 'youtube',\n 'yt',\n 'za',\n 'zm',\n 'zone',\n 'zuerich',\n 'zw',\n];\nconst INTERNAL_SUFFIXES = [\n 'local',\n 'internal',\n 'intranet',\n 'corp',\n 'lan',\n 'home',\n 'localdomain',\n 'arpa',\n];\nconst INTERNAL_COMPOUND_SUFFIXES = [\n 'svc\\\\.cluster\\\\.local',\n 'ec2\\\\.internal',\n 'compute\\\\.internal',\n];\n\nconst FILE_EXT_COLLISION_TLDS = [\n 'ac',\n 'am',\n 'cc',\n 'gs',\n 'hiv',\n 'in',\n 'is',\n 'it',\n 'java',\n 'la',\n 'md',\n 'ml',\n 'pl',\n 'py',\n 'rs',\n 'sh',\n 'so',\n 'tf',\n];\nconst COLLISION_TLD_SET = new Set(FILE_EXT_COLLISION_TLDS);\nconst GTLD_UNRESTRICTED = GTLD.filter((tld) => !COLLISION_TLD_SET.has(tld));\n\nconst TLD_EXACT = [...INTERNAL_COMPOUND_SUFFIXES, ...GTLD_UNRESTRICTED, ...INTERNAL_SUFFIXES].join(\n '|',\n);\nconst TLD_COLLISION = FILE_EXT_COLLISION_TLDS.join('|');\nconst LABEL = '[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?';\n\nconst HOST_EXACT = `(?:(?<![\\\\w.$-])(?<![^:/\\\\\\\\][/\\\\\\\\])(?:${LABEL}\\\\.)+(?:${TLD_EXACT})(?!\\\\.?\\\\w))`;\n\nconst HOST_COLLISION = `(?:(?:https?|sftp|ftps?|wss?)://(?:[^/@\\\\s]+@)?)((?:${LABEL}\\\\.)+(?:${TLD_COLLISION}))(?!\\\\.?\\\\w)`;\n\nfunction uncComputerPattern(separator: string): string {\n return `(?:${separator}${separator})([A-Za-z][A-Za-z0-9-]{0,14})(?=${separator}[A-Za-z0-9$])`;\n}\n\nconst UNC_COMPUTER = uncComputerPattern(BACKSLASH);\nconst UNC_COMPUTER_JSON = uncComputerPattern(JSON_BACKSLASH);\n\nconst SPN_HOST = '(?:\\\\b[A-Za-z][A-Za-z0-9]*/)([A-Za-z0-9][A-Za-z0-9.-]*)(?=@[A-Z0-9.-]+\\\\b)';\n\nconst HOST_CTX_KEY = '(?:host|hostname|computer)';\nconst HOST_VALUE = '[A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?';\nconst HOST_CTX = `(?:\\\\b${HOST_CTX_KEY}\\\\s*[=:]\\\\s*)(${HOST_VALUE})`;\n\nfunction anyCase(word: string): string {\n let pattern = '';\n\n for (const char of word) {\n const lower = char.toLowerCase();\n const upper = char.toUpperCase();\n pattern += lower === upper ? char : `[${lower}${upper}]`;\n }\n\n return pattern;\n}\n\nconst QUOTED_DOMAIN_ACCOUNT = `(?:\")(?!${WELL_KNOWN_DOMAIN}\\\\\\\\{1,2})(${NETBIOS_DOMAIN})(?=\\\\\\\\{1,2}${NOT_WINDOWS_FILENAME}${ACCOUNT_SEGMENT}\")`;\n\nconst KEY_WORD = '[A-Za-z_]*';\nconst JSON_HOST_KEY = [\n `${KEY_WORD}${anyCase('computer')}${KEY_WORD}`,\n `${KEY_WORD}${anyCase('domain')}[_-]?${anyCase('name')}`,\n `${anyCase('host')}(?:[_-]?${anyCase('name')})?`,\n anyCase('fqdn'),\n anyCase('domain'),\n `${anyCase('server')}[_-]?${anyCase('name')}`,\n `${anyCase('node')}[_-]?${anyCase('name')}`,\n `${anyCase('dns')}[_-]?${anyCase('name')}`,\n `${anyCase('machine')}[_-]?${anyCase('name')}`,\n `${anyCase('target')}[_-]?${anyCase('host')}`,\n].join('|');\nconst HOST_JSON_CTX = `(?:\"(?:${JSON_HOST_KEY})\"\\\\s*:\\\\s*\")(${HOST_VALUE})(?=\")`;\n\nconst NETBIOS_AGGRESSIVE = '(?:\\\\b(?:WIN|DESKTOP)-[A-Z0-9]{7,10}\\\\b)';\n\nconst SYSLOG_MONTH = '(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)';\nconst SYSLOG_BSD_TS = `${SYSLOG_MONTH}\\\\s+\\\\d{1,2}\\\\s+\\\\d{2}:\\\\d{2}:\\\\d{2}`;\nconst SYSLOG_ISO_TS =\n '\\\\d{4}-\\\\d{2}-\\\\d{2}[T ]\\\\d{2}:\\\\d{2}:\\\\d{2}(?:\\\\.\\\\d+)?(?:Z|[+-]\\\\d{2}:?\\\\d{2})?';\nconst SYSLOG_HOST_NAME = `${LABEL}(?:\\\\.${LABEL})*`;\nconst SYSLOG_HOST_LOOKAHEAD = '(?=\\\\s+[A-Za-z][A-Za-z0-9_.@-]*(?:\\\\[\\\\d+\\\\])?:)';\nconst SYSLOG_HOST = `(?:(?:${SYSLOG_BSD_TS}|${SYSLOG_ISO_TS})\\\\s+)(${SYSLOG_HOST_NAME})${SYSLOG_HOST_LOOKAHEAD}`;\n\nconst INVENTORY_PREFIX =\n '(?:[Ss][Rr][Vv]|[Ww][Ee][Bb]|[Dd][Bb]|[Aa][Pp][Pp]|[Hh][Oo][Ss][Tt]|[Nn][Oo][Dd][Ee]|[Pp][Oo][Dd])';\nconst INVENTORY_HOST = `(?:\\\\b${INVENTORY_PREFIX}-[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*-\\\\d+\\\\b)`;\n\nexport const hostnamesRule: SanitizeRule = {\n id: 'hosts',\n label: 'Hostnames & domains',\n description:\n 'FQDNs, UNC computer names, Kerberos SPN hosts, quoted JSON host fields, the domain half of a quoted DOMAIN\\\\account value and syslog host fields become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'HOST',\n patterns: [\n HOST_EXACT,\n HOST_COLLISION,\n UNC_COMPUTER,\n UNC_COMPUTER_JSON,\n SPN_HOST,\n HOST_CTX,\n HOST_JSON_CTX,\n QUOTED_DOMAIN_ACCOUNT,\n SYSLOG_HOST,\n ],\n aggressivePatterns: [NETBIOS_AGGRESSIVE, INVENTORY_HOST],\n jsonKeys: [\n 'hostname',\n 'host',\n 'fqdn',\n 'domain',\n 'computer',\n 'computerName',\n 'serverName',\n 'nodeName',\n 'dnsName',\n 'machineName',\n 'targetHost',\n ],\n jsonKeyContains: ['computer', 'domainname'],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst IPV4_OCTET = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)';\nconst IPV4 = `(?:(?<![\\\\d.])\\\\b${IPV4_OCTET}(?:\\\\.${IPV4_OCTET}){3}\\\\b(?!\\\\.\\\\d))`;\n\nconst IPV6_SEG = '[0-9a-fA-F]{1,4}';\nconst IPV6_FULL = `(?:${IPV6_SEG}:){7}${IPV6_SEG}`;\nconst IPV6_COMPRESSED = `(?:(?:${IPV6_SEG}:){1,7}:|(?:${IPV6_SEG}:){1,6}:${IPV6_SEG}|(?:${IPV6_SEG}:){1,5}(?::${IPV6_SEG}){1,2}|(?:${IPV6_SEG}:){1,4}(?::${IPV6_SEG}){1,3}|(?:${IPV6_SEG}:){1,3}(?::${IPV6_SEG}){1,4}|(?:${IPV6_SEG}:){1,2}(?::${IPV6_SEG}){1,5}|${IPV6_SEG}:(?::${IPV6_SEG}){1,6}|:(?:(?::${IPV6_SEG}){1,7}|:))`;\nconst IPV4_MAPPED = `(?:::ffff:${IPV4})`;\nconst IPV6 = `(?:(?<![A-Za-z0-9])(?:${IPV4_MAPPED}|${IPV6_FULL}|${IPV6_COMPRESSED})(?![A-Za-z0-9:])(?!\\\\.\\\\d)(?:%[A-Za-z0-9_.-]+)?)`;\n\nconst PTR_V4 = '(?:\\\\b(?:\\\\d{1,3}\\\\.){4}in-addr\\\\.arpa\\\\b)';\nconst PTR_V6 = '(?:\\\\b(?:[0-9a-fA-F]\\\\.){4,32}ip6\\\\.arpa\\\\b)';\n\nconst MAC_COLON = '(?:(?<!&)\\\\b[0-9A-Fa-f]{2}(?::[0-9A-Fa-f]{2}){5}\\\\b)';\nconst MAC_DASH = '(?:\\\\b[0-9A-Fa-f]{2}(?:-[0-9A-Fa-f]{2}){5}\\\\b)';\nconst MAC_CISCO = '(?:\\\\b[0-9A-Fa-f]{4}(?:\\\\.[0-9A-Fa-f]{4}){2}\\\\b)';\n\nfunction ipv4ToOctets(ip: string): number[] {\n return ip.split('.').map(Number);\n}\n\nfunction isNetmaskShape(octets: number[]): boolean {\n const bin = octets.map((octet) => octet.toString(2).padStart(8, '0')).join('');\n return /^1*0*$/.test(bin);\n}\n\nfunction isReservedIpv4(ip: string): boolean {\n const octets = ipv4ToOctets(ip);\n\n if (octets.length !== 4 || octets.some((octet) => Number.isNaN(octet))) {\n return false;\n }\n\n if (octets[0] === 127) {\n return true;\n }\n\n if (octets[0] === 0) {\n return true;\n }\n\n if (octets[0] === 169 && octets[1] === 254) {\n return true;\n }\n\n if (octets[0] >= 224 && octets[0] <= 239) {\n return true;\n }\n\n return isNetmaskShape(octets);\n}\n\nfunction validateIp(match: string): boolean {\n if (/^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(match)) {\n return !isReservedIpv4(match);\n }\n\n const withoutZone = match.split('%')[0] ?? match;\n\n if (withoutZone === '::' || withoutZone === '::1') {\n return false;\n }\n\n const mapped = /^::ffff:(\\d{1,3}(?:\\.\\d{1,3}){3})$/.exec(withoutZone);\n\n if (mapped?.[1]) {\n return !isReservedIpv4(mapped[1]);\n }\n\n return true;\n}\n\nexport const ipAddressesRule: SanitizeRule = {\n id: 'ips',\n label: 'Network addresses',\n description:\n 'IPv4/IPv6 addresses, MAC addresses and reverse-DNS (PTR) names become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'IP',\n patterns: [PTR_V4, PTR_V6, IPV6, IPV4, MAC_COLON, MAC_DASH, MAC_CISCO],\n validate: validateIp,\n jsonKeys: [\n 'ip',\n 'ipAddress',\n 'ip_address',\n 'clientIp',\n 'remoteAddr',\n 'srcIp',\n 'dstIp',\n 'sourceIp',\n 'destinationIp',\n 'xForwardedFor',\n 'mac',\n 'macAddress',\n ],\n};\n","const BLOCK_BYTES = 64;\nconst DIGEST_BYTES = 32;\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nconst INITIAL_STATE = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\nfunction rotr(value: number, bits: number): number {\n return ((value >>> bits) | (value << (32 - bits))) >>> 0;\n}\n\nfunction padMessage(message: Uint8Array): Uint8Array {\n const bitLength = message.length * 8;\n const paddedLength = Math.ceil((message.length + 9) / BLOCK_BYTES) * BLOCK_BYTES;\n const padded = new Uint8Array(paddedLength);\n\n padded.set(message);\n padded[message.length] = 0x80;\n\n const view = new DataView(padded.buffer);\n view.setUint32(paddedLength - 8, Math.floor(bitLength / 2 ** 32), false);\n view.setUint32(paddedLength - 4, bitLength >>> 0, false);\n\n return padded;\n}\n\nexport function sha256(message: Uint8Array): Uint8Array {\n const padded = padMessage(message);\n const view = new DataView(padded.buffer);\n const state = Uint32Array.from(INITIAL_STATE);\n const w = new Uint32Array(64);\n\n for (let offset = 0; offset < padded.length; offset += BLOCK_BYTES) {\n for (let i = 0; i < 16; i += 1) {\n w[i] = view.getUint32(offset + i * 4, false);\n }\n\n for (let i = 16; i < 64; i += 1) {\n const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ (w[i - 15] >>> 3);\n const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ (w[i - 2] >>> 10);\n w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;\n }\n\n let [a, b, c, d, e, f, g, h] = state;\n\n for (let i = 0; i < 64; i += 1) {\n const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + ch + K[i] + w[i]) >>> 0;\n const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n state[0] = (state[0] + a) >>> 0;\n state[1] = (state[1] + b) >>> 0;\n state[2] = (state[2] + c) >>> 0;\n state[3] = (state[3] + d) >>> 0;\n state[4] = (state[4] + e) >>> 0;\n state[5] = (state[5] + f) >>> 0;\n state[6] = (state[6] + g) >>> 0;\n state[7] = (state[7] + h) >>> 0;\n }\n\n const digest = new Uint8Array(DIGEST_BYTES);\n const digestView = new DataView(digest.buffer);\n\n for (let i = 0; i < 8; i += 1) {\n digestView.setUint32(i * 4, state[i], false);\n }\n\n return digest;\n}\n","import { sha256 } from '../shared/hmacSha256';\nimport type { SanitizeRule } from '../../types';\n\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\nfunction luhnCheck(digits: string): boolean {\n if (!/^\\d{13,19}$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n let doubleIt = false;\n\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let digit = Number(digits[i]);\n\n if (doubleIt) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n doubleIt = !doubleIt;\n }\n\n return sum % 10 === 0;\n}\n\nfunction ibanMod97(iban: string): boolean {\n const compact = iban.replace(/\\s/g, '').toUpperCase();\n\n if (!/^[A-Z]{2}\\d{2}[A-Z0-9]{10,30}$/.test(compact)) {\n return false;\n }\n\n const rearranged = compact.slice(4) + compact.slice(0, 4);\n const numeric = rearranged.replace(/[A-Z]/g, (char) => String(char.charCodeAt(0) - 55));\n let remainder = 0;\n\n for (let i = 0; i < numeric.length; i += 1) {\n remainder = (remainder * 10 + Number(numeric[i])) % 97;\n }\n\n return remainder === 1;\n}\n\nconst IBAN_COUNTRY_CODES = new Set([\n 'AD',\n 'AE',\n 'AL',\n 'AO',\n 'AT',\n 'AZ',\n 'BA',\n 'BE',\n 'BF',\n 'BG',\n 'BH',\n 'BI',\n 'BJ',\n 'BR',\n 'BY',\n 'CF',\n 'CG',\n 'CH',\n 'CI',\n 'CM',\n 'CR',\n 'CV',\n 'CY',\n 'CZ',\n 'DE',\n 'DJ',\n 'DK',\n 'DO',\n 'DZ',\n 'EE',\n 'EG',\n 'ES',\n 'FI',\n 'FO',\n 'FR',\n 'GA',\n 'GB',\n 'GE',\n 'GI',\n 'GL',\n 'GQ',\n 'GR',\n 'GT',\n 'GW',\n 'HN',\n 'HR',\n 'HU',\n 'IE',\n 'IL',\n 'IQ',\n 'IR',\n 'IS',\n 'IT',\n 'JO',\n 'KM',\n 'KW',\n 'KZ',\n 'LB',\n 'LC',\n 'LI',\n 'LT',\n 'LU',\n 'LV',\n 'LY',\n 'MA',\n 'MC',\n 'MD',\n 'ME',\n 'MG',\n 'MK',\n 'ML',\n 'MR',\n 'MT',\n 'MU',\n 'MZ',\n 'NE',\n 'NI',\n 'NL',\n 'NO',\n 'PK',\n 'PL',\n 'PS',\n 'PT',\n 'QA',\n 'RO',\n 'RS',\n 'RU',\n 'SA',\n 'SC',\n 'SD',\n 'SE',\n 'SI',\n 'SK',\n 'SM',\n 'SN',\n 'ST',\n 'SV',\n 'TD',\n 'TG',\n 'TL',\n 'TN',\n 'TR',\n 'UA',\n 'VA',\n 'VG',\n 'XK',\n]);\n\nfunction isIbanCountry(compact: string): boolean {\n return IBAN_COUNTRY_CODES.has(compact.slice(0, 2).toUpperCase());\n}\n\nfunction isHexHashLength(value: string): boolean {\n return /^(?:[A-Fa-f0-9]{32}|[A-Fa-f0-9]{40}|[A-Fa-f0-9]{64})$/.test(value);\n}\n\nfunction isCardSeparatorLayout(match: string): boolean {\n if (!/[ -]/.test(match)) {\n return true;\n }\n\n const groups = match.split(/[ -]/).map((group) => group.length);\n\n if (groups.some((length) => length === 0)) {\n return false;\n }\n\n if (\n groups.length === 3 &&\n groups[0] === 4 &&\n groups[1] === 6 &&\n (groups[2] === 4 || groups[2] === 5)\n ) {\n return true;\n }\n\n const last = groups[groups.length - 1];\n\n return (\n groups.length >= 2 &&\n groups.slice(0, -1).every((length) => length === 4) &&\n last >= 1 &&\n last <= 7\n );\n}\n\nfunction bitcoinBase58Check(address: string): boolean {\n const decoded = decodeBase58(address);\n\n if (!decoded || decoded.length < 5) {\n return false;\n }\n\n const payload = decoded.subarray(0, decoded.length - 4);\n const checksum = decoded.subarray(decoded.length - 4);\n const digest = sha256(sha256(payload));\n\n return (\n digest[0] === checksum[0] &&\n digest[1] === checksum[1] &&\n digest[2] === checksum[2] &&\n digest[3] === checksum[3]\n );\n}\n\nfunction decodeBase58(input: string): Uint8Array | null {\n const bytes: number[] = [0];\n\n for (let i = 0; i < input.length; i += 1) {\n let carry = BASE58_ALPHABET.indexOf(input[i]);\n\n if (carry === -1) {\n return null;\n }\n\n for (let j = 0; j < bytes.length; j += 1) {\n carry += bytes[j] * 58;\n bytes[j] = carry % 256;\n carry = Math.floor(carry / 256);\n }\n\n while (carry > 0) {\n bytes.push(carry % 256);\n carry = Math.floor(carry / 256);\n }\n }\n\n let leadingOnes = 0;\n\n while (leadingOnes < input.length && input[leadingOnes] === '1') {\n leadingOnes += 1;\n }\n\n let end = bytes.length;\n\n while (end > 0 && bytes[end - 1] === 0) {\n end -= 1;\n }\n\n const out = new Uint8Array(leadingOnes + end);\n\n for (let i = 0; i < end; i += 1) {\n out[leadingOnes + end - 1 - i] = bytes[i];\n }\n\n return out;\n}\n\nfunction isKnownCardIin(digits: string): boolean {\n const { length } = digits;\n const d2 = Number(digits.slice(0, 2));\n const d4 = Number(digits.slice(0, 4));\n\n switch (digits[0]) {\n case '4':\n return length === 13 || length === 16 || length === 19;\n case '5':\n return length === 16 && d2 >= 51 && d2 <= 55;\n case '2':\n return length === 16 && d4 >= 2221 && d4 <= 2720;\n case '3':\n if (length === 15) {\n return d2 === 34 || d2 === 37;\n }\n\n if (length === 14) {\n return d2 === 36 || d2 === 38 || d2 === 39 || (d4 >= 3000 && d4 <= 3059) || d4 === 3095;\n }\n\n return length >= 16 && length <= 19 && d4 >= 3528 && d4 <= 3589;\n case '6':\n return (\n length >= 16 &&\n length <= 19 &&\n (digits.startsWith('6011') ||\n digits.startsWith('62') ||\n digits.startsWith('64') ||\n digits.startsWith('65'))\n );\n default:\n return false;\n }\n}\n\nfunction validatePayment(match: string): boolean {\n const compactIban = match.replace(/\\s/g, '');\n\n if (/^[A-Za-z]{2}\\d{2}[A-Za-z0-9]+$/.test(compactIban)) {\n return !isHexHashLength(compactIban) && isIbanCountry(compactIban) && ibanMod97(match);\n }\n\n const compactPan = match.replace(/[ -]/g, '');\n\n if (/^[\\d -]+$/.test(match) && /^\\d{13,19}$/.test(compactPan)) {\n const grouped = /[ -]/.test(match);\n\n if (!grouped && compactPan.length > 16) {\n return false;\n }\n\n return isCardSeparatorLayout(match) && isKnownCardIin(compactPan) && luhnCheck(compactPan);\n }\n\n if (/^[13][A-HJ-NP-Za-km-z1-9]{25,34}$/.test(match)) {\n return bitcoinBase58Check(match);\n }\n\n return true;\n}\n\nconst CVV_KEY = '(?:[Cc][Vv][Vv]2?|[Cc][Vv][Cc]2?|[Cc][Ii][Dd])';\nconst EXP_KEY = '(?:[Ee]xp(?:iry|iration)?|[Ee]xp[_-]?[Dd]ate)';\nconst ROUTING_KEY = '(?:[Rr]outing(?:[_-]?[Nn]umber)?|[Aa][Bb][Aa])';\nconst ACCOUNT_KEY = '(?:[Aa]ccount[_-]?[Nn]umber|[Aa]cct)';\n\nexport const paymentInfoRule: SanitizeRule = {\n id: 'paymentInfo',\n label: 'Payment info',\n description:\n 'IBANs, card numbers (PAN, Luhn-checked), CVV/CVC, expiry dates and crypto addresses are redacted outright.',\n mode: 'mask',\n token: 'PAYMENT',\n patterns: [\n '(?:(?<![.\\\\d])\\\\b\\\\d(?:[ -]?\\\\d){12,18}\\\\b)',\n '(?:\\\\b[A-Z]{2}\\\\d{2}[A-Z0-9]{10,30}\\\\b)',\n '(?:\\\\b[A-Z]{2}\\\\d{2}(?: [A-Z0-9]{4}){2,7}(?: [A-Z0-9]{1,4})?\\\\b)',\n `(?:\\\\b${CVV_KEY}\\\\s*[=:]\\\\s*)(\\\\d{3,4}\\\\b)`,\n `(?:\\\\b${EXP_KEY}\\\\s*[=:]\\\\s*)((?:0[1-9]|1[0-2])[/-](?:\\\\d{2}|\\\\d{4})\\\\b)`,\n '(?:\\\\bbc1[a-z0-9]{25,39}\\\\b)',\n '(?:(?<![A-Za-z0-9])[13][A-HJ-NP-Za-km-z1-9]{25,34}(?![A-Za-z0-9]))',\n '(?:\\\\b0x[A-Fa-f0-9]{40}\\\\b)',\n ],\n aggressivePatterns: [\n '(?:(?<![\\\\\\\\/])\\\\b[A-Z]{6}[A-Z0-9]{2}(?:[A-Z0-9]{3})?\\\\b(?![\\\\\\\\/]))',\n `(?:\\\\b${ROUTING_KEY}\\\\s*[=:]\\\\s*)(\\\\d{9}\\\\b)`,\n `(?:\\\\b${ACCOUNT_KEY}\\\\s*[=:]\\\\s*)(\\\\d{8,12}\\\\b)`,\n ],\n validate: validatePayment,\n jsonKeys: [\n 'iban',\n 'cardNumber',\n 'pan',\n 'cvv',\n 'cvc',\n 'card_number',\n 'creditCard',\n 'cvv2',\n 'accountNumber',\n 'routingNumber',\n 'bic',\n 'swift',\n 'expiryDate',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction validatePhone(match: string): boolean {\n const digits = match.replace(/\\D/g, '');\n const national = digits.startsWith('00') ? digits.slice(2) : digits;\n return national.length >= 7 && national.length <= 15;\n}\n\nconst PHONE_KEY = '(?:telephone|phone|mobile|msisdn|cell|fax|tel)';\n\nexport const phoneNumbersRule: SanitizeRule = {\n id: 'phoneNumbers',\n label: 'Phone numbers',\n description:\n 'Phone numbers become a stable <PHONE:…> token — the same number maps to the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'PHONE',\n patterns: [\n '(?:(?<![A-Za-z0-9])\\\\+[1-9](?:[\\\\s().-]*\\\\d){6,14}(?!\\\\d))',\n '(?:\\\\(\\\\d{3}\\\\)\\\\s?\\\\d{3}-\\\\d{4}(?!\\\\d))',\n '(?:\\\\b\\\\d{3}-\\\\d{3}-\\\\d{4}\\\\b)',\n '(?:\\\\b1-\\\\d{3}-\\\\d{3}-\\\\d{4}\\\\b)',\n '(?:\\\\b0\\\\d{2}-\\\\d{3}-\\\\d{2}-\\\\d{2}\\\\b)',\n '(?:\\\\b0\\\\d{2}\\\\s\\\\d{3}\\\\s\\\\d{2}\\\\s\\\\d{2}\\\\b)',\n '(?:(?<![.\\\\d-])\\\\b00[1-9](?:[\\\\s().-]*\\\\d){7,13}(?!\\\\w)(?!-[\\\\dA-Fa-f]))',\n '(?:\\\\b(?:tel|sms):)(\\\\+?[1-9](?:[\\\\s().-]*\\\\d){6,14})(?!\\\\d)',\n `(?:\\\\b${PHONE_KEY}\\\\s*[=:]\\\\s*)(\\\\+?[0-9](?:[\\\\s().-]*\\\\d){6,14})(?!\\\\d)`,\n ],\n validate: validatePhone,\n jsonKeys: [\n 'phone',\n 'phoneNumber',\n 'phone_number',\n 'mobile',\n 'mobileNumber',\n 'cell',\n 'telephone',\n 'tel',\n 'fax',\n 'msisdn',\n 'contactNumber',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst ENTROPY_THRESHOLD = 3.5;\n\nfunction shannonEntropy(value: string): number {\n const { length } = value;\n\n if (length === 0) {\n return 0;\n }\n\n const freq: Record<string, number> = {};\n\n for (let i = 0; i < length; i += 1) {\n const char = value[i];\n freq[char] = (freq[char] ?? 0) + 1;\n }\n\n return Object.values(freq).reduce((entropy, count) => {\n const p = count / length;\n\n return entropy - p * Math.log2(p);\n }, 0);\n}\n\nfunction isHexBlob(match: string): boolean {\n return match.length >= 32 && /^[A-Fa-f0-9]+$/.test(match);\n}\n\nfunction isBase64Blob(match: string): boolean {\n return match.length >= 40 && /^[A-Za-z0-9+/]+=*$/.test(match);\n}\n\nfunction validateSecret(match: string): boolean {\n if (isHexBlob(match)) {\n return shannonEntropy(match) > ENTROPY_THRESHOLD;\n }\n\n if (isBase64Blob(match)) {\n return (\n shannonEntropy(match) > ENTROPY_THRESHOLD && /[A-Za-z]/.test(match) && /[0-9+/]/.test(match)\n );\n }\n\n return true;\n}\n\nconst CONTEXT_KEYS =\n '(?:api[_-]?key|apikey|access[_-]?token|refresh[_-]?token|id[_-]?token|client[_-]?secret|secret[_-]?key|private[_-]?key|password|passwd|pwd|pass|auth[_-]?token|signing[_-]?key)';\n\nconst CONTEXT_VALUE = '[^\\\\s,;}\"\\']{4,}';\n\nconst CLI_FLAGS = '(?:password|secret|token|api-key|apikey|access-token|client-secret)';\n\nexport const secretsRule: SanitizeRule = {\n id: 'secrets',\n label: 'Tokens & credentials',\n description:\n 'Bearer tokens, JWTs and API keys are redacted outright — they are not meant to be traced.',\n mode: 'mask',\n token: 'SECRET',\n patterns: [\n '(?:(?:Bearer|bearer|BEARER)\\\\s+)([A-Za-z0-9._\\\\-+/=]{8,})',\n '(?:(?:Basic|basic|BASIC)\\\\s+)([A-Za-z0-9+/]{8,}={0,2})',\n '(?:(?<![A-Za-z0-9_-])eyJ[A-Za-z0-9_-]{8,}\\\\.[A-Za-z0-9_-]{8,}(?:\\\\.[A-Za-z0-9_-]{8,})?)',\n '(?:-----BEGIN (?:(?:RSA |EC |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY|CERTIFICATE)-----[A-Za-z0-9+/=\\\\s\\\\\\\\]+?-----END (?:(?:RSA |EC |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY|CERTIFICATE)-----)',\n '(?:\\\\b(?:AKIA|ASIA|ABIA|ACCA)[A-Z0-9]{16}\\\\b)',\n '(?:(?:aws_secret_access_key|AWS_SECRET_ACCESS_KEY)\\\\s*[=:]\\\\s*)([A-Za-z0-9/+=]{30,})',\n '(?:github_pat_[A-Za-z0-9_]{22,})',\n '(?:gh[pousr]_[A-Za-z0-9]{36,})',\n '(?:xox[abprs]-[A-Za-z0-9-]{10,})',\n '(?:hooks\\\\.slack\\\\.com/services/[A-Za-z0-9/_-]{16,})',\n '(?:AIza[A-Za-z0-9_-]{35})',\n '(?:(?:sk_live_|sk_test_|rk_live_|rk_test_)[A-Za-z0-9]{16,})',\n '(?:sk-proj-[A-Za-z0-9_-]{16,})',\n '(?:sk-[A-Za-z0-9]{20,})',\n // Kept as a lookbehind: `.{0,60}` asserts a nearby keyword rather than an adjacent prefix, so\n // one `Twilio` has to stay reusable by every identifier that follows it.\n '(?:(?<=(?:[Tt]wilio.{0,60}|\\\\b(?:[Aa]ccount[Ss]id|[Aa]uth[Tt]oken|[Ss]id)\\\\s*[=:]\\\\s*))(?:AC|SK)[0-9A-Fa-f]{32})',\n '(?:SG\\\\.[A-Za-z0-9_-]{10,}\\\\.[A-Za-z0-9_-]{10,})',\n '(?:npm_[A-Za-z0-9]{36,})',\n '(?:[?&][Ss]ig=)([^&\\\\s\"\\']{16,})',\n '(?:[a-zA-Z][a-zA-Z0-9+.-]*://)([^/@\\\\s:]+:[^/@\\\\s]+@)',\n `(?:--${CLI_FLAGS}(?:\\\\s+|=)\"?)([^\\\\s\"']{4,})`,\n `(?:\\\\b${CONTEXT_KEYS}\"?\\\\s*[=:]\\\\s*\"?)(${CONTEXT_VALUE})`,\n ],\n aggressivePatterns: [\n '(?:(?<![A-Za-z0-9+/])[A-Za-z0-9+/]{40,}={0,2}(?![A-Za-z0-9+/=]))',\n '(?:\\\\b[A-Fa-f0-9]{32,}\\\\b)',\n ],\n validate: validateSecret,\n jsonKeys: [\n 'password',\n 'token',\n 'authorization',\n 'apiKey',\n 'secret',\n 'accessToken',\n 'refreshToken',\n 'passwd',\n 'pwd',\n 'pass',\n 'clientSecret',\n 'privateKey',\n 'secretKey',\n 'apiSecret',\n 'credentials',\n 'auth',\n 'xApiKey',\n 'idToken',\n 'awsSecretAccessKey',\n 'signature',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst COOKIE_VALUE = '[^;\\\\s]{8,}';\n\nexport const sessionCookiesRule: SanitizeRule = {\n id: 'sessionCookies',\n label: 'Session cookies',\n description: 'Session identifiers (sessionid, sid, JSESSIONID, PHPSESSID) are redacted outright.',\n mode: 'mask',\n token: 'SESSION',\n patterns: [\n `(?:(?<![\\\\w-])(?:[Ss]essionid|[Ss]ession_id|sessionId|SESSIONID)=${COOKIE_VALUE})`,\n `(?:(?<![\\\\w-])sid=${COOKIE_VALUE})`,\n `(?:PHPSESSID=${COOKIE_VALUE})`,\n `(?:JSESSIONID=${COOKIE_VALUE})`,\n `(?:ASP\\\\.NET_SessionId=${COOKIE_VALUE})`,\n `(?:ASPSESSIONID[A-Za-z0-9]*=${COOKIE_VALUE})`,\n `(?:connect\\\\.sid=${COOKIE_VALUE})`,\n `(?:laravel_session=${COOKIE_VALUE})`,\n `(?:_session_id=${COOKIE_VALUE})`,\n `(?:(?:csrftoken|csrf_token|XSRF-TOKEN|xsrf-token)=${COOKIE_VALUE})`,\n `(?:remember_token=${COOKIE_VALUE})`,\n `(?:(?:SSESS|SESS)[A-Fa-f0-9]{32}=${COOKIE_VALUE})`,\n `(?:[Ss]et-[Cc]ookie:\\\\s*)([^;=\\\\s]+=${COOKIE_VALUE})`,\n ],\n aggressivePatterns: [\n `(?:(?<![\\\\w-])[\\\\w-]*session[\\\\w-]*=${COOKIE_VALUE})`,\n `(?:(?<![\\\\w-])[\\\\w-]*token=${COOKIE_VALUE})`,\n ],\n jsonKeys: ['sessionId', 'sid', 'cookie', 'cookies', 'setCookie', 'jsessionid', 'csrfToken'],\n};\n","import type { SanitizeRule } from '../../types';\nimport {\n ACCOUNT_SEGMENT,\n BACKSLASH,\n JSON_BACKSLASH,\n NETBIOS_DOMAIN,\n NOT_WINDOWS_FILENAME,\n WELL_KNOWN_DOMAIN,\n} from '../shared/windowsAccounts';\n\nconst EMAIL_LOCAL = '[A-Za-z0-9._%+-]+';\nconst EMAIL_DOMAIN = '[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}';\nconst EMAIL = `(?:\\\\b${EMAIL_LOCAL}@${EMAIL_DOMAIN})`;\nconst EMAIL_IP_LITERAL = `(?:\\\\b${EMAIL_LOCAL}@\\\\[[0-9a-fA-F.:]+\\\\])`;\n\nconst USER_SEG_SIMPLE = ACCOUNT_SEGMENT;\n\nconst NOT_GUID = '(?![0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-)';\nconst ACCOUNT_END = '(?![A-Za-z0-9_$\\\\\\\\/-])';\n\nfunction domainUserPattern(separator: string): string {\n const winDomainExclude = `${WELL_KNOWN_DOMAIN}${separator}`;\n const pathRoot = `(?:\\\\b(?:HKLM|HKCU|HKU|HKCR|HKEY_[A-Z_]+)|\\\\b[A-Za-z]:)${separator}`;\n const notUnderPathRoot = `(?<!${pathRoot}(?:(?! [-/])[^<>'\"\\\\n])*)`;\n const domain = `(?:^|[^\\\\\\\\.-])\\\\b${NETBIOS_DOMAIN}${separator}`;\n\n return `(?:(?:${domain})(?<!${winDomainExclude})${NOT_WINDOWS_FILENAME}${NOT_GUID}(${USER_SEG_SIMPLE})${ACCOUNT_END}${notUnderPathRoot})`;\n}\n\nconst DOMAIN_USER = domainUserPattern(BACKSLASH);\nconst DOMAIN_USER_JSON = domainUserPattern(JSON_BACKSLASH);\n\nconst SID = '(?:\\\\bS-1-(?:\\\\d+-){1,14}\\\\d+\\\\b)';\n\nconst VALUE_WITH_LETTER = '[\\\\w.@+-]*[A-Za-z][\\\\w.@+-]*';\nconst LDAP_DN_SINGLE = `(?:\\\\b(?:uid|sAMAccountName)=)(${VALUE_WITH_LETTER})`;\nconst CN_VALUE = \"(?:[A-Za-z0-9.'-]+(?: [A-Za-z0-9.'-]+){0,3})\";\nconst LDAP_DN_CN = `(?:\\\\bcn=)(${CN_VALUE})`;\n\nconst ARN_USER = '(?::user/)([\\\\w.@+=,-]+)';\nconst ARN_ASSUMED_ROLE_SESSION = '(?::assumed-role/[\\\\w+=,.@-]+/)([\\\\w.@+=,-]+)';\n\nconst K8S_SERVICE_ACCOUNT = '(?:\\\\bsystem:serviceaccount:[A-Za-z0-9-]+:)([A-Za-z0-9-]+)';\n\nconst SSHD_FOR_USER = '(?:(?:\\\\bfor (?:invalid )?user|\\\\b[Ii]nvalid user)\\\\s+)([A-Za-z0-9._-]+)';\nconst SSHD_RUSER = '(?:\\\\bruser=)([A-Za-z0-9._-]+)';\nconst SSHD_LOGNAME = '(?:\\\\blogname=)([A-Za-z0-9._-]+)';\nconst SUDO_USER = '(?:\\\\bsudo:\\\\s+)([A-Za-z0-9._-]+)(?=\\\\s+:)';\n\nconst GENERIC_KEY =\n '(?:user|username|login|account|owner|actor|principal|requester|createdBy|modifiedBy|assignee|operator)';\nconst GENERIC_CTX = `(?:\\\\b${GENERIC_KEY}\\\\s*[=:]\\\\s*)(${VALUE_WITH_LETTER})`;\n\nconst SLACK_USER_ID_AGGRESSIVE = '(?:\\\\bU[A-Z0-9]{8,10}\\\\b)';\n\nconst SYSTEM_ACCOUNTS = new Set([\n 'root',\n 'system',\n 'daemon',\n 'nobody',\n 'www-data',\n 'nginx',\n 'sshd',\n 'syslog',\n]);\n\nfunction isWellKnownWindowsAccount(match: string): boolean {\n const upper = match.toUpperCase();\n\n if (upper === 'SYSTEM' || upper === 'LOCAL' || upper === 'NETWORK' || upper === 'ANONYMOUS') {\n return true;\n }\n\n return match.endsWith('$');\n}\n\nfunction isWellKnownSid(match: string): boolean {\n if (match === 'S-1-1-0') {\n return true;\n }\n\n if (/^S-1-5-(?:18|19|20)$/.test(match)) {\n return true;\n }\n\n return /^S-1-5-32-\\d+$/.test(match);\n}\n\nfunction validateUser(match: string): boolean {\n if (isWellKnownWindowsAccount(match)) {\n return false;\n }\n\n if (isWellKnownSid(match)) {\n return false;\n }\n\n return !SYSTEM_ACCOUNTS.has(match.toLowerCase());\n}\n\nexport const usersRule: SanitizeRule = {\n id: 'users',\n label: 'Usernames & emails',\n description:\n 'Email addresses and account identifiers (DOMAIN\\\\user, SIDs, ARNs, LDAP DNs, sshd/PAM context) become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'USER',\n patterns: [\n EMAIL_IP_LITERAL,\n EMAIL,\n DOMAIN_USER,\n DOMAIN_USER_JSON,\n SID,\n LDAP_DN_SINGLE,\n LDAP_DN_CN,\n ARN_USER,\n ARN_ASSUMED_ROLE_SESSION,\n K8S_SERVICE_ACCOUNT,\n SSHD_FOR_USER,\n SSHD_RUSER,\n SSHD_LOGNAME,\n SUDO_USER,\n GENERIC_CTX,\n ],\n aggressivePatterns: [SLACK_USER_ID_AGGRESSIVE],\n validate: validateUser,\n jsonKeys: [\n 'email',\n 'username',\n 'user',\n 'emailAddress',\n 'mail',\n 'userEmail',\n 'user_name',\n 'login',\n 'account',\n 'samAccountName',\n 'userPrincipalName',\n 'upn',\n 'actor',\n 'principal',\n 'owner',\n 'createdBy',\n 'modifiedBy',\n 'firstName',\n 'lastName',\n 'fullName',\n 'displayName',\n 'givenName',\n 'surname',\n 'userId',\n 'uid',\n ],\n jsonKeyContains: ['owner', 'username'],\n};\n","import type { BuiltinRuleId, SanitizeRule } from '../types';\nimport { geoLocationRule } from './definitions/geoLocation';\nimport { govIdentifiersRule } from './definitions/govIdentifiers';\nimport { healthInfoRule } from './definitions/healthInfo';\nimport { homePathsRule } from './definitions/homePaths';\nimport { hostnamesRule } from './definitions/hostnames';\nimport { ipAddressesRule } from './definitions/ipAddresses';\nimport { paymentInfoRule } from './definitions/paymentInfo';\nimport { phoneNumbersRule } from './definitions/phoneNumbers';\nimport { secretsRule } from './definitions/secrets';\nimport { sessionCookiesRule } from './definitions/sessionCookies';\nimport { usersRule } from './definitions/users';\n\n/**\n * Every rule shipped with this package, in default priority order.\n *\n * Order matters: when two rules could match at the same position, the one listed first wins.\n * Credential-shaped rules come first so a token is not partially consumed by a broader\n * identifier rule.\n */\nexport const builtinRules: readonly SanitizeRule[] = [\n secretsRule,\n sessionCookiesRule,\n paymentInfoRule,\n govIdentifiersRule,\n healthInfoRule,\n phoneNumbersRule,\n ipAddressesRule,\n hostnamesRule,\n usersRule,\n geoLocationRule,\n homePathsRule,\n];\n\n/** Identifiers of {@link builtinRules}, in the same order. */\nexport const builtinRuleIds: readonly BuiltinRuleId[] = builtinRules.map(\n (rule) => rule.id as BuiltinRuleId,\n);\n\nconst builtinsById = new Map<string, SanitizeRule>(builtinRules.map((rule) => [rule.id, rule]));\n\n/**\n * Looks up a built-in rule by identifier.\n *\n * @returns The rule, or `undefined` when the identifier is not built in.\n */\nexport function getBuiltinRule(id: string): SanitizeRule | undefined {\n return builtinsById.get(id);\n}\n","import type { NeverRedactOptions } from '../types';\nimport { InvalidOptionError } from './errors';\n\nexport interface AllowList {\n empty: boolean;\n values: ReadonlySet<string>;\n pattern: RegExp | null;\n byRule: ReadonlyMap<string, ReadonlySet<string>>;\n}\n\nexport function patternSource(pattern: string | RegExp): string {\n return typeof pattern === 'string' ? pattern : pattern.source;\n}\n\nfunction compileAnchored(patterns: readonly (string | RegExp)[]): RegExp | null {\n const sources = patterns.map(patternSource).filter((source) => source.length > 0);\n\n if (sources.length === 0) {\n return null;\n }\n\n const combined = sources.map((source) => `(?:${source})`).join('|');\n\n try {\n return new RegExp(`^(?:${combined})$`, 'u');\n } catch (cause) {\n throw new InvalidOptionError(\n `neverRedact.patterns contains an invalid regular expression: ${String(cause)}`,\n );\n }\n}\n\nexport function createAllowList(options: NeverRedactOptions | undefined): AllowList {\n const values = new Set((options?.values ?? []).filter((value) => value.length > 0));\n const pattern = compileAnchored(options?.patterns ?? []);\n const byRule = new Map<string, Set<string>>();\n\n for (const entry of options?.byRule ?? []) {\n const existing = byRule.get(entry.ruleId) ?? new Set<string>();\n\n for (const value of entry.values) {\n if (value.length > 0) {\n existing.add(value);\n }\n }\n\n byRule.set(entry.ruleId, existing);\n }\n\n return {\n empty: values.size === 0 && pattern === null && byRule.size === 0,\n values,\n pattern,\n byRule,\n };\n}\n\nexport function isAllowed(allow: AllowList, ruleId: string, value: string): boolean {\n if (allow.empty) {\n return false;\n }\n\n if (allow.values.has(value)) {\n return true;\n }\n\n if (allow.byRule.get(ruleId)?.has(value) === true) {\n return true;\n }\n\n return allow.pattern !== null && allow.pattern.test(value);\n}\n","import type { KeyEncoding, SanitizeRule } from '../types';\nimport { MASK_TOKEN_PREFIX } from './constants';\nimport { bytesToHex, createHmacSha256, hexToBytes } from './hmac';\n\nconst TOKEN_HEX_LENGTH = 16;\nconst TOKEN_BYTES = TOKEN_HEX_LENGTH / 2;\n\nconst textEncoder = new TextEncoder();\n\nexport type Pseudonymizer = (ruleId: string, value: string) => string;\n\nexport function createPseudonymizer(key: string, encoding: KeyEncoding): Pseudonymizer {\n const keyBytes = encoding === 'utf8' ? textEncoder.encode(key) : hexToBytes(key);\n const sign = createHmacSha256(keyBytes);\n const cache = new Map<string, string>();\n\n return (ruleId, value) => {\n const cacheKey = `${ruleId}\\u0000${value}`;\n const cached = cache.get(cacheKey);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const digest = sign(textEncoder.encode(cacheKey));\n const token = bytesToHex(digest.subarray(0, TOKEN_BYTES));\n\n cache.set(cacheKey, token);\n return token;\n };\n}\n\nexport function replacementPrefix(rule: SanitizeRule): string {\n if (rule.mode === 'mask') {\n return MASK_TOKEN_PREFIX;\n }\n\n return rule.token ?? rule.id.toUpperCase();\n}\n","export function matchParen(source: string, openIndex: number): number {\n let depth = 0;\n let inClass = false;\n\n for (let index = openIndex; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n\n if (inClass) {\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n continue;\n }\n\n if (char === '(') {\n depth += 1;\n } else if (char === ')') {\n depth -= 1;\n\n if (depth === 0) {\n return index;\n }\n }\n }\n\n return -1;\n}\n\nexport function countCapturingGroups(source: string): number {\n let count = 0;\n let inClass = false;\n\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n\n if (inClass) {\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n continue;\n }\n\n if (char !== '(') {\n continue;\n }\n\n const next = source.slice(index, index + 4);\n\n if (\n next.startsWith('(?:') ||\n next.startsWith('(?=') ||\n next.startsWith('(?!') ||\n next.startsWith('(?<=') ||\n next.startsWith('(?<!')\n ) {\n continue;\n }\n\n count += 1;\n }\n\n return count;\n}\n\nexport function deriveGateSource(source: string): string {\n let output = '';\n let inClass = false;\n\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n output += source.slice(index, index + 2);\n index += 1;\n continue;\n }\n\n if (inClass) {\n output += char;\n\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n output += char;\n continue;\n }\n\n if (char === '(' && source.startsWith('(?<=', index)) {\n const close = matchParen(source, index);\n\n if (close === -1) {\n output += char;\n continue;\n }\n\n output += `(?:${source.slice(index + 4, close)})`;\n index = close;\n continue;\n }\n\n if (\n char === '(' &&\n (source.startsWith('(?<!', index) ||\n source.startsWith('(?=', index) ||\n source.startsWith('(?!', index))\n ) {\n const close = matchParen(source, index);\n\n if (close === -1) {\n output += char;\n continue;\n }\n\n index = close;\n continue;\n }\n\n output += char;\n }\n\n return output;\n}\n\nexport function lineHasAnyChar(line: string, chars: string): boolean {\n for (let index = 0; index < line.length; index += 1) {\n if (chars.includes(line[index]!)) {\n return true;\n }\n }\n\n return false;\n}\n","import type { SanitizeRule } from '../types';\nimport type { AllowList } from './allowlist';\nimport { InvalidRuleError } from './errors';\nimport { replacementPrefix, type Pseudonymizer } from './pseudonymize';\nimport { countCapturingGroups, deriveGateSource } from './regexSource';\n\nexport interface CompiledFragment {\n regex: RegExp;\n hasValueGroup: boolean;\n}\n\nexport interface CompiledRule {\n id: string;\n fragments: CompiledFragment[];\n gate: RegExp | null;\n gateChars: string | null;\n}\n\nexport interface RuleContext {\n compiled: CompiledRule[];\n rules: SanitizeRule[];\n ruleIds: string[];\n rulesById: Map<string, SanitizeRule>;\n prefixById: Map<string, string>;\n pseudonymize: Pseudonymizer;\n allow: AllowList;\n contextChars: number;\n json: boolean;\n}\n\nconst SKIP_REGEX_GATE = new Set(['ips', 'hosts']);\n\nfunction gateCharsFor(ruleId: string, aggressive: boolean): string | null {\n if (ruleId === 'phoneNumbers') {\n return '0123456789';\n }\n\n if (ruleId === 'paymentInfo' && !aggressive) {\n return '0123456789';\n }\n\n return null;\n}\n\nfunction compileOne(rule: SanitizeRule, aggressive: boolean): CompiledRule | null {\n const patterns = aggressive\n ? [...rule.patterns, ...(rule.aggressivePatterns ?? [])]\n : rule.patterns;\n\n if (patterns.length === 0) {\n return null;\n }\n\n const source = patterns.join('|');\n const fragments: CompiledFragment[] = [];\n\n for (const pattern of patterns) {\n try {\n fragments.push({\n regex: new RegExp(pattern, 'gu'),\n hasValueGroup: countCapturingGroups(pattern) === 1,\n });\n } catch (cause) {\n throw new InvalidRuleError(`Failed to compile rule \"${rule.id}\": ${String(cause)}`);\n }\n }\n\n const gateSource = patterns.map(deriveGateSource).join('|');\n let gate: RegExp | null = null;\n\n if (!SKIP_REGEX_GATE.has(rule.id) && gateSource.length > 0 && gateSource !== source) {\n try {\n gate = new RegExp(gateSource, 'gu');\n } catch {\n gate = null;\n }\n }\n\n return {\n id: rule.id,\n fragments,\n gate,\n gateChars: gateCharsFor(rule.id, aggressive),\n };\n}\n\nexport function compileRules(rules: SanitizeRule[], aggressive: boolean): CompiledRule[] {\n const compiled: CompiledRule[] = [];\n\n for (const rule of rules) {\n const one = compileOne(rule, aggressive);\n\n if (one) {\n compiled.push(one);\n }\n }\n\n return compiled;\n}\n\nexport interface RuleContextInput {\n rules: SanitizeRule[];\n aggressive: boolean;\n pseudonymize: Pseudonymizer;\n allow: AllowList;\n contextChars: number;\n json: boolean;\n}\n\nexport function createRuleContext(input: RuleContextInput): RuleContext {\n const { rules } = input;\n\n return {\n compiled: compileRules(rules, input.aggressive),\n rules,\n ruleIds: rules.map((rule) => rule.id),\n rulesById: new Map(rules.map((rule) => [rule.id, rule])),\n prefixById: new Map(rules.map((rule) => [rule.id, replacementPrefix(rule)])),\n pseudonymize: input.pseudonymize,\n allow: input.allow,\n contextChars: input.contextChars,\n json: input.json,\n };\n}\n\nexport function buildReplacement(ctx: RuleContext, ruleId: string, value: string): string {\n return `<${ctx.prefixById.get(ruleId) ?? ruleId.toUpperCase()}:${ctx.pseudonymize(ruleId, value)}>`;\n}\n","import type { LineOptions } from '../types';\nimport { DEFAULT_LINE_OVERLAP_CHARS, DEFAULT_MAX_LINE_CHARS } from './constants';\nimport { InvalidOptionError } from './errors';\n\nexport interface LineSplitter {\n push(chunk: string): string[];\n flush(): string[];\n}\n\nfunction extractLines(buffer: string): { lines: string[]; rest: string } {\n const lines: string[] = [];\n let start = 0;\n\n for (let i = 0; i < buffer.length; i += 1) {\n if (buffer[i] === '\\n') {\n lines.push(buffer.slice(start, i + 1));\n start = i + 1;\n }\n }\n\n return { lines, rest: buffer.slice(start) };\n}\n\nexport function createLineSplitter(options: LineOptions = {}): LineSplitter {\n const maxLineChars = options.maxLineChars ?? DEFAULT_MAX_LINE_CHARS;\n const overlapChars = options.overlapChars ?? DEFAULT_LINE_OVERLAP_CHARS;\n\n if (maxLineChars < 1) {\n throw new InvalidOptionError('lines.maxLineChars must be at least 1.');\n }\n\n if (overlapChars < 0 || overlapChars >= maxLineChars) {\n throw new InvalidOptionError(\n `lines.overlapChars must be between 0 and lines.maxLineChars - 1 (${maxLineChars - 1}), got ${overlapChars}.`,\n );\n }\n\n let carry = '';\n\n function push(chunk: string): string[] {\n carry += chunk;\n\n const { lines, rest } = extractLines(carry);\n carry = rest;\n\n while (carry.length > maxLineChars) {\n const cut = carry.length - overlapChars;\n lines.push(carry.slice(0, cut));\n carry = carry.slice(cut);\n }\n\n return lines;\n }\n\n function flush(): string[] {\n if (carry.length === 0) {\n return [];\n }\n\n const rest = carry;\n carry = '';\n return [rest];\n }\n\n return { push, flush };\n}\n","import type { SanitizeSegment } from '../types';\nimport { isAllowed } from './allowlist';\nimport { buildReplacement, type CompiledRule, type RuleContext } from './compile';\nimport { lineHasAnyChar } from './regexSource';\n\nexport interface RedactMatch {\n ruleId: string;\n original: string;\n replacement: string;\n index: number;\n contextBefore?: string;\n contextAfter?: string;\n}\n\nexport interface RedactResult {\n output: string;\n counts: Record<string, number>;\n matches: RedactMatch[];\n segments?: {\n before: SanitizeSegment[];\n after: SanitizeSegment[];\n };\n}\n\nexport interface RedactOptions {\n withSegments?: boolean;\n withMatches?: boolean;\n}\n\nexport function sliceContext(\n text: string,\n index: number,\n length: number,\n chars: number,\n): { contextBefore: string; contextAfter: string } {\n return {\n contextBefore: text.slice(Math.max(0, index - chars), index),\n contextAfter: text.slice(index + length, index + length + chars),\n };\n}\n\n/**\n * One live match per pattern fragment. Fragments are scanned separately rather than as a single\n * alternation, so that a fragment whose consumed prefix begins earlier cannot pre-empt a\n * higher-priority fragment that matches the same value offset.\n */\ninterface FragmentCursor {\n ruleIndex: number;\n fragmentIndex: number;\n ruleId: string;\n regex: RegExp;\n hasValueGroup: boolean;\n active: boolean;\n start: number;\n original: string;\n}\n\n/** Moves a cursor to its next match whose value starts at or after `minStart`. */\nfunction advance(cursor: FragmentCursor, line: string, minStart: number): void {\n const { regex } = cursor;\n\n for (;;) {\n // Never scan past the floor: a fragment that overshot it would hide a shorter match starting\n // inside the text its own previous match covered.\n if (regex.lastIndex > minStart) {\n regex.lastIndex = minStart;\n }\n\n const match = regex.exec(line);\n\n if (match === null) {\n cursor.active = false;\n return;\n }\n\n const original = (cursor.hasValueGroup ? match[1] : undefined) ?? match[0];\n const start = match.index + match[0].length - original.length;\n\n if (match[0].length === 0) {\n regex.lastIndex += 1;\n } else if (start > match.index) {\n // Resume at the value rather than past it: a consumed prefix has to stay available to the\n // next occurrence, the way a lookbehind can re-read text the scan already passed.\n regex.lastIndex = start;\n }\n\n if (start >= minStart) {\n cursor.active = true;\n cursor.start = start;\n cursor.original = original;\n return;\n }\n }\n}\n\nfunction openCursors(line: string, compiled: CompiledRule[]): FragmentCursor[] {\n const cursors: FragmentCursor[] = [];\n\n for (let ruleIndex = 0; ruleIndex < compiled.length; ruleIndex += 1) {\n const rule = compiled[ruleIndex]!;\n\n if (rule.gateChars !== null && !lineHasAnyChar(line, rule.gateChars)) {\n continue;\n }\n\n if (rule.gate !== null) {\n rule.gate.lastIndex = 0;\n\n if (!rule.gate.test(line)) {\n continue;\n }\n }\n\n for (let fragmentIndex = 0; fragmentIndex < rule.fragments.length; fragmentIndex += 1) {\n const fragment = rule.fragments[fragmentIndex]!;\n fragment.regex.lastIndex = 0;\n\n const cursor: FragmentCursor = {\n ruleIndex,\n fragmentIndex,\n ruleId: rule.id,\n regex: fragment.regex,\n hasValueGroup: fragment.hasValueGroup,\n active: false,\n start: 0,\n original: '',\n };\n\n advance(cursor, line, 0);\n\n if (cursor.active) {\n cursors.push(cursor);\n }\n }\n }\n\n return cursors;\n}\n\n/** Leftmost value wins; ties go to the earlier rule, then the earlier pattern fragment. */\nfunction pickNext(cursors: FragmentCursor[]): FragmentCursor | null {\n let best: FragmentCursor | null = null;\n\n for (const cursor of cursors) {\n if (!cursor.active) {\n continue;\n }\n\n if (\n best === null ||\n cursor.start < best.start ||\n (cursor.start === best.start &&\n (cursor.ruleIndex < best.ruleIndex ||\n (cursor.ruleIndex === best.ruleIndex && cursor.fragmentIndex < best.fragmentIndex)))\n ) {\n best = cursor;\n }\n }\n\n return best;\n}\n\nexport function redactLine(\n line: string,\n ctx: RuleContext,\n options: RedactOptions = {},\n): RedactResult {\n const { compiled, rulesById, allow, contextChars } = ctx;\n const withSegments = options.withSegments ?? false;\n const withMatches = options.withMatches ?? false;\n\n if (compiled.length === 0) {\n return {\n output: line,\n counts: {},\n matches: [],\n segments: withSegments\n ? { before: [{ text: line, changed: false }], after: [{ text: line, changed: false }] }\n : undefined,\n };\n }\n\n const cursors = openCursors(line, compiled);\n const counts: Record<string, number> = {};\n const matches: RedactMatch[] = [];\n const before: SanitizeSegment[] = [];\n const after: SanitizeSegment[] = [];\n let output = '';\n let cursor = 0;\n\n for (;;) {\n const next = pickNext(cursors);\n\n if (next === null) {\n break;\n }\n\n const { start, original, ruleId } = next;\n // A rejected candidate still occupies its span, so a lower-priority match inside it is not\n // retried. Empty values advance by one so the walk always makes progress.\n const spanEnd = start + Math.max(original.length, 1);\n const rule = rulesById.get(ruleId);\n const accepted =\n rule !== undefined &&\n !(rule.validate !== undefined && !rule.validate(original)) &&\n !isAllowed(allow, rule.id, original);\n\n if (accepted) {\n const replacement = buildReplacement(ctx, rule.id, original);\n\n if (withSegments) {\n if (start > cursor) {\n const gap = line.slice(cursor, start);\n before.push({ text: gap, changed: false });\n after.push({ text: gap, changed: false });\n }\n\n before.push({ text: original, changed: true });\n after.push({ text: replacement, changed: true });\n }\n\n output += line.slice(cursor, start) + replacement;\n cursor = start + original.length;\n counts[rule.id] = (counts[rule.id] ?? 0) + 1;\n\n if (withMatches) {\n matches.push({\n ruleId: rule.id,\n original,\n replacement,\n index: start,\n ...(contextChars > 0 ? sliceContext(line, start, original.length, contextChars) : {}),\n });\n }\n }\n\n for (const candidate of cursors) {\n if (candidate.active && candidate.start < spanEnd) {\n advance(candidate, line, spanEnd);\n }\n }\n }\n\n output += line.slice(cursor);\n\n if (withSegments && cursor < line.length) {\n const tail = line.slice(cursor);\n before.push({ text: tail, changed: false });\n after.push({ text: tail, changed: false });\n }\n\n return {\n output,\n counts,\n matches,\n segments: withSegments ? { before, after } : undefined,\n };\n}\n","import type { SanitizeRule, SanitizeSegment } from '../types';\nimport { isAllowed } from './allowlist';\nimport { buildReplacement, type RuleContext } from './compile';\nimport {\n redactLine,\n sliceContext,\n type RedactMatch,\n type RedactOptions,\n type RedactResult,\n} from './redactLine';\n\nconst REPLACEMENT_TOKEN_RE = /<[A-Z][A-Z0-9]*:[0-9a-f]+>/g;\n\nexport function looksLikeJson(line: string): boolean {\n const trimmed = line.trim();\n return trimmed.length > 0 && (trimmed.startsWith('{') || trimmed.startsWith('['));\n}\n\nfunction normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[-_]/g, '');\n}\n\nfunction shouldPreserveJsonValue(value: string): boolean {\n return value.length === 0 || value === '-';\n}\n\ninterface JsonKeyMatcher {\n exact: Map<string, SanitizeRule>;\n contains: Array<{ fragment: string; rule: SanitizeRule }>;\n}\n\nfunction buildJsonKeyMatcher(rules: SanitizeRule[]): JsonKeyMatcher {\n const exact = new Map<string, SanitizeRule>();\n const contains: Array<{ fragment: string; rule: SanitizeRule }> = [];\n\n for (const rule of rules) {\n for (const key of rule.jsonKeys ?? []) {\n const normalized = normalizeKey(key);\n\n if (!exact.has(normalized)) {\n exact.set(normalized, rule);\n }\n }\n\n for (const fragment of rule.jsonKeyContains ?? []) {\n contains.push({ fragment: normalizeKey(fragment), rule });\n }\n }\n\n return { exact, contains };\n}\n\nfunction resolveJsonKeyRule(matcher: JsonKeyMatcher, key: string): SanitizeRule | undefined {\n const normalized = normalizeKey(key);\n const exact = matcher.exact.get(normalized);\n\n if (exact) {\n return exact;\n }\n\n for (const entry of matcher.contains) {\n if (normalized.includes(entry.fragment)) {\n return entry.rule;\n }\n }\n\n return undefined;\n}\n\nconst jsonKeyMatcherCache = new WeakMap<SanitizeRule[], JsonKeyMatcher>();\n\nfunction jsonKeyMatcher(rules: SanitizeRule[]): JsonKeyMatcher {\n const cached = jsonKeyMatcherCache.get(rules);\n\n if (cached) {\n return cached;\n }\n\n const matcher = buildJsonKeyMatcher(rules);\n jsonKeyMatcherCache.set(rules, matcher);\n return matcher;\n}\n\nfunction mergeCounts(target: Record<string, number>, source: Record<string, number>): void {\n for (const [id, count] of Object.entries(source)) {\n target[id] = (target[id] ?? 0) + count;\n }\n}\n\nfunction highlightReplacements(text: string): SanitizeSegment[] {\n const segments: SanitizeSegment[] = [];\n let cursor = 0;\n\n REPLACEMENT_TOKEN_RE.lastIndex = 0;\n let match = REPLACEMENT_TOKEN_RE.exec(text);\n\n while (match !== null) {\n if (match.index > cursor) {\n segments.push({ text: text.slice(cursor, match.index), changed: false });\n }\n\n segments.push({ text: match[0], changed: true });\n cursor = match.index + match[0].length;\n match = REPLACEMENT_TOKEN_RE.exec(text);\n }\n\n if (cursor < text.length) {\n segments.push({ text: text.slice(cursor), changed: false });\n }\n\n return segments.length > 0 ? segments : [{ text, changed: false }];\n}\n\ninterface PreviewOriginal {\n value: string;\n wholeValue: boolean;\n}\n\nfunction jsonStringContent(value: string): string {\n return JSON.stringify(value).slice(1, -1);\n}\n\nfunction locateQuotedJsonValue(\n text: string,\n value: string,\n from = 0,\n): { index: number; length: number } | null {\n const encoded = jsonStringContent(value);\n const quotedAt = text.indexOf(`\"${encoded}\"`, from);\n\n if (quotedAt === -1) {\n return null;\n }\n\n return { index: quotedAt + 1, length: encoded.length };\n}\n\nfunction findOriginal(\n text: string,\n original: PreviewOriginal,\n from: number,\n): { index: number; length: number } | null {\n const encoded = jsonStringContent(original.value);\n\n if (original.wholeValue) {\n const quoted = `\"${encoded}\"`;\n const quotedIndex = text.indexOf(quoted, from);\n\n if (quotedIndex !== -1) {\n return { index: quotedIndex + 1, length: encoded.length };\n }\n }\n\n const needles = encoded === original.value ? [encoded] : [encoded, original.value];\n\n for (const needle of needles) {\n const index = text.indexOf(needle, from);\n\n if (index !== -1) {\n return { index, length: needle.length };\n }\n }\n\n return null;\n}\n\nfunction highlightOriginals(text: string, originals: PreviewOriginal[]): SanitizeSegment[] {\n if (originals.length === 0) {\n return [{ text, changed: false }];\n }\n\n const segments: SanitizeSegment[] = [];\n let cursor = 0;\n\n for (const original of originals) {\n if (original.value.length === 0) {\n continue;\n }\n\n const found = findOriginal(text, original, cursor);\n\n if (found === null) {\n continue;\n }\n\n if (found.index > cursor) {\n segments.push({ text: text.slice(cursor, found.index), changed: false });\n }\n\n segments.push({\n text: text.slice(found.index, found.index + found.length),\n changed: true,\n });\n cursor = found.index + found.length;\n }\n\n if (cursor < text.length) {\n segments.push({ text: text.slice(cursor), changed: false });\n }\n\n return segments.length > 0 ? segments : [{ text, changed: false }];\n}\n\nexport function redactJsonLine(\n line: string,\n ctx: RuleContext,\n options: RedactOptions = {},\n): RedactResult | null {\n const terminatorMatch = /(\\r\\n|\\r|\\n)$/.exec(line);\n const terminator = terminatorMatch ? terminatorMatch[0] : '';\n const content = terminator ? line.slice(0, -terminator.length) : line;\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(content);\n } catch {\n return null;\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n return null;\n }\n\n const withSegments = options.withSegments ?? false;\n const withMatches = options.withMatches ?? false;\n const collectOriginals = withMatches || withSegments;\n const keyMatcher = jsonKeyMatcher(ctx.rules);\n const counts: Record<string, number> = {};\n const matches: RedactMatch[] = [];\n const originals: PreviewOriginal[] = [];\n\n const contextFor = (value: string): Partial<RedactMatch> => {\n if (ctx.contextChars <= 0) {\n return {};\n }\n\n const encoded = jsonStringContent(value);\n const encodedIndex = content.indexOf(encoded);\n\n if (encodedIndex >= 0) {\n return sliceContext(content, encodedIndex, encoded.length, ctx.contextChars);\n }\n\n if (encoded !== value) {\n const rawIndex = content.indexOf(value);\n\n if (rawIndex >= 0) {\n return sliceContext(content, rawIndex, value.length, ctx.contextChars);\n }\n }\n\n return { contextBefore: '', contextAfter: '' };\n };\n\n const redactValue = (value: unknown, key?: string): unknown => {\n if (typeof value === 'string') {\n if (key !== undefined && shouldPreserveJsonValue(value)) {\n return value;\n }\n\n const fieldRule = key === undefined ? undefined : resolveJsonKeyRule(keyMatcher, key);\n\n if (fieldRule) {\n if (isAllowed(ctx.allow, fieldRule.id, value)) {\n return value;\n }\n\n const replacement = buildReplacement(ctx, fieldRule.id, value);\n counts[fieldRule.id] = (counts[fieldRule.id] ?? 0) + 1;\n\n if (withSegments) {\n originals.push({ value, wholeValue: true });\n }\n\n if (withMatches) {\n const located = locateQuotedJsonValue(content, value);\n\n matches.push({\n ruleId: fieldRule.id,\n original: value,\n replacement,\n index: located?.index ?? 0,\n ...(located && ctx.contextChars > 0\n ? sliceContext(content, located.index, located.length, ctx.contextChars)\n : ctx.contextChars > 0\n ? { contextBefore: '', contextAfter: '' }\n : {}),\n });\n }\n\n return replacement;\n }\n\n const result = redactLine(value, ctx, { withMatches: collectOriginals });\n mergeCounts(counts, result.counts);\n\n if (collectOriginals) {\n for (const match of result.matches) {\n if (withSegments) {\n originals.push({ value: match.original, wholeValue: false });\n }\n\n if (withMatches) {\n matches.push({ ...match, ...contextFor(match.original) });\n }\n }\n }\n\n return result.output;\n }\n\n if (Array.isArray(value)) {\n return value.map((item: unknown) => redactValue(item));\n }\n\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n\n for (const [entryKey, entryValue] of Object.entries(value)) {\n out[entryKey] = redactValue(entryValue, entryKey);\n }\n\n return out;\n }\n\n return value;\n };\n\n const output = JSON.stringify(redactValue(parsed)) + terminator;\n\n if (!withSegments) {\n return { output, counts, matches };\n }\n\n return {\n output,\n counts,\n matches,\n segments: {\n before: highlightOriginals(line, originals),\n after: highlightReplacements(output),\n },\n };\n}\n","import type { RuleCounts, SanitizeReplacement, SanitizeReport, SanitizeSegment } from '../types';\nimport { DEFAULT_PREVIEW_BYTES } from './constants';\nimport { InvalidOptionError } from './errors';\nimport type { RedactResult } from './redactLine';\n\nexport interface ReportCollectorOptions {\n previewBytes?: number;\n replacements?: boolean;\n maxReplacementsPerRule?: number;\n}\n\nexport interface ReportSnapshotOptions {\n includeReplacements?: boolean;\n}\n\nexport interface ReportCollector {\n needsSegments(): boolean;\n needsMatches(): boolean;\n record(result: RedactResult): void;\n build(options?: ReportSnapshotOptions): SanitizeReport;\n}\n\nexport function createReportCollector(options: ReportCollectorOptions = {}): ReportCollector {\n const previewBytes = options.previewBytes ?? DEFAULT_PREVIEW_BYTES;\n const collectReplacements = options.replacements ?? true;\n const maxPerRule = options.maxReplacementsPerRule;\n const limited = maxPerRule !== undefined;\n\n if (previewBytes < 0) {\n throw new InvalidOptionError('report.previewBytes must not be negative.');\n }\n\n if (limited && (maxPerRule < 0 || !Number.isInteger(maxPerRule))) {\n throw new InvalidOptionError('report.maxReplacementsPerRule must be a non-negative integer.');\n }\n\n const counts: Record<string, number> = {};\n const replacements = new Map<string, SanitizeReplacement>();\n const perRuleDistinct = limited ? new Map<string, number>() : null;\n const before: SanitizeSegment[] = [];\n const after: SanitizeSegment[] = [];\n let lineCount = 0;\n let previewBytesUsed = 0;\n let previewClosed = previewBytes === 0;\n let truncated = false;\n\n function needsSegments(): boolean {\n return !previewClosed;\n }\n\n function needsMatches(): boolean {\n return collectReplacements;\n }\n\n function record(result: RedactResult): void {\n lineCount += 1;\n\n for (const [id, count] of Object.entries(result.counts)) {\n counts[id] = (counts[id] ?? 0) + count;\n }\n\n if (collectReplacements) {\n for (const match of result.matches) {\n const key = `${match.ruleId}\\u0000${match.original}`;\n const existing = replacements.get(key);\n\n if (existing) {\n existing.count += 1;\n continue;\n }\n\n if (perRuleDistinct) {\n const n = perRuleDistinct.get(match.ruleId) ?? 0;\n\n if (n >= maxPerRule!) {\n truncated = true;\n continue;\n }\n\n perRuleDistinct.set(match.ruleId, n + 1);\n }\n\n replacements.set(key, {\n ruleId: match.ruleId,\n original: match.original,\n replacement: match.replacement,\n count: 1,\n ...(match.contextBefore !== undefined\n ? { contextBefore: match.contextBefore, contextAfter: match.contextAfter }\n : {}),\n });\n }\n }\n\n if (previewClosed) {\n return;\n }\n\n if (result.segments) {\n before.push(...result.segments.before);\n after.push(...result.segments.after);\n }\n\n previewBytesUsed += result.output.length;\n\n if (previewBytesUsed >= previewBytes) {\n previewClosed = true;\n }\n }\n\n function build(snapshot?: ReportSnapshotOptions): SanitizeReport {\n const includeReplacements = snapshot?.includeReplacements ?? true;\n let totalMatches = 0;\n\n for (const count of Object.values(counts)) {\n totalMatches += count;\n }\n\n return {\n counts: { ...counts } as RuleCounts,\n totalMatches,\n lineCount,\n replacements: includeReplacements ? [...replacements.values()] : [],\n preview: { before: [...before], after: [...after] },\n ...(truncated && includeReplacements ? { replacementsTruncated: true } : {}),\n };\n }\n\n return { needsSegments, needsMatches, record, build };\n}\n","import { InvalidRuleError } from '../core/errors';\nimport { countCapturingGroups } from '../core/regexSource';\nimport type { SanitizeRule } from '../types';\n\nconst RULE_ID_PATTERN = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\nconst TOKEN_PATTERN = /^[A-Z][A-Z0-9]*$/;\nconst NAMED_GROUP_PATTERN = /\\(\\?<[^=!]/;\n\nfunction requireText(value: unknown, rule: string, field: string): string {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new InvalidRuleError(`Rule \"${rule}\": \\`${field}\\` must be a non-empty string.`);\n }\n\n return value;\n}\n\nfunction assertPatterns(patterns: unknown, ruleId: string, field: string): string[] {\n if (patterns === undefined) {\n return [];\n }\n\n if (!Array.isArray(patterns)) {\n throw new InvalidRuleError(`Rule \"${ruleId}\": \\`${field}\\` must be an array of strings.`);\n }\n\n return patterns.map((pattern: unknown, index) => {\n if (typeof pattern !== 'string' || pattern.length === 0) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must be a non-empty regular expression source.`,\n );\n }\n\n if (NAMED_GROUP_PATTERN.test(pattern)) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must not declare a named capture group.`,\n );\n }\n\n try {\n new RegExp(pattern, 'u');\n } catch (cause) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` is not a valid Unicode regular expression: ${String(cause)}`,\n );\n }\n\n if (countCapturingGroups(pattern) > 1) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must contain at most one capturing group, which marks the value to replace.`,\n );\n }\n\n return pattern;\n });\n}\n\nexport function validateRule(rule: SanitizeRule): SanitizeRule {\n if (typeof rule !== 'object' || rule === null) {\n throw new InvalidRuleError('A rule must be an object.');\n }\n\n const id = requireText(rule.id, String(rule.id), 'id');\n\n if (!RULE_ID_PATTERN.test(id)) {\n throw new InvalidRuleError(\n `Rule \"${id}\": \\`id\\` must be a valid ASCII identifier matching ${RULE_ID_PATTERN.source}.`,\n );\n }\n\n requireText(rule.label, id, 'label');\n requireText(rule.description, id, 'description');\n\n if (rule.mode !== 'pseudo' && rule.mode !== 'mask') {\n throw new InvalidRuleError(`Rule \"${id}\": \\`mode\\` must be either \"pseudo\" or \"mask\".`);\n }\n\n if (rule.token !== undefined && !TOKEN_PATTERN.test(rule.token)) {\n throw new InvalidRuleError(\n `Rule \"${id}\": \\`token\\` must match ${TOKEN_PATTERN.source}, so replacement tokens stay recognizable.`,\n );\n }\n\n const patterns = assertPatterns(rule.patterns, id, 'patterns');\n const aggressivePatterns = assertPatterns(rule.aggressivePatterns, id, 'aggressivePatterns');\n\n if (patterns.length === 0 && aggressivePatterns.length === 0) {\n throw new InvalidRuleError(`Rule \"${id}\": at least one pattern is required.`);\n }\n\n if (rule.jsonKeys !== undefined) {\n if (!Array.isArray(rule.jsonKeys)) {\n throw new InvalidRuleError(`Rule \"${id}\": \\`jsonKeys\\` must be an array of strings.`);\n }\n\n for (const [index, key] of rule.jsonKeys.entries()) {\n requireText(key, id, `jsonKeys[${index}]`);\n }\n }\n\n if (rule.jsonKeyContains !== undefined) {\n if (!Array.isArray(rule.jsonKeyContains)) {\n throw new InvalidRuleError(`Rule \"${id}\": \\`jsonKeyContains\\` must be an array of strings.`);\n }\n\n for (const [index, fragment] of rule.jsonKeyContains.entries()) {\n requireText(fragment, id, `jsonKeyContains[${index}]`);\n }\n }\n\n if (rule.validate !== undefined && typeof rule.validate !== 'function') {\n throw new InvalidRuleError(`Rule \"${id}\": \\`validate\\` must be a function.`);\n }\n\n return rule;\n}\n","import { getBuiltinRule } from '../rules/registry';\nimport { validateRule } from '../rules/validateRule';\nimport type { RuleSelector, SanitizeRule } from '../types';\nimport { UnknownRuleError } from './errors';\n\nfunction toRule(selector: RuleSelector): SanitizeRule {\n if (typeof selector === 'string') {\n const builtin = getBuiltinRule(selector);\n\n if (!builtin) {\n throw new UnknownRuleError(\n `Unknown rule \"${selector}\". Pass a rule object for custom rules, or one of the built-in identifiers.`,\n );\n }\n\n return builtin;\n }\n\n return validateRule(selector);\n}\n\nexport function resolveRules(\n selectors: readonly RuleSelector[],\n extraRules: readonly SanitizeRule[] = [],\n): SanitizeRule[] {\n const resolved: SanitizeRule[] = [];\n const positions = new Map<string, number>();\n\n for (const selector of [...selectors, ...extraRules]) {\n const rule = toRule(selector);\n const existing = positions.get(rule.id);\n\n if (existing === undefined) {\n positions.set(rule.id, resolved.length);\n resolved.push(rule);\n } else {\n resolved[existing] = rule;\n }\n }\n\n return resolved;\n}\n","import { createAlwaysRedactRule } from '../rules/alwaysRedact';\nimport { builtinRuleIds } from '../rules/registry';\nimport type {\n RuleInfo,\n Sanitizer,\n SanitizerOptions,\n SanitizeReport,\n SanitizeRule,\n SanitizeStreamOptions,\n SanitizeTextResult,\n TextSink,\n TextSource,\n} from '../types';\nimport { createAllowList } from './allowlist';\nimport { createRuleContext, type RuleContext } from './compile';\nimport { InvalidOptionError, SanitizationAbortedError } from './errors';\nimport { assertKey, generateKey } from './key';\nimport { createLineSplitter } from './lineSplitter';\nimport { createPseudonymizer } from './pseudonymize';\nimport { looksLikeJson, redactJsonLine } from './redactJsonLine';\nimport { redactLine } from './redactLine';\nimport { createReportCollector, type ReportCollector } from './report';\nimport { resolveRules } from './resolveRules';\n\nasync function* toAsyncIterable(source: TextSource): AsyncIterable<string> {\n yield* source as AsyncIterable<string>;\n}\n\nfunction processLine(line: string, ctx: RuleContext, collector: ReportCollector): string {\n const options = {\n withSegments: collector.needsSegments(),\n withMatches: collector.needsMatches(),\n };\n\n const parsed = ctx.json && looksLikeJson(line) ? redactJsonLine(line, ctx, options) : null;\n const result = parsed ?? redactLine(line, ctx, options);\n\n collector.record(result);\n return result.output;\n}\n\nexport function createSanitizer(options: SanitizerOptions = {}): Sanitizer {\n const keyEncoding = options.keyEncoding ?? 'hex';\n const key = options.key ?? generateKey();\n assertKey(key, keyEncoding);\n\n const contextChars = options.report?.contextChars ?? 0;\n\n if (contextChars < 0) {\n throw new InvalidOptionError('report.contextChars must not be negative.');\n }\n\n const selected = resolveWithAlwaysRedact(options);\n\n const ctx = createRuleContext({\n rules: selected,\n aggressive: options.aggressive ?? false,\n pseudonymize: createPseudonymizer(key, keyEncoding),\n allow: createAllowList(options.neverRedact),\n contextChars,\n json: options.json !== false,\n });\n\n const collectorOptions = {\n previewBytes: options.report?.previewBytes,\n replacements: options.report?.replacements,\n maxReplacementsPerRule: options.report?.maxReplacementsPerRule,\n };\n\n const rules: readonly RuleInfo[] = selected.map((rule) => ({\n id: rule.id,\n label: rule.label,\n description: rule.description,\n mode: rule.mode,\n }));\n\n function sanitizeText(text: string): SanitizeTextResult {\n const collector = createReportCollector(collectorOptions);\n const splitter = createLineSplitter(options.lines);\n let output = '';\n\n for (const line of splitter.push(text)) {\n output += processLine(line, ctx, collector);\n }\n\n for (const line of splitter.flush()) {\n output += processLine(line, ctx, collector);\n }\n\n return { output, report: collector.build() };\n }\n\n async function sanitizeStream(\n source: TextSource,\n sink: TextSink,\n streamOptions: SanitizeStreamOptions = {},\n ): Promise<SanitizeReport> {\n const collector = createReportCollector({\n ...collectorOptions,\n ...(streamOptions.previewBytes !== undefined\n ? { previewBytes: streamOptions.previewBytes }\n : {}),\n });\n const splitter = createLineSplitter(options.lines);\n const { signal, onProgress } = streamOptions;\n let charsRead = 0;\n\n const writeLine = async (line: string): Promise<void> => {\n if (signal?.aborted === true) {\n throw new SanitizationAbortedError();\n }\n\n await sink.write(processLine(line, ctx, collector));\n };\n\n for await (const chunk of toAsyncIterable(source)) {\n charsRead += chunk.length;\n\n for (const line of splitter.push(chunk)) {\n await writeLine(line);\n }\n\n onProgress?.({ charsRead, report: collector.build({ includeReplacements: false }) });\n }\n\n for (const line of splitter.flush()) {\n await writeLine(line);\n }\n\n await sink.close?.();\n\n return collector.build();\n }\n\n return { key, rules, sanitizeText, sanitizeStream };\n}\n\nfunction resolveWithAlwaysRedact(options: SanitizerOptions): SanitizeRule[] {\n const selected = resolveRules(options.rules ?? builtinRuleIds, options.extraRules);\n const alwaysRule = createAlwaysRedactRule(options.alwaysRedact);\n\n if (!alwaysRule) {\n return selected;\n }\n\n if (selected.some((rule) => rule.id === alwaysRule.id)) {\n throw new InvalidOptionError(\n `alwaysRedact.ruleId \"${alwaysRule.id}\" collides with an active rule. Choose an identifier that is not in use.`,\n );\n }\n\n return [alwaysRule, ...selected];\n}\n\n/**\n * Sanitizes a string with a one-off configuration.\n *\n * Convenient for scripts and tests. Each call builds a new sanitizer, so unless `options.key` is\n * supplied the tokens are not comparable between calls. For repeated use, create a sanitizer with\n * {@link createSanitizer} instead.\n */\nexport function sanitizeText(text: string, options?: SanitizerOptions): SanitizeTextResult {\n return createSanitizer(options).sanitizeText(text);\n}\n\nexport function sanitizeStream(\n source: TextSource,\n sink: TextSink,\n options?: SanitizerOptions & SanitizeStreamOptions,\n): Promise<SanitizeReport> {\n const { onProgress, signal, previewBytes, ...sanitizerOptions } = options ?? {};\n\n return createSanitizer(sanitizerOptions).sanitizeStream(source, sink, {\n onProgress,\n signal,\n previewBytes,\n });\n}\n","import type { TextSink } from '../types';\n\n/** A sink that accumulates everything in memory. */\nexport interface StringSink extends TextSink {\n /** Everything written so far, joined. */\n readonly text: string;\n}\n\n/**\n * Collects sanitized output into a string.\n *\n * Only appropriate when the output is known to fit in memory — the point of the streaming API is\n * usually to avoid that.\n *\n * @example\n * ```ts\n * const sink = toStringSink();\n * const report = await sanitizer.sanitizeStream(fromString(input), sink);\n * console.log(sink.text, report.totalMatches);\n * ```\n */\nexport function toStringSink(): StringSink {\n const chunks: string[] = [];\n\n return {\n write(chunk: string): void {\n chunks.push(chunk);\n },\n get text(): string {\n return chunks.join('');\n },\n };\n}\n\n/**\n * Sends sanitized output to a callback, one line at a time.\n *\n * The callback may return a promise; it is awaited before the next line is written, so\n * backpressure propagates to the source.\n */\nexport function toCallbackSink(\n onChunk: (chunk: string) => void | Promise<void>,\n onClose?: () => void | Promise<void>,\n): TextSink {\n return {\n write: onChunk,\n ...(onClose ? { close: onClose } : {}),\n };\n}\n\n/** A sink that discards everything, for report-only runs. */\nexport function toNullSink(): TextSink {\n return { write: () => undefined };\n}\n","import { createReadStream, createWriteStream } from 'node:fs';\nimport { once } from 'node:events';\nimport type { Readable, Writable } from 'node:stream';\nimport { finished } from 'node:stream/promises';\n\nimport { createSanitizer } from '../core/sanitizer';\nimport { toNullSink } from '../io/sinks';\nimport type {\n AbortSignalLike,\n SanitizeProgress,\n SanitizeReport,\n SanitizerOptions,\n TextSink,\n TextSource,\n} from '../types';\n\nconst DEFAULT_CHUNK_BYTES = 4 * 1024 * 1024;\n\n/**\n * Reads a Node readable stream as UTF-8 text.\n *\n * Byte chunks are decoded across chunk boundaries, so multi-byte characters are never split.\n */\nexport function fromNodeStream(stream: Readable | AsyncIterable<string | Uint8Array>): TextSource {\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<string> {\n const decoder = new TextDecoder('utf-8');\n\n for await (const chunk of stream as AsyncIterable<string | Uint8Array>) {\n const text = typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });\n\n if (text.length > 0) {\n yield text;\n }\n }\n\n const tail = decoder.decode();\n\n if (tail.length > 0) {\n yield tail;\n }\n },\n };\n}\n\n/**\n * Reads a file as UTF-8 text.\n *\n * @param path Path to the file to read.\n * @param chunkBytes Read buffer size.\n */\nexport function fromFile(path: string, chunkBytes = DEFAULT_CHUNK_BYTES): TextSource {\n return fromNodeStream(createReadStream(path, { highWaterMark: chunkBytes }));\n}\n\n/**\n * Writes sanitized text to a Node writable stream, respecting backpressure.\n *\n * The stream is not ended when the run finishes, so it is safe to pass `process.stdout`.\n */\nexport function toNodeStream(stream: Writable): TextSink {\n return {\n async write(chunk: string): Promise<void> {\n if (!stream.write(chunk)) {\n await once(stream, 'drain');\n }\n },\n };\n}\n\n/**\n * Writes sanitized text to a file, creating or truncating it.\n *\n * The file is closed and flushed when the run finishes.\n */\nexport function toFile(path: string): TextSink {\n const stream = createWriteStream(path, { encoding: 'utf-8' });\n const target = toNodeStream(stream);\n\n return {\n write: target.write.bind(target),\n async close(): Promise<void> {\n stream.end();\n await finished(stream);\n },\n };\n}\n\n/** Options for {@link sanitizeFile}. */\nexport interface SanitizeFileOptions extends SanitizerOptions {\n /** Path of the file to read. */\n input: string;\n /** Path to write the sanitized result to. Omit for a report-only run. */\n output?: string;\n /** Read buffer size, in bytes. */\n chunkBytes?: number;\n /** Called after each chunk with a live snapshot of progress. */\n onProgress?: (progress: SanitizeProgress) => void;\n /** Aborts the run between lines. A partially written output file is left in place. */\n signal?: AbortSignalLike;\n}\n\n/**\n * Sanitizes a file on disk, streaming it so memory use stays flat regardless of file size.\n *\n * @returns The report for the whole file.\n * @throws {SanitizationAbortedError} When `options.signal` is aborted.\n *\n * @example\n * ```ts\n * const report = await sanitizeFile({\n * input: 'app.log',\n * output: 'app.sanitized.log',\n * rules: ['secrets', 'ips'],\n * });\n *\n * console.log(`${report.totalMatches} values redacted`);\n * ```\n */\nexport async function sanitizeFile(options: SanitizeFileOptions): Promise<SanitizeReport> {\n const { input, output, chunkBytes, onProgress, signal, ...sanitizerOptions } = options;\n const sanitizer = createSanitizer(sanitizerOptions);\n const sink = output === undefined ? toNullSink() : toFile(output);\n\n return sanitizer.sanitizeStream(fromFile(input, chunkBytes), sink, { onProgress, signal });\n}\n\nexport * from '../index';\n","import { realpathSync } from 'node:fs';\nimport { readFile, stat, writeFile } from 'node:fs/promises';\nimport { basename, dirname, join } from 'node:path';\nimport { type Readable, type Writable } from 'node:stream';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { parseArgs } from 'node:util';\n\nimport { generateKey } from './core/key';\nimport { createSanitizer } from './core/sanitizer';\nimport { toNullSink } from './io/sinks';\nimport { fromFile, fromNodeStream, toFile, toNodeStream } from './node';\nimport { builtinRuleIds } from './rules/registry';\nimport type {\n BuiltinRuleId,\n KeyEncoding,\n SanitizeReport,\n SanitizeRule,\n SanitizerOptions,\n TextSink,\n TextSource,\n} from './types';\n\nexport const EXIT_OK = 0;\nexport const EXIT_ERROR = 1;\nexport const EXIT_USAGE = 2;\n\nconst HELP = `Usage: logtotal-sanitize [options] <input>\n\nRedact secrets, identifiers and PII from a log file. Input \"-\" reads stdin.\n\nOptions:\n -o, --out <path> Output file (default: <input>.sanitized)\n --stdout Write sanitized text to stdout\n --report <path> Write a JSON report to <path>\n --report-format <fmt> json | text (default: json)\n --rules <ids> Comma-separated built-in rule ids (default: all)\n --exclude-rules <ids> Comma-separated built-in rule ids to skip\n --rules-file <path> Load extra rules from a JS/JSON module\n --exclude <value> Never redact this exact value (repeatable)\n --exclude-file <path> Newline-separated never-redact values\n --redact <value> Always redact this exact value (repeatable)\n --redact-file <path> Newline-separated always-redact values\n --aggressive Enable broader, noisier patterns\n --key <value> HMAC key (reuse to correlate tokens across files)\n --key-file <path> Read HMAC key from a file\n --key-encoding <enc> hex | utf8\n --print-key Print the key to stderr\n --dry-run Report only; do not write sanitized output\n --fail-on-match Exit 1 if anything was redacted\n --progress Show a live progress bar on stderr\n --no-progress Do not show a progress bar\n -q, --quiet Suppress the text summary\n -h, --help Show this help\n -v, --version Show version\n`;\n\ninterface CliFlags {\n out?: string;\n stdout: boolean;\n report?: string;\n reportFormat: 'json' | 'text';\n rules?: string;\n excludeRules?: string;\n rulesFile?: string;\n exclude: string[];\n excludeFile?: string;\n redact: string[];\n redactFile?: string;\n aggressive: boolean;\n key?: string;\n keyFile?: string;\n keyEncoding?: KeyEncoding;\n printKey: boolean;\n dryRun: boolean;\n failOnMatch: boolean;\n progress: boolean;\n noProgress: boolean;\n quiet: boolean;\n help: boolean;\n version: boolean;\n input?: string;\n}\n\nfunction parseCli(argv: string[]): CliFlags {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n out: { type: 'string', short: 'o' },\n stdout: { type: 'boolean', default: false },\n report: { type: 'string' },\n 'report-format': { type: 'string', default: 'json' },\n rules: { type: 'string' },\n 'exclude-rules': { type: 'string' },\n 'rules-file': { type: 'string' },\n exclude: { type: 'string', multiple: true },\n 'exclude-file': { type: 'string' },\n redact: { type: 'string', multiple: true },\n 'redact-file': { type: 'string' },\n aggressive: { type: 'boolean', default: false },\n key: { type: 'string' },\n 'key-file': { type: 'string' },\n 'key-encoding': { type: 'string' },\n 'print-key': { type: 'boolean', default: false },\n 'dry-run': { type: 'boolean', default: false },\n 'fail-on-match': { type: 'boolean', default: false },\n progress: { type: 'boolean', default: false },\n 'no-progress': { type: 'boolean', default: false },\n quiet: { type: 'boolean', short: 'q', default: false },\n help: { type: 'boolean', short: 'h', default: false },\n version: { type: 'boolean', short: 'v', default: false },\n },\n });\n\n const keyEncoding =\n values['key-encoding'] === 'hex' || values['key-encoding'] === 'utf8'\n ? values['key-encoding']\n : undefined;\n\n return {\n out: values.out,\n stdout: Boolean(values.stdout),\n report: values.report,\n reportFormat: values['report-format'] === 'text' ? 'text' : 'json',\n rules: values.rules,\n excludeRules: values['exclude-rules'],\n rulesFile: values['rules-file'],\n exclude: values.exclude ?? [],\n excludeFile: values['exclude-file'],\n redact: values.redact ?? [],\n redactFile: values['redact-file'],\n aggressive: Boolean(values.aggressive),\n key: values.key,\n keyFile: values['key-file'],\n keyEncoding,\n printKey: Boolean(values['print-key']),\n dryRun: Boolean(values['dry-run']),\n failOnMatch: Boolean(values['fail-on-match']),\n progress: Boolean(values.progress),\n noProgress: Boolean(values['no-progress']),\n quiet: Boolean(values.quiet),\n help: Boolean(values.help),\n version: Boolean(values.version),\n input: positionals[0],\n };\n}\n\nasync function readLines(path: string): Promise<string[]> {\n const text = await readFile(path, 'utf8');\n return text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n}\n\nasync function loadRulesFile(path: string): Promise<SanitizeRule[]> {\n if (path.endsWith('.json')) {\n const parsed = JSON.parse(await readFile(path, 'utf8')) as unknown;\n return Array.isArray(parsed) ? (parsed as SanitizeRule[]) : [parsed as SanitizeRule];\n }\n\n const mod = (await import(pathToFileURL(path).href)) as { default?: unknown };\n const value = mod.default;\n if (Array.isArray(value)) {\n return value as SanitizeRule[];\n }\n return [value as SanitizeRule];\n}\n\nfunction formatReportText(report: SanitizeReport): string {\n const lines = [`lines: ${report.lineCount}`, `matches: ${report.totalMatches}`];\n for (const [id, count] of Object.entries(report.counts)) {\n lines.push(` ${id}: ${count}`);\n }\n return `${lines.join('\\n')}\\n`;\n}\n\nconst PROGRESS_BAR_WIDTH = 20;\n\nfunction streamIsTty(stream: Writable): boolean {\n return Boolean((stream as NodeJS.WriteStream).isTTY);\n}\n\nfunction progressLabel(input: string, useStdin: boolean): string {\n if (useStdin) {\n return 'stdin';\n }\n const name = basename(input);\n return name.length > 32 ? `${name.slice(0, 29)}...` : name;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${Math.round(bytes)} B`;\n }\n\n const units = ['KB', 'MB', 'GB', 'TB'] as const;\n let value = bytes / 1024;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit += 1;\n }\n const digits = value >= 10 ? 1 : 2;\n return `${value.toFixed(digits)} ${units[unit]}`;\n}\n\nfunction formatBar(ratio: number): string {\n const clamped = Math.min(1, Math.max(0, ratio));\n const filled = Math.round(clamped * PROGRESS_BAR_WIDTH);\n const head =\n filled > 0 && filled < PROGRESS_BAR_WIDTH ? '>' : filled === PROGRESS_BAR_WIDTH ? '=' : '';\n const body = '='.repeat(Math.max(0, filled - head.length));\n const empty = ' '.repeat(PROGRESS_BAR_WIDTH - body.length - head.length);\n return `[${body}${head}${empty}]`;\n}\n\nfunction formatProgressLine(state: {\n label: string;\n bytesRead: number;\n totalBytes?: number;\n lineCount: number;\n totalMatches: number;\n}): string {\n const stats = `${formatBytes(state.bytesRead)}${\n state.totalBytes !== undefined ? ` / ${formatBytes(state.totalBytes)}` : ''\n } ${state.lineCount} lines ${state.totalMatches} matches`;\n\n if (state.totalBytes === undefined) {\n return `${state.label} ${stats}`;\n }\n\n const ratio = state.totalBytes === 0 ? 1 : Math.min(1, state.bytesRead / state.totalBytes);\n const pct = String(Math.min(100, Math.floor(ratio * 100))).padStart(3, ' ');\n return `${state.label} ${formatBar(ratio)} ${pct}% ${stats}`;\n}\n\nfunction withByteTracking(source: TextSource, tracked: { bytes: number }): TextSource {\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<string> {\n for await (const chunk of source as AsyncIterable<string>) {\n tracked.bytes += Buffer.byteLength(chunk, 'utf8');\n yield chunk;\n }\n },\n };\n}\n\nfunction createProgressPrinter(\n stderr: Writable,\n options: { tty: boolean; label: string; totalBytes?: number },\n): {\n update(bytesRead: number, report: Pick<SanitizeReport, 'lineCount' | 'totalMatches'>): void;\n finish(bytesRead: number, report: Pick<SanitizeReport, 'lineCount' | 'totalMatches'>): void;\n} {\n const minIntervalMs = options.tty ? 80 : 500;\n let lastAt = 0;\n let lastLen = 0;\n let lastText = '';\n\n const lineFor = (\n bytesRead: number,\n report: Pick<SanitizeReport, 'lineCount' | 'totalMatches'>,\n ): string =>\n formatProgressLine({\n label: options.label,\n bytesRead,\n totalBytes: options.totalBytes,\n lineCount: report.lineCount,\n totalMatches: report.totalMatches,\n });\n\n const paint = (text: string, newline: boolean): void => {\n lastText = text;\n if (options.tty) {\n const padded = text.length < lastLen ? `${text}${' '.repeat(lastLen - text.length)}` : text;\n stderr.write(`\\r${padded}`);\n lastLen = text.length;\n if (newline) {\n stderr.write('\\n');\n }\n } else {\n stderr.write(`${text}\\n`);\n }\n };\n\n return {\n update(bytesRead, report) {\n const now = Date.now();\n if (now - lastAt < minIntervalMs) {\n return;\n }\n lastAt = now;\n paint(lineFor(bytesRead, report), false);\n },\n finish(bytesRead, report) {\n const text = lineFor(bytesRead, report);\n if (!options.tty && text === lastText) {\n return;\n }\n paint(text, true);\n },\n };\n}\n\nexport async function runCli(\n argv: string[],\n io: {\n stdin: Readable;\n stdout: Writable;\n stderr: Writable;\n } = {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n },\n): Promise<number> {\n let flags: CliFlags;\n try {\n flags = parseCli(argv);\n } catch (error) {\n io.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n return EXIT_USAGE;\n }\n\n if (flags.help) {\n io.stdout.write(HELP);\n return EXIT_OK;\n }\n\n if (flags.version) {\n const pkgUrl = new URL('../package.json', import.meta.url);\n const pkg = JSON.parse(await readFile(pkgUrl, 'utf8')) as { version: string };\n io.stdout.write(`${pkg.version}\\n`);\n return EXIT_OK;\n }\n\n if (!flags.input) {\n io.stderr.write('Missing input path. Use \"-\" for stdin.\\n');\n io.stderr.write(HELP);\n return EXIT_USAGE;\n }\n\n const extraRules = flags.rulesFile ? await loadRulesFile(flags.rulesFile) : [];\n let ruleIds: BuiltinRuleId[] = [...builtinRuleIds];\n if (flags.rules) {\n ruleIds = flags.rules.split(',').map((id) => id.trim()) as BuiltinRuleId[];\n }\n if (flags.excludeRules) {\n const skip = new Set(flags.excludeRules.split(',').map((id) => id.trim()));\n ruleIds = ruleIds.filter((id) => !skip.has(id));\n }\n\n const neverValues = [...flags.exclude];\n if (flags.excludeFile) {\n neverValues.push(...(await readLines(flags.excludeFile)));\n }\n const alwaysValues = [...flags.redact];\n if (flags.redactFile) {\n alwaysValues.push(...(await readLines(flags.redactFile)));\n }\n\n const suppliedKey = Boolean(flags.key || flags.keyFile);\n let key = flags.key;\n if (flags.keyFile) {\n key = (await readFile(flags.keyFile, 'utf8')).trim();\n }\n if (!key) {\n key = generateKey();\n }\n if (flags.printKey) {\n io.stderr.write(`${key}\\n`);\n }\n\n const options: SanitizerOptions = {\n rules: ruleIds,\n extraRules: extraRules.length > 0 ? extraRules : undefined,\n aggressive: flags.aggressive,\n key,\n keyEncoding: flags.keyEncoding ?? (suppliedKey ? 'utf8' : 'hex'),\n alwaysRedact: alwaysValues.length > 0 ? { values: alwaysValues } : undefined,\n neverRedact: neverValues.length > 0 ? { values: neverValues } : undefined,\n // Normal output, progress, and text reports only consume aggregate counts. Preserve the\n // detailed replacement list and preview for the explicit JSON report surface.\n report:\n flags.report && flags.reportFormat === 'json'\n ? undefined\n : { previewBytes: 0, replacements: false },\n };\n\n const sanitizer = createSanitizer(options);\n const useStdin = flags.input === '-';\n const source = useStdin ? fromNodeStream(io.stdin) : fromFile(flags.input);\n const tty = streamIsTty(io.stderr);\n const showProgress = flags.noProgress ? false : flags.progress || (tty && !flags.quiet);\n const totalBytes = showProgress && !useStdin ? (await stat(flags.input)).size : undefined;\n const tracked = { bytes: 0 };\n const trackedSource = showProgress ? withByteTracking(source, tracked) : source;\n const progress = showProgress\n ? createProgressPrinter(io.stderr, {\n tty,\n label: progressLabel(flags.input, useStdin),\n totalBytes,\n })\n : undefined;\n\n const writeStdout = flags.stdout || (useStdin && !flags.out);\n let outputPath = flags.out;\n if (!writeStdout && !flags.dryRun && !outputPath && !useStdin) {\n outputPath = join(dirname(flags.input), `${basename(flags.input)}.sanitized`);\n }\n\n const sink: TextSink = flags.dryRun\n ? toNullSink()\n : writeStdout\n ? toNodeStream(io.stdout)\n : toFile(outputPath!);\n\n const report = await sanitizer.sanitizeStream(trackedSource, sink, {\n onProgress: progress\n ? (snapshot) => {\n progress.update(tracked.bytes, snapshot.report);\n }\n : undefined,\n });\n\n progress?.finish(tracked.bytes, report);\n\n if (flags.report) {\n const body =\n flags.reportFormat === 'text'\n ? formatReportText(report)\n : `${JSON.stringify(report, null, 2)}\\n`;\n await writeFile(flags.report, body, 'utf8');\n }\n\n if (!flags.quiet && !writeStdout) {\n io.stderr.write(formatReportText(report));\n }\n\n if (flags.failOnMatch && report.totalMatches > 0) {\n return EXIT_ERROR;\n }\n\n return EXIT_OK;\n}\n\nasync function main(): Promise<void> {\n try {\n process.exitCode = await runCli(process.argv.slice(2));\n } catch (error) {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = EXIT_ERROR;\n }\n}\n\n/** True when this module is the Node process entry (including npm/npx bin shims). */\nexport function isCliEntryPoint(entryPath: string | undefined = process.argv[1]): boolean {\n if (!entryPath) {\n return false;\n }\n\n try {\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(entryPath);\n } catch {\n return false;\n }\n}\n\nif (isCliEntryPoint()) {\n void main();\n}\n"]}
|