{"version":3,"sources":["../src/internal/redaction.ts","../src/errors.ts"],"sourcesContent":["export const MAX_DIAGNOSTIC_PREVIEW_LENGTH = 4096;\n\nconst MAX_DIAGNOSTIC_SCALAR_LENGTH = 512;\nconst SENSITIVE_XML_ELEMENT_NAME = \"((?:[A-Za-z_][\\\\w.-]*:)?(?:Token|Sign))\";\nconst PAIRED_SENSITIVE_XML_ELEMENT = new RegExp(\n  `<${SENSITIVE_XML_ELEMENT_NAME}\\\\b[^>]*>[\\\\s\\\\S]*?<\\\\/\\\\1\\\\s*>`,\n  \"gi\"\n);\nconst SELF_CLOSING_SENSITIVE_XML_ELEMENT = new RegExp(\n  `<${SENSITIVE_XML_ELEMENT_NAME}\\\\b[^>]*\\\\/\\\\s*>`,\n  \"gi\"\n);\nconst UNTERMINATED_SENSITIVE_XML_ELEMENT = new RegExp(\n  `<${SENSITIVE_XML_ELEMENT_NAME}\\\\b[^>]*>[^<]*`,\n  \"gi\"\n);\n\nexport type ResponseBodyDiagnostic = {\n  responseBodyLength: number;\n  responseBodyPreview: string;\n};\n\nexport type SafeErrorDiagnostic = {\n  errorName?: string;\n  errorCode?: string;\n  statusCode?: number;\n  contentType?: string;\n  responseBodyLength?: number;\n  responseBodyPreview?: string;\n  faultCode?: string;\n};\n\n/** Redacts credential-bearing XML elements and applies the global preview bound. */\nexport function redactDiagnosticPreview(\n  value: string,\n  requestedMaxLength = MAX_DIAGNOSTIC_PREVIEW_LENGTH\n): string {\n  const maxLength = normalizePreviewLength(requestedMaxLength);\n\n  return value\n    .replace(\n      PAIRED_SENSITIVE_XML_ELEMENT,\n      (_match, tagName: string) => `<${tagName}>[REDACTED]</${tagName}>`\n    )\n    .replace(\n      SELF_CLOSING_SENSITIVE_XML_ELEMENT,\n      (_match, tagName: string) => `<${tagName}>[REDACTED]</${tagName}>`\n    )\n    .replace(\n      UNTERMINATED_SENSITIVE_XML_ELEMENT,\n      (_match, tagName: string) => `<${tagName}>[REDACTED]`\n    )\n    .slice(0, maxLength);\n}\n\n/** Produces the only response-body shape allowed in errors and logs. */\nexport function createResponseBodyDiagnostic(\n  responseBody: string,\n  requestedMaxLength = MAX_DIAGNOSTIC_PREVIEW_LENGTH\n): ResponseBodyDiagnostic {\n  return {\n    responseBodyLength: responseBody.length,\n    responseBodyPreview: redactDiagnosticPreview(\n      responseBody,\n      requestedMaxLength\n    ),\n  };\n}\n\n/** Extracts a scalar allowlist from an error without exposing the error or cause. */\nexport function createSafeErrorDiagnostic(error: unknown): SafeErrorDiagnostic {\n  if (!(error && typeof error === \"object\")) {\n    return {};\n  }\n\n  const candidate = error as Record<string, unknown>;\n  const diagnostic: SafeErrorDiagnostic = {};\n\n  assignSafeString(diagnostic, \"errorName\", candidate.name);\n  assignSafeString(diagnostic, \"errorCode\", candidate.code);\n  assignSafeNumber(diagnostic, \"statusCode\", candidate.statusCode);\n  assignSafeString(diagnostic, \"contentType\", candidate.contentType);\n  assignSafeNumber(\n    diagnostic,\n    \"responseBodyLength\",\n    candidate.responseBodyLength\n  );\n  if (typeof candidate.responseBodyPreview === \"string\") {\n    diagnostic.responseBodyPreview = redactDiagnosticPreview(\n      candidate.responseBodyPreview\n    );\n  }\n  assignSafeString(diagnostic, \"faultCode\", candidate.faultCode);\n\n  return diagnostic;\n}\n\nfunction normalizePreviewLength(requestedMaxLength: number): number {\n  if (!Number.isFinite(requestedMaxLength)) {\n    return MAX_DIAGNOSTIC_PREVIEW_LENGTH;\n  }\n\n  return Math.max(\n    0,\n    Math.min(Math.trunc(requestedMaxLength), MAX_DIAGNOSTIC_PREVIEW_LENGTH)\n  );\n}\n\nfunction assignSafeString<\n  TKey extends \"errorName\" | \"errorCode\" | \"contentType\" | \"faultCode\",\n>(target: SafeErrorDiagnostic, key: TKey, value: unknown): void {\n  if (typeof value === \"string\") {\n    target[key] = redactDiagnosticPreview(value, MAX_DIAGNOSTIC_SCALAR_LENGTH);\n  }\n}\n\nfunction assignSafeNumber<TKey extends \"statusCode\" | \"responseBodyLength\">(\n  target: SafeErrorDiagnostic,\n  key: TKey,\n  value: unknown\n): void {\n  if (typeof value === \"number\" && Number.isFinite(value)) {\n    target[key] = value;\n  }\n}\n","import { redactDiagnosticPreview } from \"./internal/redaction\";\nimport type { ArcaServiceName } from \"./internal/types\";\nimport type {\n  ArcaFiscalIssue,\n  ArcaFiscalResultLevel,\n  ArcaFiscalResults,\n} from \"./services/fiscal-evidence\";\n\n/** Base error class for all ARCA-related errors. */\nexport class ArcaError extends Error {\n  readonly code: string;\n  override readonly name: string = \"ArcaError\";\n\n  constructor(message: string, code = \"ARCA_ERROR\", options?: ErrorOptions) {\n    super(message, options);\n    this.code = code;\n  }\n}\n\n/** Thrown when the ARCA client configuration is missing or invalid. */\nexport class ArcaConfigurationError extends ArcaError {\n  override readonly name: string = \"ArcaConfigurationError\";\n\n  constructor(message: string, options?: ErrorOptions) {\n    super(message, \"ARCA_CONFIGURATION_ERROR\", options);\n  }\n}\n\n/** Stable routing codes for caller-provided input failures. */\nexport type ArcaInputErrorCode =\n  | \"ARCA_INPUT_IDEMPOTENCY_MISMATCH\"\n  | \"ARCA_INPUT_RESERVATION_NOT_FOUND\"\n  | \"ARCA_INPUT_INVALID_DATE\"\n  | \"ARCA_INPUT_INVALID_AMOUNT\"\n  | \"ARCA_INPUT_AMOUNT_PRECISION\"\n  | \"ARCA_INPUT_AMOUNT_MISMATCH\"\n  | \"ARCA_INPUT_INVALID_EXCHANGE_RATE\"\n  | \"ARCA_INPUT_INVALID_VALUE\"\n  | \"ARCA_INPUT_MISSING_FIELD\"\n  | \"ARCA_INPUT_RESERVED_FIELD\";\n\nexport type ArcaInputErrorOptions = ErrorOptions & {\n  code: ArcaInputErrorCode;\n  field?: string;\n  expected?: string;\n};\n\n/** Thrown when caller-provided input data is missing or invalid. */\nexport class ArcaInputError extends ArcaError {\n  declare readonly code: ArcaInputErrorCode;\n  override readonly name: string = \"ArcaInputError\";\n  readonly field?: string;\n  readonly expected?: string;\n\n  constructor(message: string, options: ArcaInputErrorOptions) {\n    super(message, options.code, options);\n    this.field = options.field;\n    this.expected = options.expected;\n  }\n}\n\n/** Stable reasons exposed for explicit ARCA authentication rejections. */\nexport type ArcaAuthenticationReason =\n  | \"invalid_token\"\n  | \"unauthorized_computer\"\n  | \"missing_relationship\"\n  | \"authentication_rejected\";\n\nexport type ArcaAuthenticationErrorOptions = ErrorOptions & {\n  reason: ArcaAuthenticationReason;\n  service: ArcaServiceName;\n  operation: string;\n  providerCode?: string | number;\n};\n\n/** Thrown when ARCA explicitly rejects credentials before an operation runs. */\nexport class ArcaAuthenticationError extends ArcaError {\n  declare readonly code: \"ARCA_AUTHENTICATION_ERROR\";\n  override readonly name: string = \"ArcaAuthenticationError\";\n  readonly reason: ArcaAuthenticationReason;\n  readonly service: ArcaServiceName;\n  readonly operation: string;\n  readonly providerCode?: string | number;\n\n  constructor(message: string, options: ArcaAuthenticationErrorOptions) {\n    super(\n      redactDiagnosticPreview(message),\n      \"ARCA_AUTHENTICATION_ERROR\",\n      options\n    );\n    this.reason = options.reason;\n    this.service = options.service;\n    this.operation = options.operation;\n    this.providerCode = normalizeProviderCode(options.providerCode);\n  }\n}\n\n/** Narrows unknown failures to the explicit authentication error contract. */\nexport function isArcaAuthenticationError(\n  error: unknown\n): error is ArcaAuthenticationError {\n  return error instanceof ArcaAuthenticationError;\n}\n\n/** Thrown when an HTTP request to an ARCA endpoint fails at the transport level. */\nexport class ArcaTransportError extends ArcaError {\n  override readonly name: string = \"ArcaTransportError\";\n  readonly statusCode?: number;\n  readonly contentType?: string;\n  readonly responseBodyLength?: number;\n  readonly responseBodyPreview?: string;\n\n  constructor(\n    message: string,\n    options?: ErrorOptions & {\n      statusCode?: number;\n      contentType?: string;\n      responseBodyLength?: number;\n      responseBodyPreview?: string;\n    }\n  ) {\n    super(message, \"ARCA_TRANSPORT_ERROR\", options);\n    this.statusCode = options?.statusCode;\n    this.contentType = options?.contentType;\n    this.responseBodyLength = options?.responseBodyLength;\n    this.responseBodyPreview =\n      options?.responseBodyPreview === undefined\n        ? undefined\n        : redactDiagnosticPreview(options.responseBodyPreview);\n  }\n}\n\n/** Thrown when the SOAP response contains a Fault element. */\nexport class ArcaSoapFaultError extends ArcaError {\n  override readonly name: string = \"ArcaSoapFaultError\";\n  readonly faultCode?: string;\n\n  constructor(\n    message: string,\n    options?: ErrorOptions & {\n      faultCode?: string;\n    }\n  ) {\n    super(redactDiagnosticPreview(message), \"ARCA_SOAP_FAULT\", options);\n    this.faultCode =\n      options?.faultCode === undefined\n        ? undefined\n        : redactDiagnosticPreview(options.faultCode);\n  }\n}\n\n/** Thrown when a response cannot be parsed as a valid SOAP envelope. */\nexport class ArcaInvalidSoapResponseError extends ArcaError {\n  override readonly name: string = \"ArcaInvalidSoapResponseError\";\n  readonly service?: ArcaServiceName;\n  readonly operation?: string;\n  readonly endpointUrl?: string;\n  readonly statusCode?: number;\n  readonly contentType?: string;\n  readonly responseBodyLength?: number;\n  readonly responseBodyPreview?: string;\n\n  constructor(\n    message: string,\n    options?: ErrorOptions & {\n      service?: ArcaServiceName;\n      operation?: string;\n      endpointUrl?: string;\n      statusCode?: number;\n      contentType?: string;\n      responseBodyLength?: number;\n      responseBodyPreview?: string;\n    }\n  ) {\n    super(message, \"ARCA_INVALID_SOAP_RESPONSE\", options);\n    this.service = options?.service;\n    this.operation = options?.operation;\n    this.endpointUrl = options?.endpointUrl;\n    this.statusCode = options?.statusCode;\n    this.contentType = options?.contentType;\n    this.responseBodyLength = options?.responseBodyLength;\n    this.responseBodyPreview =\n      options?.responseBodyPreview === undefined\n        ? undefined\n        : redactDiagnosticPreview(options.responseBodyPreview);\n  }\n}\n\n/** Thrown when an ARCA service (WSFE, WSMTXCA, Padron) returns a domain-level error. */\nexport class ArcaServiceError extends ArcaError {\n  override readonly name: string = \"ArcaServiceError\";\n  readonly serviceCode?: string | number;\n  readonly service?: ArcaServiceName;\n  readonly operation?: string;\n  readonly result?: string;\n  readonly resultLevel?: ArcaFiscalResultLevel;\n  readonly results?: ArcaFiscalResults;\n  readonly cae?: string;\n  readonly issues?: readonly ArcaFiscalIssue[];\n\n  constructor(\n    message: string,\n    options?: ErrorOptions & {\n      serviceCode?: string | number;\n      service?: ArcaServiceName;\n      operation?: string;\n      result?: string;\n      resultLevel?: ArcaFiscalResultLevel;\n      results?: ArcaFiscalResults;\n      cae?: string;\n      issues?: readonly ArcaFiscalIssue[];\n    }\n  ) {\n    super(message, \"ARCA_SERVICE_ERROR\", options);\n    this.serviceCode = options?.serviceCode;\n    this.service = options?.service;\n    this.operation = options?.operation;\n    this.result = options?.result;\n    this.resultLevel = options?.resultLevel;\n    this.results = options?.results;\n    this.cae = options?.cae;\n    this.issues = options?.issues;\n  }\n}\n\nfunction normalizeProviderCode(\n  providerCode: string | number | undefined\n): string | number | undefined {\n  if (typeof providerCode === \"number\") {\n    return Number.isFinite(providerCode) ? providerCode : undefined;\n  }\n  if (typeof providerCode === \"string\") {\n    return redactDiagnosticPreview(providerCode, 512);\n  }\n  return undefined;\n}\n\n/** Narrow error evidence: never includes a cause, raw response or stack. */\nexport type ArcaSafeErrorMetadata = {\n  name: string;\n  message: string;\n  code?: string;\n  statusCode?: number;\n};\n\nexport function toArcaSafeErrorMetadata(error: unknown): ArcaSafeErrorMetadata {\n  if (!(error instanceof Error)) {\n    return { name: \"UnknownError\", message: String(error) };\n  }\n  return {\n    name: error.name,\n    message: error.message,\n    ...(error instanceof ArcaError ? { code: error.code } : {}),\n    ...(error instanceof ArcaTransportError && error.statusCode !== undefined\n      ? { statusCode: error.statusCode }\n      : {}),\n  };\n}\n"],"mappings":";AAAO,IAAM,gCAAgC;AAE7C,IAAM,+BAA+B;AACrC,IAAM,6BAA6B;AACnC,IAAM,+BAA+B,IAAI;AAAA,EACvC,IAAI,0BAA0B;AAAA,EAC9B;AACF;AACA,IAAM,qCAAqC,IAAI;AAAA,EAC7C,IAAI,0BAA0B;AAAA,EAC9B;AACF;AACA,IAAM,qCAAqC,IAAI;AAAA,EAC7C,IAAI,0BAA0B;AAAA,EAC9B;AACF;AAkBO,SAAS,wBACd,OACA,qBAAqB,+BACb;AACR,QAAM,YAAY,uBAAuB,kBAAkB;AAE3D,SAAO,MACJ;AAAA,IACC;AAAA,IACA,CAAC,QAAQ,YAAoB,IAAI,OAAO,gBAAgB,OAAO;AAAA,EACjE,EACC;AAAA,IACC;AAAA,IACA,CAAC,QAAQ,YAAoB,IAAI,OAAO,gBAAgB,OAAO;AAAA,EACjE,EACC;AAAA,IACC;AAAA,IACA,CAAC,QAAQ,YAAoB,IAAI,OAAO;AAAA,EAC1C,EACC,MAAM,GAAG,SAAS;AACvB;AAGO,SAAS,6BACd,cACA,qBAAqB,+BACG;AACxB,SAAO;AAAA,IACL,oBAAoB,aAAa;AAAA,IACjC,qBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,0BAA0B,OAAqC;AAC7E,MAAI,EAAE,SAAS,OAAO,UAAU,WAAW;AACzC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAY;AAClB,QAAM,aAAkC,CAAC;AAEzC,mBAAiB,YAAY,aAAa,UAAU,IAAI;AACxD,mBAAiB,YAAY,aAAa,UAAU,IAAI;AACxD,mBAAiB,YAAY,cAAc,UAAU,UAAU;AAC/D,mBAAiB,YAAY,eAAe,UAAU,WAAW;AACjE;AAAA,IACE;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ;AACA,MAAI,OAAO,UAAU,wBAAwB,UAAU;AACrD,eAAW,sBAAsB;AAAA,MAC/B,UAAU;AAAA,IACZ;AAAA,EACF;AACA,mBAAiB,YAAY,aAAa,UAAU,SAAS;AAE7D,SAAO;AACT;AAEA,SAAS,uBAAuB,oBAAoC;AAClE,MAAI,CAAC,OAAO,SAAS,kBAAkB,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SAAO,KAAK;AAAA,IACV;AAAA,IACA,KAAK,IAAI,KAAK,MAAM,kBAAkB,GAAG,6BAA6B;AAAA,EACxE;AACF;AAEA,SAAS,iBAEP,QAA6B,KAAW,OAAsB;AAC9D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,GAAG,IAAI,wBAAwB,OAAO,4BAA4B;AAAA,EAC3E;AACF;AAEA,SAAS,iBACP,QACA,KACA,OACM;AACN,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,GAAG,IAAI;AAAA,EAChB;AACF;;;ACnHO,IAAM,YAAN,cAAwB,MAAM;AAAA,EAC1B;AAAA,EACS,OAAe;AAAA,EAEjC,YAAY,SAAiB,OAAO,cAAc,SAAwB;AACxE,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,yBAAN,cAAqC,UAAU;AAAA,EAClC,OAAe;AAAA,EAEjC,YAAY,SAAiB,SAAwB;AACnD,UAAM,SAAS,4BAA4B,OAAO;AAAA,EACpD;AACF;AAsBO,IAAM,iBAAN,cAA6B,UAAU;AAAA,EAE1B,OAAe;AAAA,EACxB;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,SAAgC;AAC3D,UAAM,SAAS,QAAQ,MAAM,OAAO;AACpC,SAAK,QAAQ,QAAQ;AACrB,SAAK,WAAW,QAAQ;AAAA,EAC1B;AACF;AAiBO,IAAM,0BAAN,cAAsC,UAAU;AAAA,EAEnC,OAAe;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,SAAyC;AACpE;AAAA,MACE,wBAAwB,OAAO;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AACA,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ;AACvB,SAAK,YAAY,QAAQ;AACzB,SAAK,eAAe,sBAAsB,QAAQ,YAAY;AAAA,EAChE;AACF;AAGO,SAAS,0BACd,OACkC;AAClC,SAAO,iBAAiB;AAC1B;AAGO,IAAM,qBAAN,cAAiC,UAAU;AAAA,EAC9B,OAAe;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,SACA,SAMA;AACA,UAAM,SAAS,wBAAwB,OAAO;AAC9C,SAAK,aAAa,SAAS;AAC3B,SAAK,cAAc,SAAS;AAC5B,SAAK,qBAAqB,SAAS;AACnC,SAAK,sBACH,SAAS,wBAAwB,SAC7B,SACA,wBAAwB,QAAQ,mBAAmB;AAAA,EAC3D;AACF;AAGO,IAAM,qBAAN,cAAiC,UAAU;AAAA,EAC9B,OAAe;AAAA,EACxB;AAAA,EAET,YACE,SACA,SAGA;AACA,UAAM,wBAAwB,OAAO,GAAG,mBAAmB,OAAO;AAClE,SAAK,YACH,SAAS,cAAc,SACnB,SACA,wBAAwB,QAAQ,SAAS;AAAA,EACjD;AACF;AAGO,IAAM,+BAAN,cAA2C,UAAU;AAAA,EACxC,OAAe;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,SACA,SASA;AACA,UAAM,SAAS,8BAA8B,OAAO;AACpD,SAAK,UAAU,SAAS;AACxB,SAAK,YAAY,SAAS;AAC1B,SAAK,cAAc,SAAS;AAC5B,SAAK,aAAa,SAAS;AAC3B,SAAK,cAAc,SAAS;AAC5B,SAAK,qBAAqB,SAAS;AACnC,SAAK,sBACH,SAAS,wBAAwB,SAC7B,SACA,wBAAwB,QAAQ,mBAAmB;AAAA,EAC3D;AACF;AAGO,IAAM,mBAAN,cAA+B,UAAU;AAAA,EAC5B,OAAe;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,SACA,SAUA;AACA,UAAM,SAAS,sBAAsB,OAAO;AAC5C,SAAK,cAAc,SAAS;AAC5B,SAAK,UAAU,SAAS;AACxB,SAAK,YAAY,SAAS;AAC1B,SAAK,SAAS,SAAS;AACvB,SAAK,cAAc,SAAS;AAC5B,SAAK,UAAU,SAAS;AACxB,SAAK,MAAM,SAAS;AACpB,SAAK,SAAS,SAAS;AAAA,EACzB;AACF;AAEA,SAAS,sBACP,cAC6B;AAC7B,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO,OAAO,SAAS,YAAY,IAAI,eAAe;AAAA,EACxD;AACA,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO,wBAAwB,cAAc,GAAG;AAAA,EAClD;AACA,SAAO;AACT;AAUO,SAAS,wBAAwB,OAAuC;AAC7E,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO,EAAE,MAAM,gBAAgB,SAAS,OAAO,KAAK,EAAE;AAAA,EACxD;AACA,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,IACf,GAAI,iBAAiB,YAAY,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,IACzD,GAAI,iBAAiB,sBAAsB,MAAM,eAAe,SAC5D,EAAE,YAAY,MAAM,WAAW,IAC/B,CAAC;AAAA,EACP;AACF;","names":[]}