@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
95 lines (94 loc) • 4.59 kB
JavaScript
import { CredoError } from "../../error/CredoError.mjs";
import "../../error/index.mjs";
import { isJsonObject } from "../../types.mjs";
import { CREDENTIALS_CONTEXT_V2_URL, VERIFIABLE_CREDENTIAL_TYPE, VERIFIABLE_PRESENTATION_TYPE } from "./constants.mjs";
import { ValidateBy, buildMessage, isString, isURL } from "class-validator";
//#region src/modules/vc/validators.ts
function IsCredentialJsonLdContext(validationOptions) {
const allowString = validationOptions?.allowString ?? false;
const credentialContext = validationOptions?.credentialContext ?? "https://www.w3.org/2018/credentials/v1";
return ValidateBy({
name: "IsCredentialJsonLdContext",
validator: {
validate: (value) => {
if (!Array.isArray(value)) return allowString && isString(value) && value === credentialContext;
if (value[0] !== credentialContext) return false;
return value.every((v) => isString(v) && isURL(v) || isJsonObject(v));
},
defaultMessage: buildMessage((eachPrefix) => `${eachPrefix}$property must be an array of strings or objects, where the first item is the verifiable credential context URL.`, validationOptions)
}
}, validationOptions);
}
function IsCredentialType(validationOptions) {
return ValidateBy({
name: "IsVerifiableCredentialType",
validator: {
validate: (value) => {
return Array.isArray(value) ? value.includes("VerifiableCredential") && value.every((v) => typeof v === "string") : value === VERIFIABLE_CREDENTIAL_TYPE;
},
defaultMessage: buildMessage((eachPrefix) => `${eachPrefix}$property must be "VerifiableCredential" or an array of strings which includes "VerifiableCredential"`, validationOptions)
}
}, validationOptions);
}
function IsVerifiablePresentationType(validationOptions) {
return ValidateBy({
name: "IsVerifiablePresentationType",
validator: {
validate: (value) => {
return Array.isArray(value) ? value.includes("VerifiablePresentation") && value.every((v) => typeof v === "string") : value === VERIFIABLE_PRESENTATION_TYPE;
},
defaultMessage: buildMessage((eachPrefix) => `${eachPrefix}$property must be "VerifiablePresentation" or an array of strings which includes "VerifiablePresentation"`, validationOptions)
}
}, validationOptions);
}
function validateVc2ContextBaseline(context) {
const contextArray = Array.isArray(context) ? context : typeof context === "string" ? [context] : void 0;
if (!contextArray) return {
isValid: false,
error: new CredoError("VC2 @context must be an ordered set")
};
if (contextArray.length === 0) return {
isValid: false,
error: new CredoError("VC2 @context must not be empty")
};
if (contextArray[0] !== "https://www.w3.org/ns/credentials/v2") return {
isValid: false,
error: new CredoError(`VC2 @context must start with '${CREDENTIALS_CONTEXT_V2_URL}'`)
};
if (!contextArray.every((entry) => {
if (typeof entry === "string") return isURL(entry);
return isJsonObject(entry);
})) return {
isValid: false,
error: new CredoError("VC2 @context entries must be URLs or JSON objects")
};
return { isValid: true };
}
function validateVc2CredentialStatus(options) {
if (!options.verifyCredentialStatus || !options.credentialStatus) return { isValid: true };
return {
isValid: false,
error: new CredoError(`Verifying credential status is not supported for W3C VC2 ${options.credentialFormat} credentials`)
};
}
function validateVc2CredentialValidityPeriod(options) {
const now = options.now ?? Math.floor(Date.now() / 1e3);
const validFromTimestamp = options.validFrom ? Math.floor(Date.parse(options.validFrom) / 1e3) : void 0;
const validUntilTimestamp = options.validUntil ? Math.floor(Date.parse(options.validUntil) / 1e3) : void 0;
if (validFromTimestamp !== void 0 && validUntilTimestamp !== void 0 && validFromTimestamp > validUntilTimestamp) return {
isValid: false,
error: new CredoError("Credential validFrom must be temporally equal to or before validUntil")
};
if (validFromTimestamp !== void 0 && validFromTimestamp - options.skewSeconds > now) return {
isValid: false,
error: new CredoError("Credential is not valid yet based on validFrom")
};
if (validUntilTimestamp !== void 0 && validUntilTimestamp + options.skewSeconds < now) return {
isValid: false,
error: new CredoError("Credential is no longer valid based on validUntil")
};
return { isValid: true };
}
//#endregion
export { IsCredentialJsonLdContext, IsCredentialType, IsVerifiablePresentationType, validateVc2ContextBaseline, validateVc2CredentialStatus, validateVc2CredentialValidityPeriod };
//# sourceMappingURL=validators.mjs.map