{"version":3,"file":"ClrCredential.mjs","names":["errors: string[]"],"sources":["../../src/models/ClrCredential.ts"],"sourcesContent":["/**\n * CLR 2.0 (Comprehensive Learner Record) Credential Types\n *\n * A ClrCredential bundles multiple OpenBadgeCredentials into a single\n * verifiable credential representing a learner's complete achievement record.\n *\n * Spec: https://www.imsglobal.org/spec/clr/v2p0\n */\n\nimport { CLR_V2_CONTEXT, VC_V2_CONTEXT } from '../constants'\n\n/**\n * The subject of a CLR credential - represents the learner\n */\nexport interface ClrSubject {\n  id: string // DID or URL identifying the learner\n  type: 'ClrSubject'\n  verifiableCredential: VerifiableCredentialReference[] // Array of embedded credentials\n  achievement?: AchievementReference[] // Optional achievement summaries\n  association?: Association[] // Optional associations between credentials\n}\n\n/**\n * A reference to or embedded verifiable credential\n */\nexport interface VerifiableCredentialReference {\n  '@context'?: string | string[]\n  type: string[]\n  id?: string\n  issuer: string | { id: string; [key: string]: unknown }\n  validFrom?: string\n  validUntil?: string\n  credentialSubject: Record<string, unknown>\n  proof?: Record<string, unknown>\n  [key: string]: unknown\n}\n\n/**\n * Summary reference to an achievement\n */\nexport interface AchievementReference {\n  id: string\n  type: 'Achievement'\n  name: string\n  description?: string\n  achievementType?: string\n}\n\n/**\n * Association between credentials in a CLR\n */\nexport interface Association {\n  type: 'Association'\n  associationType: AssociationType\n  sourceCredentialId: string\n  targetCredentialId: string\n}\n\nexport type AssociationType =\n  | 'isChildOf'\n  | 'isParentOf'\n  | 'isRelatedTo'\n  | 'replacedBy'\n  | 'precedes'\n  | 'isEqualTo'\n\n/**\n * Input for creating a CLR credential\n */\nexport interface ClrCredentialInput {\n  /** Optional credential ID (auto-generated if not provided) */\n  id?: string\n  /** The learner's identifier (DID or URL) */\n  learnerId: string\n  /** The issuer's profile (DID or profile object) */\n  issuerProfile: string | {\n    id: string\n    type?: 'Profile'\n    name?: string\n    description?: string\n    url?: string\n    image?: string\n  }\n  /** Array of OpenBadgeCredentials to include */\n  verifiableCredentials: VerifiableCredentialReference[]\n  /** Optional associations between credentials */\n  associations?: Association[]\n  /** Verification method for signing */\n  verificationMethod: string\n  /** Optional validity dates */\n  validFrom?: string\n  validUntil?: string\n  /** Optional name for the CLR */\n  name?: string\n  /** Optional description */\n  description?: string\n}\n\n/**\n * The full CLR credential structure\n */\nexport interface ClrCredential {\n  '@context': string[]\n  type: ['VerifiableCredential', 'ClrCredential']\n  id: string\n  issuer: string | { id: string; [key: string]: unknown }\n  validFrom: string\n  validUntil?: string\n  name?: string\n  description?: string\n  credentialSubject: ClrSubject\n  proof?: Record<string, unknown>\n}\n\n/**\n * Build the @context array for a CLR credential\n */\nexport function buildClrContexts(): string[] {\n  return [VC_V2_CONTEXT, CLR_V2_CONTEXT]\n}\n\n/**\n * Validate a CLR credential structure\n */\nexport function validateClrCredential(credential: Partial<ClrCredential>): string[] {\n  const errors: string[] = []\n\n  // Check required fields\n  if (!credential['@context']) {\n    errors.push('Missing @context')\n  }\n\n  if (!credential.type?.includes('ClrCredential')) {\n    errors.push('type must include ClrCredential')\n  }\n\n  if (!credential.issuer) {\n    errors.push('Missing issuer')\n  }\n\n  if (!credential.credentialSubject) {\n    errors.push('Missing credentialSubject')\n  } else {\n    const subject = credential.credentialSubject as Partial<ClrSubject>\n\n    if (!subject.id) {\n      errors.push('credentialSubject.id is required')\n    }\n\n    if (subject.type !== 'ClrSubject') {\n      errors.push('credentialSubject.type must be ClrSubject')\n    }\n\n    if (!Array.isArray(subject.verifiableCredential) || subject.verifiableCredential.length === 0) {\n      errors.push('credentialSubject.verifiableCredential must be a non-empty array')\n    }\n  }\n\n  return errors\n}\n"],"mappings":";;;;;;;;;;;;;;AAqHA,SAAgB,mBAA6B;AAC3C,QAAO,CAAC,eAAe,eAAe;;;;;AAMxC,SAAgB,sBAAsB,YAA8C;CAClF,MAAMA,SAAmB,EAAE;AAG3B,KAAI,CAAC,WAAW,YACd,QAAO,KAAK,mBAAmB;AAGjC,KAAI,CAAC,WAAW,MAAM,SAAS,gBAAgB,CAC7C,QAAO,KAAK,kCAAkC;AAGhD,KAAI,CAAC,WAAW,OACd,QAAO,KAAK,iBAAiB;AAG/B,KAAI,CAAC,WAAW,kBACd,QAAO,KAAK,4BAA4B;MACnC;EACL,MAAM,UAAU,WAAW;AAE3B,MAAI,CAAC,QAAQ,GACX,QAAO,KAAK,mCAAmC;AAGjD,MAAI,QAAQ,SAAS,aACnB,QAAO,KAAK,4CAA4C;AAG1D,MAAI,CAAC,MAAM,QAAQ,QAAQ,qBAAqB,IAAI,QAAQ,qBAAqB,WAAW,EAC1F,QAAO,KAAK,mEAAmE;;AAInF,QAAO"}