@socprime/logtotal-sanitizer 0.2.0-beta.0 → 0.2.0-beta.2

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.
@@ -1,4 +1,4 @@
1
- import { InvalidKeyError, InvalidOptionError, builtinRuleIds, SanitizationAbortedError, getBuiltinRule, UnknownRuleError, validateRule, countCapturingGroups, InvalidRuleError, deriveGateSource, lineHasAnyChar } from './chunk-5R34WEOD.js';
1
+ import { InvalidKeyError, InvalidOptionError, builtinRuleIds, SanitizationAbortedError, getBuiltinRule, UnknownRuleError, validateRule, countCapturingGroups, InvalidRuleError, deriveGateSource, lineHasAnyChar } from './chunk-VMPXBCSL.js';
2
2
 
3
3
  // src/core/constants.ts
4
4
  var DEFAULT_PREVIEW_BYTES = 256 * 1024;
@@ -619,27 +619,47 @@ function looksLikeJson(line) {
619
619
  function normalizeKey2(key) {
620
620
  return key.toLowerCase().replace(/[-_]/g, "");
621
621
  }
622
- function buildJsonKeyIndex(rules) {
623
- const index = /* @__PURE__ */ new Map();
622
+ function shouldPreserveJsonValue(value) {
623
+ return value.length === 0 || value === "-";
624
+ }
625
+ function buildJsonKeyMatcher(rules) {
626
+ const exact = /* @__PURE__ */ new Map();
627
+ const contains = [];
624
628
  for (const rule of rules) {
625
629
  for (const key of rule.jsonKeys ?? []) {
626
630
  const normalized = normalizeKey2(key);
627
- if (!index.has(normalized)) {
628
- index.set(normalized, rule);
631
+ if (!exact.has(normalized)) {
632
+ exact.set(normalized, rule);
629
633
  }
630
634
  }
635
+ for (const fragment of rule.jsonKeyContains ?? []) {
636
+ contains.push({ fragment: normalizeKey2(fragment), rule });
637
+ }
638
+ }
639
+ return { exact, contains };
640
+ }
641
+ function resolveJsonKeyRule(matcher, key) {
642
+ const normalized = normalizeKey2(key);
643
+ const exact = matcher.exact.get(normalized);
644
+ if (exact) {
645
+ return exact;
646
+ }
647
+ for (const entry of matcher.contains) {
648
+ if (normalized.includes(entry.fragment)) {
649
+ return entry.rule;
650
+ }
631
651
  }
632
- return index;
652
+ return void 0;
633
653
  }
634
- var jsonKeyIndexCache = /* @__PURE__ */ new WeakMap();
635
- function jsonKeyIndex(rules) {
636
- const cached = jsonKeyIndexCache.get(rules);
654
+ var jsonKeyMatcherCache = /* @__PURE__ */ new WeakMap();
655
+ function jsonKeyMatcher(rules) {
656
+ const cached = jsonKeyMatcherCache.get(rules);
637
657
  if (cached) {
638
658
  return cached;
639
659
  }
640
- const index = buildJsonKeyIndex(rules);
641
- jsonKeyIndexCache.set(rules, index);
642
- return index;
660
+ const matcher = buildJsonKeyMatcher(rules);
661
+ jsonKeyMatcherCache.set(rules, matcher);
662
+ return matcher;
643
663
  }
644
664
  function mergeCounts(target, source) {
645
665
  for (const [id, count] of Object.entries(source)) {
@@ -729,7 +749,7 @@ function redactJsonLine(line, ctx, options = {}) {
729
749
  const withSegments = options.withSegments ?? false;
730
750
  const withMatches = options.withMatches ?? false;
731
751
  const collectOriginals = withMatches || withSegments;
732
- const keyIndex = jsonKeyIndex(ctx.rules);
752
+ const keyMatcher = jsonKeyMatcher(ctx.rules);
733
753
  const counts = {};
734
754
  const matches = [];
735
755
  const originals = [];
@@ -752,7 +772,10 @@ function redactJsonLine(line, ctx, options = {}) {
752
772
  };
753
773
  const redactValue = (value, key) => {
754
774
  if (typeof value === "string") {
755
- const fieldRule = key === void 0 ? void 0 : keyIndex.get(normalizeKey2(key));
775
+ if (key !== void 0 && shouldPreserveJsonValue(value)) {
776
+ return value;
777
+ }
778
+ const fieldRule = key === void 0 ? void 0 : resolveJsonKeyRule(keyMatcher, key);
756
779
  if (fieldRule) {
757
780
  if (isAllowed(ctx.allow, fieldRule.id, value)) {
758
781
  return value;
@@ -1272,5 +1295,5 @@ function toNullSink() {
1272
1295
  }
1273
1296
 
1274
1297
  export { createSanitizer, fromBlob, fromString, fromWebStream, generateKey, mergeReports, planLineAlignedRanges, sanitizeStream, sanitizeText, toCallbackSink, toNullSink, toStringSink };
1275
- //# sourceMappingURL=chunk-FUDPRHOC.js.map
1276
- //# sourceMappingURL=chunk-FUDPRHOC.js.map
1298
+ //# sourceMappingURL=chunk-M4CEAFAP.js.map
1299
+ //# sourceMappingURL=chunk-M4CEAFAP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/constants.ts","../src/core/hmac.ts","../src/core/key.ts","../src/rules/alwaysRedact.ts","../src/core/allowlist.ts","../src/core/pseudonymize.ts","../src/core/compile.ts","../src/core/lineSplitter.ts","../src/core/redactLine.ts","../src/core/redactJsonLine.ts","../src/core/report.ts","../src/core/resolveRules.ts","../src/core/sanitizer.ts","../src/core/mergeReports.ts","../src/io/sources.ts","../src/io/planLineRanges.ts","../src/io/sinks.ts"],"names":["normalizeKey","sanitizeText","sanitizeStream"],"mappings":"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","file":"chunk-M4CEAFAP.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 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 { 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","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 { 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 { RuleCounts, SanitizeReplacement, SanitizeReport, SanitizeSegment } from '../types';\nimport { DEFAULT_PREVIEW_BYTES } from './constants';\n\nexport interface MergeReportsOptions {\n previewBytes?: number;\n maxReplacementsPerRule?: number;\n}\n\nfunction emptyReport(): SanitizeReport {\n return {\n counts: {},\n totalMatches: 0,\n lineCount: 0,\n replacements: [],\n preview: { before: [], after: [] },\n };\n}\n\nfunction cloneReplacement(row: SanitizeReplacement): SanitizeReplacement {\n return {\n ruleId: row.ruleId,\n original: row.original,\n replacement: row.replacement,\n count: row.count,\n ...(row.contextBefore !== undefined\n ? { contextBefore: row.contextBefore, contextAfter: row.contextAfter }\n : {}),\n };\n}\n\nfunction mergePreview(\n reports: readonly SanitizeReport[],\n previewBytes: number,\n): { before: SanitizeSegment[]; after: SanitizeSegment[] } {\n if (previewBytes === 0) {\n return { before: [], after: [] };\n }\n\n const before: SanitizeSegment[] = [];\n const after: SanitizeSegment[] = [];\n let used = 0;\n\n for (const report of reports) {\n const afterSegs = report.preview.after;\n const beforeSegs = report.preview.before;\n\n for (let i = 0; i < afterSegs.length; i += 1) {\n if (used >= previewBytes) {\n return { before, after };\n }\n\n after.push(afterSegs[i]!);\n before.push(beforeSegs[i] ?? { text: '', changed: false });\n used += afterSegs[i]!.text.length;\n }\n }\n\n return { before, after };\n}\n\nexport function mergeReports(\n reports: readonly SanitizeReport[],\n options: MergeReportsOptions = {},\n): SanitizeReport {\n if (reports.length === 0) {\n return emptyReport();\n }\n\n const previewBytes = options.previewBytes ?? DEFAULT_PREVIEW_BYTES;\n const maxPerRule = options.maxReplacementsPerRule;\n const limited = maxPerRule !== undefined;\n const counts: Record<string, number> = {};\n const replacements = new Map<string, SanitizeReplacement>();\n const perRuleDistinct = limited ? new Map<string, number>() : null;\n let lineCount = 0;\n let truncated = false;\n\n for (const report of reports) {\n lineCount += report.lineCount;\n\n if (report.replacementsTruncated === true) {\n truncated = true;\n }\n\n for (const [id, count] of Object.entries(report.counts)) {\n counts[id] = (counts[id] ?? 0) + (count ?? 0);\n }\n\n for (const row of report.replacements) {\n const key = `${row.ruleId}\\u0000${row.original}`;\n const existing = replacements.get(key);\n\n if (existing) {\n existing.count += row.count;\n continue;\n }\n\n if (maxPerRule !== undefined && perRuleDistinct) {\n const n = perRuleDistinct.get(row.ruleId) ?? 0;\n\n if (n >= maxPerRule) {\n truncated = true;\n continue;\n }\n\n perRuleDistinct.set(row.ruleId, n + 1);\n }\n\n replacements.set(key, cloneReplacement(row));\n }\n }\n\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: [...replacements.values()],\n preview: mergePreview(reports, previewBytes),\n ...(truncated ? { replacementsTruncated: true } : {}),\n };\n}\n","import type { BlobLike, ReadableStreamLike, TextSource } from '../types';\n\nconst DEFAULT_CHUNK_BYTES = 4 * 1024 * 1024;\n\n/**\n * Wraps a string as a source, split into fixed-size chunks.\n *\n * Useful for exercising the streaming path in tests and for feeding text that is already in memory\n * without copying it in one piece.\n */\nexport function fromString(text: string, chunkChars = DEFAULT_CHUNK_BYTES): TextSource {\n return {\n *[Symbol.iterator](): Iterator<string> {\n for (let offset = 0; offset < text.length; offset += chunkChars) {\n yield text.slice(offset, offset + chunkChars);\n }\n },\n };\n}\n\n/**\n * Reads a `Blob` or `File` as UTF-8 text, one chunk at a time.\n *\n * Multi-byte characters split across a chunk boundary are decoded correctly. Accepts any object\n * with `size`, `slice` and `arrayBuffer`, so browser `File`, browser `Blob` and Node's `Blob` all\n * work.\n *\n * @example\n * ```ts\n * const report = await sanitizer.sanitizeStream(fromBlob(file), toStringSink());\n * ```\n */\nexport function fromBlob(blob: BlobLike, chunkBytes = DEFAULT_CHUNK_BYTES): TextSource {\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<string> {\n const decoder = new TextDecoder('utf-8');\n\n for (let offset = 0; offset < blob.size; offset += chunkBytes) {\n const slice = blob.slice(offset, Math.min(offset + chunkBytes, blob.size));\n const buffer = await slice.arrayBuffer();\n const text = decoder.decode(new Uint8Array(buffer), { 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 `ReadableStream` of text or bytes.\n *\n * Byte chunks are decoded as UTF-8 across chunk boundaries. Accepts web streams from `fetch`,\n * `Blob.stream()` and `node:stream/web`.\n */\nexport function fromWebStream(stream: ReadableStreamLike<string | Uint8Array>): TextSource {\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder('utf-8');\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n if (value === undefined) {\n continue;\n }\n\n const text = typeof value === 'string' ? value : decoder.decode(value, { 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 } finally {\n reader.releaseLock();\n }\n },\n };\n}\n","import { DEFAULT_RANGE_MAX_PROBE_BYTES, DEFAULT_RANGE_PROBE_BYTES } from '../core/constants';\nimport { InvalidOptionError } from '../core/errors';\nimport type { BlobLike } from '../types';\n\nconst LF = 0x0a;\n\nexport interface ByteRange {\n start: number;\n end: number;\n}\n\nexport interface PlanLineRangesOptions {\n probeBytes?: number;\n maxProbeBytes?: number;\n}\n\nasync function snapToNewline(\n blob: BlobLike,\n from: number,\n probeBytes: number,\n maxProbeBytes: number,\n): Promise<number | null> {\n if (from <= 0 || from >= blob.size) {\n return null;\n }\n\n let scanned = 0;\n let window = probeBytes;\n\n while (scanned < maxProbeBytes && from + scanned < blob.size) {\n const chunkEnd = Math.min(from + Math.min(window, maxProbeBytes), blob.size);\n const buffer = await blob.slice(from + scanned, chunkEnd).arrayBuffer();\n const bytes = new Uint8Array(buffer);\n const idx = bytes.indexOf(LF);\n\n if (idx !== -1) {\n return from + scanned + idx + 1;\n }\n\n scanned = chunkEnd - from;\n window = Math.min(window * 2, maxProbeBytes);\n }\n\n return null;\n}\n\nexport async function planLineAlignedRanges(\n blob: BlobLike,\n partCount: number,\n options: PlanLineRangesOptions = {},\n): Promise<ByteRange[]> {\n if (!Number.isInteger(partCount) || partCount < 1) {\n throw new InvalidOptionError('partCount must be an integer >= 1.');\n }\n\n const probeBytes = options.probeBytes ?? DEFAULT_RANGE_PROBE_BYTES;\n const maxProbeBytes = options.maxProbeBytes ?? DEFAULT_RANGE_MAX_PROBE_BYTES;\n\n if (!Number.isInteger(probeBytes) || probeBytes < 1) {\n throw new InvalidOptionError('probeBytes must be an integer >= 1.');\n }\n\n if (!Number.isInteger(maxProbeBytes) || maxProbeBytes < probeBytes) {\n throw new InvalidOptionError('maxProbeBytes must be an integer >= probeBytes.');\n }\n\n if (blob.size <= 0) {\n return [];\n }\n\n if (partCount === 1) {\n return [{ start: 0, end: blob.size }];\n }\n\n const cuts = new Set<number>();\n\n for (let i = 1; i < partCount; i += 1) {\n const nominal = Math.round((blob.size * i) / partCount);\n const snapped = await snapToNewline(blob, nominal, probeBytes, maxProbeBytes);\n\n if (snapped !== null && snapped > 0 && snapped < blob.size) {\n cuts.add(snapped);\n }\n }\n\n const bounds = [0, ...[...cuts].sort((a, b) => a - b), blob.size];\n const ranges: ByteRange[] = [];\n\n for (let i = 0; i < bounds.length - 1; i += 1) {\n const start = bounds[i]!;\n const end = bounds[i + 1]!;\n\n if (end > start) {\n ranges.push({ start, end });\n }\n }\n\n return ranges;\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"]}
@@ -312,6 +312,15 @@ var homePathsRule = {
312
312
  validate: validateHomeUser
313
313
  };
314
314
 
315
+ // src/rules/shared/windowsAccounts.ts
316
+ var BACKSLASH = "\\\\";
317
+ var JSON_BACKSLASH = "\\\\\\\\";
318
+ var WINDOWS_FILE_EXT = "exe|dll|sys|bat|cmd|ps1|vbs|msi|tmp|hiv|log|dat|txt|ini|xml|json|lnk|cpl|ocx|drv";
319
+ var NOT_WINDOWS_FILENAME = `(?![A-Za-z0-9_$.-]*\\.(?:${WINDOWS_FILE_EXT})(?![A-Za-z0-9]))`;
320
+ var WELL_KNOWN_DOMAIN = "(?:BUILTIN|NT SERVICE|NT AUTHORITY|Users|Settings|Files)";
321
+ var NETBIOS_DOMAIN = "[A-Za-z0-9](?:[A-Za-z0-9.-]{0,13}[A-Za-z0-9])?";
322
+ var ACCOUNT_SEGMENT = "[A-Za-z0-9_](?:[A-Za-z0-9_.$-]*[A-Za-z0-9$])";
323
+
315
324
  // src/rules/definitions/hostnames.ts
316
325
  var GTLD = [
317
326
  "abbott",
@@ -1277,10 +1286,39 @@ var TLD_COLLISION = FILE_EXT_COLLISION_TLDS.join("|");
1277
1286
  var LABEL = "[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?";
1278
1287
  var HOST_EXACT = `(?:(?<![\\w.$-])(?<![^:/\\\\][/\\\\])(?:${LABEL}\\.)+(?:${TLD_EXACT})(?!\\.?\\w))`;
1279
1288
  var HOST_COLLISION = `(?:(?:https?|sftp|ftps?|wss?)://(?:[^/@\\s]+@)?)((?:${LABEL}\\.)+(?:${TLD_COLLISION}))(?!\\.?\\w)`;
1280
- var UNC_COMPUTER = "(?:\\\\\\\\)([A-Za-z][A-Za-z0-9-]{0,14})(?=\\\\[A-Za-z0-9$])";
1289
+ function uncComputerPattern(separator) {
1290
+ return `(?:${separator}${separator})([A-Za-z][A-Za-z0-9-]{0,14})(?=${separator}[A-Za-z0-9$])`;
1291
+ }
1292
+ var UNC_COMPUTER = uncComputerPattern(BACKSLASH);
1293
+ var UNC_COMPUTER_JSON = uncComputerPattern(JSON_BACKSLASH);
1281
1294
  var SPN_HOST = "(?:\\b[A-Za-z][A-Za-z0-9]*/)([A-Za-z0-9][A-Za-z0-9.-]*)(?=@[A-Z0-9.-]+\\b)";
1282
1295
  var HOST_CTX_KEY = "(?:host|hostname|computer)";
1283
- var HOST_CTX = `(?:\\b${HOST_CTX_KEY}\\s*[=:]\\s*)([A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?)`;
1296
+ var HOST_VALUE = "[A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?";
1297
+ var HOST_CTX = `(?:\\b${HOST_CTX_KEY}\\s*[=:]\\s*)(${HOST_VALUE})`;
1298
+ function anyCase(word) {
1299
+ let pattern = "";
1300
+ for (const char of word) {
1301
+ const lower = char.toLowerCase();
1302
+ const upper = char.toUpperCase();
1303
+ pattern += lower === upper ? char : `[${lower}${upper}]`;
1304
+ }
1305
+ return pattern;
1306
+ }
1307
+ var QUOTED_DOMAIN_ACCOUNT = `(?:")(?!${WELL_KNOWN_DOMAIN}\\\\{1,2})(${NETBIOS_DOMAIN})(?=\\\\{1,2}${NOT_WINDOWS_FILENAME}${ACCOUNT_SEGMENT}")`;
1308
+ var KEY_WORD = "[A-Za-z_]*";
1309
+ var JSON_HOST_KEY = [
1310
+ `${KEY_WORD}${anyCase("computer")}${KEY_WORD}`,
1311
+ `${KEY_WORD}${anyCase("domain")}[_-]?${anyCase("name")}`,
1312
+ `${anyCase("host")}(?:[_-]?${anyCase("name")})?`,
1313
+ anyCase("fqdn"),
1314
+ anyCase("domain"),
1315
+ `${anyCase("server")}[_-]?${anyCase("name")}`,
1316
+ `${anyCase("node")}[_-]?${anyCase("name")}`,
1317
+ `${anyCase("dns")}[_-]?${anyCase("name")}`,
1318
+ `${anyCase("machine")}[_-]?${anyCase("name")}`,
1319
+ `${anyCase("target")}[_-]?${anyCase("host")}`
1320
+ ].join("|");
1321
+ var HOST_JSON_CTX = `(?:"(?:${JSON_HOST_KEY})"\\s*:\\s*")(${HOST_VALUE})(?=")`;
1284
1322
  var NETBIOS_AGGRESSIVE = "(?:\\b(?:WIN|DESKTOP)-[A-Z0-9]{7,10}\\b)";
1285
1323
  var SYSLOG_MONTH = "(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
1286
1324
  var SYSLOG_BSD_TS = `${SYSLOG_MONTH}\\s+\\d{1,2}\\s+\\d{2}:\\d{2}:\\d{2}`;
@@ -1293,23 +1331,35 @@ var INVENTORY_HOST = `(?:\\b${INVENTORY_PREFIX}-[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*-\
1293
1331
  var hostnamesRule = {
1294
1332
  id: "hosts",
1295
1333
  label: "Hostnames & domains",
1296
- description: "FQDNs, UNC computer names, Kerberos SPN hosts and syslog host fields become the same token everywhere within a session.",
1334
+ description: "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.",
1297
1335
  mode: "pseudo",
1298
1336
  token: "HOST",
1299
- patterns: [HOST_EXACT, HOST_COLLISION, UNC_COMPUTER, SPN_HOST, HOST_CTX, SYSLOG_HOST],
1337
+ patterns: [
1338
+ HOST_EXACT,
1339
+ HOST_COLLISION,
1340
+ UNC_COMPUTER,
1341
+ UNC_COMPUTER_JSON,
1342
+ SPN_HOST,
1343
+ HOST_CTX,
1344
+ HOST_JSON_CTX,
1345
+ QUOTED_DOMAIN_ACCOUNT,
1346
+ SYSLOG_HOST
1347
+ ],
1300
1348
  aggressivePatterns: [NETBIOS_AGGRESSIVE, INVENTORY_HOST],
1301
1349
  jsonKeys: [
1302
1350
  "hostname",
1303
1351
  "host",
1304
1352
  "fqdn",
1305
1353
  "domain",
1354
+ "computer",
1306
1355
  "computerName",
1307
1356
  "serverName",
1308
1357
  "nodeName",
1309
1358
  "dnsName",
1310
1359
  "machineName",
1311
1360
  "targetHost"
1312
- ]
1361
+ ],
1362
+ jsonKeyContains: ["computer", "domainname"]
1313
1363
  };
1314
1364
 
1315
1365
  // src/rules/definitions/ipAddresses.ts
@@ -1989,15 +2039,18 @@ var EMAIL_LOCAL = "[A-Za-z0-9._%+-]+";
1989
2039
  var EMAIL_DOMAIN = "[A-Za-z0-9.-]+\\.[A-Za-z]{2,}";
1990
2040
  var EMAIL = `(?:\\b${EMAIL_LOCAL}@${EMAIL_DOMAIN})`;
1991
2041
  var EMAIL_IP_LITERAL = `(?:\\b${EMAIL_LOCAL}@\\[[0-9a-fA-F.:]+\\])`;
1992
- var WIN_DOMAIN_EXCLUDE = "(?:BUILTIN|NT SERVICE|NT AUTHORITY|Users|Settings|Files)\\\\";
1993
- var USER_SEG_SIMPLE = "[A-Za-z0-9_](?:[A-Za-z0-9_.$-]*[A-Za-z0-9$])";
1994
- var FILE_EXT = "exe|dll|sys|bat|cmd|ps1|vbs|msi|tmp|hiv|log|dat|txt|ini|xml|json|lnk|cpl|ocx|drv";
1995
- var NOT_FILENAME = `(?![A-Za-z0-9_$.-]*\\.(?:${FILE_EXT})(?![A-Za-z0-9]))`;
2042
+ var USER_SEG_SIMPLE = ACCOUNT_SEGMENT;
1996
2043
  var NOT_GUID = "(?![0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-)";
1997
2044
  var ACCOUNT_END = "(?![A-Za-z0-9_$\\\\/-])";
1998
- var PATH_ROOT = "(?:\\b(?:HKLM|HKCU|HKU|HKCR|HKEY_[A-Z_]+)|\\b[A-Za-z]:)\\\\";
1999
- var NOT_UNDER_PATH_ROOT = `(?<!${PATH_ROOT}(?:(?! [-/])[^<>'"\\n])*)`;
2000
- var DOMAIN_USER = `(?:(?:(?:^|[^\\\\.-])\\b[A-Za-z0-9](?:[A-Za-z0-9.-]{0,13}[A-Za-z0-9])?\\\\)(?<!${WIN_DOMAIN_EXCLUDE})${NOT_FILENAME}${NOT_GUID}(${USER_SEG_SIMPLE})${ACCOUNT_END}${NOT_UNDER_PATH_ROOT})`;
2045
+ function domainUserPattern(separator) {
2046
+ const winDomainExclude = `${WELL_KNOWN_DOMAIN}${separator}`;
2047
+ const pathRoot = `(?:\\b(?:HKLM|HKCU|HKU|HKCR|HKEY_[A-Z_]+)|\\b[A-Za-z]:)${separator}`;
2048
+ const notUnderPathRoot = `(?<!${pathRoot}(?:(?! [-/])[^<>'"\\n])*)`;
2049
+ const domain = `(?:^|[^\\\\.-])\\b${NETBIOS_DOMAIN}${separator}`;
2050
+ return `(?:(?:${domain})(?<!${winDomainExclude})${NOT_WINDOWS_FILENAME}${NOT_GUID}(${USER_SEG_SIMPLE})${ACCOUNT_END}${notUnderPathRoot})`;
2051
+ }
2052
+ var DOMAIN_USER = domainUserPattern(BACKSLASH);
2053
+ var DOMAIN_USER_JSON = domainUserPattern(JSON_BACKSLASH);
2001
2054
  var SID = "(?:\\bS-1-(?:\\d+-){1,14}\\d+\\b)";
2002
2055
  var VALUE_WITH_LETTER = "[\\w.@+-]*[A-Za-z][\\w.@+-]*";
2003
2056
  var LDAP_DN_SINGLE = `(?:\\b(?:uid|sAMAccountName)=)(${VALUE_WITH_LETTER})`;
@@ -2058,6 +2111,7 @@ var usersRule = {
2058
2111
  EMAIL_IP_LITERAL,
2059
2112
  EMAIL,
2060
2113
  DOMAIN_USER,
2114
+ DOMAIN_USER_JSON,
2061
2115
  SID,
2062
2116
  LDAP_DN_SINGLE,
2063
2117
  LDAP_DN_CN,
@@ -2098,7 +2152,8 @@ var usersRule = {
2098
2152
  "surname",
2099
2153
  "userId",
2100
2154
  "uid"
2101
- ]
2155
+ ],
2156
+ jsonKeyContains: ["owner", "username"]
2102
2157
  };
2103
2158
 
2104
2159
  // src/rules/registry.ts
@@ -2314,6 +2369,14 @@ function validateRule(rule) {
2314
2369
  requireText(key, id, `jsonKeys[${index}]`);
2315
2370
  }
2316
2371
  }
2372
+ if (rule.jsonKeyContains !== void 0) {
2373
+ if (!Array.isArray(rule.jsonKeyContains)) {
2374
+ throw new InvalidRuleError(`Rule "${id}": \`jsonKeyContains\` must be an array of strings.`);
2375
+ }
2376
+ for (const [index, fragment] of rule.jsonKeyContains.entries()) {
2377
+ requireText(fragment, id, `jsonKeyContains[${index}]`);
2378
+ }
2379
+ }
2317
2380
  if (rule.validate !== void 0 && typeof rule.validate !== "function") {
2318
2381
  throw new InvalidRuleError(`Rule "${id}": \`validate\` must be a function.`);
2319
2382
  }
@@ -2326,5 +2389,5 @@ function defineRule(rule) {
2326
2389
  }
2327
2390
 
2328
2391
  export { InvalidKeyError, InvalidOptionError, InvalidRuleError, SanitizationAbortedError, SanitizerError, UnknownRuleError, builtinRuleIds, builtinRules, countCapturingGroups, defineRule, deriveGateSource, getBuiltinRule, isSanitizerError, lineHasAnyChar, validateRule };
2329
- //# sourceMappingURL=chunk-5R34WEOD.js.map
2330
- //# sourceMappingURL=chunk-5R34WEOD.js.map
2392
+ //# sourceMappingURL=chunk-VMPXBCSL.js.map
2393
+ //# sourceMappingURL=chunk-VMPXBCSL.js.map