{"version":3,"file":"W3cCredentialSubject.mjs","names":[],"sources":["../../../../../src/modules/vc/models/credential/W3cCredentialSubject.ts"],"sourcesContent":["import { Transform, TransformationType } from 'class-transformer'\nimport type { ValidationOptions } from 'class-validator'\nimport { buildMessage, IsOptional, isInstance, ValidateBy } from 'class-validator'\n\nimport { CredoError } from '../../../../error'\n\n/**\n * @see https://www.w3.org/TR/vc-data-model/#credential-subject\n */\n\nexport interface W3cCredentialSubjectOptions {\n  id?: string\n  // note claims must not contain an id field\n  claims?: Record<string, unknown>\n}\n\nexport class W3cCredentialSubject {\n  public constructor(options: W3cCredentialSubjectOptions) {\n    if (options) {\n      this.id = options.id\n\n      const { id, ...claims } = options.claims ?? {}\n      this.claims = Object.keys(claims).length > 0 ? claims : undefined\n    }\n  }\n\n  @IsOptional()\n  public id?: string\n\n  @IsOptional()\n  public claims?: Record<string, unknown>\n}\n\nexport function W3cCredentialSubjectTransformer() {\n  return Transform(({ value, type }: { value: W3cCredentialSubjectOptions; type: TransformationType }) => {\n    if (type === TransformationType.PLAIN_TO_CLASS) {\n      const vToClass = (v: unknown) => {\n        if (!v || typeof v !== 'object') throw new CredoError('Invalid credential subject')\n        if (isInstance(v, W3cCredentialSubject)) return v\n        const { id, ...claims } = v as Record<string, unknown>\n        if (id !== undefined && typeof id !== 'string') throw new CredoError('Invalid credential subject id')\n        return new W3cCredentialSubject({ id, claims })\n      }\n\n      if (Array.isArray(value) && value.length === 0) {\n        throw new CredoError('At least one credential subject is required')\n      }\n\n      return Array.isArray(value) ? value.map(vToClass) : vToClass(value)\n    }\n    if (type === TransformationType.CLASS_TO_PLAIN) {\n      const vToJson = (v: unknown) => {\n        if (v instanceof W3cCredentialSubject) return v.id ? { ...v.claims, id: v.id } : { ...v.claims }\n        return v\n      }\n\n      return Array.isArray(value) ? value.map(vToJson) : vToJson(value)\n    }\n    // PLAIN_TO_PLAIN\n    return value\n  })\n}\n\nexport function IsW3cCredentialSubject(validationOptions?: ValidationOptions): PropertyDecorator {\n  return ValidateBy(\n    {\n      name: 'IsW3cCredentialSubject',\n      validator: {\n        validate: (value): boolean => {\n          return isInstance(value, W3cCredentialSubject)\n        },\n        defaultMessage: buildMessage(\n          (eachPrefix) =>\n            `${eachPrefix}$property must be an object or an array of objects with an optional id property`,\n          validationOptions\n        ),\n      },\n    },\n    validationOptions\n  )\n}\n"],"mappings":";;;;;;;;;;;AAgBA,IAAa,uBAAb,MAAkC;CAChC,AAAO,YAAY,SAAsC;AACvD,MAAI,SAAS;AACX,QAAK,KAAK,QAAQ;GAElB,MAAM,EAAE,IAAI,GAAG,WAAW,QAAQ,UAAU,EAAE;AAC9C,QAAK,SAAS,OAAO,KAAK,OAAO,CAAC,SAAS,IAAI,SAAS;;;;YAI3D,YAAY;YAGZ,YAAY;AAIf,SAAgB,kCAAkC;AAChD,QAAO,WAAW,EAAE,OAAO,WAA6E;AACtG,MAAI,SAAS,mBAAmB,gBAAgB;GAC9C,MAAM,YAAY,MAAe;AAC/B,QAAI,CAAC,KAAK,OAAO,MAAM,SAAU,OAAM,IAAI,WAAW,6BAA6B;AACnF,QAAI,WAAW,GAAG,qBAAqB,CAAE,QAAO;IAChD,MAAM,EAAE,IAAI,GAAG,WAAW;AAC1B,QAAI,OAAO,UAAa,OAAO,OAAO,SAAU,OAAM,IAAI,WAAW,gCAAgC;AACrG,WAAO,IAAI,qBAAqB;KAAE;KAAI;KAAQ,CAAC;;AAGjD,OAAI,MAAM,QAAQ,MAAM,IAAI,MAAM,WAAW,EAC3C,OAAM,IAAI,WAAW,8CAA8C;AAGrE,UAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,IAAI,SAAS,GAAG,SAAS,MAAM;;AAErE,MAAI,SAAS,mBAAmB,gBAAgB;GAC9C,MAAM,WAAW,MAAe;AAC9B,QAAI,aAAa,qBAAsB,QAAO,EAAE,KAAK;KAAE,GAAG,EAAE;KAAQ,IAAI,EAAE;KAAI,GAAG,EAAE,GAAG,EAAE,QAAQ;AAChG,WAAO;;AAGT,UAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,IAAI,QAAQ,GAAG,QAAQ,MAAM;;AAGnE,SAAO;GACP;;AAGJ,SAAgB,uBAAuB,mBAA0D;AAC/F,QAAO,WACL;EACE,MAAM;EACN,WAAW;GACT,WAAW,UAAmB;AAC5B,WAAO,WAAW,OAAO,qBAAqB;;GAEhD,gBAAgB,cACb,eACC,GAAG,WAAW,kFAChB,kBACD;GACF;EACF,EACD,kBACD"}