import { DidDocumentError, INVALID_DID_DOCUMENT } from '@did-btcr2/common'; import type { BeaconService } from '../core/beacon/interfaces.js'; import type { DidVerificationMethod } from './did-document.js'; import { BTCR2_DID_DOCUMENT_CONTEXT, DidDocument } from './did-document.js'; /** * A builder for DID documents. If the initial document has no "@context", the builder * writes the two btcr2 contexts. It sets no other default member. * @type {DidDocumentBuilder} * @class DidDocumentBuilder */ export class DidDocumentBuilder { private document: Partial = {}; constructor(initialDocument: Partial) { if (!initialDocument.id) { throw new DidDocumentError('Missing required "id" property', INVALID_DID_DOCUMENT, initialDocument); } this.document.id = initialDocument.id; // If the initial document has no "@context", write the two btcr2 contexts. // Do not add an empty verificationMethod. this.document['@context'] = initialDocument['@context'] ?? [...BTCR2_DID_DOCUMENT_CONTEXT]; if (initialDocument.verificationMethod) { this.document.verificationMethod = initialDocument.verificationMethod; } } withAuthentication(authentication: Array): this { if (authentication) { this.document.authentication = authentication; } return this; } withAssertionMethod(assertionMethod: Array): this { if (assertionMethod) { this.document.assertionMethod = assertionMethod; } return this; } withCapabilityInvocation(capabilityInvocation: Array): this { if (capabilityInvocation) { this.document.capabilityInvocation = capabilityInvocation; } return this; } withCapabilityDelegation(capabilityDelegation: Array): this { if (capabilityDelegation) { this.document.capabilityDelegation = capabilityDelegation; } return this; } withService(service: Array): this { if (service) { this.document.service = service; } return this; } build(): DidDocument { const didDocument = new DidDocument(this.document as DidDocument); for (const key of Object.keys(didDocument)) { if (didDocument[key as keyof DidDocument] === undefined) { delete didDocument[key as keyof DidDocument]; } } return didDocument; } }