{"version":3,"file":"W3cV2Presentation.mjs","names":[],"sources":["../../../../../src/modules/vc/models/presentation/W3cV2Presentation.ts"],"sourcesContent":["import { Expose, instanceToPlain, Transform, TransformationType } from 'class-transformer'\nimport { IsOptional, ValidateNested } from 'class-validator'\nimport { CredoError } from '../../../../error'\nimport type { JsonObject, SingleOrArray } from '../../../../types'\nimport { JsonTransformer, mapSingleOrArray } from '../../../../utils'\nimport { IsInstanceOrArrayOfInstances, IsNever, IsUri } from '../../../../utils/validators'\nimport { CREDENTIALS_CONTEXT_V2_URL, VERIFIABLE_PRESENTATION_TYPE } from '../../constants'\nimport {\n  type W3cV2DataIntegritySecuredCredential,\n  W3cV2DataIntegrityVerifiableCredential,\n} from '../../data-integrity/W3cV2DataIntegrityVerifiableCredential'\nimport {\n  type W3cV2DataIntegritySecuredPresentation,\n  W3cV2DataIntegrityVerifiablePresentation,\n} from '../../data-integrity/W3cV2DataIntegrityVerifiablePresentation'\nimport { IsCredentialJsonLdContext, IsVerifiablePresentationType } from '../../validators'\nimport {\n  isEnvelopedVerifiableCredentialEntry,\n  W3cV2EnvelopedVerifiableCredential,\n  type W3cV2EnvelopedVerifiableCredentialOptions,\n} from '../credential/W3cV2EnvelopedVerifiableCredential'\nimport {\n  isEnvelopedVerifiablePresentationEntry,\n  W3cV2EnvelopedVerifiablePresentation,\n  type W3cV2EnvelopedVerifiablePresentationOptions,\n} from './W3cV2EnvelopedVerifiablePresentation'\nimport { IsW3cV2Holder, W3cV2Holder, type W3cV2HolderOptions, W3cV2HolderTransformer } from './W3cV2Holder'\nimport type { W3cV2JsonPresentation } from './W3cV2JsonPresentation'\n\nexport type W3cV2PresentationCredentialEntry =\n  | W3cV2EnvelopedVerifiableCredential\n  | W3cV2EnvelopedVerifiablePresentation\n  | W3cV2DataIntegrityVerifiableCredential\n  | W3cV2DataIntegrityVerifiablePresentation\n\nexport type W3cV2PresentationCredentialEntryOptions =\n  | W3cV2EnvelopedVerifiableCredentialOptions\n  | W3cV2EnvelopedVerifiablePresentationOptions\n  | W3cV2DataIntegritySecuredCredential\n  | W3cV2DataIntegritySecuredPresentation\n  | W3cV2PresentationCredentialEntry\n\nexport interface W3cV2PresentationOptions {\n  id?: string\n  context?: Array<string | JsonObject>\n  type?: SingleOrArray<string>\n  verifiableCredential?: SingleOrArray<W3cV2PresentationCredentialEntryOptions>\n  holder?: string | W3cV2HolderOptions\n}\n\nexport class W3cV2Presentation {\n  public constructor(options: W3cV2PresentationOptions) {\n    if (options) {\n      this.id = options.id\n      this.context = options.context ?? [CREDENTIALS_CONTEXT_V2_URL]\n      this.type = options.type ?? [VERIFIABLE_PRESENTATION_TYPE]\n      if (options.verifiableCredential) {\n        this.verifiableCredential = mapSingleOrArray(options.verifiableCredential, (entry) => {\n          if (\n            entry instanceof W3cV2EnvelopedVerifiablePresentation ||\n            entry instanceof W3cV2DataIntegrityVerifiablePresentation ||\n            isEnvelopedVerifiablePresentationEntry(entry) ||\n            isEmbeddedDataIntegrityPresentationEntry(entry)\n          ) {\n            throw new CredoError('Nested verifiable presentation entries are not supported in VC 2.0 presentations.')\n          }\n\n          if (\n            entry instanceof W3cV2EnvelopedVerifiableCredential ||\n            entry instanceof W3cV2DataIntegrityVerifiableCredential\n          ) {\n            return entry\n          }\n\n          if (isEmbeddedDataIntegrityCredential(entry)) {\n            return new W3cV2DataIntegrityVerifiableCredential({ securedCredential: entry })\n          }\n\n          if (isEnvelopedVerifiableCredentialEntry(entry)) {\n            return new W3cV2EnvelopedVerifiableCredential(entry)\n          }\n\n          throw new CredoError('Unsupported verifiableCredential entry shape in W3cV2Presentation.')\n        })\n      }\n\n      if (options.holder) {\n        this.holder = typeof options.holder === 'string' ? options.holder : new W3cV2Holder(options.holder)\n      }\n    }\n  }\n\n  @Expose({ name: '@context' })\n  @IsCredentialJsonLdContext({ credentialContext: CREDENTIALS_CONTEXT_V2_URL })\n  public context!: Array<string | JsonObject>\n\n  @IsOptional()\n  @IsUri()\n  public id?: string\n\n  @IsVerifiablePresentationType()\n  public type!: SingleOrArray<string>\n\n  @W3cV2HolderTransformer()\n  @IsW3cV2Holder()\n  @IsOptional()\n  public holder?: string | W3cV2Holder\n\n  @W3cV2PresentationCredentialEntryTransformer()\n  @IsOptional()\n  @IsInstanceOrArrayOfInstances({\n    classType: [W3cV2EnvelopedVerifiableCredential, W3cV2DataIntegrityVerifiableCredential],\n  })\n  @ValidateNested({ each: true })\n  public verifiableCredential?: SingleOrArray<W3cV2PresentationCredentialEntry>\n\n  @IsNever()\n  public vc?: never\n\n  @IsNever()\n  public vp?: never\n\n  public get holderId(): string | undefined {\n    if (!this.holder) return undefined\n\n    return this.holder instanceof W3cV2Holder ? this.holder.id : this.holder\n  }\n\n  public toJSON() {\n    return JsonTransformer.toJSON(this) as W3cV2JsonPresentation\n  }\n}\n\nexport function isEmbeddedDataIntegrityPresentationEntry(\n  value: unknown\n): value is W3cV2DataIntegritySecuredPresentation {\n  if (!value || typeof value !== 'object' || Array.isArray(value)) return false\n  if (!('proof' in value) || !('type' in value)) return false\n\n  const candidate = value as { type?: unknown }\n  if (Array.isArray(candidate.type)) {\n    return candidate.type.includes(VERIFIABLE_PRESENTATION_TYPE)\n  }\n\n  return candidate.type === VERIFIABLE_PRESENTATION_TYPE\n}\n\nfunction isEmbeddedDataIntegrityCredential(value: unknown): value is W3cV2DataIntegritySecuredCredential {\n  if (!value || typeof value !== 'object' || Array.isArray(value)) return false\n\n  return 'proof' in value\n}\n\nfunction jsonToCredentialEntry(value: unknown): W3cV2PresentationCredentialEntry {\n  if (\n    value instanceof W3cV2EnvelopedVerifiablePresentation ||\n    value instanceof W3cV2DataIntegrityVerifiablePresentation ||\n    isEnvelopedVerifiablePresentationEntry(value) ||\n    isEmbeddedDataIntegrityPresentationEntry(value)\n  ) {\n    throw new CredoError('Nested verifiable presentation entries are not supported in VC 2.0 presentations.')\n  }\n\n  if (value instanceof W3cV2EnvelopedVerifiableCredential || value instanceof W3cV2DataIntegrityVerifiableCredential) {\n    return value\n  }\n\n  if (isEmbeddedDataIntegrityCredential(value)) {\n    return new W3cV2DataIntegrityVerifiableCredential({ securedCredential: value })\n  }\n\n  if (isEnvelopedVerifiableCredentialEntry(value)) {\n    return JsonTransformer.fromJSON(value, W3cV2EnvelopedVerifiableCredential)\n  }\n\n  throw new CredoError('Unsupported verifiableCredential entry shape in W3cV2Presentation.')\n}\n\nfunction credentialEntryToJson(value: unknown) {\n  if (value instanceof W3cV2DataIntegrityVerifiableCredential) {\n    return value.securedCredential\n  }\n\n  if (value instanceof W3cV2DataIntegrityVerifiablePresentation) {\n    return value.securedPresentation\n  }\n\n  return instanceToPlain(value)\n}\n\nexport function W3cV2PresentationCredentialEntryTransformer() {\n  return Transform(({ value, type }: { value: SingleOrArray<unknown>; type: TransformationType }) => {\n    if (type === TransformationType.PLAIN_TO_CLASS) {\n      return Array.isArray(value) ? value.map(jsonToCredentialEntry) : jsonToCredentialEntry(value)\n    }\n\n    if (type === TransformationType.CLASS_TO_PLAIN) {\n      if (Array.isArray(value)) return value.map(credentialEntryToJson)\n      return credentialEntryToJson(value)\n    }\n\n    // PLAIN_TO_PLAIN\n    return value\n  })\n}\n"],"mappings":"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"}