{"version":3,"file":"validate.mjs","names":["issues: ValidationIssue[]"],"sources":["../../src/utils/validate.ts"],"sourcesContent":["import { VC_V2_CONTEXT, OBV3_CONTEXT, REQUIRED_TYPES, ENDORSEMENT_TYPES } from '../constants'\n\nexport type ValidationIssue = { code: string; message: string }\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n  return value != null && typeof value === 'object' && !Array.isArray(value)\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function ensureContexts(credential: any): ValidationIssue[] {\n  const issues: ValidationIssue[] = []\n  const ctx = credential?.['@context']\n  const contexts = Array.isArray(ctx) ? ctx : ctx ? [ctx] : []\n  if (!contexts.includes(VC_V2_CONTEXT)) {\n    issues.push({ code: 'missing_vc_v2_context', message: 'Missing VC v2 context' })\n  }\n  if (!contexts.includes(OBV3_CONTEXT)) {\n    issues.push({ code: 'missing_obv3_context', message: 'Missing OBv3 context' })\n  }\n  return issues\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function ensureTypes(credential: any): ValidationIssue[] {\n  const issues: ValidationIssue[] = []\n  const types = Array.isArray(credential?.type) ? credential.type : []\n  for (const t of REQUIRED_TYPES) {\n    if (!types.includes(t)) issues.push({ code: 'missing_type', message: `Missing required type ${t}` })\n  }\n  return issues\n}\n\nexport function validateObEnvelope(credential: unknown): ValidationIssue[] {\n  const issues: ValidationIssue[] = []\n  if (!isObject(credential)) return [{ code: 'invalid_json', message: 'Credential must be a JSON object' }]\n  issues.push(...ensureContexts(credential))\n  issues.push(...ensureTypes(credential))\n  // Minimal OBv3 required fields\n  const issuer = (credential as any)?.issuer\n  const issuerId = typeof issuer === 'string' ? issuer : issuer?.id\n  if (!issuerId) issues.push({ code: 'missing_issuer', message: 'Missing issuer or issuer.id' })\n\n  const cs = (credential as any)?.credentialSubject\n  if (!cs || (typeof cs !== 'object' && !Array.isArray(cs))) {\n    issues.push({ code: 'missing_credentialSubject', message: 'Missing credentialSubject' })\n  }\n\n  // If achievement present, ensure basic fields\n  const achievement = (credential as any)?.credentialSubject?.achievement\n  if (achievement) {\n    if (!achievement?.type) issues.push({ code: 'missing_achievement_type', message: 'Achievement.type is recommended' })\n    if (!achievement?.name) issues.push({ code: 'missing_achievement_name', message: 'Achievement.name is recommended' })\n  }\n  return issues\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function ensureEndorsementTypes(credential: any): ValidationIssue[] {\n  const issues: ValidationIssue[] = []\n  const types = Array.isArray(credential?.type) ? credential.type : []\n  for (const t of ENDORSEMENT_TYPES) {\n    if (!types.includes(t)) issues.push({ code: 'missing_type', message: `Missing required type ${t}` })\n  }\n  return issues\n}\n\n/**\n * Validates an EndorsementCredential envelope\n * EndorsementCredentials have a different structure than OpenBadgeCredentials:\n * - type must include 'VerifiableCredential' and 'EndorsementCredential'\n * - credentialSubject.type must be 'EndorsementSubject'\n * - credentialSubject.id is required (the entity being endorsed)\n */\nexport function validateEndorsementEnvelope(credential: unknown): ValidationIssue[] {\n  const issues: ValidationIssue[] = []\n  if (!isObject(credential)) return [{ code: 'invalid_json', message: 'Credential must be a JSON object' }]\n\n  // Check contexts\n  issues.push(...ensureContexts(credential))\n\n  // Check endorsement-specific types\n  issues.push(...ensureEndorsementTypes(credential))\n\n  // Check issuer\n  const issuer = (credential as any)?.issuer\n  const issuerId = typeof issuer === 'string' ? issuer : issuer?.id\n  if (!issuerId) issues.push({ code: 'missing_issuer', message: 'Missing issuer or issuer.id' })\n\n  // Check credentialSubject\n  const cs = (credential as any)?.credentialSubject\n  if (!cs || typeof cs !== 'object') {\n    issues.push({ code: 'missing_credentialSubject', message: 'Missing credentialSubject' })\n    return issues\n  }\n\n  // EndorsementSubject requires id (the entity being endorsed)\n  if (!cs.id) {\n    issues.push({ code: 'missing_endorsement_subject_id', message: 'EndorsementSubject requires id of the entity being endorsed' })\n  }\n\n  // Check type is EndorsementSubject\n  if (cs.type !== 'EndorsementSubject') {\n    issues.push({ code: 'invalid_endorsement_subject_type', message: 'credentialSubject.type must be EndorsementSubject' })\n  }\n\n  return issues\n}\n\n"],"mappings":"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"}