applesauce-actions 0.0.0-next-20250315131629 → 0.0.0-next-20250323173930

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,80 @@
1
+ import { beforeEach, describe, expect, it } from "vitest";
2
+ import { EventStore } from "applesauce-core";
3
+ import { EventFactory } from "applesauce-factory";
4
+ import { kinds } from "nostr-tools";
5
+ import { unlockHiddenTags } from "applesauce-core/helpers";
6
+ import { subscribeSpyTo } from "@hirez_io/observer-spy";
7
+ import { FakeUser } from "../../__tests__/fake-user.js";
8
+ import { ActionHub } from "../../action-hub.js";
9
+ import { AddUserToFollowSet, RemoveUserFromFollowSet } from "../follow-sets.js";
10
+ const user = new FakeUser();
11
+ const testPubkey = "test-pubkey";
12
+ const testIdentifier = "test-list";
13
+ let events;
14
+ let factory;
15
+ let hub;
16
+ beforeEach(() => {
17
+ events = new EventStore();
18
+ factory = new EventFactory({ signer: user });
19
+ hub = new ActionHub(events, factory);
20
+ // Add a follow set event to work with
21
+ const followSet = user.event({
22
+ kind: kinds.Followsets,
23
+ tags: [["d", testIdentifier]],
24
+ content: "",
25
+ created_at: Math.floor(Date.now() / 1000),
26
+ });
27
+ events.add(followSet);
28
+ });
29
+ describe("AddUserToList", () => {
30
+ it("should add a pubkey to public tags in a follow set", async () => {
31
+ const spy = subscribeSpyTo(hub.exec(AddUserToFollowSet, testPubkey, testIdentifier), { expectErrors: false });
32
+ await spy.onComplete();
33
+ const emittedEvent = spy.getLastValue();
34
+ expect(emittedEvent).toMatchObject({
35
+ kind: kinds.Followsets,
36
+ tags: expect.arrayContaining([
37
+ ["d", testIdentifier],
38
+ ["p", testPubkey],
39
+ ]),
40
+ });
41
+ });
42
+ it("should add a pubkey to hidden tags in a follow set", async () => {
43
+ const spy = subscribeSpyTo(hub.exec(AddUserToFollowSet, testPubkey, testIdentifier, true), { expectErrors: false });
44
+ await spy.onComplete();
45
+ const emittedEvent = spy.getLastValue();
46
+ expect(await unlockHiddenTags(emittedEvent, user)).toEqual(expect.arrayContaining([["p", testPubkey]]));
47
+ });
48
+ });
49
+ describe("RemoveUserFromList", () => {
50
+ beforeEach(async () => {
51
+ // Add a follow set with existing tags to remove
52
+ const followSetWithTags = user.event({
53
+ kind: kinds.Followsets,
54
+ tags: [
55
+ ["d", testIdentifier],
56
+ ["p", testPubkey],
57
+ ],
58
+ content: await user.nip04.encrypt(user.pubkey, JSON.stringify(["p", testPubkey])),
59
+ created_at: Math.floor(Date.now() / 1000),
60
+ });
61
+ events.add(followSetWithTags);
62
+ });
63
+ it("should remove a pubkey from public tags in a follow set", async () => {
64
+ const spy = subscribeSpyTo(hub.exec(RemoveUserFromFollowSet, testPubkey, testIdentifier), { expectErrors: false });
65
+ await spy.onComplete();
66
+ const emittedEvent = spy.getLastValue();
67
+ expect(emittedEvent).toMatchObject({
68
+ kind: kinds.Followsets,
69
+ tags: expect.not.arrayContaining([["p", testPubkey]]),
70
+ });
71
+ });
72
+ it("should remove a pubkey from hidden tags in a follow set", async () => {
73
+ const spy = subscribeSpyTo(hub.exec(RemoveUserFromFollowSet, testPubkey, testIdentifier, true), {
74
+ expectErrors: false,
75
+ });
76
+ await spy.onComplete();
77
+ const emittedEvent = spy.getLastValue();
78
+ expect(await unlockHiddenTags(emittedEvent, user)).toEqual(expect.not.arrayContaining([["hidden", "p", testPubkey]]));
79
+ });
80
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,67 @@
1
+ import { beforeEach, describe, expect, it } from "vitest";
2
+ import { EventStore } from "applesauce-core";
3
+ import { EventFactory } from "applesauce-factory";
4
+ import { kinds } from "nostr-tools";
5
+ import { getMutedThings, getHiddenMutedThings } from "applesauce-core/helpers";
6
+ import { subscribeSpyTo } from "@hirez_io/observer-spy";
7
+ import { FakeUser } from "../../__tests__/fake-user.js";
8
+ import { ActionHub } from "../../action-hub.js";
9
+ import { MuteThread, UnmuteThread } from "../mute.js";
10
+ const user = new FakeUser();
11
+ const testEventId = "test-event-id";
12
+ let events;
13
+ let factory;
14
+ let hub;
15
+ beforeEach(() => {
16
+ events = new EventStore();
17
+ factory = new EventFactory({ signer: user });
18
+ hub = new ActionHub(events, factory);
19
+ // Add a mute list event to work with
20
+ const muteList = user.event({
21
+ kind: kinds.Mutelist,
22
+ tags: [],
23
+ content: "",
24
+ created_at: Math.floor(Date.now() / 1000),
25
+ });
26
+ events.add(muteList);
27
+ });
28
+ describe("MuteThread", () => {
29
+ it("should add an event to public tags in mute list", async () => {
30
+ const spy = subscribeSpyTo(hub.exec(MuteThread, testEventId), { expectErrors: false });
31
+ await spy.onComplete();
32
+ const emittedEvent = spy.getLastValue();
33
+ const mutedThings = getMutedThings(emittedEvent);
34
+ expect(mutedThings.threads).toContain(testEventId);
35
+ });
36
+ it("should add an event to hidden tags in mute list", async () => {
37
+ const spy = subscribeSpyTo(hub.exec(MuteThread, testEventId, true), { expectErrors: false });
38
+ await spy.onComplete();
39
+ const emittedEvent = spy.getLastValue();
40
+ const hiddenMutedThings = await getHiddenMutedThings(emittedEvent);
41
+ expect(hiddenMutedThings?.threads).toContain(testEventId);
42
+ });
43
+ });
44
+ describe("UnmuteThread", () => {
45
+ it("should remove an event from public tags in mute list", async () => {
46
+ // First add the thread to mute list
47
+ const addSpy = subscribeSpyTo(hub.exec(MuteThread, testEventId), { expectErrors: false });
48
+ await addSpy.onComplete();
49
+ // Then unmute it
50
+ const spy = subscribeSpyTo(hub.exec(UnmuteThread, testEventId), { expectErrors: false });
51
+ await spy.onComplete();
52
+ const emittedEvent = spy.getLastValue();
53
+ const mutedThings = getMutedThings(emittedEvent);
54
+ expect(mutedThings.threads).not.toContain(testEventId);
55
+ });
56
+ it("should remove an event from hidden tags in mute list", async () => {
57
+ // First add the thread to hidden mute list
58
+ const addSpy = subscribeSpyTo(hub.exec(MuteThread, testEventId, true), { expectErrors: false });
59
+ await addSpy.onComplete();
60
+ // Then unmute it
61
+ const spy = subscribeSpyTo(hub.exec(UnmuteThread, testEventId, true), { expectErrors: false });
62
+ await spy.onComplete();
63
+ const emittedEvent = spy.getLastValue();
64
+ const hiddenMutedThings = await getHiddenMutedThings(emittedEvent);
65
+ expect(hiddenMutedThings?.threads).not.toContain(testEventId);
66
+ });
67
+ });
@@ -0,0 +1,43 @@
1
+ import { NostrEvent } from "nostr-tools";
2
+ import { Action } from "../action-hub.js";
3
+ import { ProfilePointer } from "nostr-tools/nip19";
4
+ /**
5
+ * An action that creates a new follow set
6
+ * @param identifier the "d" tag of the follow set
7
+ * @param pubkeys the pubkeys to add to the follow set
8
+ * @param hidden set to true to create a hidden follow set
9
+ * @throws if a follow set already exists
10
+ */
11
+ export declare function CreateFollowSet(title: string, options?: {
12
+ description?: string;
13
+ image?: string;
14
+ public?: (string | ProfilePointer)[];
15
+ hidden?: (string | ProfilePointer)[];
16
+ }): Action;
17
+ /**
18
+ * An action that adds a pubkey to a follow set
19
+ * @param pubkey the pubkey to add to the set
20
+ * @param identifier the "d" tag of the follow set
21
+ * @param hidden set to true to add to hidden follows
22
+ * @throws if the follow set does not exist
23
+ */
24
+ export declare function AddUserToFollowSet(pubkey: (string | ProfilePointer)[] | string | ProfilePointer, identifier: NostrEvent | string, hidden?: boolean): Action;
25
+ /**
26
+ * An action that removes a pubkey from a follow set
27
+ * @param pubkey the pubkey to remove from the set
28
+ * @param identifier the "d" tag of the follow set
29
+ * @param hidden set to true to remove from hidden follows
30
+ * @throws if the follow set does not exist
31
+ */
32
+ export declare function RemoveUserFromFollowSet(pubkey: (string | ProfilePointer)[] | string | ProfilePointer, identifier: NostrEvent | string, hidden?: boolean): Action;
33
+ /**
34
+ * An action that updates the title, description, or image of a follow set
35
+ * @param identifier the "d" tag of the follow set
36
+ * @param info the new information for the follow set
37
+ * @throws if the follow set does not exist
38
+ */
39
+ export declare function UpdateFollowSetInformation(identifier: string, info: {
40
+ title?: string;
41
+ description?: string;
42
+ image?: string;
43
+ }): Action;
@@ -0,0 +1,71 @@
1
+ import { kinds } from "nostr-tools";
2
+ import { addPubkeyTag, removePubkeyTag } from "applesauce-factory/operations/tag";
3
+ import { modifyHiddenTags, modifyPublicTags, setListDescription, setListImage, setListTitle, } from "applesauce-factory/operations/event";
4
+ function getFollowSetEvent(events, self, identifier) {
5
+ const set = typeof identifier === "string" ? events.getReplaceable(kinds.Followsets, self, identifier) : identifier;
6
+ if (!set)
7
+ throw new Error("Can't find follow set");
8
+ if (set.kind !== kinds.Followsets)
9
+ throw new Error("Event is not a follow set");
10
+ return set;
11
+ }
12
+ /**
13
+ * An action that creates a new follow set
14
+ * @param identifier the "d" tag of the follow set
15
+ * @param pubkeys the pubkeys to add to the follow set
16
+ * @param hidden set to true to create a hidden follow set
17
+ * @throws if a follow set already exists
18
+ */
19
+ export function CreateFollowSet(title, options) {
20
+ return async function* ({ factory }) {
21
+ const draft = await factory.build({ kind: kinds.Followsets },
22
+ // set list information
23
+ setListTitle(title), options?.description ? setListDescription(options.description) : undefined, options?.image ? setListImage(options.image) : undefined,
24
+ // add pubkey tags
25
+ options?.public ? modifyPublicTags(...options.public.map((p) => addPubkeyTag(p))) : undefined, options?.hidden ? modifyHiddenTags(...options.hidden.map((p) => addPubkeyTag(p))) : undefined);
26
+ yield await factory.sign(draft);
27
+ };
28
+ }
29
+ /**
30
+ * An action that adds a pubkey to a follow set
31
+ * @param pubkey the pubkey to add to the set
32
+ * @param identifier the "d" tag of the follow set
33
+ * @param hidden set to true to add to hidden follows
34
+ * @throws if the follow set does not exist
35
+ */
36
+ export function AddUserToFollowSet(pubkey, identifier, hidden = false) {
37
+ return async function* ({ events, factory, self }) {
38
+ const follows = getFollowSetEvent(events, self, identifier);
39
+ const operations = Array.isArray(pubkey) ? pubkey.map((p) => addPubkeyTag(p)) : addPubkeyTag(pubkey);
40
+ const draft = await factory.modifyTags(follows, hidden ? { hidden: operations } : operations);
41
+ yield await factory.sign(draft);
42
+ };
43
+ }
44
+ /**
45
+ * An action that removes a pubkey from a follow set
46
+ * @param pubkey the pubkey to remove from the set
47
+ * @param identifier the "d" tag of the follow set
48
+ * @param hidden set to true to remove from hidden follows
49
+ * @throws if the follow set does not exist
50
+ */
51
+ export function RemoveUserFromFollowSet(pubkey, identifier, hidden = false) {
52
+ return async function* ({ events, factory, self }) {
53
+ const follows = getFollowSetEvent(events, self, identifier);
54
+ const operations = Array.isArray(pubkey) ? pubkey.map((p) => removePubkeyTag(p)) : removePubkeyTag(pubkey);
55
+ const draft = await factory.modifyTags(follows, hidden ? { hidden: operations } : operations);
56
+ yield await factory.sign(draft);
57
+ };
58
+ }
59
+ /**
60
+ * An action that updates the title, description, or image of a follow set
61
+ * @param identifier the "d" tag of the follow set
62
+ * @param info the new information for the follow set
63
+ * @throws if the follow set does not exist
64
+ */
65
+ export function UpdateFollowSetInformation(identifier, info) {
66
+ return async function* ({ events, factory, self }) {
67
+ const follows = getFollowSetEvent(events, self, identifier);
68
+ const draft = await factory.modify(follows, info?.title ? setListTitle(info.title) : undefined, info?.description ? setListDescription(info.description) : undefined, info?.image ? setListImage(info.image) : undefined);
69
+ yield await factory.sign(draft);
70
+ };
71
+ }
@@ -1,4 +1,7 @@
1
- export * from "./contacts.js";
2
1
  export * from "./bookmarks.js";
2
+ export * from "./contacts.js";
3
+ export * from "./follow-sets.js";
4
+ export * from "./mailboxes.js";
3
5
  export * from "./pins.js";
4
6
  export * from "./profile.js";
7
+ export * from "./mute.js";
@@ -1,4 +1,7 @@
1
- export * from "./contacts.js";
2
1
  export * from "./bookmarks.js";
2
+ export * from "./contacts.js";
3
+ export * from "./follow-sets.js";
4
+ export * from "./mailboxes.js";
3
5
  export * from "./pins.js";
4
6
  export * from "./profile.js";
7
+ export * from "./mute.js";
@@ -0,0 +1,11 @@
1
+ import { Action } from "../action-hub.js";
2
+ /** An action to create a new kind 10002 relay list event */
3
+ export declare function CreateMailboxes(inboxes: string[], outboxes: string[]): Action;
4
+ /** An action to add an inbox relay to the kind 10002 relay list */
5
+ export declare function AddInboxRelay(relay: string | string[]): Action;
6
+ /** An action to remove an inbox relay from the kind 10002 relay list */
7
+ export declare function RemoveInboxRelay(relay: string | string[]): Action;
8
+ /** An action to add an outbox relay to the kind 10002 relay list */
9
+ export declare function AddOutboxRelay(relay: string | string[]): Action;
10
+ /** An action to remove an outbox relay from the kind 10002 relay list */
11
+ export declare function RemoveOutboxRelay(relay: string | string[]): Action;
@@ -0,0 +1,66 @@
1
+ import { kinds } from "nostr-tools";
2
+ import { addInboxRelay, addOutboxRelay, removeInboxRelay, removeOutboxRelay } from "applesauce-factory/operations/tag";
3
+ import { modifyPublicTags } from "applesauce-factory/operations/event";
4
+ /** An action to create a new kind 10002 relay list event */
5
+ export function CreateMailboxes(inboxes, outboxes) {
6
+ return async function* ({ events, factory, self }) {
7
+ const mailboxes = events.getReplaceable(kinds.RelayList, self);
8
+ if (mailboxes)
9
+ throw new Error("Mailbox event already exists");
10
+ const draft = await factory.build({ kind: kinds.RelayList }, modifyPublicTags(...inboxes.map(addInboxRelay), ...outboxes.map(addOutboxRelay)));
11
+ const signed = await factory.sign(draft);
12
+ yield signed;
13
+ };
14
+ }
15
+ /** An action to add an inbox relay to the kind 10002 relay list */
16
+ export function AddInboxRelay(relay) {
17
+ return async function* ({ events, factory, self }) {
18
+ if (typeof relay === "string")
19
+ relay = [relay];
20
+ const mailboxes = events.getReplaceable(kinds.RelayList, self);
21
+ if (!mailboxes)
22
+ throw new Error("Missing mailboxes event");
23
+ const draft = await factory.modifyTags(mailboxes, ...relay.map(addInboxRelay));
24
+ const signed = await factory.sign(draft);
25
+ yield signed;
26
+ };
27
+ }
28
+ /** An action to remove an inbox relay from the kind 10002 relay list */
29
+ export function RemoveInboxRelay(relay) {
30
+ return async function* ({ events, factory, self }) {
31
+ if (typeof relay === "string")
32
+ relay = [relay];
33
+ const mailboxes = events.getReplaceable(kinds.RelayList, self);
34
+ if (!mailboxes)
35
+ throw new Error("Missing mailboxes event");
36
+ const draft = await factory.modifyTags(mailboxes, ...relay.map(removeInboxRelay));
37
+ const signed = await factory.sign(draft);
38
+ yield signed;
39
+ };
40
+ }
41
+ /** An action to add an outbox relay to the kind 10002 relay list */
42
+ export function AddOutboxRelay(relay) {
43
+ return async function* ({ events, factory, self }) {
44
+ if (typeof relay === "string")
45
+ relay = [relay];
46
+ const mailboxes = events.getReplaceable(kinds.RelayList, self);
47
+ if (!mailboxes)
48
+ throw new Error("Missing mailboxes event");
49
+ const draft = await factory.modifyTags(mailboxes, ...relay.map(addOutboxRelay));
50
+ const signed = await factory.sign(draft);
51
+ yield signed;
52
+ };
53
+ }
54
+ /** An action to remove an outbox relay from the kind 10002 relay list */
55
+ export function RemoveOutboxRelay(relay) {
56
+ return async function* ({ events, factory, self }) {
57
+ if (typeof relay === "string")
58
+ relay = [relay];
59
+ const mailboxes = events.getReplaceable(kinds.RelayList, self);
60
+ if (!mailboxes)
61
+ throw new Error("Missing mailboxes event");
62
+ const draft = await factory.modifyTags(mailboxes, ...relay.map(removeOutboxRelay));
63
+ const signed = await factory.sign(draft);
64
+ yield signed;
65
+ };
66
+ }
@@ -0,0 +1,19 @@
1
+ import { NostrEvent } from "nostr-tools";
2
+ import { EventPointer } from "nostr-tools/nip19";
3
+ import { Action } from "../action-hub.js";
4
+ /** An action that adds a pubkey to the mute list */
5
+ export declare function MuteUser(pubkey: string, hidden?: boolean): Action;
6
+ /** Removes a pubkey from the mute list */
7
+ export declare function UnmuteUser(pubkey: string, hidden?: boolean): Action;
8
+ /** Add a thread to the mute list */
9
+ export declare function MuteThread(thread: string | NostrEvent | EventPointer, hidden?: boolean): Action;
10
+ /** Removes a thread from the mute list */
11
+ export declare function UnmuteThread(thread: string | NostrEvent | EventPointer, hidden?: boolean): Action;
12
+ /** Add a word to the mute list */
13
+ export declare function MuteWord(word: string, hidden?: boolean): Action;
14
+ /** Removes a word from the mute list */
15
+ export declare function UnmuteWord(word: string, hidden?: boolean): Action;
16
+ /** Add a hashtag to the mute list */
17
+ export declare function MuteHashtag(hashtag: string, hidden?: boolean): Action;
18
+ /** Removes a hashtag from the mute list */
19
+ export declare function UnmuteHashtag(hashtag: string, hidden?: boolean): Action;
@@ -0,0 +1,79 @@
1
+ import { addEventTag, addNameValueTag, addPubkeyTag, removeEventTag, removeNameValueTag, removePubkeyTag, } from "applesauce-factory/operations/tag";
2
+ import { kinds } from "nostr-tools";
3
+ function ensureMuteList(events, self) {
4
+ const mute = events.getReplaceable(kinds.Mutelist, self);
5
+ if (!mute)
6
+ throw new Error("No mute list found");
7
+ return mute;
8
+ }
9
+ /** An action that adds a pubkey to the mute list */
10
+ export function MuteUser(pubkey, hidden = false) {
11
+ return async function* ({ events, factory, self }) {
12
+ const mute = ensureMuteList(events, self);
13
+ const operation = addPubkeyTag(pubkey);
14
+ const draft = await factory.modifyTags(mute, hidden ? { hidden: operation } : operation);
15
+ yield await factory.sign(draft);
16
+ };
17
+ }
18
+ /** Removes a pubkey from the mute list */
19
+ export function UnmuteUser(pubkey, hidden = false) {
20
+ return async function* ({ events, factory, self }) {
21
+ const mute = ensureMuteList(events, self);
22
+ const draft = await factory.modifyTags(mute, hidden ? { hidden: removePubkeyTag(pubkey) } : removePubkeyTag(pubkey));
23
+ yield await factory.sign(draft);
24
+ };
25
+ }
26
+ /** Add a thread to the mute list */
27
+ export function MuteThread(thread, hidden = false) {
28
+ return async function* ({ events, factory, self }) {
29
+ const mute = ensureMuteList(events, self);
30
+ const operation = addEventTag(thread);
31
+ const draft = await factory.modifyTags(mute, hidden ? { hidden: operation } : operation);
32
+ yield await factory.sign(draft);
33
+ };
34
+ }
35
+ /** Removes a thread from the mute list */
36
+ export function UnmuteThread(thread, hidden = false) {
37
+ return async function* ({ events, factory, self }) {
38
+ const mute = ensureMuteList(events, self);
39
+ const operation = removeEventTag(thread);
40
+ const draft = await factory.modifyTags(mute, hidden ? { hidden: operation } : operation);
41
+ yield await factory.sign(draft);
42
+ };
43
+ }
44
+ /** Add a word to the mute list */
45
+ export function MuteWord(word, hidden = false) {
46
+ return async function* ({ events, factory, self }) {
47
+ const mute = ensureMuteList(events, self);
48
+ const operation = addNameValueTag(["word", word.toLocaleLowerCase()], true);
49
+ const draft = await factory.modifyTags(mute, hidden ? { hidden: operation } : operation);
50
+ yield await factory.sign(draft);
51
+ };
52
+ }
53
+ /** Removes a word from the mute list */
54
+ export function UnmuteWord(word, hidden = false) {
55
+ return async function* ({ events, factory, self }) {
56
+ const mute = ensureMuteList(events, self);
57
+ const operation = removeNameValueTag(["word", word.toLocaleLowerCase()]);
58
+ const draft = await factory.modifyTags(mute, hidden ? { hidden: operation } : operation);
59
+ yield await factory.sign(draft);
60
+ };
61
+ }
62
+ /** Add a hashtag to the mute list */
63
+ export function MuteHashtag(hashtag, hidden = false) {
64
+ return async function* ({ events, factory, self }) {
65
+ const mute = ensureMuteList(events, self);
66
+ const operation = addNameValueTag(["t", hashtag.toLocaleLowerCase()], true);
67
+ const draft = await factory.modifyTags(mute, hidden ? { hidden: operation } : operation);
68
+ yield await factory.sign(draft);
69
+ };
70
+ }
71
+ /** Removes a hashtag from the mute list */
72
+ export function UnmuteHashtag(hashtag, hidden = false) {
73
+ return async function* ({ events, factory, self }) {
74
+ const mute = ensureMuteList(events, self);
75
+ const operation = removeNameValueTag(["t", hashtag.toLocaleLowerCase()]);
76
+ const draft = await factory.modifyTags(mute, hidden ? { hidden: operation } : operation);
77
+ yield await factory.sign(draft);
78
+ };
79
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "applesauce-actions",
3
- "version": "0.0.0-next-20250315131629",
3
+ "version": "0.0.0-next-20250323173930",
4
4
  "description": "A package for performing common nostr actions",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -32,15 +32,15 @@
32
32
  }
33
33
  },
34
34
  "dependencies": {
35
- "applesauce-core": "0.0.0-next-20250315131629",
36
- "applesauce-factory": "0.0.0-next-20250315131629",
35
+ "applesauce-core": "^0.12.0",
36
+ "applesauce-factory": "^0.12.0",
37
37
  "nostr-tools": "^2.10.4",
38
38
  "rxjs": "^7.8.1"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@hirez_io/observer-spy": "^2.2.0",
42
42
  "@types/debug": "^4.1.12",
43
- "applesauce-signers": "0.0.0-next-20250315131629",
43
+ "applesauce-signers": "0.0.0-next-20250323173930",
44
44
  "nanoid": "^5.0.9",
45
45
  "typescript": "^5.7.3",
46
46
  "vitest": "^3.0.5"