@stll/anonymize 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ATTRIBUTION.md +43 -2
- package/README.md +56 -0
- package/dist/capabilities.d.mts +171 -4
- package/dist/capabilities.mjs +109 -3
- package/dist/capabilities.mjs.map +1 -1
- package/dist/constants.mjs +6 -1
- package/dist/constants.mjs.map +1 -1
- package/dist/constants2.d.mts +5 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist/native-node.d.mts +3 -2
- package/dist/native-node.mjs +3 -3
- package/dist/native-node2.d.mts +3 -3
- package/dist/native-node2.mjs +7 -2
- package/dist/native-node2.mjs.map +1 -1
- package/dist/native.d.mts +69 -1
- package/dist/native.mjs +18 -1
- package/dist/native.mjs.map +1 -1
- package/dist/native2.d.mts +2 -2
- package/native-pipeline.cs.stlanonpkg +0 -0
- package/native-pipeline.de.stlanonpkg +0 -0
- package/native-pipeline.en.stlanonpkg +0 -0
- package/native-pipeline.stlanonpkg +0 -0
- package/package.json +7 -7
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { CALLER_DETECTION_CONTRACT_VERSION, PreparedAnonymizer, PreparedNativeAnonymizer, PreparedNativePipeline, PreparedNativeRedactionSession, PreparedNativeSessionRedactionPlan, PreparedSearch, assertNativeBindingVersion, createNativeAnonymizerFromConfig, createNativeAnonymizerFromPackage, createNativePipelineFromPackage, encodeNativeSearchConfig, encodeNativeSearchConfigInput, getNativeBindingVersion, prepareNativeSearchPackage } from "./native.mjs";
|
|
2
|
-
import { A as
|
|
1
|
+
import { CALLER_DETECTION_CONTRACT_VERSION, EXTERNAL_DETECTION_BATCH_MAX_BYTES, EXTERNAL_DETECTION_BATCH_VERSION, EXTERNAL_DETECTION_DOCUMENT_MAX_BYTES, EXTERNAL_DETECTION_MAX_DETECTIONS, EXTERNAL_DETECTION_MAX_LABEL_MAPPINGS, EXTERNAL_DETECTION_MAX_METADATA_BYTES, EXTERNAL_DETECTION_OFFSET_UNITS, EXTERNAL_DETECTION_PROVIDER_ID_MAX_BYTES, PreparedAnonymizer, PreparedNativeAnonymizer, PreparedNativePipeline, PreparedNativeRedactionSession, PreparedNativeSessionRedactionPlan, PreparedSearch, assertNativeBindingVersion, createNativeAnonymizerFromConfig, createNativeAnonymizerFromPackage, createNativePipelineFromPackage, encodeNativeSearchConfig, encodeNativeSearchConfigInput, getNativeBindingVersion, prepareNativeSearchPackage } from "./native.mjs";
|
|
2
|
+
import { A as redact_text, C as readNativePipelinePackageFile, D as redactDefaultTextJson, E as redactDefaultText, F as assertNativePipelineSupported, I as createNativePipelineFromConfig, L as getNativePipelineCompatibility, M as redact_text_stream_json, N as summary_diagnostics_json, O as redact_default_text, P as DEFAULT_NATIVE_PIPELINE_CONFIG, R as prepareNativePipelineConfig, S as readDefaultNativePipelinePackageFileAsync, T as read_default_native_pipeline_package_file, _ as preloadDefaultNativePipeline, a as createNativePipelineFromDefaultPackage, b as prepare_search_package, c as diagnostics_json, d as get_default_native_pipeline, f as loadNativeAnonymizeBinding, g as normalize_for_search, h as native_package_version, i as convert_external_detection_batch, j as redact_text_json, k as redact_default_text_json, l as diagnostics_stream_json, m as load_prepared_package_file, n as availableDefaultNativePipelineLanguages, o as createNativePipelineFromPackageFile, p as load_prepared_package, r as available_default_native_pipeline_languages, s as create_native_pipeline_from_default_package, t as DEFAULT_NATIVE_PIPELINE_WARMUPS, u as getDefaultNativePipeline, v as preloadDefaultNativePipelineAsync, w as readNativePipelinePackageFileAsync, x as readDefaultNativePipelinePackageFile, y as preload_default_native_pipeline, z as prepareNativePipelinePackage } from "./native-node2.mjs";
|
|
3
3
|
import { DEFAULT_ENTITY_LABELS, DETECTION_SOURCES, DETECTOR_PRIORITY, ENTITY_CAPABILITIES, ENTITY_LABELS, ENTITY_SELECTIONS, OPERATOR_TYPES } from "./constants.mjs";
|
|
4
|
-
import { CAPABILITY_MANIFEST, CAPABILITY_MANIFEST_SCHEMA_VERSION, CAPABILITY_RUNTIMES } from "./capabilities.mjs";
|
|
4
|
+
import { CAPABILITY_MANIFEST, CAPABILITY_MANIFEST_SCHEMA_VERSION, CAPABILITY_PARITY_PROFILES, CAPABILITY_RUNTIMES, CAPABILITY_SURFACES } from "./capabilities.mjs";
|
|
5
5
|
//#region src/redact.ts
|
|
6
6
|
/**
|
|
7
7
|
* Serialize the redaction key to JSON for export.
|
|
@@ -26,6 +26,6 @@ const deanonymise = (redactedText, redactionMap) => {
|
|
|
26
26
|
return result;
|
|
27
27
|
};
|
|
28
28
|
//#endregion
|
|
29
|
-
export { CALLER_DETECTION_CONTRACT_VERSION, CAPABILITY_MANIFEST, CAPABILITY_MANIFEST_SCHEMA_VERSION, CAPABILITY_RUNTIMES, DEFAULT_ENTITY_LABELS, DEFAULT_NATIVE_PIPELINE_CONFIG, DEFAULT_NATIVE_PIPELINE_WARMUPS, DETECTION_SOURCES, DETECTOR_PRIORITY, ENTITY_CAPABILITIES, ENTITY_LABELS, ENTITY_SELECTIONS, OPERATOR_TYPES, PreparedAnonymizer, PreparedNativeAnonymizer, PreparedNativePipeline, PreparedNativeRedactionSession, PreparedNativeSessionRedactionPlan, PreparedSearch, assertNativeBindingVersion, assertNativePipelineSupported, availableDefaultNativePipelineLanguages, available_default_native_pipeline_languages, createNativeAnonymizerFromConfig, createNativeAnonymizerFromPackage, createNativePipelineFromConfig, createNativePipelineFromDefaultPackage, createNativePipelineFromPackage, createNativePipelineFromPackageFile, create_native_pipeline_from_default_package, deanonymise, diagnostics_json, diagnostics_stream_json, encodeNativeSearchConfig, encodeNativeSearchConfigInput, exportRedactionKey, getDefaultNativePipeline, getNativeBindingVersion, getNativePipelineCompatibility, get_default_native_pipeline, loadNativeAnonymizeBinding, load_prepared_package, load_prepared_package_file, native_package_version, normalize_for_search, preloadDefaultNativePipeline, preloadDefaultNativePipelineAsync, preload_default_native_pipeline, prepareNativePipelineConfig, prepareNativePipelinePackage, prepareNativeSearchPackage, prepare_search_package, readDefaultNativePipelinePackageFile, readDefaultNativePipelinePackageFileAsync, readNativePipelinePackageFile, readNativePipelinePackageFileAsync, read_default_native_pipeline_package_file, redactDefaultText, redactDefaultTextJson, redact_default_text, redact_default_text_json, redact_text, redact_text_json, redact_text_stream_json, summary_diagnostics_json };
|
|
29
|
+
export { CALLER_DETECTION_CONTRACT_VERSION, CAPABILITY_MANIFEST, CAPABILITY_MANIFEST_SCHEMA_VERSION, CAPABILITY_PARITY_PROFILES, CAPABILITY_RUNTIMES, CAPABILITY_SURFACES, DEFAULT_ENTITY_LABELS, DEFAULT_NATIVE_PIPELINE_CONFIG, DEFAULT_NATIVE_PIPELINE_WARMUPS, DETECTION_SOURCES, DETECTOR_PRIORITY, ENTITY_CAPABILITIES, ENTITY_LABELS, ENTITY_SELECTIONS, EXTERNAL_DETECTION_BATCH_MAX_BYTES, EXTERNAL_DETECTION_BATCH_VERSION, EXTERNAL_DETECTION_DOCUMENT_MAX_BYTES, EXTERNAL_DETECTION_MAX_DETECTIONS, EXTERNAL_DETECTION_MAX_LABEL_MAPPINGS, EXTERNAL_DETECTION_MAX_METADATA_BYTES, EXTERNAL_DETECTION_OFFSET_UNITS, EXTERNAL_DETECTION_PROVIDER_ID_MAX_BYTES, OPERATOR_TYPES, PreparedAnonymizer, PreparedNativeAnonymizer, PreparedNativePipeline, PreparedNativeRedactionSession, PreparedNativeSessionRedactionPlan, PreparedSearch, assertNativeBindingVersion, assertNativePipelineSupported, availableDefaultNativePipelineLanguages, available_default_native_pipeline_languages, convert_external_detection_batch, createNativeAnonymizerFromConfig, createNativeAnonymizerFromPackage, createNativePipelineFromConfig, createNativePipelineFromDefaultPackage, createNativePipelineFromPackage, createNativePipelineFromPackageFile, create_native_pipeline_from_default_package, deanonymise, diagnostics_json, diagnostics_stream_json, encodeNativeSearchConfig, encodeNativeSearchConfigInput, exportRedactionKey, getDefaultNativePipeline, getNativeBindingVersion, getNativePipelineCompatibility, get_default_native_pipeline, loadNativeAnonymizeBinding, load_prepared_package, load_prepared_package_file, native_package_version, normalize_for_search, preloadDefaultNativePipeline, preloadDefaultNativePipelineAsync, preload_default_native_pipeline, prepareNativePipelineConfig, prepareNativePipelinePackage, prepareNativeSearchPackage, prepare_search_package, readDefaultNativePipelinePackageFile, readDefaultNativePipelinePackageFileAsync, readNativePipelinePackageFile, readNativePipelinePackageFileAsync, read_default_native_pipeline_package_file, redactDefaultText, redactDefaultTextJson, redact_default_text, redact_default_text_json, redact_text, redact_text_json, redact_text_stream_json, summary_diagnostics_json };
|
|
30
30
|
|
|
31
31
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/redact.ts"],"sourcesContent":["import {\n DEFAULT_OPERATOR_CONFIG,\n maskReplacementSpans,\n OPERATOR_REGISTRY,\n operatorType,\n requireMaskSelection,\n resolveOperator,\n} from \"./operators\";\nimport type {\n Entity,\n OperatorConfig,\n OperatorType,\n RedactionResult,\n} from \"./types\";\nimport type { PipelineContext } from \"./context\";\nimport { defaultContext } from \"./context\";\n\nconst WHITESPACE_RE = /\\s+/g;\nconst PHONE_NOISE_RE = /[()\\s-]/g;\nconst ETHEREUM_ADDRESS_RE = /0x[0-9A-Fa-f]{40}/;\nconst BECH32_ADDRESS_RE = /\\bbc1[ac-hj-np-z02-9]{11,71}\\b/i;\nconst BASE58_ADDRESS_RE = /\\b[13][a-km-zA-HJ-NP-Z1-9]{25,34}\\b/;\nconst NHS_NUMBER_CUE_RE = /\\b(?:NHS|National\\s+Health\\s+Service)\\b/i;\nconst PLACEHOLDER_TOKEN_RE = /\\[[^\\s[\\]]+_[1-9]\\d*\\]/g;\nconst PASSPORT_IDENTIFIER_RE =\n /\\b(?:[A-Za-z]{1,2}\\d{6,8}|\\d{2}[A-Za-z]{2}\\d{5}|\\d{7,9})\\b/;\n// Strip all separators the ID detectors accept so the\n// same real-world value canonicalises to one placeholder:\n// - whitespace and `-` for IBAN, NIP, REGON, etc.\n// - `/` for birth numbers (\"900101/1234\") and Czech\n// bank accounts (\"123-4567/0100\").\n// - `.` for credit cards (\"4111.1111.1111.1111\") and\n// other dotted IDs.\nconst ID_SEPARATOR_RE = /[\\s\\-/.]/g;\n\nconst nextPlaceholder = (\n labelKey: string,\n counters: Map<string, number>,\n reservedPlaceholders: ReadonlySet<string>,\n): string => {\n let count = counters.get(labelKey) ?? 0;\n\n while (true) {\n count += 1;\n const placeholder = `[${labelKey}_${count}]`;\n if (reservedPlaceholders.has(placeholder)) continue;\n\n counters.set(labelKey, count);\n return placeholder;\n }\n};\n\nconst collectReservedPlaceholders = (\n reservedText: string,\n): ReadonlySet<string> => new Set(reservedText.match(PLACEHOLDER_TOKEN_RE));\n\nconst normalizeCryptoText = (text: string): string => {\n const trimmed = text.trim();\n\n const ethereumAddress = ETHEREUM_ADDRESS_RE.exec(trimmed)?.[0];\n if (ethereumAddress) {\n return ethereumAddress.toLowerCase();\n }\n\n const bech32Address = BECH32_ADDRESS_RE.exec(trimmed)?.[0];\n if (bech32Address) {\n return bech32Address.toLowerCase();\n }\n\n const base58Address = BASE58_ADDRESS_RE.exec(trimmed)?.[0];\n return base58Address ?? trimmed;\n};\n\nconst normalizePassportText = (text: string): string => {\n const passportIdentifier = PASSPORT_IDENTIFIER_RE.exec(text)?.[0] ?? text;\n return passportIdentifier.replace(ID_SEPARATOR_RE, \"\").toUpperCase();\n};\n\n/**\n * Normalize entity text so that surface-form variations\n * of the same real-world value map to a single canonical\n * key. Lowercased emails, stripped phone formatting, etc.\n */\nconst normalizeEntityText = (label: string, text: string): string => {\n const upper = label.toUpperCase().replace(WHITESPACE_RE, \"_\");\n\n if (upper === \"EMAIL_ADDRESS\" || upper === \"EMAIL\") {\n return text.toLowerCase().trim();\n }\n if (upper === \"PHONE_NUMBER\" || upper === \"PHONE\") {\n return text.replace(PHONE_NOISE_RE, \"\");\n }\n if (upper === \"CRYPTO\") {\n return normalizeCryptoText(text);\n }\n if (\n upper === \"NATIONAL_IDENTIFICATION_NUMBER\" &&\n NHS_NUMBER_CUE_RE.test(text)\n ) {\n return text.replace(/\\D/g, \"\");\n }\n if (\n upper === \"IBAN\" ||\n upper === \"BANK_ACCOUNT_NUMBER\" ||\n upper === \"TAX_IDENTIFICATION_NUMBER\" ||\n upper === \"REGISTRATION_NUMBER\" ||\n upper === \"NATIONAL_IDENTIFICATION_NUMBER\" ||\n upper === \"SOCIAL_SECURITY_NUMBER\" ||\n upper === \"BIRTH_NUMBER\" ||\n upper === \"IDENTITY_CARD_NUMBER\" ||\n upper === \"CREDIT_CARD_NUMBER\"\n ) {\n return text.replace(ID_SEPARATOR_RE, \"\").toUpperCase();\n }\n if (upper === \"PASSPORT_NUMBER\") {\n return normalizePassportText(text);\n }\n if (\n upper === \"PERSON\" ||\n upper === \"ORGANIZATION\" ||\n upper === \"ADDRESS\" ||\n upper === \"LAND_PARCEL\" ||\n upper === \"MISC\"\n ) {\n return text.replace(WHITESPACE_RE, \" \").toLowerCase().trim();\n }\n return text.trim();\n};\n\nconst nonOverlappingEntities = (entities: Entity[]): Entity[] => {\n const result: Entity[] = [];\n let lastEnd = 0;\n for (const entity of entities) {\n if (entity.start < lastEnd) continue;\n result.push(entity);\n lastEnd = entity.end;\n }\n return result;\n};\n\ntype MaskReplacementSpan = {\n start: number;\n end: number;\n replacement: string;\n};\n\nconst removeRedactedMaskOverlaps = (\n replacements: MaskReplacementSpan[],\n redacted: Entity[],\n): MaskReplacementSpan[] => {\n const result: MaskReplacementSpan[] = [];\n let redactedIndex = 0;\n for (const replacement of replacements) {\n while (true) {\n const candidate = redacted.at(redactedIndex);\n if (candidate === undefined || candidate.end > replacement.start) break;\n redactedIndex += 1;\n }\n const redactedEntity = redacted.at(redactedIndex);\n const overlaps =\n redactedEntity !== undefined &&\n redactedEntity.start < replacement.end &&\n replacement.start < redactedEntity.end;\n if (!overlaps) result.push(replacement);\n }\n return result;\n};\n\n/**\n * Build a stable mapping from entity text to numbered\n * placeholders. Same real-world value always maps to the\n * same placeholder (e.g., \"Dr. Muller\" and \"Dr. Muller\"\n * share one person placeholder).\n *\n * Placeholder format: [LABEL_N] where LABEL is uppercase.\n * N is allocated per label and skips tokens already present\n * in reserved text.\n *\n * @param _ctx Unused. Kept for signature compatibility;\n * coref alias links now travel on the entities\n * themselves (`corefSourceText`).\n */\ntype PlaceholderMapOptions = {\n reservedText?: string;\n};\n\nexport const buildPlaceholderMap = (\n entities: Entity[],\n _ctx: PipelineContext = defaultContext,\n { reservedText = \"\" }: PlaceholderMapOptions = {},\n): Map<string, string> => {\n const counters = new Map<string, number>();\n const textLabelToPlaceholder = new Map<string, string>();\n const normalizedToPlaceholder = new Map<string, string>();\n const reservedPlaceholders = collectReservedPlaceholders(reservedText);\n\n const sorted = entities.toSorted((a, b) => a.start - b.start);\n\n for (const entity of sorted) {\n const compositeKey = `${entity.label}\\0${entity.text}`;\n if (textLabelToPlaceholder.has(compositeKey)) {\n continue;\n }\n\n const labelKey = entity.label.toUpperCase().replace(WHITESPACE_RE, \"_\");\n\n // If this entity is a coref alias, unify its key\n // with the source entity's key so both get the same\n // number — in either direction: a backward alias\n // joins the source's existing placeholder, and a\n // forward alias (bare mention before the full form)\n // reserves its placeholder under the source key so\n // the source joins it when numbered later. The link\n // is carried on the entity itself, so it cannot be\n // lost between detection and redaction.\n const sourceText =\n entity.source === \"coreference\" ? entity.corefSourceText : undefined;\n const sourceNormalizedKey =\n sourceText === undefined\n ? undefined\n : `${labelKey}\\0${normalizeEntityText(entity.label, sourceText)}`;\n if (sourceNormalizedKey !== undefined) {\n const sourceExisting = normalizedToPlaceholder.get(sourceNormalizedKey);\n if (sourceExisting) {\n textLabelToPlaceholder.set(compositeKey, sourceExisting);\n continue;\n }\n }\n\n const normalized = normalizeEntityText(entity.label, entity.text);\n const normalizedKey = `${labelKey}\\0${normalized}`;\n const existing = normalizedToPlaceholder.get(normalizedKey);\n if (existing) {\n textLabelToPlaceholder.set(compositeKey, existing);\n if (sourceNormalizedKey !== undefined) {\n normalizedToPlaceholder.set(sourceNormalizedKey, existing);\n }\n continue;\n }\n\n const placeholder = nextPlaceholder(\n labelKey,\n counters,\n reservedPlaceholders,\n );\n textLabelToPlaceholder.set(compositeKey, placeholder);\n normalizedToPlaceholder.set(normalizedKey, placeholder);\n if (sourceNormalizedKey !== undefined) {\n normalizedToPlaceholder.set(sourceNormalizedKey, placeholder);\n }\n }\n\n return textLabelToPlaceholder;\n};\n\n/**\n * Apply redactions to the source text, replacing each\n * confirmed entity span using the configured operator.\n *\n * Co-references are consistent: if the same text appears\n * multiple times, all occurrences get the same placeholder.\n *\n * @param ctx Pipeline context. Must be the same instance\n * passed to `runPipeline` (or `findCoreferenceSpans`)\n * so coreference placeholder links are preserved.\n * Defaults to `defaultContext` for single-tenant usage.\n */\nexport const redactText = (\n fullText: string,\n entities: Entity[],\n config: OperatorConfig = DEFAULT_OPERATOR_CONFIG,\n ctx: PipelineContext = defaultContext,\n): RedactionResult => {\n if (entities.length === 0) {\n return {\n redactedText: fullText,\n redactionMap: new Map(),\n operatorMap: new Map(),\n entityCount: 0,\n };\n }\n\n const placeholderMap = buildPlaceholderMap(entities, ctx, {\n reservedText: fullText,\n });\n\n const sorted = entities.toSorted((a, b) => a.start - b.start);\n\n const kept: Entity[] = [];\n const masked: Entity[] = [];\n const redacted: Entity[] = [];\n for (const entity of sorted) {\n const opType = operatorType(resolveOperator(config, entity.label));\n if (opType === \"keep\") {\n kept.push(entity);\n } else if (opType === \"mask\") {\n masked.push(entity);\n } else {\n redacted.push(entity);\n }\n }\n const selectedKept = nonOverlappingEntities(kept);\n const selectedMasked = nonOverlappingEntities(masked);\n const selectedRedacted = nonOverlappingEntities(redacted);\n\n const maskReplacements: MaskReplacementSpan[] = [];\n for (const entity of selectedMasked) {\n const selection = resolveOperator(config, entity.label);\n const sourceText = fullText.slice(entity.start, entity.end);\n for (const replacement of maskReplacementSpans(\n sourceText,\n requireMaskSelection(selection),\n )) {\n maskReplacements.push({\n start: entity.start + replacement.start,\n end: entity.start + replacement.end,\n replacement: replacement.replacement,\n });\n }\n }\n const visibleMaskReplacements = removeRedactedMaskOverlaps(\n maskReplacements,\n selectedRedacted,\n );\n\n const parts: string[] = [];\n const redactionMap = new Map<string, string>();\n const operatorMap = new Map<string, OperatorType>();\n let cursor = 0;\n\n const placeholderFor = (entity: Entity): string =>\n placeholderMap.get(`${entity.label}\\0${entity.text}`) ??\n `[${entity.label.toUpperCase().replace(/\\s+/g, \"_\")}]`;\n const processed = [\n ...selectedKept,\n ...selectedMasked,\n ...selectedRedacted,\n ].toSorted((a, b) => a.start - b.start);\n for (const entity of processed) {\n operatorMap.set(\n placeholderFor(entity),\n operatorType(resolveOperator(config, entity.label)),\n );\n }\n\n let redactedIndex = 0;\n let maskIndex = 0;\n while (\n redactedIndex < selectedRedacted.length ||\n maskIndex < visibleMaskReplacements.length\n ) {\n const redactedEntity = selectedRedacted.at(redactedIndex);\n const maskReplacement = visibleMaskReplacements.at(maskIndex);\n const useRedacted =\n redactedEntity !== undefined &&\n (maskReplacement === undefined ||\n redactedEntity.start <= maskReplacement.start);\n const start = useRedacted\n ? (redactedEntity?.start ?? cursor)\n : (maskReplacement?.start ?? cursor);\n const end = useRedacted\n ? (redactedEntity?.end ?? start)\n : (maskReplacement?.end ?? start);\n if (start > cursor) parts.push(fullText.slice(cursor, start));\n\n if (!useRedacted && maskReplacement !== undefined) {\n parts.push(maskReplacement.replacement);\n cursor = end;\n maskIndex += 1;\n continue;\n }\n if (redactedEntity === undefined) break;\n\n const entity = redactedEntity;\n const placeholder = placeholderFor(entity);\n\n const selection = resolveOperator(config, entity.label);\n const opType = operatorType(selection);\n const operator = OPERATOR_REGISTRY[opType];\n\n const replacement = operator.apply(\n entity.text,\n entity.label,\n placeholder,\n config.redactString,\n selection,\n );\n\n parts.push(replacement);\n // Only populate redactionMap for reversible operators.\n // A coref alias contributes its source's full text, so\n // a forward alias (\"Acme\" before \"Acme Corporation\")\n // cannot pin the shortened surface form as the key's\n // canonical value for the shared placeholder.\n if (\n operator.reversibility === \"reversible\" &&\n !redactionMap.has(placeholder)\n ) {\n redactionMap.set(\n placeholder,\n entity.source === \"coreference\" ? entity.corefSourceText : entity.text,\n );\n }\n\n cursor = end;\n redactedIndex += 1;\n }\n\n if (cursor < fullText.length) {\n parts.push(fullText.slice(cursor));\n }\n\n return {\n redactedText: parts.join(\"\"),\n redactionMap,\n operatorMap,\n entityCount:\n selectedKept.length + selectedMasked.length + selectedRedacted.length,\n };\n};\n\n/**\n * Serialize the redaction key to JSON for export.\n * Includes operator metadata so the export is self-describing.\n */\nexport const exportRedactionKey = (\n redactionMap: Map<string, string>,\n operatorMap: Map<string, OperatorType>,\n): string => {\n const entries: Record<string, { original: string; operator: OperatorType }> =\n {};\n\n for (const [placeholder, value] of redactionMap) {\n entries[placeholder] = {\n original: value,\n operator: operatorMap.get(placeholder) ?? \"replace\",\n };\n }\n\n return JSON.stringify({ entries }, null, 2);\n};\n\n/**\n * De-anonymise text using a redaction key.\n * Replaces placeholders back with original values.\n * Only works for reversible operators (replace).\n */\nexport const deanonymise = (\n redactedText: string,\n redactionMap: Map<string, string>,\n): string => {\n let result = redactedText;\n\n for (const [placeholder, original] of redactionMap) {\n result = result.replaceAll(placeholder, original);\n }\n\n return result;\n};\n"],"mappings":";;;;;;;;;AAyaA,MAAa,sBACX,cACA,gBACW;CACX,MAAM,UACJ,CAAC;CAEH,KAAK,MAAM,CAAC,aAAa,UAAU,cACjC,QAAQ,eAAe;EACrB,UAAU;EACV,UAAU,YAAY,IAAI,WAAW,KAAK;CAC5C;CAGF,OAAO,KAAK,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC;AAC5C;;;;;;AAOA,MAAa,eACX,cACA,iBACW;CACX,IAAI,SAAS;CAEb,KAAK,MAAM,CAAC,aAAa,aAAa,cACpC,SAAS,OAAO,WAAW,aAAa,QAAQ;CAGlD,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/redact.ts"],"sourcesContent":["import {\n DEFAULT_OPERATOR_CONFIG,\n maskReplacementSpans,\n OPERATOR_REGISTRY,\n operatorType,\n requireMaskSelection,\n resolveOperator,\n} from \"./operators\";\nimport type {\n Entity,\n OperatorConfig,\n OperatorType,\n RedactionResult,\n} from \"./types\";\nimport type { PipelineContext } from \"./context\";\nimport { defaultContext } from \"./context\";\n\nconst WHITESPACE_RE = /\\s+/g;\nconst NON_PHONE_DIGIT_RE = /\\D/g;\nconst ETHEREUM_ADDRESS_RE = /0x[0-9A-Fa-f]{40}/;\nconst BECH32_ADDRESS_RE = /\\bbc1[ac-hj-np-z02-9]{11,71}\\b/i;\nconst BASE58_ADDRESS_RE = /\\b[13][a-km-zA-HJ-NP-Z1-9]{25,34}\\b/;\nconst NHS_NUMBER_CUE_RE = /\\b(?:NHS|National\\s+Health\\s+Service)\\b/i;\nconst PLACEHOLDER_TOKEN_RE = /\\[[^\\s[\\]]+_[1-9]\\d*\\]/g;\nconst PASSPORT_IDENTIFIER_RE =\n /\\b(?:[A-Za-z]{1,2}\\d{6,8}|\\d{2}[A-Za-z]{2}\\d{5}|\\d{7,9})\\b/;\n// Strip all separators the ID detectors accept so the\n// same real-world value canonicalises to one placeholder:\n// - whitespace and `-` for IBAN, NIP, REGON, etc.\n// - `/` for birth numbers (\"900101/1234\") and Czech\n// bank accounts (\"123-4567/0100\").\n// - `.` for credit cards (\"4111.1111.1111.1111\") and\n// other dotted IDs.\nconst ID_SEPARATOR_RE = /[\\s\\-/.]/g;\n\nconst nextPlaceholder = (\n labelKey: string,\n counters: Map<string, number>,\n reservedPlaceholders: ReadonlySet<string>,\n): string => {\n let count = counters.get(labelKey) ?? 0;\n\n while (true) {\n count += 1;\n const placeholder = `[${labelKey}_${count}]`;\n if (reservedPlaceholders.has(placeholder)) continue;\n\n counters.set(labelKey, count);\n return placeholder;\n }\n};\n\nconst collectReservedPlaceholders = (\n reservedText: string,\n): ReadonlySet<string> => new Set(reservedText.match(PLACEHOLDER_TOKEN_RE));\n\nconst normalizeCryptoText = (text: string): string => {\n const trimmed = text.trim();\n\n const ethereumAddress = ETHEREUM_ADDRESS_RE.exec(trimmed)?.[0];\n if (ethereumAddress) {\n return ethereumAddress.toLowerCase();\n }\n\n const bech32Address = BECH32_ADDRESS_RE.exec(trimmed)?.[0];\n if (bech32Address) {\n return bech32Address.toLowerCase();\n }\n\n const base58Address = BASE58_ADDRESS_RE.exec(trimmed)?.[0];\n return base58Address ?? trimmed;\n};\n\nconst normalizePassportText = (text: string): string => {\n const passportIdentifier = PASSPORT_IDENTIFIER_RE.exec(text)?.[0] ?? text;\n return passportIdentifier.replace(ID_SEPARATOR_RE, \"\").toUpperCase();\n};\n\n/**\n * Normalize entity text so that surface-form variations\n * of the same real-world value map to a single canonical\n * key. Lowercased emails, stripped phone formatting, etc.\n */\nconst normalizeEntityText = (label: string, text: string): string => {\n const upper = label.toUpperCase().replace(WHITESPACE_RE, \"_\");\n\n if (upper === \"EMAIL_ADDRESS\" || upper === \"EMAIL\") {\n return text.toLowerCase().trim();\n }\n if (upper === \"PHONE_NUMBER\" || upper === \"PHONE\") {\n const digits = text.replace(NON_PHONE_DIGIT_RE, \"\");\n return digits.startsWith(\"00\") ? digits.slice(2) : digits;\n }\n if (upper === \"CRYPTO\") {\n return normalizeCryptoText(text);\n }\n if (\n upper === \"NATIONAL_IDENTIFICATION_NUMBER\" &&\n NHS_NUMBER_CUE_RE.test(text)\n ) {\n return text.replace(/\\D/g, \"\");\n }\n if (\n upper === \"IBAN\" ||\n upper === \"BANK_ACCOUNT_NUMBER\" ||\n upper === \"TAX_IDENTIFICATION_NUMBER\" ||\n upper === \"REGISTRATION_NUMBER\" ||\n upper === \"NATIONAL_IDENTIFICATION_NUMBER\" ||\n upper === \"SOCIAL_SECURITY_NUMBER\" ||\n upper === \"BIRTH_NUMBER\" ||\n upper === \"IDENTITY_CARD_NUMBER\" ||\n upper === \"CREDIT_CARD_NUMBER\"\n ) {\n return text.replace(ID_SEPARATOR_RE, \"\").toUpperCase();\n }\n if (upper === \"PASSPORT_NUMBER\") {\n return normalizePassportText(text);\n }\n if (\n upper === \"PERSON\" ||\n upper === \"ORGANIZATION\" ||\n upper === \"ADDRESS\" ||\n upper === \"LAND_PARCEL\" ||\n upper === \"MISC\"\n ) {\n return text.replace(WHITESPACE_RE, \" \").toLowerCase().trim();\n }\n return text.trim();\n};\n\nconst nonOverlappingEntities = (entities: Entity[]): Entity[] => {\n const result: Entity[] = [];\n let lastEnd = 0;\n for (const entity of entities) {\n if (entity.start < lastEnd) continue;\n result.push(entity);\n lastEnd = entity.end;\n }\n return result;\n};\n\ntype MaskReplacementSpan = {\n start: number;\n end: number;\n replacement: string;\n};\n\nconst removeRedactedMaskOverlaps = (\n replacements: MaskReplacementSpan[],\n redacted: Entity[],\n): MaskReplacementSpan[] => {\n const result: MaskReplacementSpan[] = [];\n let redactedIndex = 0;\n for (const replacement of replacements) {\n while (true) {\n const candidate = redacted.at(redactedIndex);\n if (candidate === undefined || candidate.end > replacement.start) break;\n redactedIndex += 1;\n }\n const redactedEntity = redacted.at(redactedIndex);\n const overlaps =\n redactedEntity !== undefined &&\n redactedEntity.start < replacement.end &&\n replacement.start < redactedEntity.end;\n if (!overlaps) result.push(replacement);\n }\n return result;\n};\n\n/**\n * Build a stable mapping from entity text to numbered\n * placeholders. Same real-world value always maps to the\n * same placeholder (e.g., \"Dr. Muller\" and \"Dr. Muller\"\n * share one person placeholder).\n *\n * Placeholder format: [LABEL_N] where LABEL is uppercase.\n * N is allocated per label and skips tokens already present\n * in reserved text.\n *\n * @param _ctx Unused. Kept for signature compatibility;\n * coref alias links now travel on the entities\n * themselves (`corefSourceText`).\n */\ntype PlaceholderMapOptions = {\n reservedText?: string;\n};\n\nexport const buildPlaceholderMap = (\n entities: Entity[],\n _ctx: PipelineContext = defaultContext,\n { reservedText = \"\" }: PlaceholderMapOptions = {},\n): Map<string, string> => {\n const counters = new Map<string, number>();\n const textLabelToPlaceholder = new Map<string, string>();\n const normalizedToPlaceholder = new Map<string, string>();\n const reservedPlaceholders = collectReservedPlaceholders(reservedText);\n\n const sorted = entities.toSorted((a, b) => a.start - b.start);\n\n for (const entity of sorted) {\n const compositeKey = `${entity.label}\\0${entity.text}`;\n if (textLabelToPlaceholder.has(compositeKey)) {\n continue;\n }\n\n const labelKey = entity.label.toUpperCase().replace(WHITESPACE_RE, \"_\");\n\n // If this entity is a coref alias, unify its key\n // with the source entity's key so both get the same\n // number — in either direction: a backward alias\n // joins the source's existing placeholder, and a\n // forward alias (bare mention before the full form)\n // reserves its placeholder under the source key so\n // the source joins it when numbered later. The link\n // is carried on the entity itself, so it cannot be\n // lost between detection and redaction.\n const sourceText =\n entity.source === \"coreference\" ? entity.corefSourceText : undefined;\n const sourceNormalizedKey =\n sourceText === undefined\n ? undefined\n : `${labelKey}\\0${normalizeEntityText(entity.label, sourceText)}`;\n if (sourceNormalizedKey !== undefined) {\n const sourceExisting = normalizedToPlaceholder.get(sourceNormalizedKey);\n if (sourceExisting) {\n textLabelToPlaceholder.set(compositeKey, sourceExisting);\n continue;\n }\n }\n\n const normalized = normalizeEntityText(entity.label, entity.text);\n const normalizedKey = `${labelKey}\\0${normalized}`;\n const existing = normalizedToPlaceholder.get(normalizedKey);\n if (existing) {\n textLabelToPlaceholder.set(compositeKey, existing);\n if (sourceNormalizedKey !== undefined) {\n normalizedToPlaceholder.set(sourceNormalizedKey, existing);\n }\n continue;\n }\n\n const placeholder = nextPlaceholder(\n labelKey,\n counters,\n reservedPlaceholders,\n );\n textLabelToPlaceholder.set(compositeKey, placeholder);\n normalizedToPlaceholder.set(normalizedKey, placeholder);\n if (sourceNormalizedKey !== undefined) {\n normalizedToPlaceholder.set(sourceNormalizedKey, placeholder);\n }\n }\n\n return textLabelToPlaceholder;\n};\n\n/**\n * Apply redactions to the source text, replacing each\n * confirmed entity span using the configured operator.\n *\n * Co-references are consistent: if the same text appears\n * multiple times, all occurrences get the same placeholder.\n *\n * @param ctx Pipeline context. Must be the same instance\n * passed to `runPipeline` (or `findCoreferenceSpans`)\n * so coreference placeholder links are preserved.\n * Defaults to `defaultContext` for single-tenant usage.\n */\nexport const redactText = (\n fullText: string,\n entities: Entity[],\n config: OperatorConfig = DEFAULT_OPERATOR_CONFIG,\n ctx: PipelineContext = defaultContext,\n): RedactionResult => {\n if (entities.length === 0) {\n return {\n redactedText: fullText,\n redactionMap: new Map(),\n operatorMap: new Map(),\n entityCount: 0,\n };\n }\n\n const placeholderMap = buildPlaceholderMap(entities, ctx, {\n reservedText: fullText,\n });\n\n const sorted = entities.toSorted((a, b) => a.start - b.start);\n\n const kept: Entity[] = [];\n const masked: Entity[] = [];\n const redacted: Entity[] = [];\n for (const entity of sorted) {\n const opType = operatorType(resolveOperator(config, entity.label));\n if (opType === \"keep\") {\n kept.push(entity);\n } else if (opType === \"mask\") {\n masked.push(entity);\n } else {\n redacted.push(entity);\n }\n }\n const selectedKept = nonOverlappingEntities(kept);\n const selectedMasked = nonOverlappingEntities(masked);\n const selectedRedacted = nonOverlappingEntities(redacted);\n\n const maskReplacements: MaskReplacementSpan[] = [];\n for (const entity of selectedMasked) {\n const selection = resolveOperator(config, entity.label);\n const sourceText = fullText.slice(entity.start, entity.end);\n for (const replacement of maskReplacementSpans(\n sourceText,\n requireMaskSelection(selection),\n )) {\n maskReplacements.push({\n start: entity.start + replacement.start,\n end: entity.start + replacement.end,\n replacement: replacement.replacement,\n });\n }\n }\n const visibleMaskReplacements = removeRedactedMaskOverlaps(\n maskReplacements,\n selectedRedacted,\n );\n\n const parts: string[] = [];\n const redactionMap = new Map<string, string>();\n const operatorMap = new Map<string, OperatorType>();\n let cursor = 0;\n\n const placeholderFor = (entity: Entity): string =>\n placeholderMap.get(`${entity.label}\\0${entity.text}`) ??\n `[${entity.label.toUpperCase().replace(/\\s+/g, \"_\")}]`;\n const processed = [\n ...selectedKept,\n ...selectedMasked,\n ...selectedRedacted,\n ].toSorted((a, b) => a.start - b.start);\n for (const entity of processed) {\n operatorMap.set(\n placeholderFor(entity),\n operatorType(resolveOperator(config, entity.label)),\n );\n }\n\n let redactedIndex = 0;\n let maskIndex = 0;\n while (\n redactedIndex < selectedRedacted.length ||\n maskIndex < visibleMaskReplacements.length\n ) {\n const redactedEntity = selectedRedacted.at(redactedIndex);\n const maskReplacement = visibleMaskReplacements.at(maskIndex);\n const useRedacted =\n redactedEntity !== undefined &&\n (maskReplacement === undefined ||\n redactedEntity.start <= maskReplacement.start);\n const start = useRedacted\n ? (redactedEntity?.start ?? cursor)\n : (maskReplacement?.start ?? cursor);\n const end = useRedacted\n ? (redactedEntity?.end ?? start)\n : (maskReplacement?.end ?? start);\n if (start > cursor) parts.push(fullText.slice(cursor, start));\n\n if (!useRedacted && maskReplacement !== undefined) {\n parts.push(maskReplacement.replacement);\n cursor = end;\n maskIndex += 1;\n continue;\n }\n if (redactedEntity === undefined) break;\n\n const entity = redactedEntity;\n const placeholder = placeholderFor(entity);\n\n const selection = resolveOperator(config, entity.label);\n const opType = operatorType(selection);\n const operator = OPERATOR_REGISTRY[opType];\n\n const replacement = operator.apply(\n entity.text,\n entity.label,\n placeholder,\n config.redactString,\n selection,\n );\n\n parts.push(replacement);\n // Only populate redactionMap for reversible operators.\n // A coref alias contributes its source's full text, so\n // a forward alias (\"Acme\" before \"Acme Corporation\")\n // cannot pin the shortened surface form as the key's\n // canonical value for the shared placeholder.\n if (\n operator.reversibility === \"reversible\" &&\n !redactionMap.has(placeholder)\n ) {\n redactionMap.set(\n placeholder,\n entity.source === \"coreference\" ? entity.corefSourceText : entity.text,\n );\n }\n\n cursor = end;\n redactedIndex += 1;\n }\n\n if (cursor < fullText.length) {\n parts.push(fullText.slice(cursor));\n }\n\n return {\n redactedText: parts.join(\"\"),\n redactionMap,\n operatorMap,\n entityCount:\n selectedKept.length + selectedMasked.length + selectedRedacted.length,\n };\n};\n\n/**\n * Serialize the redaction key to JSON for export.\n * Includes operator metadata so the export is self-describing.\n */\nexport const exportRedactionKey = (\n redactionMap: Map<string, string>,\n operatorMap: Map<string, OperatorType>,\n): string => {\n const entries: Record<string, { original: string; operator: OperatorType }> =\n {};\n\n for (const [placeholder, value] of redactionMap) {\n entries[placeholder] = {\n original: value,\n operator: operatorMap.get(placeholder) ?? \"replace\",\n };\n }\n\n return JSON.stringify({ entries }, null, 2);\n};\n\n/**\n * De-anonymise text using a redaction key.\n * Replaces placeholders back with original values.\n * Only works for reversible operators (replace).\n */\nexport const deanonymise = (\n redactedText: string,\n redactionMap: Map<string, string>,\n): string => {\n let result = redactedText;\n\n for (const [placeholder, original] of redactionMap) {\n result = result.replaceAll(placeholder, original);\n }\n\n return result;\n};\n"],"mappings":";;;;;;;;;AA0aA,MAAa,sBACX,cACA,gBACW;CACX,MAAM,UACJ,CAAC;CAEH,KAAK,MAAM,CAAC,aAAa,UAAU,cACjC,QAAQ,eAAe;EACrB,UAAU;EACV,UAAU,YAAY,IAAI,WAAW,KAAK;CAC5C;CAGF,OAAO,KAAK,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC;AAC5C;;;;;;AAOA,MAAa,eACX,cACA,iBACW;CACX,IAAI,SAAS;CAEb,KAAK,MAAM,CAAC,aAAa,aAAa,cACpC,SAAS,OAAO,WAAW,aAAa,QAAQ;CAGlD,OAAO;AACT"}
|
package/dist/native-node.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { At as PipelineConfig, C as NativeOperatorConfig, G as PreparedNativePipeline, Ot as GazetteerEntry, V as NativeStaticRedactionResult, W as PreparedNativeAnonymizer, _ as NativeCallerDetection, d as ExternalDetectionBatch, j as NativeSearchPackageInput, p as NativeAnonymizeBinding, zt as NativePreparedSearchConfig } from "./native.mjs";
|
|
2
2
|
//#region src/context.d.ts
|
|
3
3
|
/**
|
|
4
4
|
* Cached state for a single pipeline run (or a sequence of runs sharing the
|
|
@@ -78,6 +78,7 @@ declare const loadNativeAnonymizeBinding: (options?: LoadNativeBindingOptions) =
|
|
|
78
78
|
declare const readNativePipelinePackageFile: (packagePath: string) => Uint8Array;
|
|
79
79
|
declare const readNativePipelinePackageFileAsync: (packagePath: string) => Promise<Uint8Array>;
|
|
80
80
|
declare const native_package_version: (options?: NativeSdkOptions) => string;
|
|
81
|
+
declare const convert_external_detection_batch: (document: Uint8Array, batch: ExternalDetectionBatch | string, options?: NativeSdkOptions) => NativeCallerDetection[];
|
|
81
82
|
declare const normalize_for_search: (text: string, options?: NativeSdkOptions) => string;
|
|
82
83
|
declare const prepare_search_package: (config: NativeSearchPackageInput, { compressed, ...options }?: NativeSdkPackageOptions) => Uint8Array;
|
|
83
84
|
declare const load_prepared_package: (packageBytes: Uint8Array, options?: NativeSdkOptions) => PreparedNativeAnonymizer;
|
|
@@ -106,5 +107,5 @@ declare const redactDefaultTextJson: (fullText: string, operators?: NativeOperat
|
|
|
106
107
|
declare const redact_default_text_json: (fullText: string, operators?: NativeOperatorConfig, options?: DefaultNativePipelinePackageOptions) => string;
|
|
107
108
|
declare const preloadDefaultNativePipelineAsync: (options?: DefaultNativePipelinePackageOptions) => Promise<PreparedNativePipeline>;
|
|
108
109
|
//#endregion
|
|
109
|
-
export {
|
|
110
|
+
export { readDefaultNativePipelinePackageFile as A, redact_text_json as B, load_prepared_package_file as C, preloadDefaultNativePipelineAsync as D, preloadDefaultNativePipeline as E, redactDefaultText as F, NativePipelineCompatibility as G, summary_diagnostics_json as H, redactDefaultTextJson as I, assertNativePipelineSupported as J, NativePipelinePackageOptions as K, redact_default_text as L, readNativePipelinePackageFile as M, readNativePipelinePackageFileAsync as N, preload_default_native_pipeline as O, read_default_native_pipeline_package_file as P, prepareNativePipelinePackage as Q, redact_default_text_json as R, load_prepared_package as S, normalize_for_search as T, DEFAULT_NATIVE_PIPELINE_CONFIG as U, redact_text_stream_json as V, NativePipelineBuildOptions as W, getNativePipelineCompatibility as X, createNativePipelineFromConfig as Y, prepareNativePipelineConfig as Z, diagnostics_json as _, LoadNativeBindingOptions as a, get_default_native_pipeline as b, NativeRequire as c, availableDefaultNativePipelineLanguages as d, available_default_native_pipeline_languages as f, create_native_pipeline_from_default_package as g, createNativePipelineFromPackageFile as h, DefaultNativePipelineWarmup as i, readDefaultNativePipelinePackageFileAsync as j, prepare_search_package as k, NativeSdkOptions as l, createNativePipelineFromDefaultPackage as m, DefaultNativePipelinePackageFileOptions as n, NativeLibc as o, convert_external_detection_batch as p, NativePipelineUnsupportedFeature as q, DefaultNativePipelinePackageOptions as r, NativePipelinePackageFileOptions as s, DEFAULT_NATIVE_PIPELINE_WARMUPS as t, NativeSdkPackageOptions as u, diagnostics_stream_json as v, native_package_version as w, loadNativeAnonymizeBinding as x, getDefaultNativePipeline as y, redact_text as z };
|
|
110
111
|
//# sourceMappingURL=native-node.d.mts.map
|
package/dist/native-node.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { CALLER_DETECTION_CONTRACT_VERSION, PreparedAnonymizer, PreparedNativeAnonymizer, PreparedNativePipeline, PreparedNativeRedactionSession, PreparedNativeSessionRedactionPlan, PreparedSearch, assertNativeBindingVersion, createNativeAnonymizerFromConfig, createNativeAnonymizerFromPackage, createNativePipelineFromPackage, encodeNativeSearchConfig, encodeNativeSearchConfigInput, getNativeBindingVersion, prepareNativeSearchPackage } from "./native.mjs";
|
|
2
|
-
import { A as
|
|
3
|
-
export { CALLER_DETECTION_CONTRACT_VERSION, DEFAULT_NATIVE_PIPELINE_CONFIG, DEFAULT_NATIVE_PIPELINE_WARMUPS, PreparedAnonymizer, PreparedNativeAnonymizer, PreparedNativePipeline, PreparedNativeRedactionSession, PreparedNativeSessionRedactionPlan, PreparedSearch, assertNativeBindingVersion, assertNativePipelineSupported, availableDefaultNativePipelineLanguages, available_default_native_pipeline_languages, createNativeAnonymizerFromConfig, createNativeAnonymizerFromPackage, createNativePipelineFromConfig, createNativePipelineFromDefaultPackage, createNativePipelineFromPackage, createNativePipelineFromPackageFile, create_native_pipeline_from_default_package, diagnostics_json, diagnostics_stream_json, encodeNativeSearchConfig, encodeNativeSearchConfigInput, getDefaultNativePipeline, getNativeBindingVersion, getNativePipelineCompatibility, get_default_native_pipeline, loadNativeAnonymizeBinding, load_prepared_package, load_prepared_package_file, native_package_version, normalize_for_search, preloadDefaultNativePipeline, preloadDefaultNativePipelineAsync, preload_default_native_pipeline, prepareNativePipelineConfig, prepareNativePipelinePackage, prepareNativeSearchPackage, prepare_search_package, readDefaultNativePipelinePackageFile, readDefaultNativePipelinePackageFileAsync, readNativePipelinePackageFile, readNativePipelinePackageFileAsync, read_default_native_pipeline_package_file, redactDefaultText, redactDefaultTextJson, redact_default_text, redact_default_text_json, redact_text, redact_text_json, redact_text_stream_json, summary_diagnostics_json };
|
|
1
|
+
import { CALLER_DETECTION_CONTRACT_VERSION, EXTERNAL_DETECTION_BATCH_MAX_BYTES, EXTERNAL_DETECTION_BATCH_VERSION, EXTERNAL_DETECTION_DOCUMENT_MAX_BYTES, EXTERNAL_DETECTION_MAX_DETECTIONS, EXTERNAL_DETECTION_MAX_LABEL_MAPPINGS, EXTERNAL_DETECTION_MAX_METADATA_BYTES, EXTERNAL_DETECTION_OFFSET_UNITS, EXTERNAL_DETECTION_PROVIDER_ID_MAX_BYTES, PreparedAnonymizer, PreparedNativeAnonymizer, PreparedNativePipeline, PreparedNativeRedactionSession, PreparedNativeSessionRedactionPlan, PreparedSearch, assertNativeBindingVersion, createNativeAnonymizerFromConfig, createNativeAnonymizerFromPackage, createNativePipelineFromPackage, encodeNativeSearchConfig, encodeNativeSearchConfigInput, getNativeBindingVersion, prepareNativeSearchPackage } from "./native.mjs";
|
|
2
|
+
import { A as redact_text, C as readNativePipelinePackageFile, D as redactDefaultTextJson, E as redactDefaultText, F as assertNativePipelineSupported, I as createNativePipelineFromConfig, L as getNativePipelineCompatibility, M as redact_text_stream_json, N as summary_diagnostics_json, O as redact_default_text, P as DEFAULT_NATIVE_PIPELINE_CONFIG, R as prepareNativePipelineConfig, S as readDefaultNativePipelinePackageFileAsync, T as read_default_native_pipeline_package_file, _ as preloadDefaultNativePipeline, a as createNativePipelineFromDefaultPackage, b as prepare_search_package, c as diagnostics_json, d as get_default_native_pipeline, f as loadNativeAnonymizeBinding, g as normalize_for_search, h as native_package_version, i as convert_external_detection_batch, j as redact_text_json, k as redact_default_text_json, l as diagnostics_stream_json, m as load_prepared_package_file, n as availableDefaultNativePipelineLanguages, o as createNativePipelineFromPackageFile, p as load_prepared_package, r as available_default_native_pipeline_languages, s as create_native_pipeline_from_default_package, t as DEFAULT_NATIVE_PIPELINE_WARMUPS, u as getDefaultNativePipeline, v as preloadDefaultNativePipelineAsync, w as readNativePipelinePackageFileAsync, x as readDefaultNativePipelinePackageFile, y as preload_default_native_pipeline, z as prepareNativePipelinePackage } from "./native-node2.mjs";
|
|
3
|
+
export { CALLER_DETECTION_CONTRACT_VERSION, DEFAULT_NATIVE_PIPELINE_CONFIG, DEFAULT_NATIVE_PIPELINE_WARMUPS, EXTERNAL_DETECTION_BATCH_MAX_BYTES, EXTERNAL_DETECTION_BATCH_VERSION, EXTERNAL_DETECTION_DOCUMENT_MAX_BYTES, EXTERNAL_DETECTION_MAX_DETECTIONS, EXTERNAL_DETECTION_MAX_LABEL_MAPPINGS, EXTERNAL_DETECTION_MAX_METADATA_BYTES, EXTERNAL_DETECTION_OFFSET_UNITS, EXTERNAL_DETECTION_PROVIDER_ID_MAX_BYTES, PreparedAnonymizer, PreparedNativeAnonymizer, PreparedNativePipeline, PreparedNativeRedactionSession, PreparedNativeSessionRedactionPlan, PreparedSearch, assertNativeBindingVersion, assertNativePipelineSupported, availableDefaultNativePipelineLanguages, available_default_native_pipeline_languages, convert_external_detection_batch, createNativeAnonymizerFromConfig, createNativeAnonymizerFromPackage, createNativePipelineFromConfig, createNativePipelineFromDefaultPackage, createNativePipelineFromPackage, createNativePipelineFromPackageFile, create_native_pipeline_from_default_package, diagnostics_json, diagnostics_stream_json, encodeNativeSearchConfig, encodeNativeSearchConfigInput, getDefaultNativePipeline, getNativeBindingVersion, getNativePipelineCompatibility, get_default_native_pipeline, loadNativeAnonymizeBinding, load_prepared_package, load_prepared_package_file, native_package_version, normalize_for_search, preloadDefaultNativePipeline, preloadDefaultNativePipelineAsync, preload_default_native_pipeline, prepareNativePipelineConfig, prepareNativePipelinePackage, prepareNativeSearchPackage, prepare_search_package, readDefaultNativePipelinePackageFile, readDefaultNativePipelinePackageFileAsync, readNativePipelinePackageFile, readNativePipelinePackageFileAsync, read_default_native_pipeline_package_file, redactDefaultText, redactDefaultTextJson, redact_default_text, redact_default_text_json, redact_text, redact_text_json, redact_text_stream_json, summary_diagnostics_json };
|
package/dist/native-node2.d.mts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { $ as
|
|
2
|
-
import { A as
|
|
3
|
-
export { CALLER_DETECTION_CONTRACT_VERSION, DEFAULT_NATIVE_PIPELINE_CONFIG, DEFAULT_NATIVE_PIPELINE_WARMUPS, DefaultNativePipelinePackageFileOptions, DefaultNativePipelinePackageOptions, DefaultNativePipelineWarmup, LoadNativeBindingOptions, NativeAnonymizeBinding, NativeAnonymizerFromConfigOptions, NativeAnonymizerFromPackageOptions, NativeBindingVersionOptions, NativeCallerDetection, NativeCallerRedactionOptions, NativeCreateSessionWithLifecycleOptions, NativeDiagnosticsBatchCallback, NativeLibc, NativeNormalizeOptions, NativeOpenSessionArchiveOptions, NativeOperatorConfig, type NativePipelineBuildOptions, type NativePipelineCompatibility, NativePipelineEntity, NativePipelineFromPackageOptions, NativePipelinePackageFileOptions, type NativePipelinePackageOptions, type NativePipelineUnsupportedFeature, NativePreparedRedactionSessionBinding, NativePreparedSearchBinding, type NativePreparedSearchConfig, NativePreparedSessionRedactionPlanBinding, NativeRedactionResult, NativeRequire, NativeResultEventCallback, NativeSdkOptions, NativeSdkPackageOptions, NativeSearchPackageInput, NativeSearchPackageOptions, NativeSessionBlockRedactionPlan, NativeSessionCallerRedactionInput, NativeSessionCallerRedactionPlanOptions, NativeSessionDeletionSummary, NativeSessionLifecycle, NativeSessionMetadata, NativeSessionRedactionAtOptions, NativeSessionStatus, NativeStaticRedactionResult, NativeTextReplacement, PreparedAnonymizer, PreparedNativeAnonymizer, PreparedNativePipeline, PreparedNativeRedactionSession, PreparedNativeSessionRedactionPlan, PreparedSearch, SharedNativeDiagnosticsJsonOptions, SharedNativeDiagnosticsStreamJsonOptions, SharedNativePreparedPackageOptions, SharedNativeRedactTextJsonOptions, SharedNativeRedactTextOptions, SharedNativeRedactTextStreamJsonOptions, SharedNativeSearchPackageOptions, assertNativeBindingVersion, assertNativePipelineSupported, availableDefaultNativePipelineLanguages, available_default_native_pipeline_languages, createNativeAnonymizerFromConfig, createNativeAnonymizerFromPackage, createNativePipelineFromConfig, createNativePipelineFromDefaultPackage, createNativePipelineFromPackage, createNativePipelineFromPackageFile, create_native_pipeline_from_default_package, diagnostics_json, diagnostics_stream_json, encodeNativeSearchConfig, encodeNativeSearchConfigInput, getDefaultNativePipeline, getNativeBindingVersion, getNativePipelineCompatibility, get_default_native_pipeline, loadNativeAnonymizeBinding, load_prepared_package, load_prepared_package_file, native_package_version, normalize_for_search, preloadDefaultNativePipeline, preloadDefaultNativePipelineAsync, preload_default_native_pipeline, prepareNativePipelineConfig, prepareNativePipelinePackage, prepareNativeSearchPackage, prepare_search_package, readDefaultNativePipelinePackageFile, readDefaultNativePipelinePackageFileAsync, readNativePipelinePackageFile, readNativePipelinePackageFileAsync, read_default_native_pipeline_package_file, redactDefaultText, redactDefaultTextJson, redact_default_text, redact_default_text_json, redact_text, redact_text_json, redact_text_stream_json, summary_diagnostics_json };
|
|
1
|
+
import { $ as SharedNativeRedactTextOptions, A as NativeResultEventCallback, B as NativeSessionStatus, C as NativeOperatorConfig, D as NativePreparedSearchBinding, E as NativePreparedRedactionSessionBinding, F as NativeSessionCallerRedactionPlanOptions, G as PreparedNativePipeline, H as NativeTextReplacement, I as NativeSessionDeletionSummary, J as PreparedSearch, K as PreparedNativeRedactionSession, L as NativeSessionLifecycle, M as NativeSearchPackageOptions, N as NativeSessionBlockRedactionPlan, O as NativePreparedSessionRedactionPlanBinding, P as NativeSessionCallerRedactionInput, Q as SharedNativeRedactTextJsonOptions, R as NativeSessionMetadata, S as NativeOpenSessionArchiveOptions, T as NativePipelineFromPackageOptions, U as PreparedAnonymizer, V as NativeStaticRedactionResult, W as PreparedNativeAnonymizer, X as SharedNativeDiagnosticsStreamJsonOptions, Y as SharedNativeDiagnosticsJsonOptions, Z as SharedNativePreparedPackageOptions, _ as NativeCallerDetection, a as EXTERNAL_DETECTION_DOCUMENT_MAX_BYTES, at as createNativeAnonymizerFromPackage, b as NativeDiagnosticsBatchCallback, c as EXTERNAL_DETECTION_MAX_METADATA_BYTES, d as ExternalDetectionBatch, dt as getNativeBindingVersion, et as SharedNativeRedactTextStreamJsonOptions, f as ExternalDetectionOffsetUnit, g as NativeBindingVersionOptions, h as NativeAnonymizerFromPackageOptions, ht as prepareNativeSearchPackage, i as EXTERNAL_DETECTION_BATCH_VERSION, it as createNativeAnonymizerFromConfig, j as NativeSearchPackageInput, k as NativeRedactionResult, l as EXTERNAL_DETECTION_OFFSET_UNITS, lt as encodeNativeSearchConfig, m as NativeAnonymizerFromConfigOptions, n as ConvertExternalDetectionBatchOptions, nt as assertNativeBindingVersion, o as EXTERNAL_DETECTION_MAX_DETECTIONS, ot as createNativePipelineFromPackage, p as NativeAnonymizeBinding, q as PreparedNativeSessionRedactionPlan, r as EXTERNAL_DETECTION_BATCH_MAX_BYTES, s as EXTERNAL_DETECTION_MAX_LABEL_MAPPINGS, t as CALLER_DETECTION_CONTRACT_VERSION, tt as SharedNativeSearchPackageOptions, u as EXTERNAL_DETECTION_PROVIDER_ID_MAX_BYTES, ut as encodeNativeSearchConfigInput, v as NativeCallerRedactionOptions, w as NativePipelineEntity, x as NativeNormalizeOptions, y as NativeCreateSessionWithLifecycleOptions, z as NativeSessionRedactionAtOptions, zt as NativePreparedSearchConfig } from "./native.mjs";
|
|
2
|
+
import { A as readDefaultNativePipelinePackageFile, B as redact_text_json, C as load_prepared_package_file, D as preloadDefaultNativePipelineAsync, E as preloadDefaultNativePipeline, F as redactDefaultText, G as NativePipelineCompatibility, H as summary_diagnostics_json, I as redactDefaultTextJson, J as assertNativePipelineSupported, K as NativePipelinePackageOptions, L as redact_default_text, M as readNativePipelinePackageFile, N as readNativePipelinePackageFileAsync, O as preload_default_native_pipeline, P as read_default_native_pipeline_package_file, Q as prepareNativePipelinePackage, R as redact_default_text_json, S as load_prepared_package, T as normalize_for_search, U as DEFAULT_NATIVE_PIPELINE_CONFIG, V as redact_text_stream_json, W as NativePipelineBuildOptions, X as getNativePipelineCompatibility, Y as createNativePipelineFromConfig, Z as prepareNativePipelineConfig, _ as diagnostics_json, a as LoadNativeBindingOptions, b as get_default_native_pipeline, c as NativeRequire, d as availableDefaultNativePipelineLanguages, f as available_default_native_pipeline_languages, g as create_native_pipeline_from_default_package, h as createNativePipelineFromPackageFile, i as DefaultNativePipelineWarmup, j as readDefaultNativePipelinePackageFileAsync, k as prepare_search_package, l as NativeSdkOptions, m as createNativePipelineFromDefaultPackage, n as DefaultNativePipelinePackageFileOptions, o as NativeLibc, p as convert_external_detection_batch, q as NativePipelineUnsupportedFeature, r as DefaultNativePipelinePackageOptions, s as NativePipelinePackageFileOptions, t as DEFAULT_NATIVE_PIPELINE_WARMUPS, u as NativeSdkPackageOptions, v as diagnostics_stream_json, w as native_package_version, x as loadNativeAnonymizeBinding, y as getDefaultNativePipeline, z as redact_text } from "./native-node.mjs";
|
|
3
|
+
export { CALLER_DETECTION_CONTRACT_VERSION, ConvertExternalDetectionBatchOptions, DEFAULT_NATIVE_PIPELINE_CONFIG, DEFAULT_NATIVE_PIPELINE_WARMUPS, DefaultNativePipelinePackageFileOptions, DefaultNativePipelinePackageOptions, DefaultNativePipelineWarmup, EXTERNAL_DETECTION_BATCH_MAX_BYTES, EXTERNAL_DETECTION_BATCH_VERSION, EXTERNAL_DETECTION_DOCUMENT_MAX_BYTES, EXTERNAL_DETECTION_MAX_DETECTIONS, EXTERNAL_DETECTION_MAX_LABEL_MAPPINGS, EXTERNAL_DETECTION_MAX_METADATA_BYTES, EXTERNAL_DETECTION_OFFSET_UNITS, EXTERNAL_DETECTION_PROVIDER_ID_MAX_BYTES, ExternalDetectionBatch, ExternalDetectionOffsetUnit, LoadNativeBindingOptions, NativeAnonymizeBinding, NativeAnonymizerFromConfigOptions, NativeAnonymizerFromPackageOptions, NativeBindingVersionOptions, NativeCallerDetection, NativeCallerRedactionOptions, NativeCreateSessionWithLifecycleOptions, NativeDiagnosticsBatchCallback, NativeLibc, NativeNormalizeOptions, NativeOpenSessionArchiveOptions, NativeOperatorConfig, type NativePipelineBuildOptions, type NativePipelineCompatibility, NativePipelineEntity, NativePipelineFromPackageOptions, NativePipelinePackageFileOptions, type NativePipelinePackageOptions, type NativePipelineUnsupportedFeature, NativePreparedRedactionSessionBinding, NativePreparedSearchBinding, type NativePreparedSearchConfig, NativePreparedSessionRedactionPlanBinding, NativeRedactionResult, NativeRequire, NativeResultEventCallback, NativeSdkOptions, NativeSdkPackageOptions, NativeSearchPackageInput, NativeSearchPackageOptions, NativeSessionBlockRedactionPlan, NativeSessionCallerRedactionInput, NativeSessionCallerRedactionPlanOptions, NativeSessionDeletionSummary, NativeSessionLifecycle, NativeSessionMetadata, NativeSessionRedactionAtOptions, NativeSessionStatus, NativeStaticRedactionResult, NativeTextReplacement, PreparedAnonymizer, PreparedNativeAnonymizer, PreparedNativePipeline, PreparedNativeRedactionSession, PreparedNativeSessionRedactionPlan, PreparedSearch, SharedNativeDiagnosticsJsonOptions, SharedNativeDiagnosticsStreamJsonOptions, SharedNativePreparedPackageOptions, SharedNativeRedactTextJsonOptions, SharedNativeRedactTextOptions, SharedNativeRedactTextStreamJsonOptions, SharedNativeSearchPackageOptions, assertNativeBindingVersion, assertNativePipelineSupported, availableDefaultNativePipelineLanguages, available_default_native_pipeline_languages, convert_external_detection_batch, createNativeAnonymizerFromConfig, createNativeAnonymizerFromPackage, createNativePipelineFromConfig, createNativePipelineFromDefaultPackage, createNativePipelineFromPackage, createNativePipelineFromPackageFile, create_native_pipeline_from_default_package, diagnostics_json, diagnostics_stream_json, encodeNativeSearchConfig, encodeNativeSearchConfigInput, getDefaultNativePipeline, getNativeBindingVersion, getNativePipelineCompatibility, get_default_native_pipeline, loadNativeAnonymizeBinding, load_prepared_package, load_prepared_package_file, native_package_version, normalize_for_search, preloadDefaultNativePipeline, preloadDefaultNativePipelineAsync, preload_default_native_pipeline, prepareNativePipelineConfig, prepareNativePipelinePackage, prepareNativeSearchPackage, prepare_search_package, readDefaultNativePipelinePackageFile, readDefaultNativePipelinePackageFileAsync, readNativePipelinePackageFile, readNativePipelinePackageFileAsync, read_default_native_pipeline_package_file, redactDefaultText, redactDefaultTextJson, redact_default_text, redact_default_text_json, redact_text, redact_text_json, redact_text_stream_json, summary_diagnostics_json };
|
package/dist/native-node2.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PreparedNativeAnonymizer, PreparedNativePipeline, assertNativeBindingVersion, createNativePipelineFromPackage, diagnostics_json as diagnostics_json$1, diagnostics_stream_json as diagnostics_stream_json$1, load_prepared_package as load_prepared_package$1, native_package_version as native_package_version$1, normalize_for_search as normalize_for_search$1, prepare_search_package as prepare_search_package$1, redact_text as redact_text$1, redact_text_json as redact_text_json$1, redact_text_stream_json as redact_text_stream_json$1, summary_diagnostics_json as summary_diagnostics_json$1 } from "./native.mjs";
|
|
1
|
+
import { PreparedNativeAnonymizer, PreparedNativePipeline, assertNativeBindingVersion, convert_external_detection_batch as convert_external_detection_batch$1, createNativePipelineFromPackage, diagnostics_json as diagnostics_json$1, diagnostics_stream_json as diagnostics_stream_json$1, load_prepared_package as load_prepared_package$1, native_package_version as native_package_version$1, normalize_for_search as normalize_for_search$1, prepare_search_package as prepare_search_package$1, redact_text as redact_text$1, redact_text_json as redact_text_json$1, redact_text_stream_json as redact_text_stream_json$1, summary_diagnostics_json as summary_diagnostics_json$1 } from "./native.mjs";
|
|
2
2
|
import { DEFAULT_ENTITY_LABELS } from "./constants.mjs";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
4
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
@@ -420,6 +420,11 @@ const loadNativeAnonymizeBinding = (options = {}) => {
|
|
|
420
420
|
const readNativePipelinePackageFile = (packagePath) => readFileSync(packagePath);
|
|
421
421
|
const readNativePipelinePackageFileAsync = async (packagePath) => readFile(packagePath);
|
|
422
422
|
const native_package_version = (options = {}) => native_package_version$1(resolveNativeSdkBinding(options));
|
|
423
|
+
const convert_external_detection_batch = (document, batch, options = {}) => convert_external_detection_batch$1({
|
|
424
|
+
binding: resolveNativeSdkBinding(options),
|
|
425
|
+
document,
|
|
426
|
+
batch
|
|
427
|
+
});
|
|
423
428
|
const normalize_for_search = (text, options = {}) => {
|
|
424
429
|
return normalize_for_search$1({
|
|
425
430
|
binding: resolveNativeSdkBinding(options),
|
|
@@ -748,6 +753,6 @@ const formatLoadError = (error) => {
|
|
|
748
753
|
return String(error);
|
|
749
754
|
};
|
|
750
755
|
//#endregion
|
|
751
|
-
export {
|
|
756
|
+
export { redact_text as A, readNativePipelinePackageFile as C, redactDefaultTextJson as D, redactDefaultText as E, assertNativePipelineSupported as F, createNativePipelineFromConfig as I, getNativePipelineCompatibility as L, redact_text_stream_json as M, summary_diagnostics_json as N, redact_default_text as O, DEFAULT_NATIVE_PIPELINE_CONFIG as P, prepareNativePipelineConfig as R, readDefaultNativePipelinePackageFileAsync as S, read_default_native_pipeline_package_file as T, preloadDefaultNativePipeline as _, createNativePipelineFromDefaultPackage as a, prepare_search_package as b, diagnostics_json as c, get_default_native_pipeline as d, loadNativeAnonymizeBinding as f, normalize_for_search as g, native_package_version as h, convert_external_detection_batch as i, redact_text_json as j, redact_default_text_json as k, diagnostics_stream_json as l, load_prepared_package_file as m, availableDefaultNativePipelineLanguages as n, createNativePipelineFromPackageFile as o, load_prepared_package as p, available_default_native_pipeline_languages as r, create_native_pipeline_from_default_package as s, DEFAULT_NATIVE_PIPELINE_WARMUPS as t, getDefaultNativePipeline as u, preloadDefaultNativePipelineAsync as v, readNativePipelinePackageFileAsync as w, readDefaultNativePipelinePackageFile as x, preload_default_native_pipeline as y, prepareNativePipelinePackage as z };
|
|
752
757
|
|
|
753
758
|
//# sourceMappingURL=native-node2.mjs.map
|