A TypeScript implementation of the Digital Credentials Query Language (DCQL, pronounced [ˈdakl̩]) - a JSON-encoded query language for requesting and validating Verifiable Presentations.
DCQL enables Verifiers to request Verifiable Presentations that match specific queries. The library provides functionality to:
- Create and validate DCQL queries
- Match queries against Verifiable Credentials
- Validate presentation results
- Handle various credential formats including mso_mdoc and dc+sd-jwt and w3c vc's.
npm install dcql
# or
yarn add dcql
# or
pnpm add dcql
import { DcqlQuery, DcqlPresentationResult } from 'dcql';
// Create a DCQL query
const query = {
credentials: [{
id: 'my_credential',
format: 'mso_mdoc',
meta: { doctype_value: 'org.iso.7367.1.mVRC' },
claims: [
{ namespace: 'org.iso.7367.1', claim_name: 'vehicle_holder' },
{ namespace: 'org.iso.18013.5.1', claim_name: 'first_name' },
],
}]
};
// Parse (structural) and validate (content) the query
const parsedQuery = DcqlQuery.parse(query);
DcqlQuery.validate(parsedQuery);
// Execute the query against credentials
const queryResult = DcqlQuery.query(parsedQuery, credentials);
- Query Construction: Build structured DCQL queries with type safety
- Validation: Comprehensive query validation and parsing
- Credential Matching: Match credentials against query requirements
- Result Processing: Process and validate presentation results
- Type Safety: Full TypeScript support with detailed type definitions
- Format Support: Support for multiple credential formats
- Extensible: Easy to extend for custom credential formats
The query result provides detailed information about the match:
const queryResult = DcqlQuery.query(query, credentials);
// Check if query can be satisfied
console.log(queryResult.canBeSatisfied);
// Access matched credentials
console.log(queryResult.credential_matches);
// The result of a specific credential query
const credentialMatch = queryResult.credential_matches['credential_query_id'];
console.log(credentialMatch.success); // True if the query is fulfillable
console.log(credentialMatch.input_credential_index); // The index of the best matching input credential
console.log(credentialMatch.claim_set_index); // The index of the claim_set that matched
console.log(credentialMatch.output); // The credential parse output
Validate presentation results against queries:
const presentationQueryResult = DcqlPresentationResult.fromDcqlPresentation(
{
my_credential: {
credential_format: 'mso_mdoc' as const,
doctype: 'org.iso.7367.1.mVRC',
namespaces: {
'org.iso.7367.1': { vehicle_holder: 'Martin Auer' },
'org.iso.18013.5.1': { first_name: 'Martin Auer' },
}
}
},
{ dcqlQuery: query }
);
assert.deepStrictEqual(presentationQueryResult, {
credentials: [
{
id: "my_credential",
format: "mso_mdoc",
claims: [
{ namespace: "org.iso.7367.1", claim_name: "vehicle_holder" },
{ namespace: "org.iso.18013.5.1", claim_name: "first_name" },
],
meta: { doctype_value: "org.iso.7367.1.mVRC" },
},
],
canBeSatisfied: true,
valid_matches: {
my_credential: {
typed: true,
success: true,
output: {
credential_format: "mso_mdoc",
doctype: "org.iso.7367.1.mVRC",
namespaces: {
"org.iso.7367.1": { vehicle_holder: "Martin Auer" },
"org.iso.18013.5.1": { first_name: "Martin Auer" }
},
},
claim_set_index: undefined,
presentation_id: "my_credential",
},
},
invalid_matches: undefined,
credential_sets: undefined,
})