Files
welshman/packages/domain/src/BookmarkList.ts
T
hodlbod b6b129fdc9
tests / tests (push) Failing after 5m8s
Rewrite domain objects as a Reader/Builder split
Replace the single DomainObject/EncryptableList classes with a read/write split
that removes the optional-event ambiguity:

- base.ts: EventReader<P> (static kind; fromEvent(event, signer?) eagerly computes
  a generic `plain`, validates leniently, throws-or-passes; lazy method accessors;
  group/protect/expires + extraTags carry-over; builder()) and EventBuilder<P>
  (chainable setters, buildTags/buildContent, validate-on-emit).
- List.ts: ListReader/ListBuilder for NIP-51 lists (decrypt-on-read into `plain`,
  re-encrypt-on-emit, tag mutators).
- Every kind converted to a <Noun> reader + <Noun>Builder pair; membership ops
  split into per-kind reader/builder pairs over a shared abstract base.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V67tPYdvh1qCkjEBhJGZUR
2026-06-19 00:35:06 +00:00

53 lines
1.1 KiB
TypeScript

import {uniq} from "@welshman/lib"
import {
BOOKMARKS,
getEventTagValues,
getAddressTagValues,
getTopicTagValues,
getTagValues,
} from "@welshman/util"
import {ListReader, ListBuilder} from "./List.js"
// NIP-51 kind-10003 bookmark list. Mixed entries (notes via 'e', articles via
// 'a', hashtags via 't', urls via 'r') can be bookmarked publicly (tags) or
// privately (encrypted content); accessors treat both as one merged set.
export class BookmarkList extends ListReader {
static kind = BOOKMARKS
ids() {
return uniq(getEventTagValues(this.tags()))
}
addresses() {
return uniq(getAddressTagValues(this.tags()))
}
topics() {
return uniq(getTopicTagValues(this.tags()))
}
urls() {
return uniq(getTagValues("r", this.tags()))
}
builder() {
return this.seedList(new BookmarkListBuilder())
}
}
export class BookmarkListBuilder extends ListBuilder {
static kind = BOOKMARKS
bookmarkPublicly(tag: string[]) {
return this.addPublicTags(tag)
}
bookmarkPrivately(tag: string[]) {
return this.addPrivateTags(tag)
}
removeBookmark(value: string) {
return this.removeTagsWithValue(value)
}
}