{"version":3,"file":"W3cV2VerifiableCredential.mjs","names":[],"sources":["../../../../../src/modules/vc/models/credential/W3cV2VerifiableCredential.ts"],"sourcesContent":["import { Transform, TransformationType } from 'class-transformer'\nimport { ValidationError } from 'class-validator'\nimport { Jwt } from '../../../../crypto/jose/jwt/Jwt'\nimport { ClassValidationError, CredoError } from '../../../../error'\nimport type { SingleOrArray } from '../../../../types'\nimport {\n  W3cV2DataIntegrityVerifiableCredential,\n  type W3cV2DataIntegrityVerifiableCredentialOptions,\n} from '../../data-integrity'\nimport { W3cV2JwtVerifiableCredential, type W3cV2JwtVerifiableCredentialOptions } from '../../jwt-vc'\nimport { W3cV2SdJwtVerifiableCredential, type W3cV2SdJwtVerifiableCredentialOptions } from '../../sd-jwt-vc'\nimport { ClaimFormat } from '../ClaimFormat'\n\nexport const decodeW3cV2VerifiableCredential = (v: unknown) => {\n  try {\n    if (typeof v !== 'string') {\n      throw new CredoError('Expected a plain string encoding')\n    }\n\n    const trimmedValue = v.trim()\n\n    try {\n      const parsedJson = JSON.parse(trimmedValue)\n      if (parsedJson && typeof parsedJson === 'object' && !Array.isArray(parsedJson)) {\n        return new W3cV2DataIntegrityVerifiableCredential({\n          securedCredential: parsedJson as Record<string, unknown> & {\n            proof: unknown\n          },\n        })\n      }\n    } catch {\n      // Not JSON; continue with compact encodings.\n    }\n\n    const issuerSignedCompact = trimmedValue.split('~')[0]\n    if (issuerSignedCompact !== trimmedValue && Jwt.format.test(issuerSignedCompact)) {\n      try {\n        const typ = Jwt.fromSerializedJwt(issuerSignedCompact).header.typ\n\n        if (typ === 'vp+sd-jwt') {\n          throw new CredoError('Value is a W3C SD-JWT VP, but a W3C SD-JWT VC was expected')\n        }\n\n        if (!typ || typ === 'vc+sd-jwt' || typ === 'dc+sd-jwt') {\n          return W3cV2SdJwtVerifiableCredential.fromCompact(trimmedValue)\n        }\n      } catch (error) {\n        if (error instanceof CredoError && error.message.includes('W3C SD-JWT VP')) {\n          throw error\n        }\n\n        // Unable to classify SD-JWT type using compact header, continue with JWT.\n      }\n    }\n\n    return W3cV2JwtVerifiableCredential.fromCompact(trimmedValue)\n  } catch (error) {\n    if (error instanceof ValidationError || error instanceof ClassValidationError) {\n      throw error\n    }\n\n    throw new CredoError(`Value '${v}' is not a valid W3cV2VerifiableCredential. ${error.message}`)\n  }\n}\n\nconst encodeCredential = (v: unknown) => {\n  if (v instanceof W3cV2JwtVerifiableCredential) {\n    return v.encoded\n  }\n\n  if (v instanceof W3cV2SdJwtVerifiableCredential) {\n    return v.encoded\n  }\n\n  if (v instanceof W3cV2DataIntegrityVerifiableCredential) {\n    return v.encoded\n  }\n\n  throw new CredoError(`Value '${v}' is not a valid W3cV2VerifiableCredential`)\n}\n\nexport function W3cV2VerifiableCredentialTransformer() {\n  return Transform(({ value, type }: { value: SingleOrArray<unknown>; type: TransformationType }) => {\n    if (type === TransformationType.PLAIN_TO_CLASS) {\n      return Array.isArray(value) ? value.map(decodeW3cV2VerifiableCredential) : decodeW3cV2VerifiableCredential(value)\n    }\n\n    if (type === TransformationType.CLASS_TO_PLAIN) {\n      if (Array.isArray(value)) return value.map(encodeCredential)\n      return encodeCredential(value)\n    }\n\n    // PLAIN_TO_PLAIN\n    return value\n  })\n}\n\n/**\n * A Secured W3C Verifiable Credential (VC) as defined in the W3C VC Data Model 2.0\n * and secured according to VC-JOSE-COSE and Data Integrity mechanisms.\n *\n * It can be one of:\n * - A verifiable credential encoded as a JWT.\n * - A verifiable credential encoded as a SD-JWT.\n * - A Data Integrity verifiable credential.\n *\n * @see https://www.w3.org/TR/vc-data-model-2.0/\n * @see https://www.w3.org/TR/vc-jose-cose/\n * @see https://www.w3.org/TR/vc-data-integrity/\n */\nexport type W3cV2VerifiableCredential<\n  Format extends ClaimFormat.JwtW3cVc | ClaimFormat.SdJwtW3cVc | ClaimFormat.DiVc | unknown = unknown,\n> = Format extends ClaimFormat.JwtW3cVc\n  ? W3cV2JwtVerifiableCredential\n  : Format extends ClaimFormat.SdJwtW3cVc\n    ? W3cV2SdJwtVerifiableCredential\n    : Format extends ClaimFormat.DiVc\n      ? W3cV2DataIntegrityVerifiableCredential\n      : W3cV2JwtVerifiableCredential | W3cV2SdJwtVerifiableCredential | W3cV2DataIntegrityVerifiableCredential\n\nexport type W3cV2VerifiableCredentialOptions<\n  Format extends ClaimFormat.JwtW3cVc | ClaimFormat.SdJwtW3cVc | ClaimFormat.DiVc | unknown = unknown,\n> = Format extends ClaimFormat.JwtW3cVc\n  ? W3cV2JwtVerifiableCredentialOptions\n  : Format extends ClaimFormat.SdJwtW3cVc\n    ? W3cV2SdJwtVerifiableCredentialOptions\n    : Format extends ClaimFormat.DiVc\n      ? W3cV2DataIntegrityVerifiableCredentialOptions\n      :\n          | W3cV2JwtVerifiableCredentialOptions\n          | W3cV2SdJwtVerifiableCredentialOptions\n          | W3cV2DataIntegrityVerifiableCredentialOptions\n"],"mappings":";;;;;;;;;;;;;AAaA,MAAa,mCAAmC,MAAe;CAC7D,IAAI;EACF,IAAI,OAAO,MAAM,UACf,MAAM,IAAI,WAAW,kCAAkC;EAGzD,MAAM,eAAe,EAAE,KAAK;EAE5B,IAAI;GACF,MAAM,aAAa,KAAK,MAAM,YAAY;GAC1C,IAAI,cAAc,OAAO,eAAe,YAAY,CAAC,MAAM,QAAQ,UAAU,GAC3E,OAAO,IAAI,uCAAuC,EAChD,mBAAmB,WAGrB,CAAC;EAEL,QAAQ,CAER;EAEA,MAAM,sBAAsB,aAAa,MAAM,GAAG,CAAC,CAAC;EACpD,IAAI,wBAAwB,gBAAgB,IAAI,OAAO,KAAK,mBAAmB,GAC7E,IAAI;GACF,MAAM,MAAM,IAAI,kBAAkB,mBAAmB,CAAC,CAAC,OAAO;GAE9D,IAAI,QAAQ,aACV,MAAM,IAAI,WAAW,4DAA4D;GAGnF,IAAI,CAAC,OAAO,QAAQ,eAAe,QAAQ,aACzC,OAAO,+BAA+B,YAAY,YAAY;EAElE,SAAS,OAAO;GACd,IAAI,iBAAiB,cAAc,MAAM,QAAQ,SAAS,eAAe,GACvE,MAAM;EAIV;EAGF,OAAO,6BAA6B,YAAY,YAAY;CAC9D,SAAS,OAAO;EACd,IAAI,iBAAiB,mBAAmB,iBAAiB,sBACvD,MAAM;EAGR,MAAM,IAAI,WAAW,UAAU,EAAE,8CAA8C,MAAM,SAAS;CAChG;AACF;AAEA,MAAM,oBAAoB,MAAe;CACvC,IAAI,aAAa,8BACf,OAAO,EAAE;CAGX,IAAI,aAAa,gCACf,OAAO,EAAE;CAGX,IAAI,aAAa,wCACf,OAAO,EAAE;CAGX,MAAM,IAAI,WAAW,UAAU,EAAE,2CAA2C;AAC9E;AAEA,SAAgB,uCAAuC;CACrD,OAAO,WAAW,EAAE,OAAO,WAAwE;EACjG,IAAI,SAAS,mBAAmB,gBAC9B,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,+BAA+B,IAAI,gCAAgC,KAAK;EAGlH,IAAI,SAAS,mBAAmB,gBAAgB;GAC9C,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,IAAI,gBAAgB;GAC3D,OAAO,iBAAiB,KAAK;EAC/B;EAGA,OAAO;CACT,CAAC;AACH"}