UNPKG

@credo-ts/core

Version:

<p align="center"> <br /> <img alt="Credo Logo" src="https://github.com/openwallet-foundation/credo-ts/blob/c7886cb8377ceb8ee4efe8d264211e561a75072d/images/credo-logo.png" height="250px" /> </p> <h1 align="center"><b>Credo - Core</b></h1

1 lines • 3.96 kB
{"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"}