Bring back typedoc

This commit is contained in:
Jon Staab
2025-04-08 15:08:00 -07:00
parent 02202d298e
commit 3301616e7d
19 changed files with 261 additions and 135 deletions
+48 -35
View File
@@ -1,8 +1,21 @@
import {describe, it, vi, expect, beforeEach} from "vitest"
import * as Filters from "../src/Filters"
import type {TrustedEvent} from "../src/Events"
import {GENERIC_REPOST, LONG_FORM, MUTES, REPOST} from "@welshman/util"
import {
addRepostFilters,
getFilterGenerality,
getFilterId,
getFilterResultCardinality,
getIdFilters,
getReplyFilters,
guessFilterDelta,
intersectFilters,
matchFilter,
matchFilters,
trimFilter,
unionFilters,
Filter,
} from "../src/Filters"
import type {TrustedEvent} from "../src/Events"
describe("Filters", () => {
beforeEach(() => {
@@ -27,23 +40,23 @@ describe("Filters", () => {
it("should match basic filter criteria", () => {
const event = createEvent()
const filter = {kinds: [1], authors: [pubkey]}
expect(Filters.matchFilter(filter, event)).toBe(true)
expect(matchFilter(filter, event)).toBe(true)
})
it("should handle search terms", () => {
const event = createEvent({content: "Hello Nostr World!"})
expect(Filters.matchFilter({search: "nostr"}, event)).toBe(true)
expect(Filters.matchFilter({search: "bitcoin"}, event)).toBe(false)
expect(matchFilter({search: "nostr"}, event)).toBe(true)
expect(matchFilter({search: "bitcoin"}, event)).toBe(false)
})
it("should handle multiple search terms", () => {
const event = createEvent({content: "Hello Nostr World!"})
expect(Filters.matchFilter({search: "hello world"}, event)).toBe(true)
expect(matchFilter({search: "hello world"}, event)).toBe(true)
})
it("should handle case-insensitive search", () => {
const event = createEvent({content: "Hello NOSTR World!"})
expect(Filters.matchFilter({search: "nostr"}, event)).toBe(true)
expect(matchFilter({search: "nostr"}, event)).toBe(true)
})
})
@@ -51,13 +64,13 @@ describe("Filters", () => {
it("should match if any filter matches", () => {
const event = createEvent()
const filters = [{kinds: [2]}, {kinds: [1], authors: [pubkey]}]
expect(Filters.matchFilters(filters, event)).toBe(true)
expect(matchFilters(filters, event)).toBe(true)
})
it("should not match if no filters match", () => {
const event = createEvent()
const filters = [{kinds: [2]}, {kinds: [3]}]
expect(Filters.matchFilters(filters, event)).toBe(false)
expect(matchFilters(filters, event)).toBe(false)
})
})
@@ -65,13 +78,13 @@ describe("Filters", () => {
it("should generate consistent IDs for equivalent filters", () => {
const filter1 = {kinds: [1], authors: [pubkey]}
const filter2 = {authors: [pubkey], kinds: [1]}
expect(Filters.getFilterId(filter1)).toBe(Filters.getFilterId(filter2))
expect(getFilterId(filter1)).toBe(getFilterId(filter2))
})
it("should generate different IDs for different filters", () => {
const filter1 = {kinds: [1], authors: [pubkey]}
const filter2 = {kinds: [2], authors: [pubkey]}
expect(Filters.getFilterId(filter1)).not.toBe(Filters.getFilterId(filter2))
expect(getFilterId(filter1)).not.toBe(getFilterId(filter2))
})
})
@@ -81,14 +94,14 @@ describe("Filters", () => {
{kinds: [1], authors: [pubkey]},
{kinds: [1], authors: [pubkey + "1"]},
]
const result = Filters.unionFilters(filters)
const result = unionFilters(filters)
expect(result).toHaveLength(1)
expect(result[0].authors).toHaveLength(2)
})
it("should handle different filter groups", () => {
const filters = [{kinds: [1]}, {"#e": [id]}]
const result = Filters.unionFilters(filters)
const filters: Filter[] = [{kinds: [1]}, {"#e": [id]}]
const result = unionFilters(filters)
expect(result).toHaveLength(2)
})
@@ -97,7 +110,7 @@ describe("Filters", () => {
{kinds: [1], limit: 10, since: 1000, until: 2000, search: "test"},
{kinds: [1], limit: 10, since: 1000, until: 2000, search: "test"},
]
const result = Filters.unionFilters(filters)
const result = unionFilters(filters)
expect(result).toHaveLength(1)
expect(result[0]).toMatchObject({limit: 10, since: 1000, until: 2000, search: "test"})
})
@@ -106,7 +119,7 @@ describe("Filters", () => {
describe("intersectFilters", () => {
it("should combine filter groups", () => {
const groups = [[{kinds: [1]}], [{authors: [pubkey]}]]
const result = Filters.intersectFilters(groups)
const result = intersectFilters(groups)
expect(result).toHaveLength(1)
expect(result[0]).toMatchObject({
kinds: [1],
@@ -119,7 +132,7 @@ describe("Filters", () => {
[{since: 1000, until: 2000, limit: 10}],
[{since: 1500, until: 1800, limit: 20}],
]
const result = Filters.intersectFilters(groups)
const result = intersectFilters(groups)
expect(result[0]).toMatchObject({
since: 1500, // Max of since
until: 1800, // Min of until
@@ -129,20 +142,20 @@ describe("Filters", () => {
it("should combine search terms", () => {
const groups = [[{search: "hello"}], [{search: "world"}]]
const result = Filters.intersectFilters(groups)
const result = intersectFilters(groups)
expect(result[0].search).toBe("hello world")
})
})
describe("getIdFilters", () => {
it("should handle plain IDs", () => {
const result = Filters.getIdFilters([id])
const result = getIdFilters([id])
expect(result[0].ids).toContain(id)
})
it("should handle addresses", () => {
const addr = `1:${pubkey}:test`
const result = Filters.getIdFilters([addr])
const result = getIdFilters([addr])
expect(result[0]).toMatchObject({
kinds: [1],
authors: [pubkey],
@@ -152,7 +165,7 @@ describe("Filters", () => {
it("should handle mixed IDs and addresses", () => {
const addr = `1:${pubkey}:test`
const result = Filters.getIdFilters([id, addr])
const result = getIdFilters([id, addr])
expect(result).toHaveLength(2)
})
})
@@ -160,13 +173,13 @@ describe("Filters", () => {
describe("getReplyFilters", () => {
it("should create filters for regular events", () => {
const event = createEvent()
const result = Filters.getReplyFilters([event])
const result = getReplyFilters([event])
expect((result[0] as any)["#e"]).toContain(event.id)
})
it("should handle replaceable events", () => {
const event = createEvent({kind: MUTES})
const result = Filters.getReplyFilters([event])
const result = getReplyFilters([event])
expect((result[0] as any)["#a"]).toBeDefined()
})
@@ -174,20 +187,20 @@ describe("Filters", () => {
const event = createEvent({
wrap: createEvent(),
})
const result = Filters.getReplyFilters([event])
const result = getReplyFilters([event])
expect((result[0] as any)["#e"]).toHaveLength(2)
})
})
describe("addRepostFilters", () => {
it("should add repost kinds for kind 1", () => {
const result = Filters.addRepostFilters([{kinds: [1]}])
const result = addRepostFilters([{kinds: [1]}])
expect(result).toHaveLength(2)
expect(result[1].kinds).toContain(REPOST)
})
it("should handle other kinds", () => {
const result = Filters.addRepostFilters([{kinds: [LONG_FORM]}])
const result = addRepostFilters([{kinds: [LONG_FORM]}])
expect(result[1].kinds).toContain(GENERIC_REPOST)
expect(result[1].kinds).not.toContain(REPOST)
expect(result[1]["#k"]).toContain(LONG_FORM.toString())
@@ -196,27 +209,27 @@ describe("Filters", () => {
describe("filter utilities", () => {
it("should calculate filter generality", () => {
expect(Filters.getFilterGenerality({ids: [id]})).toBe(0)
expect(Filters.getFilterGenerality({authors: [pubkey], "#p": [pubkey]})).toBe(0.2)
expect(Filters.getFilterGenerality({authors: [pubkey, pubkey, pubkey], kinds: [1]})).toBe(
expect(getFilterGenerality({ids: [id]})).toBe(0)
expect(getFilterGenerality({authors: [pubkey], "#p": [pubkey]})).toBe(0.2)
expect(getFilterGenerality({authors: [pubkey, pubkey, pubkey], kinds: [1]})).toBe(
0.01,
)
expect(Filters.getFilterGenerality({kinds: [1]})).toBe(1)
expect(getFilterGenerality({kinds: [1]})).toBe(1)
})
it("should guess filter delta", () => {
const result = Filters.guessFilterDelta([{ids: [id]}])
const result = guessFilterDelta([{ids: [id]}])
expect(result).toBeGreaterThan(0)
})
it("should get filter result cardinality", () => {
expect(Filters.getFilterResultCardinality({ids: [id, id + "1"]})).toBe(2)
expect(Filters.getFilterResultCardinality({kinds: [1]})).toBeUndefined()
expect(getFilterResultCardinality({ids: [id, id + "1"]})).toBe(2)
expect(getFilterResultCardinality({kinds: [1]})).toBeUndefined()
})
it("should trim large filters", () => {
const largeFilter = {authors: Array(2000).fill(pubkey)}
const result = Filters.trimFilter(largeFilter)
const result = trimFilter(largeFilter)
expect(result.authors?.length).toBe(1000)
})
})