{"version":3,"file":"constants.mjs","names":[],"sources":["../src/constants.ts"],"sourcesContent":["/**\n * Runtime-free constants for the anonymization pipeline.\n *\n * This module is the SSR-safe / browser-safe entrypoint:\n * importing it must not pull in `@stll/anonymize-wasm`\n * or any other runtime-bearing module.\n * Consumers that only need the static label list,\n * detection-source identifiers, or operator names import\n * from `@stll/anonymize/constants` (or\n * `@stll/anonymize-wasm/constants`) without paying the\n * wasm / regex-set startup cost.\n *\n * `types.ts` re-exports these for back-compat, so existing\n * `import { DEFAULT_ENTITY_LABELS } from \"@stll/anonymize\"`\n * call sites keep working.\n */\n\n/**\n * Source of a detected entity span.\n * Ordered by detection layer in the pipeline.\n */\nexport const DETECTION_SOURCES = {\n  TRIGGER: \"trigger\",\n  REGEX: \"regex\",\n  DENY_LIST: \"deny-list\",\n  LEGAL_FORM: \"legal-form\",\n  GAZETTEER: \"gazetteer\",\n  COUNTRY: \"country\",\n  NER: \"ner\",\n  COREFERENCE: \"coreference\",\n} as const;\n\nexport type DetectionSource =\n  (typeof DETECTION_SOURCES)[keyof typeof DETECTION_SOURCES];\n\n/**\n * Priority levels for detection sources.\n * Higher = more structurally reliable. Used during\n * overlap resolution so deterministic detectors beat\n * probabilistic ones regardless of raw score.\n */\nexport const DETECTOR_PRIORITY = {\n  [DETECTION_SOURCES.GAZETTEER]: 5,\n  [DETECTION_SOURCES.TRIGGER]: 4,\n  [DETECTION_SOURCES.LEGAL_FORM]: 3,\n  [DETECTION_SOURCES.REGEX]: 3,\n  [DETECTION_SOURCES.COUNTRY]: 3,\n  [DETECTION_SOURCES.DENY_LIST]: 2,\n  [DETECTION_SOURCES.COREFERENCE]: 2,\n  [DETECTION_SOURCES.NER]: 1,\n} as const satisfies Record<DetectionSource, number>;\n\n/**\n * Anonymization operator types. Each operator defines\n * how a confirmed entity is replaced in the output.\n */\nexport const OPERATOR_TYPES = [\"replace\", \"redact\", \"keep\", \"mask\"] as const;\n\nexport type OperatorType = (typeof OPERATOR_TYPES)[number];\n\nexport const ENTITY_SELECTIONS = {\n  DEFAULT: \"default\",\n  OPT_IN: \"opt-in\",\n} as const;\n\nexport type EntitySelection =\n  (typeof ENTITY_SELECTIONS)[keyof typeof ENTITY_SELECTIONS];\n\nexport type EntityCapability = {\n  label: string;\n  selection: EntitySelection;\n  detectionSources: readonly DetectionSource[];\n};\n\n/**\n * Canonical entity capabilities exposed by the deterministic native pipeline.\n * `selection` describes whether the default package requests the label; opt-in\n * labels have built-in detection rules but must be requested explicitly.\n *\n * These labels are ephemeral: entities are regenerated on\n * every pipeline run and never persisted to the database.\n * Renaming a label here requires no migration.\n */\nexport const ENTITY_CAPABILITIES = [\n  {\n    label: \"person\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [\n      DETECTION_SOURCES.TRIGGER,\n      DETECTION_SOURCES.REGEX,\n      DETECTION_SOURCES.DENY_LIST,\n      DETECTION_SOURCES.COREFERENCE,\n    ],\n  },\n  {\n    label: \"organization\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [\n      DETECTION_SOURCES.TRIGGER,\n      DETECTION_SOURCES.DENY_LIST,\n      DETECTION_SOURCES.LEGAL_FORM,\n      DETECTION_SOURCES.GAZETTEER,\n      DETECTION_SOURCES.COREFERENCE,\n    ],\n  },\n  {\n    label: \"phone number\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"address\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [\n      DETECTION_SOURCES.REGEX,\n      DETECTION_SOURCES.TRIGGER,\n      DETECTION_SOURCES.DENY_LIST,\n    ],\n  },\n  {\n    label: \"country\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.COUNTRY],\n  },\n  {\n    label: \"email address\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX],\n  },\n  {\n    label: \"date\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"date of birth\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"bank account number\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"iban\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"tax identification number\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"identity card number\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"birth number\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"national identification number\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"social security number\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"registration number\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"case number\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"credit card number\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX],\n  },\n  {\n    label: \"passport number\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"crypto\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX],\n  },\n  {\n    label: \"monetary amount\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"land parcel\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.TRIGGER],\n  },\n  {\n    label: \"misc\",\n    selection: ENTITY_SELECTIONS.DEFAULT,\n    detectionSources: [DETECTION_SOURCES.REGEX, DETECTION_SOURCES.DENY_LIST],\n  },\n  {\n    label: \"ip address\",\n    selection: ENTITY_SELECTIONS.OPT_IN,\n    detectionSources: [DETECTION_SOURCES.REGEX],\n  },\n  {\n    label: \"mac address\",\n    selection: ENTITY_SELECTIONS.OPT_IN,\n    detectionSources: [DETECTION_SOURCES.REGEX],\n  },\n  {\n    label: \"url\",\n    selection: ENTITY_SELECTIONS.OPT_IN,\n    detectionSources: [DETECTION_SOURCES.REGEX],\n  },\n] as const satisfies readonly EntityCapability[];\n\ntype KnownEntityCapability = (typeof ENTITY_CAPABILITIES)[number];\n\nexport type EntityLabel = KnownEntityCapability[\"label\"];\n\nexport const ENTITY_LABELS: readonly EntityLabel[] = ENTITY_CAPABILITIES.map(\n  ({ label }) => label,\n);\n\nconst isDefaultEntityCapability = (\n  capability: KnownEntityCapability,\n): capability is Extract<\n  KnownEntityCapability,\n  { selection: typeof ENTITY_SELECTIONS.DEFAULT }\n> => capability.selection === ENTITY_SELECTIONS.DEFAULT;\n\nexport type DefaultEntityLabel = Extract<\n  KnownEntityCapability,\n  { selection: typeof ENTITY_SELECTIONS.DEFAULT }\n>[\"label\"];\n\nexport const DEFAULT_ENTITY_LABELS: readonly DefaultEntityLabel[] =\n  ENTITY_CAPABILITIES.filter(isDefaultEntityCapability).map(\n    ({ label }) => label,\n  );\n"],"mappings":"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"}