@fedify/botkit 0.4.0-dev.184 → 0.4.0-dev.186

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.
package/dist/deno.js CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  //#region deno.json
6
6
  var name = "@fedify/botkit";
7
- var version = "0.4.0-dev.184+a99f7e05";
7
+ var version = "0.4.0-dev.186+05ac3701";
8
8
  var license = "AGPL-3.0-only";
9
9
  var exports = {
10
10
  ".": "./src/mod.ts",
@@ -20,8 +20,8 @@ var exports = {
20
20
  "./text": "./src/text.ts"
21
21
  };
22
22
  var imports = {
23
- "@fedify/vocab": "jsr:@fedify/vocab@^2.1.0",
24
- "@fedify/vocab-runtime": "jsr:@fedify/vocab-runtime@^2.1.0",
23
+ "@fedify/vocab": "jsr:@fedify/vocab@^2.1.2",
24
+ "@fedify/vocab-runtime": "jsr:@fedify/vocab-runtime@^2.1.2",
25
25
  "@fedify/markdown-it-hashtag": "jsr:@fedify/markdown-it-hashtag@^0.3.0",
26
26
  "@fedify/markdown-it-mention": "jsr:@fedify/markdown-it-mention@^0.3.0",
27
27
  "html-entities": "npm:html-entities@^2.6.0",
package/dist/deno.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"deno.js","names":[],"sources":["../deno.json"],"sourcesContent":["{\n \"name\": \"@fedify/botkit\",\n \"version\": \"0.4.0-dev.184+a99f7e05\",\n \"license\": \"AGPL-3.0-only\",\n \"exports\": {\n \".\": \"./src/mod.ts\",\n \"./bot\": \"./src/bot.ts\",\n \"./emoji\": \"./src/emoji.ts\",\n \"./events\": \"./src/events.ts\",\n \"./follow\": \"./src/follow.ts\",\n \"./message\": \"./src/message.ts\",\n \"./poll\": \"./src/poll.ts\",\n \"./reaction\": \"./src/reaction.ts\",\n \"./repository\": \"./src/repository.ts\",\n \"./session\": \"./src/session.ts\",\n \"./text\": \"./src/text.ts\"\n },\n \"imports\": {\n \"@fedify/vocab\": \"jsr:@fedify/vocab@^2.1.0\",\n \"@fedify/vocab-runtime\": \"jsr:@fedify/vocab-runtime@^2.1.0\",\n \"@fedify/markdown-it-hashtag\": \"jsr:@fedify/markdown-it-hashtag@^0.3.0\",\n \"@fedify/markdown-it-mention\": \"jsr:@fedify/markdown-it-mention@^0.3.0\",\n \"html-entities\": \"npm:html-entities@^2.6.0\",\n \"markdown-it\": \"npm:markdown-it@^14.1.0\",\n \"mime-db\": \"npm:mime-db@^1.54.0\",\n \"tsdown\": \"npm:tsdown@^0.12.8\",\n \"url-template\": \"npm:url-template@^3.1.1\",\n \"uuid\": \"npm:uuid@^11.1.0\",\n \"xss\": \"npm:xss@^1.0.15\"\n },\n \"exclude\": [\n \"dist\",\n \"junit.xml\",\n \"src/css\"\n ],\n \"fmt\": {\n \"exclude\": [\n \"*.md\",\n \"*.yaml\",\n \"*.yml\",\n \"src/static/*.ts\"\n ]\n },\n \"tasks\": {\n \"test\": \"deno test --allow-env=NODE_V8_COVERAGE,JEST_WORKER_ID --allow-net=hollo.social --parallel\",\n \"test:node\": \"pnpm install && pnpm test\",\n \"test-all\": {\n \"dependencies\": [\n \"check\",\n \"test\",\n \"test:node\"\n ]\n },\n \"coverage\": \"deno task test --coverage --clean && deno coverage --html\"\n }\n}\n"],"mappings":";;;;;WACU;cACG;cACA;cACA;CACT,KAAK;CACL,SAAS;CACT,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,UAAU;CACV,cAAc;CACd,gBAAgB;CAChB,aAAa;CACb,UAAU;AACX;cACU;CACT,iBAAiB;CACjB,yBAAyB;CACzB,+BAA+B;CAC/B,+BAA+B;CAC/B,iBAAiB;CACjB,eAAe;CACf,WAAW;CACX,UAAU;CACV,gBAAgB;CAChB,QAAQ;CACR,OAAO;AACR;cACU;CACT;CACA;CACA;AACD;UACM,EACL,WAAW;CACT;CACA;CACA;CACA;AACD,EACF;YACQ;CACP,QAAQ;CACR,aAAa;CACb,YAAY,EACV,gBAAgB;EACd;EACA;EACA;CACD,EACF;CACD,YAAY;AACb;mBAtDH;;;;;;;;;AAuDC"}
1
+ {"version":3,"file":"deno.js","names":[],"sources":["../deno.json"],"sourcesContent":["{\n \"name\": \"@fedify/botkit\",\n \"version\": \"0.4.0-dev.186+05ac3701\",\n \"license\": \"AGPL-3.0-only\",\n \"exports\": {\n \".\": \"./src/mod.ts\",\n \"./bot\": \"./src/bot.ts\",\n \"./emoji\": \"./src/emoji.ts\",\n \"./events\": \"./src/events.ts\",\n \"./follow\": \"./src/follow.ts\",\n \"./message\": \"./src/message.ts\",\n \"./poll\": \"./src/poll.ts\",\n \"./reaction\": \"./src/reaction.ts\",\n \"./repository\": \"./src/repository.ts\",\n \"./session\": \"./src/session.ts\",\n \"./text\": \"./src/text.ts\"\n },\n \"imports\": {\n \"@fedify/vocab\": \"jsr:@fedify/vocab@^2.1.2\",\n \"@fedify/vocab-runtime\": \"jsr:@fedify/vocab-runtime@^2.1.2\",\n \"@fedify/markdown-it-hashtag\": \"jsr:@fedify/markdown-it-hashtag@^0.3.0\",\n \"@fedify/markdown-it-mention\": \"jsr:@fedify/markdown-it-mention@^0.3.0\",\n \"html-entities\": \"npm:html-entities@^2.6.0\",\n \"markdown-it\": \"npm:markdown-it@^14.1.0\",\n \"mime-db\": \"npm:mime-db@^1.54.0\",\n \"tsdown\": \"npm:tsdown@^0.12.8\",\n \"url-template\": \"npm:url-template@^3.1.1\",\n \"uuid\": \"npm:uuid@^11.1.0\",\n \"xss\": \"npm:xss@^1.0.15\"\n },\n \"exclude\": [\n \"dist\",\n \"junit.xml\",\n \"src/css\"\n ],\n \"fmt\": {\n \"exclude\": [\n \"*.md\",\n \"*.yaml\",\n \"*.yml\",\n \"src/static/*.ts\"\n ]\n },\n \"tasks\": {\n \"test\": \"deno test --allow-env=NODE_V8_COVERAGE,JEST_WORKER_ID --allow-net=hollo.social --parallel\",\n \"test:node\": \"pnpm install && pnpm test\",\n \"test-all\": {\n \"dependencies\": [\n \"check\",\n \"test\",\n \"test:node\"\n ]\n },\n \"coverage\": \"deno task test --coverage --clean && deno coverage --html\"\n }\n}\n"],"mappings":";;;;;WACU;cACG;cACA;cACA;CACT,KAAK;CACL,SAAS;CACT,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,UAAU;CACV,cAAc;CACd,gBAAgB;CAChB,aAAa;CACb,UAAU;AACX;cACU;CACT,iBAAiB;CACjB,yBAAyB;CACzB,+BAA+B;CAC/B,+BAA+B;CAC/B,iBAAiB;CACjB,eAAe;CACf,WAAW;CACX,UAAU;CACV,gBAAgB;CAChB,QAAQ;CACR,OAAO;AACR;cACU;CACT;CACA;CACA;AACD;UACM,EACL,WAAW;CACT;CACA;CACA;CACA;AACD,EACF;YACQ;CACP,QAAQ;CACR,aAAa;CACb,YAAY,EACV,gBAAgB;EACd;EACA;EACA;CACD,EACF;CACD,YAAY;AACb;mBAtDH;;;;;;;;;AAuDC"}
@@ -23,6 +23,7 @@ declare class SessionImpl<TContextData> implements Session<TContextData> {
23
23
  follow(actor: Actor | URL | string): Promise<void>;
24
24
  unfollow(actor: Actor | URL | string): Promise<void>;
25
25
  follows(actor: Actor | URL | string): Promise<boolean>;
26
+ republishProfile(): Promise<void>;
26
27
  publish(content: Text<"block", TContextData>, options?: SessionImplPublishOptions<TContextData>): Promise<AuthorizedMessage<Note, TContextData>>;
27
28
  publish<T extends MessageClass>(content: Text<"block", TContextData>, options: SessionImplPublishOptionsWithClass<T, TContextData>): Promise<AuthorizedMessage<T, TContextData>>;
28
29
  publish(content: Text<"block", TContextData>, options: SessionImplPublishOptionsWithQuestion<TContextData>): Promise<AuthorizedMessage<Question, TContextData>>;
@@ -1 +1 @@
1
- {"version":3,"file":"session-impl.d.ts","names":[],"sources":["../src/session-impl.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAqDiB,gDACP,sBAAsB;gBAChB,QAAQ,cAAc;;UAGrB,6CACL,oCAGV,+BAA+B,GAAG,eAClC,0BAA0B;UAGX,4DAEb,kCAAkC,eAClC,mCAAmC,UAAU,eAhBjD;AAA0C,cAmB7B,WAnB6B,CAAA,YAAA,CAAA,YAmBQ,OAnBR,CAmBgB,YAnBhB,CAAA,CAAA;EAAA,SACV,GAAA,EAmBhB,OAnBgB,CAmBR,YAnBQ,CAAA;EAAY,SACpB,OAAA,EAmBJ,OAnBI,CAmBI,YAnBJ,CAAA;EAAY,WAAE,CAAA,GAAA,EAqBnB,OArBmB,CAqBX,YArBW,CAAA,EAAA,OAAA,EAqBa,OArBb,CAqBqB,YArBrB,CAAA;EAAY,IAAlC,OAAA,CAAA,CAAA,EA0BH,GA1BG;EAAO,IADb,WAAA,CAAA,CAAA,EAAA,IAAA,MAAA,IAAA,MAAA,EAAA;EAAqB,QAAA,CAAA,CAAA,EAmCX,OAnCW,CAmCH,KAnCG,CAAA;EAId,MAAA,CAAA,KAAA,EAmCK,KAnCL,GAmCa,GAnCb,GAAA,MAAA,CAAA,EAmC4B,OAnCM,CAAA,IAAA,CAAA;EAAA,QAAA,CAAA,KAAA,EAgF3B,KAhF2B,GAgFnB,GAhFmB,GAAA,MAAA,CAAA,EAgFJ,OAhFI,CAAA,IAAA,CAAA;EAAA,OACvC,CAAA,KAAA,EA4HW,KA5HX,GA4HmB,GA5HnB,GAAA,MAAA,CAAA,EA4HkC,OA5HlC,CAAA,OAAA,CAAA;EAAY,OAGS,CAAA,OAAA,EA0JpB,IA1JoB,CAAA,OAAA,EA0JN,YA1JM,CAAA,EAAA,OAAA,CAAA,EA2JnB,yBA3JmB,CA2JO,YA3JP,CAAA,CAAA,EA4J5B,OA5J4B,CA4JpB,iBA5JoB,CA4JF,IA5JE,EA4JI,YA5JJ,CAAA,CAAA;EAAC,OAAE,CAAA,UA6JV,YA7JU,CAAA,CAAA,OAAA,EA8JvB,IA9JuB,CAAA,OAAA,EA8JT,YA9JS,CAAA,EAAA,OAAA,EA+JvB,kCA/JuB,CA+JY,CA/JZ,EA+Je,YA/Jf,CAAA,CAAA,EAgK/B,OAhK+B,CAgKvB,iBAhKuB,CAgKL,CAhKK,EAgKF,YAhKE,CAAA,CAAA;EAAY,OACpB,CAAA,OAAA,EAiKf,IAjKe,CAAA,OAAA,EAiKD,YAjKC,CAAA,EAAA,OAAA,EAkKf,qCAlKe,CAkKuB,YAlKvB,CAAA,CAAA,EAmKvB,OAnKuB,CAmKf,iBAnKe,CAmKG,QAnKH,EAmKa,YAnKb,CAAA,CAAA;EAAY,SADtC,CAAA,OAAA,CAAA,EA4UW,uBA5UX,CAAA,EA6UG,aA7UH,CA6UiB,iBA7UjB,CA6UmC,YA7UnC,EA6UiD,YA7UjD,CAAA,CAAA;;AACyB"}
1
+ {"version":3,"file":"session-impl.d.ts","names":[],"sources":["../src/session-impl.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAsDiB,gDACP,sBAAsB;gBAChB,QAAQ,cAAc;;UAGrB,6CACL,oCAGV,+BAA+B,GAAG,eAClC,0BAA0B;UAGX,4DAEb,kCAAkC,eAClC,mCAAmC,UAAU,eAhBjD;AAA0C,cAmB7B,WAnB6B,CAAA,YAAA,CAAA,YAmBQ,OAnBR,CAmBgB,YAnBhB,CAAA,CAAA;EAAA,SACV,GAAA,EAmBhB,OAnBgB,CAmBR,YAnBQ,CAAA;EAAY,SACpB,OAAA,EAmBJ,OAnBI,CAmBI,YAnBJ,CAAA;EAAY,WAAE,CAAA,GAAA,EAqBnB,OArBmB,CAqBX,YArBW,CAAA,EAAA,OAAA,EAqBa,OArBb,CAqBqB,YArBrB,CAAA;EAAY,IAAlC,OAAA,CAAA,CAAA,EA0BH,GA1BG;EAAO,IADb,WAAA,CAAA,CAAA,EAAA,IAAA,MAAA,IAAA,MAAA,EAAA;EAAqB,QAAA,CAAA,CAAA,EAmCX,OAnCW,CAmCH,KAnCG,CAAA;EAId,MAAA,CAAA,KAAA,EAmCK,KAnCL,GAmCa,GAnCb,GAAA,MAAA,CAAA,EAmC4B,OAnCM,CAAA,IAAA,CAAA;EAAA,QAAA,CAAA,KAAA,EAgF3B,KAhF2B,GAgFnB,GAhFmB,GAAA,MAAA,CAAA,EAgFJ,OAhFI,CAAA,IAAA,CAAA;EAAA,OACvC,CAAA,KAAA,EA4HW,KA5HX,GA4HmB,GA5HnB,GAAA,MAAA,CAAA,EA4HkC,OA5HlC,CAAA,OAAA,CAAA;EAAY,gBAGS,CAAA,CAAA,EAyJL,OAzJK,CAAA,IAAA,CAAA;EAAC,OAAE,CAAA,OAAA,EA6KvB,IA7KuB,CAAA,OAAA,EA6KT,YA7KS,CAAA,EAAA,OAAA,CAAA,EA8KtB,yBA9KsB,CA8KI,YA9KJ,CAAA,CAAA,EA+K/B,OA/K+B,CA+KvB,iBA/KuB,CA+KL,IA/KK,EA+KC,YA/KD,CAAA,CAAA;EAAY,OACpB,CAAA,UA+KF,YA/KE,CAAA,CAAA,OAAA,EAgLf,IAhLe,CAAA,OAAA,EAgLD,YAhLC,CAAA,EAAA,OAAA,EAiLf,kCAjLe,CAiLoB,CAjLpB,EAiLuB,YAjLvB,CAAA,CAAA,EAkLvB,OAlLuB,CAkLf,iBAlLe,CAkLG,CAlLH,EAkLM,YAlLN,CAAA,CAAA;EAAY,OADtC,CAAA,OAAA,EAqLW,IArLX,CAAA,OAAA,EAqLyB,YArLzB,CAAA,EAAA,OAAA,EAsLW,qCAtLX,CAsLiD,YAtLjD,CAAA,CAAA,EAuLG,OAvLH,CAuLW,iBAvLX,CAuL6B,QAvL7B,EAuLuC,YAvLvC,CAAA,CAAA;EAA8B,SAC9B,CAAA,OAAA,CAAA,EA8VW,uBA9VX,CAAA,EA+VG,aA/VH,CA+ViB,iBA/VjB,CA+VmC,YA/VnC,EA+ViD,YA/VjD,CAAA,CAAA;AAAyB;AAG3B"}
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { createMessage, isMessageObject } from "./message-impl.js";
6
6
  import { Question } from "./message.js";
7
- import { Collection, Create, Follow, Link, Mention, Note, PUBLIC_COLLECTION, Undo, isActor } from "@fedify/vocab";
7
+ import { Collection, Create, Follow, Link, Mention, Note, PUBLIC_COLLECTION, Undo, Update, isActor } from "@fedify/vocab";
8
8
  import { getLogger } from "@logtape/logtape";
9
9
  import { LanguageString } from "@fedify/vocab-runtime";
10
10
  import { encode } from "html-entities";
@@ -95,6 +95,19 @@ var SessionImpl = class {
95
95
  const follow = await this.bot.repository.getFollowee(actorId);
96
96
  return follow != null;
97
97
  }
98
+ async republishProfile() {
99
+ const actor = await this.getActor();
100
+ const update = new Update({
101
+ id: new URL(`#update-profile/${crypto.randomUUID()}`, this.actorId),
102
+ actor: this.actorId,
103
+ to: this.context.getFollowersUri(this.bot.identifier),
104
+ object: actor
105
+ });
106
+ await this.context.sendActivity(this.bot, "followers", update, {
107
+ preferSharedInbox: true,
108
+ excludeBaseUris: [new URL(this.context.origin)]
109
+ });
110
+ }
98
111
  async publish(content, options = {}) {
99
112
  const published = /* @__PURE__ */ new Date();
100
113
  const id = v7({ msecs: +published });
@@ -1 +1 @@
1
- {"version":3,"file":"session-impl.js","names":["bot: BotImpl<TContextData>","context: Context<TContextData>","actor: Actor | URL | string","actorId: URL","content: Text<\"block\", TContextData>","options:\n | SessionImplPublishOptions<TContextData>\n | SessionImplPublishOptionsWithClass<MessageClass, TContextData>\n | SessionImplPublishOptionsWithQuestion<TContextData>","mentionedActorIds: URL[]","inclusiveOptions: Note[]","exclusiveOptions: Note[]","voters: number | null","endTime: Temporal.Instant | null","cachedObjects: Record<string, Object>","promises: Promise<Object | null>[]","options: SessionGetOutboxOptions","object: Object | null"],"sources":["../src/session-impl.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025 Hong Minhee <https://hongminhee.org/>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as\n// published by the Free Software Foundation, either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <https://www.gnu.org/licenses/>.\nimport type { Context } from \"@fedify/fedify/federation\";\nimport { LanguageString } from \"@fedify/vocab-runtime\";\nimport {\n type Actor,\n Collection,\n Create,\n Follow,\n isActor,\n Link,\n Mention,\n Note,\n type Object,\n PUBLIC_COLLECTION,\n Undo,\n} from \"@fedify/vocab\";\nimport { getLogger } from \"@logtape/logtape\";\nimport { encode } from \"html-entities\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport type { BotImpl } from \"./bot-impl.ts\";\nimport { createMessage, isMessageObject } from \"./message-impl.ts\";\nimport {\n type AuthorizedMessage,\n type Message,\n type MessageClass,\n Question,\n} from \"./message.ts\";\nimport type { Uuid } from \"./repository.ts\";\nimport type {\n Session,\n SessionGetOutboxOptions,\n SessionPublishOptions,\n SessionPublishOptionsWithClass,\n SessionPublishOptionsWithQuestion,\n} from \"./session.ts\";\nimport type { Text } from \"./text.ts\";\n\nconst logger = getLogger([\"botkit\", \"session\"]);\n\nexport interface SessionImplPublishOptions<TContextData>\n extends SessionPublishOptions<TContextData> {\n replyTarget?: Message<MessageClass, TContextData>;\n}\n\nexport interface SessionImplPublishOptionsWithClass<\n T extends MessageClass,\n TContextData,\n> extends\n SessionPublishOptionsWithClass<T, TContextData>,\n SessionImplPublishOptions<TContextData> {\n}\n\nexport interface SessionImplPublishOptionsWithQuestion<TContextData>\n extends\n SessionPublishOptionsWithQuestion<TContextData>,\n SessionImplPublishOptionsWithClass<Question, TContextData> {\n}\n\nexport class SessionImpl<TContextData> implements Session<TContextData> {\n readonly bot: BotImpl<TContextData>;\n readonly context: Context<TContextData>;\n\n constructor(bot: BotImpl<TContextData>, context: Context<TContextData>) {\n this.bot = bot;\n this.context = context;\n }\n\n get actorId() {\n return this.context.getActorUri(this.bot.identifier);\n }\n\n get actorHandle() {\n return `@${this.bot.username}@${this.context.host}` as const;\n }\n\n async getActor(): Promise<Actor> {\n return (await this.bot.dispatchActor(this.context, this.bot.identifier))!;\n }\n\n async follow(actor: Actor | URL | string): Promise<void> {\n if (actor instanceof URL || typeof actor === \"string\") {\n if (\n actor instanceof URL && actor.href === this.actorId.href ||\n typeof actor === \"string\" &&\n (actor === this.actorId.href || actor === this.actorHandle)\n ) {\n throw new TypeError(\"The bot cannot follow itself.\");\n }\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const object = await this.context.lookupObject(actor, { documentLoader });\n if (!isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n actor = object;\n }\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n } else if (actor.id.href === this.actorId.href) {\n throw new TypeError(\"The bot cannot follow itself.\");\n }\n const followee = await this.bot.repository.getFollowee(actor.id);\n if (followee != null) {\n logger.warn(\n \"The bot is already following the actor {actor}.\",\n { actor: actor.id.href },\n );\n return;\n }\n const id = uuidv7() as Uuid;\n const follow = new Follow({\n id: this.context.getObjectUri(Follow, { id }),\n actor: this.context.getActorUri(this.bot.identifier),\n object: actor.id,\n to: actor.id,\n });\n await this.bot.repository.addSentFollow(id, follow);\n await this.context.sendActivity(\n this.bot,\n actor,\n follow,\n { excludeBaseUris: [new URL(this.context.origin)] },\n );\n }\n\n async unfollow(actor: Actor | URL | string): Promise<void> {\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n if (actor instanceof URL || typeof actor === \"string\") {\n if (\n actor instanceof URL && actor.href === this.actorId.href ||\n typeof actor === \"string\" &&\n (actor === this.actorId.href || actor === this.actorHandle)\n ) {\n throw new TypeError(\"The bot cannot unfollow itself.\");\n }\n const object = await this.context.lookupObject(actor, { documentLoader });\n if (!isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n actor = object;\n }\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n } else if (actor.id.href === this.actorId.href) {\n throw new TypeError(\"The bot cannot unfollow itself.\");\n }\n const follow = await this.bot.repository.getFollowee(actor.id);\n if (follow == null) {\n logger.warn(\n \"The bot is not following the actor {actor}.\",\n { actor: actor.id.href },\n );\n return;\n }\n await this.bot.repository.removeFollowee(actor.id);\n if (follow.id != null && follow.objectId?.href === actor.id.href) {\n await this.context.sendActivity(\n this.bot,\n actor,\n new Undo({\n id: new URL(\"#undo\", follow.id),\n actor: this.context.getActorUri(this.bot.identifier),\n object: follow,\n to: actor.id,\n }),\n { excludeBaseUris: [new URL(this.context.origin)] },\n );\n }\n }\n\n async follows(actor: Actor | URL | string): Promise<boolean> {\n let actorId: URL;\n if (isActor(actor)) {\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n }\n actorId = actor.id;\n } else if (actor instanceof URL) {\n actorId = actor;\n } else {\n if (actor.startsWith(\"http://\") || actor.startsWith(\"https://\")) {\n actorId = new URL(actor);\n } else {\n if (actor === this.actorHandle) return false;\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const object = await this.context.lookupObject(actor, {\n documentLoader,\n });\n if (object == null || !isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n if (object.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n }\n actorId = object.id;\n }\n }\n if (actorId.href === this.actorId.href) return false;\n const follow = await this.bot.repository.getFollowee(actorId);\n return follow != null;\n }\n\n async publish(\n content: Text<\"block\", TContextData>,\n options?: SessionImplPublishOptions<TContextData>,\n ): Promise<AuthorizedMessage<Note, TContextData>>;\n async publish<T extends MessageClass>(\n content: Text<\"block\", TContextData>,\n options: SessionImplPublishOptionsWithClass<T, TContextData>,\n ): Promise<AuthorizedMessage<T, TContextData>>;\n async publish(\n content: Text<\"block\", TContextData>,\n options: SessionImplPublishOptionsWithQuestion<TContextData>,\n ): Promise<AuthorizedMessage<Question, TContextData>>;\n async publish(\n content: Text<\"block\", TContextData>,\n options:\n | SessionImplPublishOptions<TContextData>\n | SessionImplPublishOptionsWithClass<MessageClass, TContextData>\n | SessionImplPublishOptionsWithQuestion<TContextData> = {},\n ): Promise<AuthorizedMessage<MessageClass, TContextData>> {\n const published = new Date();\n const id = uuidv7({ msecs: +published }) as Uuid;\n const cls = \"class\" in options ? options.class : Note;\n const visibility = options.visibility ?? \"public\";\n let contentHtml = \"\";\n for await (const chunk of content.getHtml(this)) {\n contentHtml += chunk;\n }\n const tags = await Array.fromAsync(content.getTags(this));\n const mentionedActorIds: URL[] = [];\n for (const tag of tags) {\n if (tag instanceof Mention && tag.href != null) {\n mentionedActorIds.push(tag.href);\n }\n }\n if (options.quoteTarget != null) {\n let url = options.quoteTarget.raw.url ?? options.quoteTarget.id;\n if (url instanceof Link) url = url.href ?? options.quoteTarget.id;\n contentHtml += `\\n\\n<p class=\"quote-inline\"><br>RE: <a href=\"${\n encode(url.href)\n }\">${encode(url.href)}</a></p>`;\n tags.push(\n new Link({\n mediaType:\n 'application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"',\n rel: \"https://misskey-hub.net/ns#_misskey_quote\",\n href: options.quoteTarget.id,\n name: `RE: ${url.href}`,\n }),\n );\n }\n let inclusiveOptions: Note[] = [];\n let exclusiveOptions: Note[] = [];\n let voters: number | null = null;\n let endTime: Temporal.Instant | null = null;\n if (\"class\" in options && options.class === Question && \"poll\" in options) {\n if (options.poll.options.length < 2) {\n throw new TypeError(\"At least two options are required in a poll.\");\n } else if (\n new Set(options.poll.options).size != options.poll.options.length\n ) {\n throw new TypeError(\"Duplicate options are not allowed in a poll.\");\n } else if (options.poll.options.some((o) => o.trim() === \"\")) {\n throw new TypeError(\"Poll options cannot be empty.\");\n }\n const pollOptions = options.poll.options.map((option) =>\n new Note({\n name: option,\n replies: new Collection({ totalItems: 0 }),\n })\n );\n if (options.poll.multiple) inclusiveOptions = pollOptions;\n else exclusiveOptions = pollOptions;\n voters = 0;\n endTime = options.poll.endTime;\n }\n const msg = new cls({\n id: this.context.getObjectUri<MessageClass>(cls, { id }),\n contents: options.language == null\n ? [contentHtml]\n : [new LanguageString(contentHtml, options.language), contentHtml],\n replyTarget: options.replyTarget?.id,\n quoteUrl: options.quoteTarget?.id,\n tags,\n attribution: this.context.getActorUri(this.bot.identifier),\n attachments: options.attachments ?? [],\n inclusiveOptions,\n exclusiveOptions,\n voters,\n endTime,\n tos: visibility === \"public\"\n ? [PUBLIC_COLLECTION, ...mentionedActorIds]\n : visibility === \"unlisted\" || visibility === \"followers\"\n ? [\n this.context.getFollowersUri(this.bot.identifier),\n ...mentionedActorIds,\n ]\n : mentionedActorIds,\n ccs: visibility === \"public\"\n ? [this.context.getFollowersUri(this.bot.identifier)]\n : visibility === \"unlisted\"\n ? [PUBLIC_COLLECTION]\n : [],\n published: published.toTemporalInstant(),\n url: new URL(`/message/${id}`, this.context.origin),\n });\n const activity = new Create({\n id: this.context.getObjectUri(Create, { id }),\n actors: msg.attributionIds,\n tos: msg.toIds,\n ccs: msg.ccIds,\n object: msg,\n published: published.toTemporalInstant(),\n });\n await this.bot.repository.addMessage(id, activity);\n const preferSharedInbox = visibility === \"public\" ||\n visibility === \"unlisted\" || visibility === \"followers\";\n const excludeBaseUris = [new URL(this.context.origin)];\n if (preferSharedInbox) {\n await this.context.sendActivity(\n this.bot,\n \"followers\",\n activity,\n { preferSharedInbox, excludeBaseUris },\n );\n }\n const cachedObjects: Record<string, Object> = {};\n for (const cachedObject of content.getCachedObjects()) {\n if (cachedObject.id == null) continue;\n cachedObjects[cachedObject.id.href] = cachedObject;\n }\n if (mentionedActorIds.length > 0) {\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const promises: Promise<Object | null>[] = [];\n for (const mentionedActorId of mentionedActorIds) {\n const cachedObject = cachedObjects[mentionedActorId.href];\n const promise = cachedObject == null\n ? this.context.lookupObject(\n mentionedActorId,\n { documentLoader },\n )\n : Promise.resolve(cachedObject);\n promises.push(promise);\n }\n const objects = await Promise.all(promises);\n const mentionedActors = objects.filter(isActor);\n await this.context.sendActivity(\n this.bot,\n mentionedActors,\n activity,\n { preferSharedInbox, excludeBaseUris },\n );\n }\n if (options.replyTarget != null) {\n await this.context.sendActivity(\n this.bot,\n options.replyTarget.actor,\n activity,\n { preferSharedInbox, excludeBaseUris, fanout: \"skip\" },\n );\n }\n if (options.quoteTarget != null) {\n await this.context.sendActivity(\n this.bot,\n options.quoteTarget.actor,\n activity,\n { preferSharedInbox, excludeBaseUris, fanout: \"skip\" },\n );\n }\n return await createMessage(\n msg,\n this,\n cachedObjects,\n options.replyTarget,\n options.quoteTarget,\n true,\n );\n }\n\n async *getOutbox(\n options: SessionGetOutboxOptions = {},\n ): AsyncIterable<AuthorizedMessage<MessageClass, TContextData>> {\n for await (const activity of this.bot.repository.getMessages(options)) {\n let object: Object | null;\n try {\n object = await activity.getObject(this.context);\n } catch {\n continue;\n }\n if (object == null || !isMessageObject(object)) continue;\n const message = await createMessage(\n object,\n this,\n {},\n undefined,\n undefined,\n true,\n );\n yield message;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session-impl.js","names":["bot: BotImpl<TContextData>","context: Context<TContextData>","actor: Actor | URL | string","actorId: URL","content: Text<\"block\", TContextData>","options:\n | SessionImplPublishOptions<TContextData>\n | SessionImplPublishOptionsWithClass<MessageClass, TContextData>\n | SessionImplPublishOptionsWithQuestion<TContextData>","mentionedActorIds: URL[]","inclusiveOptions: Note[]","exclusiveOptions: Note[]","voters: number | null","endTime: Temporal.Instant | null","cachedObjects: Record<string, Object>","promises: Promise<Object | null>[]","options: SessionGetOutboxOptions","object: Object | null"],"sources":["../src/session-impl.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025 Hong Minhee <https://hongminhee.org/>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as\n// published by the Free Software Foundation, either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <https://www.gnu.org/licenses/>.\nimport type { Context } from \"@fedify/fedify/federation\";\nimport { LanguageString } from \"@fedify/vocab-runtime\";\nimport {\n type Actor,\n Collection,\n Create,\n Follow,\n isActor,\n Link,\n Mention,\n Note,\n type Object,\n PUBLIC_COLLECTION,\n Undo,\n Update,\n} from \"@fedify/vocab\";\nimport { getLogger } from \"@logtape/logtape\";\nimport { encode } from \"html-entities\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport type { BotImpl } from \"./bot-impl.ts\";\nimport { createMessage, isMessageObject } from \"./message-impl.ts\";\nimport {\n type AuthorizedMessage,\n type Message,\n type MessageClass,\n Question,\n} from \"./message.ts\";\nimport type { Uuid } from \"./repository.ts\";\nimport type {\n Session,\n SessionGetOutboxOptions,\n SessionPublishOptions,\n SessionPublishOptionsWithClass,\n SessionPublishOptionsWithQuestion,\n} from \"./session.ts\";\nimport type { Text } from \"./text.ts\";\n\nconst logger = getLogger([\"botkit\", \"session\"]);\n\nexport interface SessionImplPublishOptions<TContextData>\n extends SessionPublishOptions<TContextData> {\n replyTarget?: Message<MessageClass, TContextData>;\n}\n\nexport interface SessionImplPublishOptionsWithClass<\n T extends MessageClass,\n TContextData,\n> extends\n SessionPublishOptionsWithClass<T, TContextData>,\n SessionImplPublishOptions<TContextData> {\n}\n\nexport interface SessionImplPublishOptionsWithQuestion<TContextData>\n extends\n SessionPublishOptionsWithQuestion<TContextData>,\n SessionImplPublishOptionsWithClass<Question, TContextData> {\n}\n\nexport class SessionImpl<TContextData> implements Session<TContextData> {\n readonly bot: BotImpl<TContextData>;\n readonly context: Context<TContextData>;\n\n constructor(bot: BotImpl<TContextData>, context: Context<TContextData>) {\n this.bot = bot;\n this.context = context;\n }\n\n get actorId() {\n return this.context.getActorUri(this.bot.identifier);\n }\n\n get actorHandle() {\n return `@${this.bot.username}@${this.context.host}` as const;\n }\n\n async getActor(): Promise<Actor> {\n return (await this.bot.dispatchActor(this.context, this.bot.identifier))!;\n }\n\n async follow(actor: Actor | URL | string): Promise<void> {\n if (actor instanceof URL || typeof actor === \"string\") {\n if (\n actor instanceof URL && actor.href === this.actorId.href ||\n typeof actor === \"string\" &&\n (actor === this.actorId.href || actor === this.actorHandle)\n ) {\n throw new TypeError(\"The bot cannot follow itself.\");\n }\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const object = await this.context.lookupObject(actor, { documentLoader });\n if (!isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n actor = object;\n }\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n } else if (actor.id.href === this.actorId.href) {\n throw new TypeError(\"The bot cannot follow itself.\");\n }\n const followee = await this.bot.repository.getFollowee(actor.id);\n if (followee != null) {\n logger.warn(\n \"The bot is already following the actor {actor}.\",\n { actor: actor.id.href },\n );\n return;\n }\n const id = uuidv7() as Uuid;\n const follow = new Follow({\n id: this.context.getObjectUri(Follow, { id }),\n actor: this.context.getActorUri(this.bot.identifier),\n object: actor.id,\n to: actor.id,\n });\n await this.bot.repository.addSentFollow(id, follow);\n await this.context.sendActivity(\n this.bot,\n actor,\n follow,\n { excludeBaseUris: [new URL(this.context.origin)] },\n );\n }\n\n async unfollow(actor: Actor | URL | string): Promise<void> {\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n if (actor instanceof URL || typeof actor === \"string\") {\n if (\n actor instanceof URL && actor.href === this.actorId.href ||\n typeof actor === \"string\" &&\n (actor === this.actorId.href || actor === this.actorHandle)\n ) {\n throw new TypeError(\"The bot cannot unfollow itself.\");\n }\n const object = await this.context.lookupObject(actor, { documentLoader });\n if (!isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n actor = object;\n }\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n } else if (actor.id.href === this.actorId.href) {\n throw new TypeError(\"The bot cannot unfollow itself.\");\n }\n const follow = await this.bot.repository.getFollowee(actor.id);\n if (follow == null) {\n logger.warn(\n \"The bot is not following the actor {actor}.\",\n { actor: actor.id.href },\n );\n return;\n }\n await this.bot.repository.removeFollowee(actor.id);\n if (follow.id != null && follow.objectId?.href === actor.id.href) {\n await this.context.sendActivity(\n this.bot,\n actor,\n new Undo({\n id: new URL(\"#undo\", follow.id),\n actor: this.context.getActorUri(this.bot.identifier),\n object: follow,\n to: actor.id,\n }),\n { excludeBaseUris: [new URL(this.context.origin)] },\n );\n }\n }\n\n async follows(actor: Actor | URL | string): Promise<boolean> {\n let actorId: URL;\n if (isActor(actor)) {\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n }\n actorId = actor.id;\n } else if (actor instanceof URL) {\n actorId = actor;\n } else {\n if (actor.startsWith(\"http://\") || actor.startsWith(\"https://\")) {\n actorId = new URL(actor);\n } else {\n if (actor === this.actorHandle) return false;\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const object = await this.context.lookupObject(actor, {\n documentLoader,\n });\n if (object == null || !isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n if (object.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n }\n actorId = object.id;\n }\n }\n if (actorId.href === this.actorId.href) return false;\n const follow = await this.bot.repository.getFollowee(actorId);\n return follow != null;\n }\n\n async republishProfile(): Promise<void> {\n const actor = await this.getActor();\n const update = new Update({\n id: new URL(`#update-profile/${crypto.randomUUID()}`, this.actorId),\n actor: this.actorId,\n to: this.context.getFollowersUri(this.bot.identifier),\n object: actor,\n });\n await this.context.sendActivity(\n this.bot,\n \"followers\",\n update,\n {\n preferSharedInbox: true,\n excludeBaseUris: [new URL(this.context.origin)],\n },\n );\n }\n\n async publish(\n content: Text<\"block\", TContextData>,\n options?: SessionImplPublishOptions<TContextData>,\n ): Promise<AuthorizedMessage<Note, TContextData>>;\n async publish<T extends MessageClass>(\n content: Text<\"block\", TContextData>,\n options: SessionImplPublishOptionsWithClass<T, TContextData>,\n ): Promise<AuthorizedMessage<T, TContextData>>;\n async publish(\n content: Text<\"block\", TContextData>,\n options: SessionImplPublishOptionsWithQuestion<TContextData>,\n ): Promise<AuthorizedMessage<Question, TContextData>>;\n async publish(\n content: Text<\"block\", TContextData>,\n options:\n | SessionImplPublishOptions<TContextData>\n | SessionImplPublishOptionsWithClass<MessageClass, TContextData>\n | SessionImplPublishOptionsWithQuestion<TContextData> = {},\n ): Promise<AuthorizedMessage<MessageClass, TContextData>> {\n const published = new Date();\n const id = uuidv7({ msecs: +published }) as Uuid;\n const cls = \"class\" in options ? options.class : Note;\n const visibility = options.visibility ?? \"public\";\n let contentHtml = \"\";\n for await (const chunk of content.getHtml(this)) {\n contentHtml += chunk;\n }\n const tags = await Array.fromAsync(content.getTags(this));\n const mentionedActorIds: URL[] = [];\n for (const tag of tags) {\n if (tag instanceof Mention && tag.href != null) {\n mentionedActorIds.push(tag.href);\n }\n }\n if (options.quoteTarget != null) {\n let url = options.quoteTarget.raw.url ?? options.quoteTarget.id;\n if (url instanceof Link) url = url.href ?? options.quoteTarget.id;\n contentHtml += `\\n\\n<p class=\"quote-inline\"><br>RE: <a href=\"${\n encode(url.href)\n }\">${encode(url.href)}</a></p>`;\n tags.push(\n new Link({\n mediaType:\n 'application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"',\n rel: \"https://misskey-hub.net/ns#_misskey_quote\",\n href: options.quoteTarget.id,\n name: `RE: ${url.href}`,\n }),\n );\n }\n let inclusiveOptions: Note[] = [];\n let exclusiveOptions: Note[] = [];\n let voters: number | null = null;\n let endTime: Temporal.Instant | null = null;\n if (\"class\" in options && options.class === Question && \"poll\" in options) {\n if (options.poll.options.length < 2) {\n throw new TypeError(\"At least two options are required in a poll.\");\n } else if (\n new Set(options.poll.options).size != options.poll.options.length\n ) {\n throw new TypeError(\"Duplicate options are not allowed in a poll.\");\n } else if (options.poll.options.some((o) => o.trim() === \"\")) {\n throw new TypeError(\"Poll options cannot be empty.\");\n }\n const pollOptions = options.poll.options.map((option) =>\n new Note({\n name: option,\n replies: new Collection({ totalItems: 0 }),\n })\n );\n if (options.poll.multiple) inclusiveOptions = pollOptions;\n else exclusiveOptions = pollOptions;\n voters = 0;\n endTime = options.poll.endTime;\n }\n const msg = new cls({\n id: this.context.getObjectUri<MessageClass>(cls, { id }),\n contents: options.language == null\n ? [contentHtml]\n : [new LanguageString(contentHtml, options.language), contentHtml],\n replyTarget: options.replyTarget?.id,\n quoteUrl: options.quoteTarget?.id,\n tags,\n attribution: this.context.getActorUri(this.bot.identifier),\n attachments: options.attachments ?? [],\n inclusiveOptions,\n exclusiveOptions,\n voters,\n endTime,\n tos: visibility === \"public\"\n ? [PUBLIC_COLLECTION, ...mentionedActorIds]\n : visibility === \"unlisted\" || visibility === \"followers\"\n ? [\n this.context.getFollowersUri(this.bot.identifier),\n ...mentionedActorIds,\n ]\n : mentionedActorIds,\n ccs: visibility === \"public\"\n ? [this.context.getFollowersUri(this.bot.identifier)]\n : visibility === \"unlisted\"\n ? [PUBLIC_COLLECTION]\n : [],\n published: published.toTemporalInstant(),\n url: new URL(`/message/${id}`, this.context.origin),\n });\n const activity = new Create({\n id: this.context.getObjectUri(Create, { id }),\n actors: msg.attributionIds,\n tos: msg.toIds,\n ccs: msg.ccIds,\n object: msg,\n published: published.toTemporalInstant(),\n });\n await this.bot.repository.addMessage(id, activity);\n const preferSharedInbox = visibility === \"public\" ||\n visibility === \"unlisted\" || visibility === \"followers\";\n const excludeBaseUris = [new URL(this.context.origin)];\n if (preferSharedInbox) {\n await this.context.sendActivity(\n this.bot,\n \"followers\",\n activity,\n { preferSharedInbox, excludeBaseUris },\n );\n }\n const cachedObjects: Record<string, Object> = {};\n for (const cachedObject of content.getCachedObjects()) {\n if (cachedObject.id == null) continue;\n cachedObjects[cachedObject.id.href] = cachedObject;\n }\n if (mentionedActorIds.length > 0) {\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const promises: Promise<Object | null>[] = [];\n for (const mentionedActorId of mentionedActorIds) {\n const cachedObject = cachedObjects[mentionedActorId.href];\n const promise = cachedObject == null\n ? this.context.lookupObject(\n mentionedActorId,\n { documentLoader },\n )\n : Promise.resolve(cachedObject);\n promises.push(promise);\n }\n const objects = await Promise.all(promises);\n const mentionedActors = objects.filter(isActor);\n await this.context.sendActivity(\n this.bot,\n mentionedActors,\n activity,\n { preferSharedInbox, excludeBaseUris },\n );\n }\n if (options.replyTarget != null) {\n await this.context.sendActivity(\n this.bot,\n options.replyTarget.actor,\n activity,\n { preferSharedInbox, excludeBaseUris, fanout: \"skip\" },\n );\n }\n if (options.quoteTarget != null) {\n await this.context.sendActivity(\n this.bot,\n options.quoteTarget.actor,\n activity,\n { preferSharedInbox, excludeBaseUris, fanout: \"skip\" },\n );\n }\n return await createMessage(\n msg,\n this,\n cachedObjects,\n options.replyTarget,\n options.quoteTarget,\n true,\n );\n }\n\n async *getOutbox(\n options: SessionGetOutboxOptions = {},\n ): AsyncIterable<AuthorizedMessage<MessageClass, TContextData>> {\n for await (const activity of this.bot.repository.getMessages(options)) {\n let object: Object | null;\n try {\n object = await activity.getObject(this.context);\n } catch {\n continue;\n }\n if (object == null || !isMessageObject(object)) continue;\n const message = await createMessage(\n object,\n this,\n {},\n undefined,\n undefined,\n true,\n );\n yield message;\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-impl.test.d.ts","names":[],"sources":["../src/session-impl.test.ts"],"sourcesContent":[],"mappings":";;;;;;;UAm3BiB,YAAA;4BACW;YAChB;;UAGK,WAAA,SAAoB;kBACnB;AANlB;AAA6B,iBASb,iBAAA,CATa,GAAA,EAUtB,OAVsB,CAAA,IAAA,CAAA,EAAA,MAAA,EAWnB,GAXmB,GAAA,MAAA,CAAA,EAY1B,WAZ0B"}
1
+ {"version":3,"file":"session-impl.test.d.ts","names":[],"sources":["../src/session-impl.test.ts"],"sourcesContent":[],"mappings":";;;;;;;UAy5BiB,YAAA;4BACW;YAChB;;UAGK,WAAA,SAAoB;kBACnB;AANlB;AAA6B,iBASb,iBAAA,CATa,GAAA,EAUtB,OAVsB,CAAA,IAAA,CAAA,EAAA,MAAA,EAWnB,GAXmB,GAAA,MAAA,CAAA,EAY1B,WAZ0B"}
@@ -8,7 +8,7 @@ import { SessionImpl } from "./session-impl.js";
8
8
  import { BotImpl } from "./bot-impl.js";
9
9
  import { mention, text } from "./text.js";
10
10
  import { MemoryKvStore } from "@fedify/fedify/federation";
11
- import { Create, Follow, Note, PUBLIC_COLLECTION, Person, Question, Undo } from "@fedify/vocab";
11
+ import { Create, Follow, Note, PUBLIC_COLLECTION, Person, Question, Undo, Update } from "@fedify/vocab";
12
12
  import assert from "node:assert";
13
13
  import { describe, test } from "node:test";
14
14
 
@@ -163,6 +163,37 @@ describe("SessionImpl.follows()", () => {
163
163
  assert.deepStrictEqual(await session.follows(session.actorHandle), false);
164
164
  });
165
165
  });
166
+ test("SessionImpl.republishProfile()", async () => {
167
+ const bot = new BotImpl({
168
+ kv: new MemoryKvStore(),
169
+ username: "bot",
170
+ name: "Bot display name",
171
+ summary: text`This is the bot profile.`,
172
+ icon: new URL("https://example.com/icon.png"),
173
+ image: new URL("https://example.com/header.png")
174
+ });
175
+ const ctx = createMockContext(bot, "https://example.com");
176
+ const session = new SessionImpl(bot, ctx);
177
+ await session.republishProfile();
178
+ assert.deepStrictEqual(ctx.sentActivities.length, 1);
179
+ const { recipients, activity } = ctx.sentActivities[0];
180
+ assert.deepStrictEqual(recipients, "followers");
181
+ assert.ok(activity instanceof Update);
182
+ assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));
183
+ assert.deepStrictEqual(activity.toIds, [ctx.getFollowersUri(bot.identifier)]);
184
+ assert.deepStrictEqual(activity.ccIds, []);
185
+ const actor = await activity.getObject(ctx);
186
+ assert.ok(actor instanceof bot.class);
187
+ assert.deepStrictEqual(actor.id, session.actorId);
188
+ assert.deepStrictEqual(actor.name?.toString(), "Bot display name");
189
+ assert.deepStrictEqual(actor.summary?.toString(), "<p>This is the bot profile.</p>");
190
+ const icon = await actor.getIcon();
191
+ assert.ok(icon != null);
192
+ assert.deepStrictEqual(icon.url, new URL("https://example.com/icon.png"));
193
+ const image = await actor.getImage();
194
+ assert.ok(image != null);
195
+ assert.deepStrictEqual(image.url, new URL("https://example.com/header.png"));
196
+ });
166
197
  test("SessionImpl.publish()", async (t) => {
167
198
  const kv = new MemoryKvStore();
168
199
  const bot = new BotImpl({
@@ -1 +1 @@
1
- {"version":3,"file":"session-impl.test.js","names":["bot: BotImpl<void>","origin: URL | string"],"sources":["../src/session-impl.test.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025 Hong Minhee <https://hongminhee.org/>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as\n// published by the Free Software Foundation, either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <https://www.gnu.org/licenses/>.\nimport { type Context, MemoryKvStore } from \"@fedify/fedify/federation\";\nimport {\n type Activity,\n Create,\n Follow,\n Note,\n Person,\n PUBLIC_COLLECTION,\n Question,\n type Recipient,\n Undo,\n} from \"@fedify/vocab\";\nimport assert from \"node:assert\";\nimport { describe, test } from \"node:test\";\nimport { BotImpl } from \"./bot-impl.ts\";\nimport { createMessage } from \"./message-impl.ts\";\nimport { MemoryRepository, type Uuid } from \"./repository.ts\";\nimport { SessionImpl } from \"./session-impl.ts\";\nimport { mention, text } from \"./text.ts\";\n\ntest(\"SessionImpl.follow()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"follow\", async () => {\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n await session.follow(actor);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [actor]);\n assert.ok(activity instanceof Follow);\n const parsed = ctx.parseUri(activity.id);\n assert.deepStrictEqual(parsed?.type, \"object\");\n assert.ok(parsed?.type === \"object\");\n assert.deepStrictEqual(parsed.class, Follow);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.objectId, actor.id);\n assert.deepStrictEqual(activity.toIds, [actor.id]);\n const follow = await repository.getSentFollow(parsed.values.id as Uuid);\n assert.ok(follow != null);\n assert.deepStrictEqual(\n await follow.toJsonLd({ format: \"compact\" }),\n await activity.toJsonLd({ format: \"compact\" }),\n );\n });\n\n await t.test(\"follow again\", async () => {\n ctx.sentActivities = [];\n await repository.addFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: new URL(\"https://example.com/ap/actor/alice\"),\n }),\n );\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.follow(actor);\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n\n await t.test(\"follow bot itself\", async () => {\n ctx.sentActivities = [];\n await assert.rejects(\n () => session.follow(session.actorId.href),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.follow(session.actorId),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.follow(session.actorHandle),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n const actor = await session.getActor();\n await assert.rejects(\n () => session.follow(actor),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n});\n\ntest(\"SessionImpl.unfollow()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"unfollow\", async () => {\n await repository.addFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: new URL(\"https://example.com/ap/actor/alice\"),\n }),\n );\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.unfollow(actor);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [actor]);\n assert.ok(activity instanceof Undo);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Follow);\n assert.deepStrictEqual(\n object.id,\n new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n );\n assert.deepStrictEqual(object.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(\n await repository.getFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n ),\n undefined,\n );\n });\n\n await t.test(\"unfollow again\", async () => {\n ctx.sentActivities = [];\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.unfollow(actor);\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n\n await t.test(\"unfollow bot itself\", async () => {\n ctx.sentActivities = [];\n await assert.rejects(\n () => session.unfollow(session.actorId.href),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.unfollow(session.actorId),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.unfollow(session.actorHandle),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n const actor = await session.getActor();\n await assert.rejects(\n () => session.unfollow(actor),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n});\n\ndescribe(\"SessionImpl.follows()\", () => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n test(\"when it follows\", async () => {\n const followeeId = new URL(\"https://example.com/ap/actor/alice\");\n const followee = new Person({\n id: followeeId,\n preferredUsername: \"alice\",\n });\n await repository.addFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: followee,\n }),\n );\n assert.ok(await session.follows(followeeId.href));\n assert.ok(await session.follows(followeeId));\n assert.ok(await session.follows(followee));\n });\n\n test(\"when it does not follow\", async () => {\n const actorId = new URL(\"https://example.com/ap/actor/john\");\n const actor = new Person({\n id: actorId,\n preferredUsername: \"john\",\n });\n assert.deepStrictEqual(await session.follows(actorId.href), false);\n assert.deepStrictEqual(await session.follows(actorId), false);\n assert.deepStrictEqual(await session.follows(actor), false);\n });\n\n test(\"bot itself\", async () => {\n assert.deepStrictEqual(await session.follows(session.actorId.href), false);\n assert.deepStrictEqual(await session.follows(session.actorId), false);\n assert.deepStrictEqual(\n await session.follows(await session.getActor()),\n false,\n );\n assert.deepStrictEqual(await session.follows(session.actorHandle), false);\n });\n});\n\ntest(\"SessionImpl.publish()\", async (t) => {\n const kv = new MemoryKvStore();\n const bot = new BotImpl<void>({ kv, username: \"bot\" });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"public\", async () => {\n ctx.sentActivities = [];\n const publicMsg = await session.publish(text`Hello, world!`);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.content, \"<p>Hello, world!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(publicMsg.id, object.id);\n assert.deepStrictEqual(publicMsg.text, \"Hello, world!\");\n assert.deepStrictEqual(publicMsg.html, \"<p>Hello, world!</p>\");\n assert.deepStrictEqual(publicMsg.visibility, \"public\");\n assert.deepStrictEqual(publicMsg.mentions, []);\n });\n\n await t.test(\"unlisted\", async () => {\n ctx.sentActivities = [];\n const unlistedMsg = await session.publish(text`Hello!`, {\n visibility: \"unlisted\",\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, [PUBLIC_COLLECTION]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.ccIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.content, \"<p>Hello!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(unlistedMsg.id, object.id);\n assert.deepStrictEqual(unlistedMsg.text, \"Hello!\");\n assert.deepStrictEqual(unlistedMsg.html, \"<p>Hello!</p>\");\n assert.deepStrictEqual(unlistedMsg.visibility, \"unlisted\");\n assert.deepStrictEqual(unlistedMsg.mentions, []);\n });\n\n await t.test(\"followers\", async () => {\n ctx.sentActivities = [];\n const followersMsg = await session.publish(text`Hi!`, {\n visibility: \"followers\",\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, []);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(object.content, \"<p>Hi!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(followersMsg.id, object.id);\n assert.deepStrictEqual(followersMsg.text, \"Hi!\");\n assert.deepStrictEqual(followersMsg.html, \"<p>Hi!</p>\");\n assert.deepStrictEqual(followersMsg.visibility, \"followers\");\n assert.deepStrictEqual(followersMsg.mentions, []);\n });\n\n await t.test(\"direct\", async () => {\n const mentioned = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n ctx.sentActivities = [];\n const directMsg = await session.publish(\n text`Hey ${mention(mentioned)}!`,\n { visibility: \"direct\" },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [mentioned]);\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [mentioned.id]);\n assert.deepStrictEqual(activity.ccIds, []);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [mentioned.id]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(\n object.content,\n '<p>Hey <a href=\"https://example.com/ap/actor/john\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>john@example.com' +\n \"</span></a>!</p>\",\n );\n const tags = await Array.fromAsync(object.getTags());\n assert.deepStrictEqual(tags.length, 1);\n assert.deepStrictEqual(directMsg.id, object.id);\n assert.deepStrictEqual(directMsg.text, \"Hey @john@example.com!\");\n assert.deepStrictEqual(directMsg.html, object.content);\n assert.deepStrictEqual(directMsg.visibility, \"direct\");\n // assert.deepStrictEqual(directMsg.mentions, [mentioned]); // FIXME\n });\n\n await t.test(\"quote\", async () => {\n const originalAuthor = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n const originalPost = new Note({\n id: new URL(\n \"https://example.com/ap/note/c1c792ce-a0be-4685-b396-e59e5ef8c788\",\n ),\n content: \"<p>Hello, world!</p>\",\n attribution: originalAuthor,\n to: new URL(\"https://example.com/ap/actor/john/followers\"),\n cc: PUBLIC_COLLECTION,\n });\n const originalMsg = await createMessage<Note, void>(\n originalPost,\n session,\n {},\n );\n ctx.sentActivities = [];\n const quote = await session.publish(text`Check this out!`, {\n quoteTarget: originalMsg,\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 2);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n const { recipients: recipients2, activity: activity2 } =\n ctx.sentActivities[1];\n assert.deepStrictEqual(recipients2, [originalAuthor]);\n assert.ok(activity2 instanceof Create);\n assert.deepStrictEqual(activity2.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity2.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity2.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(\n object.content,\n `<p>Check this out!</p>\n\n<p class=\"quote-inline\"><br>RE: <a href=\"${originalMsg.id.href}\">${originalMsg.id.href}</a></p>`,\n );\n assert.deepStrictEqual(object.quoteUrl, originalMsg.id);\n assert.deepStrictEqual(quote.id, object.id);\n assert.deepStrictEqual(\n quote.text,\n `Check this out!\\n\\nRE: ${originalMsg.id.href}`,\n );\n assert.deepStrictEqual(\n quote.html,\n `<p>Check this out!</p>\n\n<p><br>RE: <a href=\"${originalMsg.id.href}\">${originalMsg.id.href}</a></p>`,\n );\n assert.deepStrictEqual(quote.visibility, \"public\");\n assert.deepStrictEqual(quote.quoteTarget?.id, originalMsg.id);\n });\n\n await t.test(\"poll single choice\", async () => {\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 24 });\n const poll = await session.publish(text`What's your favorite color?`, {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Red\", \"Blue\", \"Green\"],\n endTime,\n },\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(\n object.content,\n \"<p>What&apos;s your favorite color?</p>\",\n );\n assert.deepStrictEqual(object.endTime, endTime);\n assert.deepStrictEqual(object.voters, 0);\n assert.deepStrictEqual(object.inclusiveOptionIds, []);\n\n const exclusiveOptions = await Array.fromAsync(\n object.getExclusiveOptions(ctx),\n );\n assert.deepStrictEqual(exclusiveOptions.length, 3);\n assert.ok(exclusiveOptions[0] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[0].name?.toString(), \"Red\");\n assert.ok(exclusiveOptions[1] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[1].name?.toString(), \"Blue\");\n assert.ok(exclusiveOptions[2] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[2].name?.toString(), \"Green\");\n\n for (const option of exclusiveOptions) {\n const replies = await option.getReplies(ctx);\n assert.deepStrictEqual(replies?.totalItems, 0);\n }\n\n assert.deepStrictEqual(poll.id, object.id);\n assert.deepStrictEqual(poll.text, \"What's your favorite color?\");\n assert.deepStrictEqual(\n poll.html,\n \"<p>What&apos;s your favorite color?</p>\",\n );\n assert.deepStrictEqual(poll.visibility, \"public\");\n });\n\n await t.test(\"poll multiple choice\", async () => {\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 24 * 7 });\n const poll = await session.publish(\n text`Which programming languages do you know?`,\n {\n class: Question,\n poll: {\n multiple: true,\n options: [\"JavaScript\", \"TypeScript\", \"Python\", \"Rust\"],\n endTime,\n },\n visibility: \"unlisted\",\n },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(object.endTime, endTime);\n assert.deepStrictEqual(object.voters, 0);\n assert.deepStrictEqual(object.exclusiveOptionIds, []);\n\n const inclusiveOptions = await Array.fromAsync(\n object.getInclusiveOptions(ctx),\n );\n assert.deepStrictEqual(inclusiveOptions.length, 4);\n assert.ok(inclusiveOptions[0] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[0].name?.toString(), \"JavaScript\");\n assert.ok(inclusiveOptions[1] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[1].name?.toString(), \"TypeScript\");\n assert.ok(inclusiveOptions[2] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[2].name?.toString(), \"Python\");\n assert.ok(inclusiveOptions[3] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[3].name?.toString(), \"Rust\");\n\n assert.deepStrictEqual(poll.visibility, \"unlisted\");\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, [PUBLIC_COLLECTION]);\n });\n\n await t.test(\"poll with direct visibility\", async () => {\n const mentioned = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 12 });\n const poll = await session.publish(\n text`Hey ${mention(mentioned)}, what do you think?`,\n {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Good\", \"Bad\", \"Neutral\"],\n endTime,\n },\n visibility: \"direct\",\n },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [mentioned]);\n assert.ok(activity instanceof Create);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(object.toIds, [mentioned.id]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(poll.visibility, \"direct\");\n });\n\n await t.test(\"poll end-to-end workflow\", async () => {\n // Create fresh repository and session for isolation\n const freshRepository = new MemoryRepository();\n const freshBot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository: freshRepository,\n username: \"testbot\",\n });\n const freshCtx = createMockContext(freshBot, \"https://example.com\");\n const freshSession = new SessionImpl(freshBot, freshCtx);\n\n const endTime = Temporal.Now.instant().add({ hours: 1 });\n\n // 1. Create a poll\n const poll = await freshSession.publish(\n text`What should we have for lunch?`,\n {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Pizza\", \"Burgers\", \"Salad\"],\n endTime,\n },\n },\n );\n\n // Verify poll was created correctly\n assert.deepStrictEqual(freshCtx.sentActivities.length, 1);\n const { activity: createActivity } = freshCtx.sentActivities[0];\n assert.ok(createActivity instanceof Create);\n const pollObject = await createActivity.getObject(freshCtx);\n assert.ok(pollObject instanceof Question);\n assert.deepStrictEqual(pollObject.endTime, endTime);\n\n // Get poll options\n const options = await Array.fromAsync(\n pollObject.getExclusiveOptions(freshCtx),\n );\n assert.deepStrictEqual(options.length, 3);\n assert.deepStrictEqual(options[0].name?.toString(), \"Pizza\");\n assert.deepStrictEqual(options[1].name?.toString(), \"Burgers\");\n assert.deepStrictEqual(options[2].name?.toString(), \"Salad\");\n\n // 2. Verify poll is accessible via getOutbox\n const outbox = freshSession.getOutbox({ order: \"newest\" });\n const messages = await Array.fromAsync(outbox);\n assert.deepStrictEqual(messages.length, 1);\n assert.deepStrictEqual(messages[0].id, poll.id);\n assert.deepStrictEqual(messages[0].text, \"What should we have for lunch?\");\n\n // 3. Verify poll structure\n assert.deepStrictEqual(poll.visibility, \"public\");\n assert.deepStrictEqual(poll.mentions, []);\n });\n});\n\ntest(\"SessionImpl.getOutbox()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n const messageA = new Create({\n id: new URL(\n \"https://example.com/ap/create/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n });\n const messageB = new Create({\n id: new URL(\n \"https://example.com/ap/create/0194244f-d800-7873-8993-ef71ccd47306\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n });\n const messageC = new Create({\n id: new URL(\n \"https://example.com/ap/create/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n });\n const messageD = new Create({\n id: new URL(\n \"https://example.com/ap/create/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n });\n await repository.addMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\", messageA);\n await repository.addMessage(\"0194244f-d800-7873-8993-ef71ccd47306\", messageB);\n await repository.addMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\", messageC);\n await repository.addMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\", messageD);\n\n await t.test(\"default\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n assert.deepStrictEqual(messages.length, 4);\n\n assert.deepStrictEqual(\n messages[0].id.href,\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n );\n assert.deepStrictEqual(\n messages[0].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[0].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[0].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[0].published,\n Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[1].id.href,\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n );\n assert.deepStrictEqual(\n messages[1].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[1].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[1].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[1].published,\n Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[2].id.href,\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n );\n assert.deepStrictEqual(\n messages[2].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[2].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[2].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[2].published,\n Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[3].id.href,\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n );\n assert.deepStrictEqual(\n messages[3].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[3].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[3].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[3].published,\n Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n );\n });\n\n await t.test(\"order: 'oldest'\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ]);\n });\n\n await t.test(\"order: 'newest'\", async () => {\n const outbox = session.getOutbox({ order: \"newest\" });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ]);\n });\n\n await t.test(\"since\", async () => {\n const outbox = session.getOutbox({\n since: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ]);\n });\n\n await t.test(\"until\", async () => {\n const outbox = session.getOutbox({\n until: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ]);\n });\n\n await t.test(\"messages should have update and delete methods\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n assert.strictEqual(messages.length, 4);\n\n for (const message of messages) {\n assert.strictEqual(typeof message.update, \"function\");\n assert.strictEqual(typeof message.delete, \"function\");\n }\n });\n});\n\nexport interface SentActivity {\n recipients: \"followers\" | Recipient[];\n activity: Activity;\n}\n\nexport interface MockContext extends Context<void> {\n sentActivities: SentActivity[];\n}\n\nexport function createMockContext(\n bot: BotImpl<void>,\n origin: URL | string,\n): MockContext {\n const ctx = bot.federation.createContext(\n new URL(origin),\n undefined,\n ) as MockContext;\n ctx.sentActivities = [];\n ctx.sendActivity = (_, recipients, activity) => {\n ctx.sentActivities.push({\n recipients: recipients === \"followers\"\n ? \"followers\"\n : Array.isArray(recipients)\n ? recipients\n : [recipients],\n activity,\n });\n return Promise.resolve();\n };\n return ctx;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session-impl.test.js","names":["bot: BotImpl<void>","origin: URL | string"],"sources":["../src/session-impl.test.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025 Hong Minhee <https://hongminhee.org/>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as\n// published by the Free Software Foundation, either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <https://www.gnu.org/licenses/>.\nimport { type Context, MemoryKvStore } from \"@fedify/fedify/federation\";\nimport {\n type Activity,\n Create,\n Follow,\n Note,\n Person,\n PUBLIC_COLLECTION,\n Question,\n type Recipient,\n Undo,\n Update,\n} from \"@fedify/vocab\";\nimport assert from \"node:assert\";\nimport { describe, test } from \"node:test\";\nimport { BotImpl } from \"./bot-impl.ts\";\nimport { createMessage } from \"./message-impl.ts\";\nimport { MemoryRepository, type Uuid } from \"./repository.ts\";\nimport { SessionImpl } from \"./session-impl.ts\";\nimport { mention, text } from \"./text.ts\";\n\ntest(\"SessionImpl.follow()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"follow\", async () => {\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n await session.follow(actor);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [actor]);\n assert.ok(activity instanceof Follow);\n const parsed = ctx.parseUri(activity.id);\n assert.deepStrictEqual(parsed?.type, \"object\");\n assert.ok(parsed?.type === \"object\");\n assert.deepStrictEqual(parsed.class, Follow);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.objectId, actor.id);\n assert.deepStrictEqual(activity.toIds, [actor.id]);\n const follow = await repository.getSentFollow(parsed.values.id as Uuid);\n assert.ok(follow != null);\n assert.deepStrictEqual(\n await follow.toJsonLd({ format: \"compact\" }),\n await activity.toJsonLd({ format: \"compact\" }),\n );\n });\n\n await t.test(\"follow again\", async () => {\n ctx.sentActivities = [];\n await repository.addFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: new URL(\"https://example.com/ap/actor/alice\"),\n }),\n );\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.follow(actor);\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n\n await t.test(\"follow bot itself\", async () => {\n ctx.sentActivities = [];\n await assert.rejects(\n () => session.follow(session.actorId.href),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.follow(session.actorId),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.follow(session.actorHandle),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n const actor = await session.getActor();\n await assert.rejects(\n () => session.follow(actor),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n});\n\ntest(\"SessionImpl.unfollow()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"unfollow\", async () => {\n await repository.addFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: new URL(\"https://example.com/ap/actor/alice\"),\n }),\n );\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.unfollow(actor);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [actor]);\n assert.ok(activity instanceof Undo);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Follow);\n assert.deepStrictEqual(\n object.id,\n new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n );\n assert.deepStrictEqual(object.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(\n await repository.getFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n ),\n undefined,\n );\n });\n\n await t.test(\"unfollow again\", async () => {\n ctx.sentActivities = [];\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.unfollow(actor);\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n\n await t.test(\"unfollow bot itself\", async () => {\n ctx.sentActivities = [];\n await assert.rejects(\n () => session.unfollow(session.actorId.href),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.unfollow(session.actorId),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.unfollow(session.actorHandle),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n const actor = await session.getActor();\n await assert.rejects(\n () => session.unfollow(actor),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n});\n\ndescribe(\"SessionImpl.follows()\", () => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n test(\"when it follows\", async () => {\n const followeeId = new URL(\"https://example.com/ap/actor/alice\");\n const followee = new Person({\n id: followeeId,\n preferredUsername: \"alice\",\n });\n await repository.addFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: followee,\n }),\n );\n assert.ok(await session.follows(followeeId.href));\n assert.ok(await session.follows(followeeId));\n assert.ok(await session.follows(followee));\n });\n\n test(\"when it does not follow\", async () => {\n const actorId = new URL(\"https://example.com/ap/actor/john\");\n const actor = new Person({\n id: actorId,\n preferredUsername: \"john\",\n });\n assert.deepStrictEqual(await session.follows(actorId.href), false);\n assert.deepStrictEqual(await session.follows(actorId), false);\n assert.deepStrictEqual(await session.follows(actor), false);\n });\n\n test(\"bot itself\", async () => {\n assert.deepStrictEqual(await session.follows(session.actorId.href), false);\n assert.deepStrictEqual(await session.follows(session.actorId), false);\n assert.deepStrictEqual(\n await session.follows(await session.getActor()),\n false,\n );\n assert.deepStrictEqual(await session.follows(session.actorHandle), false);\n });\n});\n\ntest(\"SessionImpl.republishProfile()\", async () => {\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n username: \"bot\",\n name: \"Bot display name\",\n summary: text`This is the bot profile.`,\n icon: new URL(\"https://example.com/icon.png\"),\n image: new URL(\"https://example.com/header.png\"),\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await session.republishProfile();\n\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Update);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(activity.ccIds, []);\n const actor = await activity.getObject(ctx);\n assert.ok(actor instanceof bot.class);\n assert.deepStrictEqual(actor.id, session.actorId);\n assert.deepStrictEqual(actor.name?.toString(), \"Bot display name\");\n assert.deepStrictEqual(\n actor.summary?.toString(),\n \"<p>This is the bot profile.</p>\",\n );\n const icon = await actor.getIcon();\n assert.ok(icon != null);\n assert.deepStrictEqual(icon.url, new URL(\"https://example.com/icon.png\"));\n const image = await actor.getImage();\n assert.ok(image != null);\n assert.deepStrictEqual(image.url, new URL(\"https://example.com/header.png\"));\n});\n\ntest(\"SessionImpl.publish()\", async (t) => {\n const kv = new MemoryKvStore();\n const bot = new BotImpl<void>({ kv, username: \"bot\" });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"public\", async () => {\n ctx.sentActivities = [];\n const publicMsg = await session.publish(text`Hello, world!`);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.content, \"<p>Hello, world!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(publicMsg.id, object.id);\n assert.deepStrictEqual(publicMsg.text, \"Hello, world!\");\n assert.deepStrictEqual(publicMsg.html, \"<p>Hello, world!</p>\");\n assert.deepStrictEqual(publicMsg.visibility, \"public\");\n assert.deepStrictEqual(publicMsg.mentions, []);\n });\n\n await t.test(\"unlisted\", async () => {\n ctx.sentActivities = [];\n const unlistedMsg = await session.publish(text`Hello!`, {\n visibility: \"unlisted\",\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, [PUBLIC_COLLECTION]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.ccIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.content, \"<p>Hello!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(unlistedMsg.id, object.id);\n assert.deepStrictEqual(unlistedMsg.text, \"Hello!\");\n assert.deepStrictEqual(unlistedMsg.html, \"<p>Hello!</p>\");\n assert.deepStrictEqual(unlistedMsg.visibility, \"unlisted\");\n assert.deepStrictEqual(unlistedMsg.mentions, []);\n });\n\n await t.test(\"followers\", async () => {\n ctx.sentActivities = [];\n const followersMsg = await session.publish(text`Hi!`, {\n visibility: \"followers\",\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, []);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(object.content, \"<p>Hi!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(followersMsg.id, object.id);\n assert.deepStrictEqual(followersMsg.text, \"Hi!\");\n assert.deepStrictEqual(followersMsg.html, \"<p>Hi!</p>\");\n assert.deepStrictEqual(followersMsg.visibility, \"followers\");\n assert.deepStrictEqual(followersMsg.mentions, []);\n });\n\n await t.test(\"direct\", async () => {\n const mentioned = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n ctx.sentActivities = [];\n const directMsg = await session.publish(\n text`Hey ${mention(mentioned)}!`,\n { visibility: \"direct\" },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [mentioned]);\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [mentioned.id]);\n assert.deepStrictEqual(activity.ccIds, []);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [mentioned.id]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(\n object.content,\n '<p>Hey <a href=\"https://example.com/ap/actor/john\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>john@example.com' +\n \"</span></a>!</p>\",\n );\n const tags = await Array.fromAsync(object.getTags());\n assert.deepStrictEqual(tags.length, 1);\n assert.deepStrictEqual(directMsg.id, object.id);\n assert.deepStrictEqual(directMsg.text, \"Hey @john@example.com!\");\n assert.deepStrictEqual(directMsg.html, object.content);\n assert.deepStrictEqual(directMsg.visibility, \"direct\");\n // assert.deepStrictEqual(directMsg.mentions, [mentioned]); // FIXME\n });\n\n await t.test(\"quote\", async () => {\n const originalAuthor = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n const originalPost = new Note({\n id: new URL(\n \"https://example.com/ap/note/c1c792ce-a0be-4685-b396-e59e5ef8c788\",\n ),\n content: \"<p>Hello, world!</p>\",\n attribution: originalAuthor,\n to: new URL(\"https://example.com/ap/actor/john/followers\"),\n cc: PUBLIC_COLLECTION,\n });\n const originalMsg = await createMessage<Note, void>(\n originalPost,\n session,\n {},\n );\n ctx.sentActivities = [];\n const quote = await session.publish(text`Check this out!`, {\n quoteTarget: originalMsg,\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 2);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n const { recipients: recipients2, activity: activity2 } =\n ctx.sentActivities[1];\n assert.deepStrictEqual(recipients2, [originalAuthor]);\n assert.ok(activity2 instanceof Create);\n assert.deepStrictEqual(activity2.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity2.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity2.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(\n object.content,\n `<p>Check this out!</p>\n\n<p class=\"quote-inline\"><br>RE: <a href=\"${originalMsg.id.href}\">${originalMsg.id.href}</a></p>`,\n );\n assert.deepStrictEqual(object.quoteUrl, originalMsg.id);\n assert.deepStrictEqual(quote.id, object.id);\n assert.deepStrictEqual(\n quote.text,\n `Check this out!\\n\\nRE: ${originalMsg.id.href}`,\n );\n assert.deepStrictEqual(\n quote.html,\n `<p>Check this out!</p>\n\n<p><br>RE: <a href=\"${originalMsg.id.href}\">${originalMsg.id.href}</a></p>`,\n );\n assert.deepStrictEqual(quote.visibility, \"public\");\n assert.deepStrictEqual(quote.quoteTarget?.id, originalMsg.id);\n });\n\n await t.test(\"poll single choice\", async () => {\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 24 });\n const poll = await session.publish(text`What's your favorite color?`, {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Red\", \"Blue\", \"Green\"],\n endTime,\n },\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(\n object.content,\n \"<p>What&apos;s your favorite color?</p>\",\n );\n assert.deepStrictEqual(object.endTime, endTime);\n assert.deepStrictEqual(object.voters, 0);\n assert.deepStrictEqual(object.inclusiveOptionIds, []);\n\n const exclusiveOptions = await Array.fromAsync(\n object.getExclusiveOptions(ctx),\n );\n assert.deepStrictEqual(exclusiveOptions.length, 3);\n assert.ok(exclusiveOptions[0] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[0].name?.toString(), \"Red\");\n assert.ok(exclusiveOptions[1] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[1].name?.toString(), \"Blue\");\n assert.ok(exclusiveOptions[2] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[2].name?.toString(), \"Green\");\n\n for (const option of exclusiveOptions) {\n const replies = await option.getReplies(ctx);\n assert.deepStrictEqual(replies?.totalItems, 0);\n }\n\n assert.deepStrictEqual(poll.id, object.id);\n assert.deepStrictEqual(poll.text, \"What's your favorite color?\");\n assert.deepStrictEqual(\n poll.html,\n \"<p>What&apos;s your favorite color?</p>\",\n );\n assert.deepStrictEqual(poll.visibility, \"public\");\n });\n\n await t.test(\"poll multiple choice\", async () => {\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 24 * 7 });\n const poll = await session.publish(\n text`Which programming languages do you know?`,\n {\n class: Question,\n poll: {\n multiple: true,\n options: [\"JavaScript\", \"TypeScript\", \"Python\", \"Rust\"],\n endTime,\n },\n visibility: \"unlisted\",\n },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(object.endTime, endTime);\n assert.deepStrictEqual(object.voters, 0);\n assert.deepStrictEqual(object.exclusiveOptionIds, []);\n\n const inclusiveOptions = await Array.fromAsync(\n object.getInclusiveOptions(ctx),\n );\n assert.deepStrictEqual(inclusiveOptions.length, 4);\n assert.ok(inclusiveOptions[0] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[0].name?.toString(), \"JavaScript\");\n assert.ok(inclusiveOptions[1] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[1].name?.toString(), \"TypeScript\");\n assert.ok(inclusiveOptions[2] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[2].name?.toString(), \"Python\");\n assert.ok(inclusiveOptions[3] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[3].name?.toString(), \"Rust\");\n\n assert.deepStrictEqual(poll.visibility, \"unlisted\");\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, [PUBLIC_COLLECTION]);\n });\n\n await t.test(\"poll with direct visibility\", async () => {\n const mentioned = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 12 });\n const poll = await session.publish(\n text`Hey ${mention(mentioned)}, what do you think?`,\n {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Good\", \"Bad\", \"Neutral\"],\n endTime,\n },\n visibility: \"direct\",\n },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [mentioned]);\n assert.ok(activity instanceof Create);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(object.toIds, [mentioned.id]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(poll.visibility, \"direct\");\n });\n\n await t.test(\"poll end-to-end workflow\", async () => {\n // Create fresh repository and session for isolation\n const freshRepository = new MemoryRepository();\n const freshBot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository: freshRepository,\n username: \"testbot\",\n });\n const freshCtx = createMockContext(freshBot, \"https://example.com\");\n const freshSession = new SessionImpl(freshBot, freshCtx);\n\n const endTime = Temporal.Now.instant().add({ hours: 1 });\n\n // 1. Create a poll\n const poll = await freshSession.publish(\n text`What should we have for lunch?`,\n {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Pizza\", \"Burgers\", \"Salad\"],\n endTime,\n },\n },\n );\n\n // Verify poll was created correctly\n assert.deepStrictEqual(freshCtx.sentActivities.length, 1);\n const { activity: createActivity } = freshCtx.sentActivities[0];\n assert.ok(createActivity instanceof Create);\n const pollObject = await createActivity.getObject(freshCtx);\n assert.ok(pollObject instanceof Question);\n assert.deepStrictEqual(pollObject.endTime, endTime);\n\n // Get poll options\n const options = await Array.fromAsync(\n pollObject.getExclusiveOptions(freshCtx),\n );\n assert.deepStrictEqual(options.length, 3);\n assert.deepStrictEqual(options[0].name?.toString(), \"Pizza\");\n assert.deepStrictEqual(options[1].name?.toString(), \"Burgers\");\n assert.deepStrictEqual(options[2].name?.toString(), \"Salad\");\n\n // 2. Verify poll is accessible via getOutbox\n const outbox = freshSession.getOutbox({ order: \"newest\" });\n const messages = await Array.fromAsync(outbox);\n assert.deepStrictEqual(messages.length, 1);\n assert.deepStrictEqual(messages[0].id, poll.id);\n assert.deepStrictEqual(messages[0].text, \"What should we have for lunch?\");\n\n // 3. Verify poll structure\n assert.deepStrictEqual(poll.visibility, \"public\");\n assert.deepStrictEqual(poll.mentions, []);\n });\n});\n\ntest(\"SessionImpl.getOutbox()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n const messageA = new Create({\n id: new URL(\n \"https://example.com/ap/create/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n });\n const messageB = new Create({\n id: new URL(\n \"https://example.com/ap/create/0194244f-d800-7873-8993-ef71ccd47306\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n });\n const messageC = new Create({\n id: new URL(\n \"https://example.com/ap/create/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n });\n const messageD = new Create({\n id: new URL(\n \"https://example.com/ap/create/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n });\n await repository.addMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\", messageA);\n await repository.addMessage(\"0194244f-d800-7873-8993-ef71ccd47306\", messageB);\n await repository.addMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\", messageC);\n await repository.addMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\", messageD);\n\n await t.test(\"default\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n assert.deepStrictEqual(messages.length, 4);\n\n assert.deepStrictEqual(\n messages[0].id.href,\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n );\n assert.deepStrictEqual(\n messages[0].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[0].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[0].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[0].published,\n Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[1].id.href,\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n );\n assert.deepStrictEqual(\n messages[1].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[1].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[1].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[1].published,\n Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[2].id.href,\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n );\n assert.deepStrictEqual(\n messages[2].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[2].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[2].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[2].published,\n Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[3].id.href,\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n );\n assert.deepStrictEqual(\n messages[3].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[3].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[3].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[3].published,\n Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n );\n });\n\n await t.test(\"order: 'oldest'\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ]);\n });\n\n await t.test(\"order: 'newest'\", async () => {\n const outbox = session.getOutbox({ order: \"newest\" });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ]);\n });\n\n await t.test(\"since\", async () => {\n const outbox = session.getOutbox({\n since: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ]);\n });\n\n await t.test(\"until\", async () => {\n const outbox = session.getOutbox({\n until: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ]);\n });\n\n await t.test(\"messages should have update and delete methods\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n assert.strictEqual(messages.length, 4);\n\n for (const message of messages) {\n assert.strictEqual(typeof message.update, \"function\");\n assert.strictEqual(typeof message.delete, \"function\");\n }\n });\n});\n\nexport interface SentActivity {\n recipients: \"followers\" | Recipient[];\n activity: Activity;\n}\n\nexport interface MockContext extends Context<void> {\n sentActivities: SentActivity[];\n}\n\nexport function createMockContext(\n bot: BotImpl<void>,\n origin: URL | string,\n): MockContext {\n const ctx = bot.federation.createContext(\n new URL(origin),\n undefined,\n ) as MockContext;\n ctx.sentActivities = [];\n ctx.sendActivity = (_, recipients, activity) => {\n ctx.sentActivities.push({\n recipients: recipients === \"followers\"\n ? \"followers\"\n : Array.isArray(recipients)\n ? recipients\n : [recipients],\n activity,\n });\n return Promise.resolve();\n };\n return ctx;\n}\n"],"mappings":"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"}
package/dist/session.d.ts CHANGED
@@ -72,6 +72,17 @@ interface Session<TContextData> {
72
72
  * is not an `Actor`.
73
73
  */
74
74
  follows(actor: Actor | URL | string): Promise<boolean>;
75
+ /**
76
+ * Republishes the bot profile to its followers.
77
+ *
78
+ * This is useful when the bot's profile metadata such as its display name,
79
+ * bio, avatar, or header image has changed and remote servers need to be
80
+ * notified explicitly.
81
+ *
82
+ * @returns A promise that resolves when the profile update activity is sent.
83
+ * @since 0.4.0
84
+ */
85
+ republishProfile(): Promise<void>;
75
86
  /**
76
87
  * Publishes a message attributed to the bot.
77
88
  * @param text The content of the note.
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","names":[],"sources":["../src/session.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;UAqCiB;;;AAAjB;EAAwB,SAAA,GAAA,EAIR,GAJQ,CAIJ,YAJI,CAAA;EAAA;;;EASgB,SAApB,OAAA,EAAA,OAAA,CAAQ,YAAR,CAAA;EAAO;;;EAgBN,SAgBL,OAAA,EA3BI,GA2BJ;EAAK;;;EAeE,SAAG,WAAA,EAAA,IAAA,MAAA,IAAA,MAAA,EAAA;EAAG;;;;EAWkB,QASpB,EAAA,EAnDb,OAmDa,CAnDL,KAmDK,CAAA;EAAY;;;;;;;;;;;;;;EAcP,MAAE,CAAA,KAAA,EAjDlB,KAiDkB,GAjDV,GAiDU,GAAA,MAAA,CAAA,EAjDK,OAiDL,CAAA,IAAA,CAAA;EAAY;;;;;;;;;;;;;EAqBiB,QAA5C,CAAA,KAAA,EAvDD,KAuDC,GAvDO,GAuDP,GAAA,MAAA,CAAA,EAvDsB,OAuDtB,CAAA,IAAA,CAAA;EAAiB;AAAlB;AAOlB;;;;;;;EAqB6C,OAAE,CAAA,KAAA,EAxE9B,KAwE8B,GAxEtB,GAwEsB,GAAA,MAAA,CAAA,EAxEP,OAwEO,CAAA,OAAA,CAAA;EAAY;AAA3B;AAQhC;;;;EAG4C,OAI1B,CAAA,OAAA,EA9EL,IA8EK,CAAA,OAAA,EA9ES,YA8ET,CAAA,EAAA,OAAA,CAAA,EA7EJ,qBA6EI,CA7EkB,YA6ElB,CAAA,CAAA,EA5Eb,OA4Ea,CA5EL,iBA4EK,CA5Ea,IA4Eb,EA5EmB,YA4EnB,CAAA,CAAA;EAAC;;;;;;;EAEC,OAAU,CAAA,UArEV,YAqEU,CAAA,CAAA,OAAA,EApEjB,IAoEiB,CAAA,OAAA,EApEH,YAoEG,CAAA,EAAA,OAAA,EAnEjB,8BAmEiB,CAnEc,CAmEd,EAnEiB,YAmEjB,CAAA,CAAA,EAlEzB,OAkEyB,CAlEjB,iBAkEiB,CAlEC,CAkED,EAlEI,YAkEJ,CAAA,CAAA;EAAI;;;;AANH;AAgB/B;;EAAkD,OACT,CAAA,OAAA,EAnE5B,IAmE4B,CAAA,OAAA,EAnEd,YAmEc,CAAA,EAAA,OAAA,EAlE5B,iCAkE4B,CAlEM,YAkEN,CAAA,CAAA,EAjEpC,OAiEoC,CAjE5B,iBAiE4B,CAjEV,QAiEU,EAjEA,YAiEA,CAAA,CAAA;EAAQ;;;AAAT;AAWxC;EAAwC,SAAA,CAAA,OAAA,CAAA,EApE1B,uBAoE0B,CAAA,EAnEnC,aAmEmC,CAnErB,iBAmEqB,CAnEH,YAmEG,EAnEW,YAmEX,CAAA,CAAA;;;AAiBL;;;UA7ElB;;;;+BAIc,IAAA,CAAK;;;;;wBAMZ,QAAQ;;;;yBAKP;;;;;yBAMA,QAAQ,cAAc;;;;;;;UAQ9B,yCACL,oCAEF,sBAAsB;;;;kBAId,UAAU,iBAAiB,UACvC,UAAU,qBAAqB,cAC/B,UAAU,cAAc,OACxB,UAAU,kBAAkB;;;;;;;UASjB,wDACP,+BAA+B,UAAU;;;;;iBAKlC;;;;;UAMA,uBAAA;;;;;;;;;;mBAWE,QAAA,CAAS;;;;;mBAMT,QAAA,CAAS"}
1
+ {"version":3,"file":"session.d.ts","names":[],"sources":["../src/session.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;UAqCiB;;;AAAjB;EAAwB,SAAA,GAAA,EAIR,GAJQ,CAIJ,YAJI,CAAA;EAAA;;;EASgB,SAApB,OAAA,EAAA,OAAA,CAAQ,YAAR,CAAA;EAAO;;;EAgBN,SAgBL,OAAA,EA3BI,GA2BJ;EAAK;;;EAeE,SAAG,WAAA,EAAA,IAAA,MAAA,IAAA,MAAA,EAAA;EAAG;;;;EAWkB,QAYzB,EAAA,EAtDR,OAsDQ,CAtDA,KAsDA,CAAA;EAAO;;;;;;;;;;;;;;EAsBc,MACZ,CAAA,KAAA,EA7Df,KA6De,GA7DP,GA6DO,GAAA,MAAA,CAAA,EA7DQ,OA6DR,CAAA,IAAA,CAAA;EAAC;;;;;;;;;;;;;EAqBiB,QAAE,CAAA,KAAA,EAnEjC,KAmEiC,GAnEzB,GAmEyB,GAAA,MAAA,CAAA,EAnEV,OAmEU,CAAA,IAAA,CAAA;EAAY;;AAA7C;AAOlB;;;;;;EAeiC,OAMA,CAAA,KAAA,EApFhB,KAoFgB,GApFR,GAoFQ,GAAA,MAAA,CAAA,EApFO,OAoFP,CAAA,OAAA,CAAA;EAAY;;AAAb;AAQhC;;;;;;;EAOoD,gBAC9C,EAAA,EAxFgB,OAwFhB,CAAA,IAAA,CAAA;EAAC;;;;;;EAEA,OAAS,CAAA,OAAA,EAjFH,IAiFG,CAAA,OAAA,EAjFW,YAiFX,CAAA,EAAA,OAAA,CAAA,EAhFF,qBAgFE,CAhFoB,YAgFpB,CAAA,CAAA,EA/EX,OA+EW,CA/EH,iBA+EG,CA/Ee,IA+Ef,EA/EqB,YA+ErB,CAAA,CAAA;EAAQ;;AAPO;AAgB/B;;;;EAC+D,OAK9C,CAAA,UArFG,YAqFH,CAAA,CAAA,OAAA,EApFJ,IAoFI,CAAA,OAAA,EApFU,YAoFV,CAAA,EAAA,OAAA,EAnFJ,8BAmFI,CAnF2B,CAmF3B,EAnF8B,YAmF9B,CAAA,CAAA,EAlFZ,OAkFY,CAlFJ,iBAkFI,CAlFc,CAkFd,EAlFiB,YAkFjB,CAAA,CAAA;EAAI;AALmB;AAWxC;;;;AAiBmC;mBA/FtB,cAAc,wBACd,kCAAkC,gBAC1C,QAAQ,kBAAkB,UAAU;;;;;;sBAQ3B,0BACT,cAAc,kBAAkB,cAAc;;;;;;UAOlC;;;;+BAIc,IAAA,CAAK;;;;;wBAMZ,QAAQ;;;;yBAKP;;;;;yBAMA,QAAQ,cAAc;;;;;;;UAQ9B,yCACL,oCAEF,sBAAsB;;;;kBAId,UAAU,iBAAiB,UACvC,UAAU,qBAAqB,cAC/B,UAAU,cAAc,OACxB,UAAU,kBAAkB;;;;;;;UASjB,wDACP,+BAA+B,UAAU;;;;;iBAKlC;;;;;UAMA,uBAAA;;;;;;;;;;mBAWE,QAAA,CAAS;;;;;mBAMT,QAAA,CAAS"}
package/dist/text.test.js CHANGED
@@ -99,6 +99,9 @@ const bot = {
99
99
  publish() {
100
100
  throw new Error("Not implemented");
101
101
  },
102
+ republishProfile() {
103
+ throw new Error("Not implemented");
104
+ },
102
105
  getOutbox() {
103
106
  throw new Error("Not implemented");
104
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"text.test.js","names":["url: string","keyPair: CryptoKeyPair","bot: BotWithVoidContextData","origin: string | URL | Context<void>","_contextData?: void","_req: Request","_emojis: Record<TEmojiName, CustomEmoji>","t: Text<\"block\", void>","m: Text<\"inline\", void>","t2: Text<\"block\", void>","t3: Text<\"block\", void>","t4: Text<\"block\", void>","t5: Text<\"block\", void>","t6: Text<\"block\", void>","t7: Text<\"block\", void>","t8: Text<\"block\", void>","t9: Text<\"block\", void>","t10: Text<\"block\", void>","m2: Text<\"inline\", void>","m3: Text<\"inline\", void>","m4: Text<\"inline\", void>","m5: Text<\"inline\", void>","m6: Text<\"inline\", void>","m7: Text<\"inline\", void>","m8: Text<\"inline\", void>","m9: Text<\"inline\", void>","t: Text<\"inline\", void>","t2: Text<\"inline\", void>","t3: Text<\"inline\", void>","t4: Text<\"inline\", void>","emojiData: CustomEmoji","emojiData1: CustomEmoji","emojiData2: CustomEmoji"],"sources":["../src/text.test.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025 Hong Minhee <https://hongminhee.org/>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as\n// published by the Free Software Foundation, either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <https://www.gnu.org/licenses/>.\nimport {\n type Context,\n createFederation,\n MemoryKvStore,\n} from \"@fedify/fedify/federation\";\nimport { getDocumentLoader } from \"@fedify/vocab-runtime\";\nimport { importJwk } from \"@fedify/fedify/sig\";\nimport { Emoji, Hashtag, Image, Mention, Person } from \"@fedify/vocab\";\nimport assert from \"node:assert\";\nimport { describe, test } from \"node:test\";\nimport { BotImpl } from \"./bot-impl.ts\";\nimport type { BotWithVoidContextData } from \"./bot.ts\";\nimport type { CustomEmoji, DeferredCustomEmoji } from \"./emoji.ts\";\nimport type { Session } from \"./session.ts\";\nimport {\n code,\n customEmoji,\n CustomEmojiText,\n em,\n hashtag,\n isText,\n link,\n markdown,\n mention,\n mentions,\n strong,\n type Text,\n text,\n} from \"./text.ts\";\n\nconst defaultDocumentLoader = getDocumentLoader();\nconst customDocumentLoader = (url: string) => {\n const parsed = new URL(url);\n if (parsed.host !== \"example.com\") {\n return defaultDocumentLoader(url);\n }\n const document = {\n \"@context\": \"https://www.w3.org/ns/activitystreams\",\n type: \"Person\",\n id: url,\n preferredUsername: url.split(\"/\").at(-1),\n url,\n };\n return Promise.resolve({\n document,\n documentUrl: url,\n contextUrl: null,\n });\n};\n\nconst federation = createFederation<void>({\n kv: new MemoryKvStore(),\n documentLoaderFactory() {\n return customDocumentLoader;\n },\n authenticatedDocumentLoaderFactory() {\n return customDocumentLoader;\n },\n});\n\nconst keyPair: CryptoKeyPair = {\n privateKey: await importJwk({\n kty: \"RSA\",\n alg: \"RS256\",\n // cSpell: disable\n n: \"15DAu9S9sROZ_NonfZm5S0PSeYuh2POeo0cpvvGnp_T9jQWjMuGdhwOPT7OOD9N-R1IY-2hXkk-RjfWNzbxMoNKvOpz_1MHRg18W5Lw60mIxZFztLKlNhOZS7rVrlJc--jj1wLETEfY5ocYCyRZm25UeT_Q1JSePdnhEGVXo4sSqoUcMV5Bgys5PlISfQj_bHDpcIi9snJ70hOzYTy7k7fNuCHHsK08DN4bZMG58qQNrPFtZW6fgpQiu0kgtUBFgQu-uUNn1h0io-7OhMU2dXeV8lwCILhIFRvrRV9vKQydBejbyYuzFY-Xq98biB9Aox8GD0jJE4tTVj6CpsmaN9yq6nI8ibWjnk87IKdU3jex5zB8chR0cm2tyIWr6dKhCTexmtYTF0pGW7PZ2Dnn31BU3cPkrkplu752D4eQ47BsAspMsHRxXE3NtqlmN02Y-6AIzt1tuPBPHldQHUpxtGrwFh9b9biC2mtb_w6F0oyxVyZsAZnuK2tN0-uX_iMPoC5VLnPrzgWjQiMArivg4u1cQ35hrvuFYFAdNf2WaBDyDNxaCoTD28z9bF1titlbQ48tDw0adZ1Zp8_x12JqA5HNpqDfmyT4KPU_6Ag7J7cGfGeO2vsjcc1oGhqZ-n6JlnSvVImHS5eKC6CDhW7ceuKC_oX-XPWWQQHhPniwM2RE\",\n e: \"AQAB\",\n d: \"eAD5ipdQUrfazcyUl3Nwl9nV3hxBqYlWEweW0dmtv-6_CDbPN5AqJfNxYKlQuLbAYevuRGc9-RGasjC1FIdzEUS4kCS-ty5--GeDUysGhABuBrVEw8wsf4PJP2J31WytfpcfGHp7Z1BvnQOioVd7Q1qsWU5WF60CTK1_G6ubzkI1yzrGQCj7-WsJGmEKV9M8o2ZJzC4ihL5o2WcQtGQixeTyqHjjROjjnZHQbwnTFDP3Cs6_3CqFANrol9_eeehyclED9bag3QMyL408ezn-FTugNF_zb9JQZcdTq1mMK_46kVLtdOzipk5klDN_uWHEkg_E1sttVemuShri3ZICDUSd70Y4VeQxNLUKJNBSYdSLmcVgfIHaXMmcrknmBuz23SrGR6JZR4DSJtr3sylR2tlOxpZhJAUZf17f8aZD7EnbR7qcNtjZmf8RyAKrEXLgL6f3jm6FfE_b027kcmLMXL7bJtlTBYnM9MrBnXSsJftHRrmB1Xe-0Hq24Q7ctrhRhFF3Ij8MjNRjdn6NWdIXzltreblLEO44iTJtlWeYtg-C9566F_yWZnjDZEQ8nvBhpCM3iXlRfzhlEebBoBbf-Mf-0hJRRUL3EtGuMueylzeyk4tTzvOfK2FUnVAi8bIhjz4m8RhN7kC4ubqUXZbKwzjeI1dhWyfDphrPiRtCetE\",\n p: \"_4BmuvmlMZmiD_uGE__iWIHizMe4Ay34WOSNAm0uhjfNgWpWHdxosQQeSehBE8x_CwJGKbCl69ewmEAOYnP3KYpytvcHVEMO7XQAE66p_19PzIy95WY6CR20CFXUykzQ_6gE_nFB39rxcxprxAqaNEGM2PtwpiTSwoyZFWkgSE6O6rwv03vNAMeib3CZU3kdg4mHiZAryk9U6uphZ_lJ2wOSMX_SHkcEAwePoae8E_jIJ0drfIkyR5pSkghThjHIv95hcHuuDodm2W9e7sppv3EpjE81ANKEfkrrauDfX9BrRDC-14hhCK7t7bYJ9bj49nmSSLmLHNw1W2eyvvAHEw\",\n q: \"1_xoQ6UBnAsql-87v7UddCiJEppk9LkfYb-DBEtBHbTFDvxbE0Px7ooNevgwlMDmi6t4hSkQZEwF5sLFHv1-fNFtpwVGzqu6ekXYfw0FxWRVjJTh5e91G3mOMVprGvgSMk3PRO33dBAhA6MMGIMi72XCGWNpy7ajfawYdpeMO6k6aC93jT9RmoaB_UmwyM2lmzaWP9RKInJ6t_i-eFm05_0qkPdPdg5b3HbNpKyAMLVxA8DAauHvcCx9CsAZ8ZbvL-mC5AX7v7B9iovXCStHpfA5f73M7AGFGRZpt51mvx8pxHVwF2tW6h03HEBz5BX-9YMTaepH369CRovGo4Jvyw\",\n dp:\n \"hlBlsN0T7mMpQuWisljOEGEXbTeAkItWBsT_K8thrcUgD2xrIP-BOa1Eju29aD8UeiET6U6nqreUajUiWrdDs17It05dV_p4mnNkpvQnAcyFEq7aFQIMeEZZIhic6ExBgmQ9W9UGIDvkufGlvUUlk1ryRA7KRU0OTp_CyfKdueUyVEvhiHeIaWSJC7RRpgQBc-iUi8hyfMP_jA7ybcoq_St_au4a8ze58C3FX-HhiU47SgrNgoZNHD8QMRyXa_A37EVnS854zcJ4Ws2lRjq6JJ3EjbIF1wzUAeA4qdLVGnViLlLBwGQ9PmdXRKNx0O8QUeHO-NQxQVax5f85hA6CaQ\",\n dq:\n \"MVKMpNXrlizeny-cn1zGyx3un3bukwwrZHENhE-DITuEvLVYPwAHIYgZJ_nBblbWzxJrRU1pVt4dguL7jOYqmmpg9gE4eD2zKfUFSY45wSf2eVIOfCnAvnN1y0Nwrgn0bdRi_sSw-6orP99eBcL8mVrNhmqzYDfnAe3o8DwPZBhzJBOi43iQNA9_Y84ONuzvYpCGozDhdRhbeeOt62Hg9BFWRSCU3srMo33l3DMgWv80Pb0os7_ApAckzu2rfwYOvQxAPb44DUBKivcANjHR_Mzs9ITtZP-720zI-4tQSVjeeuSuokp64J-nVCZL0MxNGtfB-S_tFeG56s5EoFZLHQ\",\n qi:\n \"1J7CfWYlg4Igsu2N7bhgLzbc1l6A3odyyOlM70uH8P41kCYgpRDdH8Ms8yOJE-F13ha5drICZqsD7IjgG0cZONJ_0xTeka0AYMvCwjuJZ_4CzVFYNICxSHFUI-sCu1p-zb70eXU6fiwOFgzoPbnrwywpbxcTV_8H0XszwPcI3fjrGk6N-hi23Ur1gIjhnri_-x8mzwmtPA1ID1G17U4X93mP7dlYCzGigq8ORbSdZthOKdjtHXITBOgpcTiuyTTwAEqh3xyXscfsgzi0X6olBevJCGeTzOrqQX026JmNVykaS1-o_ea_Y0cD0q6Nxd5TwLZMCLZi1M5PLHhGlJg9MQ\",\n // cSpell: enable\n key_ops: [\"sign\"],\n ext: true,\n }, \"private\"),\n publicKey: await importJwk({\n kty: \"RSA\",\n alg: \"RS256\",\n // cSpell: disable\n n: \"15DAu9S9sROZ_NonfZm5S0PSeYuh2POeo0cpvvGnp_T9jQWjMuGdhwOPT7OOD9N-R1IY-2hXkk-RjfWNzbxMoNKvOpz_1MHRg18W5Lw60mIxZFztLKlNhOZS7rVrlJc--jj1wLETEfY5ocYCyRZm25UeT_Q1JSePdnhEGVXo4sSqoUcMV5Bgys5PlISfQj_bHDpcIi9snJ70hOzYTy7k7fNuCHHsK08DN4bZMG58qQNrPFtZW6fgpQiu0kgtUBFgQu-uUNn1h0io-7OhMU2dXeV8lwCILhIFRvrRV9vKQydBejbyYuzFY-Xq98biB9Aox8GD0jJE4tTVj6CpsmaN9yq6nI8ibWjnk87IKdU3jex5zB8chR0cm2tyIWr6dKhCTexmtYTF0pGW7PZ2Dnn31BU3cPkrkplu752D4eQ47BsAspMsHRxXE3NtqlmN02Y-6AIzt1tuPBPHldQHUpxtGrwFh9b9biC2mtb_w6F0oyxVyZsAZnuK2tN0-uX_iMPoC5VLnPrzgWjQiMArivg4u1cQ35hrvuFYFAdNf2WaBDyDNxaCoTD28z9bF1titlbQ48tDw0adZ1Zp8_x12JqA5HNpqDfmyT4KPU_6Ag7J7cGfGeO2vsjcc1oGhqZ-n6JlnSvVImHS5eKC6CDhW7ceuKC_oX-XPWWQQHhPniwM2RE\",\n e: \"AQAB\",\n // cSpell: enable\n key_ops: [\"verify\"],\n ext: true,\n }, \"public\"),\n};\n\nfederation.setActorDispatcher(\"/ap/actor/{identifier}\", (ctx, identifier) => {\n return new Person({\n id: ctx.getActorUri(identifier),\n preferredUsername: identifier,\n });\n}).setKeyPairsDispatcher((_ctx, _identifier) => {\n return [keyPair];\n});\n\nconst bot: BotWithVoidContextData = {\n federation,\n identifier: \"bot\",\n getSession(origin: string | URL | Context<void>, _contextData?: void) {\n const ctx = typeof origin === \"string\" || origin instanceof URL\n ? federation.createContext(new URL(origin))\n : origin;\n return {\n bot,\n context: ctx,\n actorId: ctx.getActorUri(bot.identifier),\n actorHandle: `@bot@${ctx.host}` as const,\n getActor() {\n const actor = new Person({\n id: ctx.getActorUri(bot.identifier),\n preferredUsername: \"bot\",\n });\n return Promise.resolve(actor);\n },\n follow() {\n throw new Error(\"Not implemented\");\n },\n unfollow() {\n throw new Error(\"Not implemented\");\n },\n follows() {\n throw new Error(\"Not implemented\");\n },\n publish() {\n throw new Error(\"Not implemented\");\n },\n getOutbox() {\n throw new Error(\"Not implemented\");\n },\n } satisfies Session<void>;\n },\n fetch(_req: Request) {\n return Promise.resolve(new Response());\n },\n addCustomEmojis<TEmojiName extends string>(\n _emojis: Record<TEmojiName, CustomEmoji>,\n ): Record<TEmojiName, DeferredCustomEmoji<void>> {\n return {} as Record<TEmojiName, DeferredCustomEmoji<void>>;\n },\n};\n\ntest(\"isText()\", () => {\n const t = text`Hello, World`;\n assert.ok(isText(t));\n const t2 = em(\"Hello, World\");\n assert.ok(isText(t2));\n assert.deepStrictEqual(isText(\"Hello, World\"), false);\n});\n\ntest(\"mentions()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const actor = new URL(\"https://hollo.social/@fedify\");\n const actor2 = new URL(\"https://example.com/users/john\");\n const actor3 = new Person({ id: actor });\n const t: Text<\"block\", void> = text`Hello, world!`;\n assert.deepStrictEqual(await mentions(session, t, actor), false);\n assert.deepStrictEqual(await mentions(session, t, actor2), false);\n assert.deepStrictEqual(await mentions(session, t, actor3), false);\n\n const m: Text<\"inline\", void> = mention(actor);\n assert.ok(await mentions(session, m, actor));\n assert.deepStrictEqual(await mentions(session, m, actor2), false);\n assert.ok(await mentions(session, m, actor3));\n});\n\ntest(\"text`...`\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"block\", void> = text`Hello, <${123}>`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<p>Hello, &lt;123&gt;</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t.getTags(session)), []);\n assert.deepStrictEqual(t.getCachedObjects(), []);\n\n const t2: Text<\"block\", void> = text`Hello, ${em(\"World\")}`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t2.getHtml(session))).join(\"\"),\n \"<p>Hello, <em>World</em></p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t2.getTags(session)), []);\n assert.deepStrictEqual(t2.getCachedObjects(), []);\n\n const actor = new Person({\n id: new URL(\"https://example.com/users/john\"),\n preferredUsername: \"john\",\n url: new URL(\"https://example.com/@john\"),\n });\n const t3: Text<\"block\", void> = text`Hello, ${mention(actor)}`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t3.getHtml(session))).join(\"\"),\n '<p>Hello, <a href=\"https://example.com/@john\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>john@example.com' +\n \"</span></a></p>\",\n );\n const tags3 = await Array.fromAsync(t3.getTags(session));\n assert.deepStrictEqual(tags3.length, 1);\n assert.ok(tags3[0] instanceof Mention);\n assert.deepStrictEqual(tags3[0].name, \"@john@example.com\");\n assert.deepStrictEqual(\n tags3[0].href,\n new URL(\"https://example.com/users/john\"),\n );\n const cache3 = t3.getCachedObjects();\n assert.deepStrictEqual(cache3.length, 1);\n assert.ok(cache3[0] instanceof Person);\n assert.deepStrictEqual(\n cache3[0].id,\n new URL(\"https://example.com/users/john\"),\n );\n\n const t4: Text<\"block\", void> = text`Hello\\nworld!`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t4.getHtml(session))).join(\"\"),\n \"<p>Hello<br>world!</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t4.getTags(session)), []);\n assert.deepStrictEqual(t4.getCachedObjects(), []);\n\n const t5: Text<\"block\", void> =\n text`Hello\\nworld!\\n\\nGoodbye!\\n\\t\\n \\nHello!`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t5.getHtml(session))).join(\"\"),\n \"<p>Hello<br>world!</p><p>Goodbye!</p><p>Hello!</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t5.getTags(session)), []);\n assert.deepStrictEqual(t5.getCachedObjects(), []);\n\n const t6: Text<\"block\", void> = text`\\n\\n\\nHello\\nworld\\n\\n\\nGoodbye!\\n`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t6.getHtml(session))).join(\"\"),\n \"<p>Hello<br>world</p><p>Goodbye!</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t6.getTags(session)), []);\n assert.deepStrictEqual(t6.getCachedObjects(), []);\n\n const t7: Text<\"block\", void> = text`Here's a link: ${new URL(\n \"https://fedify.dev/\",\n )}.`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t7.getHtml(session))).join(\"\"),\n '<p>Here&apos;s a link: <a href=\"https://fedify.dev/\" target=\"_blank\">' +\n \"https://fedify.dev/</a>.</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t7.getTags(session)), []);\n assert.deepStrictEqual(t7.getCachedObjects(), []);\n\n const t8: Text<\"block\", void> = text`Here's a multiline text:\n \n${\"First line.\\nSecond line.\"}`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t8.getHtml(session))).join(\"\"),\n \"<p>Here&apos;s a multiline text:</p><p>First line.<br>Second line.</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t8.getTags(session)), []);\n assert.deepStrictEqual(t8.getCachedObjects(), []);\n\n const t9: Text<\"block\", void> =\n text`Interpolating blocks: ${text`Hello\\nworld!`} ... and ... ${text`Goodbye!`}`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t9.getHtml(session))).join(\"\"),\n \"<p>Interpolating blocks: </p><p>Hello<br>world!</p><p> ... and ... </p><p>Goodbye!</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t9.getTags(session)), []);\n assert.deepStrictEqual(t9.getCachedObjects(), []);\n\n const t10: Text<\"block\", void> =\n text`Interpolating blocks:\\n\\n${text`Hello\\nworld!`}\\n\\n... and ...\\n\\n${text`Goodbye!`}`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t10.getHtml(session))).join(\"\"),\n \"<p>Interpolating blocks:</p><p>Hello<br>world!</p><p>... and ...</p><p>Goodbye!</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t10.getTags(session)), []);\n assert.deepStrictEqual(t10.getCachedObjects(), []);\n});\n\ntest(\"mention()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const m: Text<\"inline\", void> = mention(\n new Person({\n id: new URL(\"https://example.com/users/john\"),\n preferredUsername: \"john\",\n url: new URL(\"https://example.com/@john\"),\n }),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/@john\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>john@example.com' +\n \"</span></a>\",\n );\n const tags = await Array.fromAsync(m.getTags(session));\n assert.deepStrictEqual(tags.length, 1);\n assert.ok(tags[0] instanceof Mention);\n assert.deepStrictEqual(tags[0].name, \"@john@example.com\");\n assert.deepStrictEqual(\n tags[0].href,\n new URL(\"https://example.com/users/john\"),\n );\n const cache = m.getCachedObjects();\n assert.deepStrictEqual(cache.length, 1);\n assert.ok(cache[0] instanceof Person);\n assert.deepStrictEqual(\n cache[0].id,\n new URL(\"https://example.com/users/john\"),\n );\n\n const m2: Text<\"inline\", void> = mention(\n \"Jane Doe\",\n new URL(\"https://example.com/@jane\"),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m2.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/@jane\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">Jane Doe</a>',\n );\n const tags2 = await Array.fromAsync(m2.getTags(session));\n assert.deepStrictEqual(tags2.length, 1);\n assert.ok(tags2[0] instanceof Mention);\n assert.deepStrictEqual(tags2[0].name, \"Jane Doe\");\n assert.deepStrictEqual(tags2[0].href, new URL(\"https://example.com/@jane\"));\n const cache2 = m2.getCachedObjects();\n assert.deepStrictEqual(cache2.length, 1);\n assert.ok(cache2[0] instanceof Person);\n assert.deepStrictEqual(cache2[0].id, new URL(\"https://example.com/@jane\"));\n\n const m3: Text<\"inline\", void> = mention(\n \"John Doe\",\n new Person({\n id: new URL(\"https://example.com/users/john\"),\n preferredUsername: \"john\",\n url: new URL(\"https://example.com/@john\"),\n }),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m3.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/@john\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">John Doe</a>',\n );\n const tags3 = await Array.fromAsync(m3.getTags(session));\n assert.deepStrictEqual(tags3.length, 1);\n assert.ok(tags3[0] instanceof Mention);\n assert.deepStrictEqual(tags3[0].name, \"John Doe\");\n assert.deepStrictEqual(\n tags3[0].href,\n new URL(\"https://example.com/users/john\"),\n );\n const cache3 = m3.getCachedObjects();\n assert.deepStrictEqual(cache3.length, 1);\n assert.ok(cache3[0] instanceof Person);\n assert.deepStrictEqual(\n cache3[0].id,\n new URL(\"https://example.com/users/john\"),\n );\n\n const m4: Text<\"inline\", void> = mention(\"@fedify@hollo.social\");\n assert.deepStrictEqual(\n (await Array.fromAsync(m4.getHtml(session))).join(\"\"),\n '<a href=\"https://hollo.social/@fedify\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>' +\n \"fedify@hollo.social</span></a>\",\n );\n const tags4 = await Array.fromAsync(m4.getTags(session));\n assert.deepStrictEqual(tags4.length, 1);\n assert.ok(tags4[0] instanceof Mention);\n assert.deepStrictEqual(tags4[0].name, \"@fedify@hollo.social\");\n assert.deepStrictEqual(\n tags4[0].href,\n new URL(\"https://hollo.social/@fedify\"),\n );\n const cache4 = m4.getCachedObjects();\n assert.deepStrictEqual(cache4.length, 1);\n assert.ok(cache4[0] instanceof Person);\n assert.deepStrictEqual(cache4[0].id, new URL(\"https://hollo.social/@fedify\"));\n\n const m5: Text<\"inline\", void> = mention(\n new URL(\"https://hollo.social/@fedify\"),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m5.getHtml(session))).join(\"\"),\n '<a href=\"https://hollo.social/@fedify\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>' +\n \"fedify@hollo.social</span></a>\",\n );\n const tags5 = await Array.fromAsync(m5.getTags(session));\n assert.deepStrictEqual(tags5.length, 1);\n assert.ok(tags5[0] instanceof Mention);\n assert.deepStrictEqual(tags5[0].name, \"@fedify@hollo.social\");\n assert.deepStrictEqual(\n tags5[0].href,\n new URL(\"https://hollo.social/@fedify\"),\n );\n const cache5 = m5.getCachedObjects();\n assert.deepStrictEqual(cache5.length, 1);\n assert.ok(cache5[0] instanceof Person);\n assert.deepStrictEqual(cache5[0].id, new URL(\"https://hollo.social/@fedify\"));\n\n const m6: Text<\"inline\", void> = mention(\"@bot@example.com\");\n assert.deepStrictEqual(\n (await Array.fromAsync(m6.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/ap/actor/bot\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>' +\n \"bot@example.com</span></a>\",\n );\n const tags6 = await Array.fromAsync(m6.getTags(session));\n assert.deepStrictEqual(tags6.length, 1);\n assert.ok(tags6[0] instanceof Mention);\n assert.deepStrictEqual(tags6[0].name, \"@bot@example.com\");\n assert.deepStrictEqual(\n tags6[0].href,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n const cache6 = m6.getCachedObjects();\n assert.deepStrictEqual(cache6.length, 1);\n assert.ok(cache6[0] instanceof Person);\n assert.deepStrictEqual(\n cache6[0].id,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n\n const m7: Text<\"inline\", void> = mention(\n \"Example\",\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m7.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/ap/actor/bot\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">Example</a>',\n );\n const tags7 = await Array.fromAsync(m7.getTags(session));\n assert.deepStrictEqual(tags7.length, 1);\n assert.ok(tags7[0] instanceof Mention);\n assert.deepStrictEqual(tags7[0].name, \"Example\");\n assert.deepStrictEqual(\n tags7[0].href,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n const cache7 = m7.getCachedObjects();\n assert.deepStrictEqual(cache7.length, 1);\n assert.ok(cache7[0] instanceof Person);\n assert.deepStrictEqual(\n cache7[0].id,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n\n const m8: Text<\"inline\", void> = mention(\n new Person({\n id: new URL(\"https://example.com/ap/actor/bot\"),\n preferredUsername: \"bot\",\n }),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m8.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/ap/actor/bot\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>' +\n \"bot@example.com</span></a>\",\n );\n const tags8 = await Array.fromAsync(m8.getTags(session));\n assert.deepStrictEqual(tags8.length, 1);\n assert.ok(tags8[0] instanceof Mention);\n assert.deepStrictEqual(tags8[0].name, \"@bot@example.com\");\n assert.deepStrictEqual(\n tags8[0].href,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n const cache8 = m8.getCachedObjects();\n assert.deepStrictEqual(cache8.length, 1);\n assert.ok(cache8[0] instanceof Person);\n assert.deepStrictEqual(\n cache8[0].id,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n\n const m9: Text<\"inline\", void> = mention(\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m9.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/ap/actor/bot\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>' +\n \"bot@example.com</span></a>\",\n );\n const tags9 = await Array.fromAsync(m9.getTags(session));\n assert.deepStrictEqual(tags9.length, 1);\n assert.ok(tags9[0] instanceof Mention);\n assert.deepStrictEqual(tags9[0].name, \"@bot@example.com\");\n assert.deepStrictEqual(\n tags9[0].href,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n const cache9 = m9.getCachedObjects();\n assert.deepStrictEqual(cache9.length, 1);\n assert.ok(cache9[0] instanceof Person);\n assert.deepStrictEqual(\n cache9[0].id,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n});\n\ntest(\"hashtag()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"inline\", void> = hashtag(\"Fediverse\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/tags/fediverse\" class=\"mention hashtag\" ' +\n 'rel=\"tag\" target=\"_blank\">#<span>Fediverse</span></a>',\n );\n const tags = await Array.fromAsync(t.getTags(session));\n assert.deepStrictEqual(tags.length, 1);\n assert.ok(tags[0] instanceof Hashtag);\n assert.deepStrictEqual(tags[0].name, \"#fediverse\");\n assert.deepStrictEqual(\n tags[0].href,\n new URL(\"https://example.com/tags/fediverse\"),\n );\n assert.deepStrictEqual(t.getCachedObjects(), []);\n});\n\ntest(\"em()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"inline\", void> = em(\"Hello, World\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<em>Hello, World</em>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t.getTags(session)), []);\n assert.deepStrictEqual(t.getCachedObjects(), []);\n});\n\ntest(\"strong()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"inline\", void> = strong(\"Hello, World\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<strong>Hello, World</strong>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t.getTags(session)), []);\n assert.deepStrictEqual(t.getCachedObjects(), []);\n});\n\ntest(\"link()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"inline\", void> = link(em(\"label\"), \"https://example.com/\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/\" target=\"_blank\"><em>label</em></a>',\n );\n assert.deepStrictEqual(await Array.fromAsync(t.getTags(session)), []);\n assert.deepStrictEqual(t.getCachedObjects(), []);\n\n const t2: Text<\"inline\", void> = link(\"label\", \"https://example.com/\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t2.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/\" target=\"_blank\">label</a>',\n );\n assert.deepStrictEqual(await Array.fromAsync(t2.getTags(session)), []);\n assert.deepStrictEqual(t2.getCachedObjects(), []);\n\n const t3: Text<\"inline\", void> = link(\"https://example.com/\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t3.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/\" target=\"_blank\">https://example.com/</a>',\n );\n assert.deepStrictEqual(await Array.fromAsync(t3.getTags(session)), []);\n assert.deepStrictEqual(t3.getCachedObjects(), []);\n\n const t4: Text<\"inline\", void> = link(em(\"label\"), \"https://example.com/\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t4.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/\" target=\"_blank\"><em>label</em></a>',\n );\n assert.deepStrictEqual(await Array.fromAsync(t4.getTags(session)), []);\n assert.deepStrictEqual(t4.getCachedObjects(), []);\n});\n\ntest(\"code()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"inline\", void> = code(\"a + b\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<code>a + b</code>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t.getTags(session)), []);\n assert.deepStrictEqual(t.getCachedObjects(), []);\n});\n\ntest(\"markdown()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const md = `Here's a Markdown text.\n\n- I can have a list.\n- I can have a **bold** text.\n- I can have an _italic_ text.\n- I can mention @fedify@hollo.social.\n- I can tag #Hashtag.`;\n const t: Text<\"block\", void> = markdown(md);\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<p>Here's a Markdown text.</p>\\n<ul>\\n\" +\n \"<li>I can have a list.</li>\\n\" +\n \"<li>I can have a <strong>bold</strong> text.</li>\\n\" +\n \"<li>I can have an <em>italic</em> text.</li>\\n\" +\n \"<li>I can mention \" +\n '<a translate=\"no\" class=\"h-card u-url mention\" target=\"_blank\" href=\"https://hollo.social/@fedify\">' +\n '<span class=\"at\">@</span><span class=\"user\">fedify</span>' +\n '<span class=\"at\">@</span><span class=\"domain\">hollo.social</span></a>.</li>\\n' +\n '<li>I can tag <a class=\"mention hashtag\" rel=\"tag\" target=\"_blank\" href=\"https://example.com/tags/hashtag\">#<span>Hashtag</span></a>.</li>\\n' +\n \"</ul>\\n\",\n );\n const tags = await Array.fromAsync(t.getTags(session));\n assert.deepStrictEqual(tags.length, 2);\n assert.ok(tags[0] instanceof Mention);\n assert.deepStrictEqual(tags[0].name, \"@fedify@hollo.social\");\n assert.deepStrictEqual(tags[0].href, new URL(\"https://hollo.social/@fedify\"));\n assert.ok(tags[1] instanceof Hashtag);\n assert.deepStrictEqual(tags[1].name, \"#hashtag\");\n assert.deepStrictEqual(\n tags[1].href,\n new URL(\"https://example.com/tags/hashtag\"),\n );\n const cache = t.getCachedObjects();\n assert.deepStrictEqual(cache.length, 1);\n assert.ok(cache[0] instanceof Person);\n assert.deepStrictEqual(cache[0].id, new URL(\"https://hollo.social/@fedify\"));\n\n const t2: Text<\"block\", void> = markdown(\"@fedify@hollo.social\", {\n mentions: false,\n });\n assert.deepStrictEqual(\n (await Array.fromAsync(t2.getHtml(session))).join(\"\"),\n \"<p>@fedify@hollo.social</p>\\n\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t2.getTags(session)), []);\n assert.deepStrictEqual(t2.getCachedObjects(), []);\n\n const t3: Text<\"block\", void> = markdown(\"@bot@example.com\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t3.getHtml(session))).join(\"\"),\n '<p><a translate=\"no\" class=\"h-card u-url mention\" target=\"_blank\" href=\"https://example.com/ap/actor/bot\">' +\n '<span class=\"at\">@</span><span class=\"user\">bot</span>' +\n '<span class=\"at\">@</span><span class=\"domain\">example.com</span></a></p>\\n',\n );\n const tags3 = await Array.fromAsync(t3.getTags(session));\n assert.deepStrictEqual(tags3.length, 1);\n assert.ok(tags3[0] instanceof Mention);\n assert.deepStrictEqual(tags3[0].name, \"@bot@example.com\");\n assert.deepStrictEqual(\n tags3[0].href,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n const cache3 = t3.getCachedObjects();\n assert.deepStrictEqual(cache3.length, 1);\n assert.ok(cache3[0] instanceof Person);\n assert.deepStrictEqual(\n cache3[0].id,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n});\n\ndescribe(\"customEmoji(), CustomEmojiText\", () => {\n const localBot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n username: \"bot\",\n });\n const session = localBot.getSession(\"https://example.com\");\n const emojiData: CustomEmoji = {\n type: \"image/png\",\n url: \"https://example.com/emoji.png\",\n };\n const deferredEmoji = localBot.addCustomEmoji(\"testEmoji\", emojiData);\n const emojiObject = deferredEmoji(session); // Get the Emoji object\n\n test(\"customEmoji() function\", () => {\n const emojiText = customEmoji<void>(deferredEmoji);\n assert.ok(emojiText instanceof CustomEmojiText);\n assert.deepStrictEqual(\n (emojiText as CustomEmojiText<void>).getEmoji(session),\n emojiObject,\n );\n\n const emojiTextDirect = customEmoji<void>(emojiObject);\n assert.ok(emojiTextDirect instanceof CustomEmojiText);\n assert.deepStrictEqual(\n (emojiTextDirect as CustomEmojiText<void>).getEmoji(session),\n emojiObject,\n );\n });\n\n test(\"CustomEmojiText.getHtml()\", async () => {\n const emojiText = new CustomEmojiText(deferredEmoji);\n assert.deepStrictEqual(\n (await Array.fromAsync(emojiText.getHtml(session))).join(\"\"),\n \"\\u200b:testEmoji:\\u200b\", // Zero-width spaces around name\n );\n\n // Test with Emoji object directly\n const emojiTextDirect = new CustomEmojiText<void>(emojiObject);\n assert.deepStrictEqual(\n (await Array.fromAsync(emojiTextDirect.getHtml(session))).join(\"\"),\n \"\\u200b:testEmoji:\\u200b\",\n );\n\n // Test with emoji without name\n const emojiNoName = new Emoji({\n id: new URL(\"https://example.com/ap/emoji/noname\"),\n icon: new Image({ url: new URL(\"https://example.com/noname.png\") }),\n });\n const emojiTextNoName = new CustomEmojiText<void>(emojiNoName);\n assert.deepStrictEqual(\n (await Array.fromAsync(emojiTextNoName.getHtml(session))).join(\"\"),\n \"\",\n );\n });\n\n test(\"CustomEmojiText.getTags()\", async () => {\n const emojiText = new CustomEmojiText(deferredEmoji);\n const tags = await Array.fromAsync(emojiText.getTags(session));\n assert.deepStrictEqual(tags.length, 1);\n assert.ok(tags[0] instanceof Emoji);\n assert.deepStrictEqual(tags[0].id, emojiObject.id);\n assert.deepStrictEqual(tags[0].name, emojiObject.name);\n\n // Test with Emoji object directly\n const emojiTextDirect = new CustomEmojiText<void>(emojiObject);\n const tagsDirect = await Array.fromAsync(emojiTextDirect.getTags(session));\n assert.deepStrictEqual(tagsDirect.length, 1);\n assert.deepStrictEqual(tagsDirect[0], emojiObject);\n });\n\n test(\"CustomEmojiText.getCachedObjects()\", () => {\n const emojiText = new CustomEmojiText(deferredEmoji);\n assert.deepStrictEqual(emojiText.getCachedObjects(), []); // CustomEmojiText doesn't cache objects itself\n\n const emojiTextDirect = new CustomEmojiText(emojiObject);\n assert.deepStrictEqual(emojiTextDirect.getCachedObjects(), []);\n });\n});\n\ntest(\"customEmoji()\", async () => {\n const localBot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n username: \"bot\",\n });\n const session = localBot.getSession(\"https://example.com\");\n const emojiData1: CustomEmoji = {\n type: \"image/png\",\n url: \"https://example.com/emoji1.png\",\n };\n const emojiData2: CustomEmoji = {\n type: \"image/gif\",\n file: \"/path/to/emoji2.gif\",\n };\n const deferredEmoji1 = localBot.addCustomEmoji(\"emoji1\", emojiData1);\n const deferredEmoji2 = localBot.addCustomEmoji(\"emoji2\", emojiData2);\n const emojiObject1 = deferredEmoji1(session);\n const emojiObject2 = deferredEmoji2(session);\n\n const t = text<void>`Hello ${customEmoji(deferredEmoji1)} world ${\n customEmoji(emojiObject2)\n }!`;\n\n // Test getHtml()\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<p>Hello \\u200b:emoji1:\\u200b world \\u200b:emoji2:\\u200b!</p>\",\n );\n\n // Test getTags()\n const tags = await Array.fromAsync(t.getTags(session));\n assert.deepStrictEqual(tags.length, 2);\n assert.ok(tags[0] instanceof Emoji);\n assert.deepStrictEqual(tags[0].id, emojiObject1.id);\n assert.ok(tags[1] instanceof Emoji);\n assert.deepStrictEqual(tags[1].id, emojiObject2.id);\n\n // Test getCachedObjects()\n assert.deepStrictEqual(t.getCachedObjects(), []); // TemplatedText itself doesn't cache, relies on children\n});\n\n// cSpell: ignore apos\n"],"mappings":"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"}
1
+ {"version":3,"file":"text.test.js","names":["url: string","keyPair: CryptoKeyPair","bot: BotWithVoidContextData","origin: string | URL | Context<void>","_contextData?: void","_req: Request","_emojis: Record<TEmojiName, CustomEmoji>","t: Text<\"block\", void>","m: Text<\"inline\", void>","t2: Text<\"block\", void>","t3: Text<\"block\", void>","t4: Text<\"block\", void>","t5: Text<\"block\", void>","t6: Text<\"block\", void>","t7: Text<\"block\", void>","t8: Text<\"block\", void>","t9: Text<\"block\", void>","t10: Text<\"block\", void>","m2: Text<\"inline\", void>","m3: Text<\"inline\", void>","m4: Text<\"inline\", void>","m5: Text<\"inline\", void>","m6: Text<\"inline\", void>","m7: Text<\"inline\", void>","m8: Text<\"inline\", void>","m9: Text<\"inline\", void>","t: Text<\"inline\", void>","t2: Text<\"inline\", void>","t3: Text<\"inline\", void>","t4: Text<\"inline\", void>","emojiData: CustomEmoji","emojiData1: CustomEmoji","emojiData2: CustomEmoji"],"sources":["../src/text.test.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025 Hong Minhee <https://hongminhee.org/>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as\n// published by the Free Software Foundation, either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <https://www.gnu.org/licenses/>.\nimport {\n type Context,\n createFederation,\n MemoryKvStore,\n} from \"@fedify/fedify/federation\";\nimport { getDocumentLoader } from \"@fedify/vocab-runtime\";\nimport { importJwk } from \"@fedify/fedify/sig\";\nimport { Emoji, Hashtag, Image, Mention, Person } from \"@fedify/vocab\";\nimport assert from \"node:assert\";\nimport { describe, test } from \"node:test\";\nimport { BotImpl } from \"./bot-impl.ts\";\nimport type { BotWithVoidContextData } from \"./bot.ts\";\nimport type { CustomEmoji, DeferredCustomEmoji } from \"./emoji.ts\";\nimport type { Session } from \"./session.ts\";\nimport {\n code,\n customEmoji,\n CustomEmojiText,\n em,\n hashtag,\n isText,\n link,\n markdown,\n mention,\n mentions,\n strong,\n type Text,\n text,\n} from \"./text.ts\";\n\nconst defaultDocumentLoader = getDocumentLoader();\nconst customDocumentLoader = (url: string) => {\n const parsed = new URL(url);\n if (parsed.host !== \"example.com\") {\n return defaultDocumentLoader(url);\n }\n const document = {\n \"@context\": \"https://www.w3.org/ns/activitystreams\",\n type: \"Person\",\n id: url,\n preferredUsername: url.split(\"/\").at(-1),\n url,\n };\n return Promise.resolve({\n document,\n documentUrl: url,\n contextUrl: null,\n });\n};\n\nconst federation = createFederation<void>({\n kv: new MemoryKvStore(),\n documentLoaderFactory() {\n return customDocumentLoader;\n },\n authenticatedDocumentLoaderFactory() {\n return customDocumentLoader;\n },\n});\n\nconst keyPair: CryptoKeyPair = {\n privateKey: await importJwk({\n kty: \"RSA\",\n alg: \"RS256\",\n // cSpell: disable\n n: \"15DAu9S9sROZ_NonfZm5S0PSeYuh2POeo0cpvvGnp_T9jQWjMuGdhwOPT7OOD9N-R1IY-2hXkk-RjfWNzbxMoNKvOpz_1MHRg18W5Lw60mIxZFztLKlNhOZS7rVrlJc--jj1wLETEfY5ocYCyRZm25UeT_Q1JSePdnhEGVXo4sSqoUcMV5Bgys5PlISfQj_bHDpcIi9snJ70hOzYTy7k7fNuCHHsK08DN4bZMG58qQNrPFtZW6fgpQiu0kgtUBFgQu-uUNn1h0io-7OhMU2dXeV8lwCILhIFRvrRV9vKQydBejbyYuzFY-Xq98biB9Aox8GD0jJE4tTVj6CpsmaN9yq6nI8ibWjnk87IKdU3jex5zB8chR0cm2tyIWr6dKhCTexmtYTF0pGW7PZ2Dnn31BU3cPkrkplu752D4eQ47BsAspMsHRxXE3NtqlmN02Y-6AIzt1tuPBPHldQHUpxtGrwFh9b9biC2mtb_w6F0oyxVyZsAZnuK2tN0-uX_iMPoC5VLnPrzgWjQiMArivg4u1cQ35hrvuFYFAdNf2WaBDyDNxaCoTD28z9bF1titlbQ48tDw0adZ1Zp8_x12JqA5HNpqDfmyT4KPU_6Ag7J7cGfGeO2vsjcc1oGhqZ-n6JlnSvVImHS5eKC6CDhW7ceuKC_oX-XPWWQQHhPniwM2RE\",\n e: \"AQAB\",\n d: \"eAD5ipdQUrfazcyUl3Nwl9nV3hxBqYlWEweW0dmtv-6_CDbPN5AqJfNxYKlQuLbAYevuRGc9-RGasjC1FIdzEUS4kCS-ty5--GeDUysGhABuBrVEw8wsf4PJP2J31WytfpcfGHp7Z1BvnQOioVd7Q1qsWU5WF60CTK1_G6ubzkI1yzrGQCj7-WsJGmEKV9M8o2ZJzC4ihL5o2WcQtGQixeTyqHjjROjjnZHQbwnTFDP3Cs6_3CqFANrol9_eeehyclED9bag3QMyL408ezn-FTugNF_zb9JQZcdTq1mMK_46kVLtdOzipk5klDN_uWHEkg_E1sttVemuShri3ZICDUSd70Y4VeQxNLUKJNBSYdSLmcVgfIHaXMmcrknmBuz23SrGR6JZR4DSJtr3sylR2tlOxpZhJAUZf17f8aZD7EnbR7qcNtjZmf8RyAKrEXLgL6f3jm6FfE_b027kcmLMXL7bJtlTBYnM9MrBnXSsJftHRrmB1Xe-0Hq24Q7ctrhRhFF3Ij8MjNRjdn6NWdIXzltreblLEO44iTJtlWeYtg-C9566F_yWZnjDZEQ8nvBhpCM3iXlRfzhlEebBoBbf-Mf-0hJRRUL3EtGuMueylzeyk4tTzvOfK2FUnVAi8bIhjz4m8RhN7kC4ubqUXZbKwzjeI1dhWyfDphrPiRtCetE\",\n p: \"_4BmuvmlMZmiD_uGE__iWIHizMe4Ay34WOSNAm0uhjfNgWpWHdxosQQeSehBE8x_CwJGKbCl69ewmEAOYnP3KYpytvcHVEMO7XQAE66p_19PzIy95WY6CR20CFXUykzQ_6gE_nFB39rxcxprxAqaNEGM2PtwpiTSwoyZFWkgSE6O6rwv03vNAMeib3CZU3kdg4mHiZAryk9U6uphZ_lJ2wOSMX_SHkcEAwePoae8E_jIJ0drfIkyR5pSkghThjHIv95hcHuuDodm2W9e7sppv3EpjE81ANKEfkrrauDfX9BrRDC-14hhCK7t7bYJ9bj49nmSSLmLHNw1W2eyvvAHEw\",\n q: \"1_xoQ6UBnAsql-87v7UddCiJEppk9LkfYb-DBEtBHbTFDvxbE0Px7ooNevgwlMDmi6t4hSkQZEwF5sLFHv1-fNFtpwVGzqu6ekXYfw0FxWRVjJTh5e91G3mOMVprGvgSMk3PRO33dBAhA6MMGIMi72XCGWNpy7ajfawYdpeMO6k6aC93jT9RmoaB_UmwyM2lmzaWP9RKInJ6t_i-eFm05_0qkPdPdg5b3HbNpKyAMLVxA8DAauHvcCx9CsAZ8ZbvL-mC5AX7v7B9iovXCStHpfA5f73M7AGFGRZpt51mvx8pxHVwF2tW6h03HEBz5BX-9YMTaepH369CRovGo4Jvyw\",\n dp:\n \"hlBlsN0T7mMpQuWisljOEGEXbTeAkItWBsT_K8thrcUgD2xrIP-BOa1Eju29aD8UeiET6U6nqreUajUiWrdDs17It05dV_p4mnNkpvQnAcyFEq7aFQIMeEZZIhic6ExBgmQ9W9UGIDvkufGlvUUlk1ryRA7KRU0OTp_CyfKdueUyVEvhiHeIaWSJC7RRpgQBc-iUi8hyfMP_jA7ybcoq_St_au4a8ze58C3FX-HhiU47SgrNgoZNHD8QMRyXa_A37EVnS854zcJ4Ws2lRjq6JJ3EjbIF1wzUAeA4qdLVGnViLlLBwGQ9PmdXRKNx0O8QUeHO-NQxQVax5f85hA6CaQ\",\n dq:\n \"MVKMpNXrlizeny-cn1zGyx3un3bukwwrZHENhE-DITuEvLVYPwAHIYgZJ_nBblbWzxJrRU1pVt4dguL7jOYqmmpg9gE4eD2zKfUFSY45wSf2eVIOfCnAvnN1y0Nwrgn0bdRi_sSw-6orP99eBcL8mVrNhmqzYDfnAe3o8DwPZBhzJBOi43iQNA9_Y84ONuzvYpCGozDhdRhbeeOt62Hg9BFWRSCU3srMo33l3DMgWv80Pb0os7_ApAckzu2rfwYOvQxAPb44DUBKivcANjHR_Mzs9ITtZP-720zI-4tQSVjeeuSuokp64J-nVCZL0MxNGtfB-S_tFeG56s5EoFZLHQ\",\n qi:\n \"1J7CfWYlg4Igsu2N7bhgLzbc1l6A3odyyOlM70uH8P41kCYgpRDdH8Ms8yOJE-F13ha5drICZqsD7IjgG0cZONJ_0xTeka0AYMvCwjuJZ_4CzVFYNICxSHFUI-sCu1p-zb70eXU6fiwOFgzoPbnrwywpbxcTV_8H0XszwPcI3fjrGk6N-hi23Ur1gIjhnri_-x8mzwmtPA1ID1G17U4X93mP7dlYCzGigq8ORbSdZthOKdjtHXITBOgpcTiuyTTwAEqh3xyXscfsgzi0X6olBevJCGeTzOrqQX026JmNVykaS1-o_ea_Y0cD0q6Nxd5TwLZMCLZi1M5PLHhGlJg9MQ\",\n // cSpell: enable\n key_ops: [\"sign\"],\n ext: true,\n }, \"private\"),\n publicKey: await importJwk({\n kty: \"RSA\",\n alg: \"RS256\",\n // cSpell: disable\n n: \"15DAu9S9sROZ_NonfZm5S0PSeYuh2POeo0cpvvGnp_T9jQWjMuGdhwOPT7OOD9N-R1IY-2hXkk-RjfWNzbxMoNKvOpz_1MHRg18W5Lw60mIxZFztLKlNhOZS7rVrlJc--jj1wLETEfY5ocYCyRZm25UeT_Q1JSePdnhEGVXo4sSqoUcMV5Bgys5PlISfQj_bHDpcIi9snJ70hOzYTy7k7fNuCHHsK08DN4bZMG58qQNrPFtZW6fgpQiu0kgtUBFgQu-uUNn1h0io-7OhMU2dXeV8lwCILhIFRvrRV9vKQydBejbyYuzFY-Xq98biB9Aox8GD0jJE4tTVj6CpsmaN9yq6nI8ibWjnk87IKdU3jex5zB8chR0cm2tyIWr6dKhCTexmtYTF0pGW7PZ2Dnn31BU3cPkrkplu752D4eQ47BsAspMsHRxXE3NtqlmN02Y-6AIzt1tuPBPHldQHUpxtGrwFh9b9biC2mtb_w6F0oyxVyZsAZnuK2tN0-uX_iMPoC5VLnPrzgWjQiMArivg4u1cQ35hrvuFYFAdNf2WaBDyDNxaCoTD28z9bF1titlbQ48tDw0adZ1Zp8_x12JqA5HNpqDfmyT4KPU_6Ag7J7cGfGeO2vsjcc1oGhqZ-n6JlnSvVImHS5eKC6CDhW7ceuKC_oX-XPWWQQHhPniwM2RE\",\n e: \"AQAB\",\n // cSpell: enable\n key_ops: [\"verify\"],\n ext: true,\n }, \"public\"),\n};\n\nfederation.setActorDispatcher(\"/ap/actor/{identifier}\", (ctx, identifier) => {\n return new Person({\n id: ctx.getActorUri(identifier),\n preferredUsername: identifier,\n });\n}).setKeyPairsDispatcher((_ctx, _identifier) => {\n return [keyPair];\n});\n\nconst bot: BotWithVoidContextData = {\n federation,\n identifier: \"bot\",\n getSession(origin: string | URL | Context<void>, _contextData?: void) {\n const ctx = typeof origin === \"string\" || origin instanceof URL\n ? federation.createContext(new URL(origin))\n : origin;\n return {\n bot,\n context: ctx,\n actorId: ctx.getActorUri(bot.identifier),\n actorHandle: `@bot@${ctx.host}` as const,\n getActor() {\n const actor = new Person({\n id: ctx.getActorUri(bot.identifier),\n preferredUsername: \"bot\",\n });\n return Promise.resolve(actor);\n },\n follow() {\n throw new Error(\"Not implemented\");\n },\n unfollow() {\n throw new Error(\"Not implemented\");\n },\n follows() {\n throw new Error(\"Not implemented\");\n },\n publish() {\n throw new Error(\"Not implemented\");\n },\n republishProfile() {\n throw new Error(\"Not implemented\");\n },\n getOutbox() {\n throw new Error(\"Not implemented\");\n },\n } satisfies Session<void>;\n },\n fetch(_req: Request) {\n return Promise.resolve(new Response());\n },\n addCustomEmojis<TEmojiName extends string>(\n _emojis: Record<TEmojiName, CustomEmoji>,\n ): Record<TEmojiName, DeferredCustomEmoji<void>> {\n return {} as Record<TEmojiName, DeferredCustomEmoji<void>>;\n },\n};\n\ntest(\"isText()\", () => {\n const t = text`Hello, World`;\n assert.ok(isText(t));\n const t2 = em(\"Hello, World\");\n assert.ok(isText(t2));\n assert.deepStrictEqual(isText(\"Hello, World\"), false);\n});\n\ntest(\"mentions()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const actor = new URL(\"https://hollo.social/@fedify\");\n const actor2 = new URL(\"https://example.com/users/john\");\n const actor3 = new Person({ id: actor });\n const t: Text<\"block\", void> = text`Hello, world!`;\n assert.deepStrictEqual(await mentions(session, t, actor), false);\n assert.deepStrictEqual(await mentions(session, t, actor2), false);\n assert.deepStrictEqual(await mentions(session, t, actor3), false);\n\n const m: Text<\"inline\", void> = mention(actor);\n assert.ok(await mentions(session, m, actor));\n assert.deepStrictEqual(await mentions(session, m, actor2), false);\n assert.ok(await mentions(session, m, actor3));\n});\n\ntest(\"text`...`\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"block\", void> = text`Hello, <${123}>`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<p>Hello, &lt;123&gt;</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t.getTags(session)), []);\n assert.deepStrictEqual(t.getCachedObjects(), []);\n\n const t2: Text<\"block\", void> = text`Hello, ${em(\"World\")}`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t2.getHtml(session))).join(\"\"),\n \"<p>Hello, <em>World</em></p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t2.getTags(session)), []);\n assert.deepStrictEqual(t2.getCachedObjects(), []);\n\n const actor = new Person({\n id: new URL(\"https://example.com/users/john\"),\n preferredUsername: \"john\",\n url: new URL(\"https://example.com/@john\"),\n });\n const t3: Text<\"block\", void> = text`Hello, ${mention(actor)}`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t3.getHtml(session))).join(\"\"),\n '<p>Hello, <a href=\"https://example.com/@john\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>john@example.com' +\n \"</span></a></p>\",\n );\n const tags3 = await Array.fromAsync(t3.getTags(session));\n assert.deepStrictEqual(tags3.length, 1);\n assert.ok(tags3[0] instanceof Mention);\n assert.deepStrictEqual(tags3[0].name, \"@john@example.com\");\n assert.deepStrictEqual(\n tags3[0].href,\n new URL(\"https://example.com/users/john\"),\n );\n const cache3 = t3.getCachedObjects();\n assert.deepStrictEqual(cache3.length, 1);\n assert.ok(cache3[0] instanceof Person);\n assert.deepStrictEqual(\n cache3[0].id,\n new URL(\"https://example.com/users/john\"),\n );\n\n const t4: Text<\"block\", void> = text`Hello\\nworld!`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t4.getHtml(session))).join(\"\"),\n \"<p>Hello<br>world!</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t4.getTags(session)), []);\n assert.deepStrictEqual(t4.getCachedObjects(), []);\n\n const t5: Text<\"block\", void> =\n text`Hello\\nworld!\\n\\nGoodbye!\\n\\t\\n \\nHello!`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t5.getHtml(session))).join(\"\"),\n \"<p>Hello<br>world!</p><p>Goodbye!</p><p>Hello!</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t5.getTags(session)), []);\n assert.deepStrictEqual(t5.getCachedObjects(), []);\n\n const t6: Text<\"block\", void> = text`\\n\\n\\nHello\\nworld\\n\\n\\nGoodbye!\\n`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t6.getHtml(session))).join(\"\"),\n \"<p>Hello<br>world</p><p>Goodbye!</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t6.getTags(session)), []);\n assert.deepStrictEqual(t6.getCachedObjects(), []);\n\n const t7: Text<\"block\", void> = text`Here's a link: ${new URL(\n \"https://fedify.dev/\",\n )}.`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t7.getHtml(session))).join(\"\"),\n '<p>Here&apos;s a link: <a href=\"https://fedify.dev/\" target=\"_blank\">' +\n \"https://fedify.dev/</a>.</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t7.getTags(session)), []);\n assert.deepStrictEqual(t7.getCachedObjects(), []);\n\n const t8: Text<\"block\", void> = text`Here's a multiline text:\n \n${\"First line.\\nSecond line.\"}`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t8.getHtml(session))).join(\"\"),\n \"<p>Here&apos;s a multiline text:</p><p>First line.<br>Second line.</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t8.getTags(session)), []);\n assert.deepStrictEqual(t8.getCachedObjects(), []);\n\n const t9: Text<\"block\", void> =\n text`Interpolating blocks: ${text`Hello\\nworld!`} ... and ... ${text`Goodbye!`}`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t9.getHtml(session))).join(\"\"),\n \"<p>Interpolating blocks: </p><p>Hello<br>world!</p><p> ... and ... </p><p>Goodbye!</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t9.getTags(session)), []);\n assert.deepStrictEqual(t9.getCachedObjects(), []);\n\n const t10: Text<\"block\", void> =\n text`Interpolating blocks:\\n\\n${text`Hello\\nworld!`}\\n\\n... and ...\\n\\n${text`Goodbye!`}`;\n assert.deepStrictEqual(\n (await Array.fromAsync(t10.getHtml(session))).join(\"\"),\n \"<p>Interpolating blocks:</p><p>Hello<br>world!</p><p>... and ...</p><p>Goodbye!</p>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t10.getTags(session)), []);\n assert.deepStrictEqual(t10.getCachedObjects(), []);\n});\n\ntest(\"mention()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const m: Text<\"inline\", void> = mention(\n new Person({\n id: new URL(\"https://example.com/users/john\"),\n preferredUsername: \"john\",\n url: new URL(\"https://example.com/@john\"),\n }),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/@john\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>john@example.com' +\n \"</span></a>\",\n );\n const tags = await Array.fromAsync(m.getTags(session));\n assert.deepStrictEqual(tags.length, 1);\n assert.ok(tags[0] instanceof Mention);\n assert.deepStrictEqual(tags[0].name, \"@john@example.com\");\n assert.deepStrictEqual(\n tags[0].href,\n new URL(\"https://example.com/users/john\"),\n );\n const cache = m.getCachedObjects();\n assert.deepStrictEqual(cache.length, 1);\n assert.ok(cache[0] instanceof Person);\n assert.deepStrictEqual(\n cache[0].id,\n new URL(\"https://example.com/users/john\"),\n );\n\n const m2: Text<\"inline\", void> = mention(\n \"Jane Doe\",\n new URL(\"https://example.com/@jane\"),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m2.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/@jane\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">Jane Doe</a>',\n );\n const tags2 = await Array.fromAsync(m2.getTags(session));\n assert.deepStrictEqual(tags2.length, 1);\n assert.ok(tags2[0] instanceof Mention);\n assert.deepStrictEqual(tags2[0].name, \"Jane Doe\");\n assert.deepStrictEqual(tags2[0].href, new URL(\"https://example.com/@jane\"));\n const cache2 = m2.getCachedObjects();\n assert.deepStrictEqual(cache2.length, 1);\n assert.ok(cache2[0] instanceof Person);\n assert.deepStrictEqual(cache2[0].id, new URL(\"https://example.com/@jane\"));\n\n const m3: Text<\"inline\", void> = mention(\n \"John Doe\",\n new Person({\n id: new URL(\"https://example.com/users/john\"),\n preferredUsername: \"john\",\n url: new URL(\"https://example.com/@john\"),\n }),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m3.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/@john\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">John Doe</a>',\n );\n const tags3 = await Array.fromAsync(m3.getTags(session));\n assert.deepStrictEqual(tags3.length, 1);\n assert.ok(tags3[0] instanceof Mention);\n assert.deepStrictEqual(tags3[0].name, \"John Doe\");\n assert.deepStrictEqual(\n tags3[0].href,\n new URL(\"https://example.com/users/john\"),\n );\n const cache3 = m3.getCachedObjects();\n assert.deepStrictEqual(cache3.length, 1);\n assert.ok(cache3[0] instanceof Person);\n assert.deepStrictEqual(\n cache3[0].id,\n new URL(\"https://example.com/users/john\"),\n );\n\n const m4: Text<\"inline\", void> = mention(\"@fedify@hollo.social\");\n assert.deepStrictEqual(\n (await Array.fromAsync(m4.getHtml(session))).join(\"\"),\n '<a href=\"https://hollo.social/@fedify\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>' +\n \"fedify@hollo.social</span></a>\",\n );\n const tags4 = await Array.fromAsync(m4.getTags(session));\n assert.deepStrictEqual(tags4.length, 1);\n assert.ok(tags4[0] instanceof Mention);\n assert.deepStrictEqual(tags4[0].name, \"@fedify@hollo.social\");\n assert.deepStrictEqual(\n tags4[0].href,\n new URL(\"https://hollo.social/@fedify\"),\n );\n const cache4 = m4.getCachedObjects();\n assert.deepStrictEqual(cache4.length, 1);\n assert.ok(cache4[0] instanceof Person);\n assert.deepStrictEqual(cache4[0].id, new URL(\"https://hollo.social/@fedify\"));\n\n const m5: Text<\"inline\", void> = mention(\n new URL(\"https://hollo.social/@fedify\"),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m5.getHtml(session))).join(\"\"),\n '<a href=\"https://hollo.social/@fedify\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>' +\n \"fedify@hollo.social</span></a>\",\n );\n const tags5 = await Array.fromAsync(m5.getTags(session));\n assert.deepStrictEqual(tags5.length, 1);\n assert.ok(tags5[0] instanceof Mention);\n assert.deepStrictEqual(tags5[0].name, \"@fedify@hollo.social\");\n assert.deepStrictEqual(\n tags5[0].href,\n new URL(\"https://hollo.social/@fedify\"),\n );\n const cache5 = m5.getCachedObjects();\n assert.deepStrictEqual(cache5.length, 1);\n assert.ok(cache5[0] instanceof Person);\n assert.deepStrictEqual(cache5[0].id, new URL(\"https://hollo.social/@fedify\"));\n\n const m6: Text<\"inline\", void> = mention(\"@bot@example.com\");\n assert.deepStrictEqual(\n (await Array.fromAsync(m6.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/ap/actor/bot\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>' +\n \"bot@example.com</span></a>\",\n );\n const tags6 = await Array.fromAsync(m6.getTags(session));\n assert.deepStrictEqual(tags6.length, 1);\n assert.ok(tags6[0] instanceof Mention);\n assert.deepStrictEqual(tags6[0].name, \"@bot@example.com\");\n assert.deepStrictEqual(\n tags6[0].href,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n const cache6 = m6.getCachedObjects();\n assert.deepStrictEqual(cache6.length, 1);\n assert.ok(cache6[0] instanceof Person);\n assert.deepStrictEqual(\n cache6[0].id,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n\n const m7: Text<\"inline\", void> = mention(\n \"Example\",\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m7.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/ap/actor/bot\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">Example</a>',\n );\n const tags7 = await Array.fromAsync(m7.getTags(session));\n assert.deepStrictEqual(tags7.length, 1);\n assert.ok(tags7[0] instanceof Mention);\n assert.deepStrictEqual(tags7[0].name, \"Example\");\n assert.deepStrictEqual(\n tags7[0].href,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n const cache7 = m7.getCachedObjects();\n assert.deepStrictEqual(cache7.length, 1);\n assert.ok(cache7[0] instanceof Person);\n assert.deepStrictEqual(\n cache7[0].id,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n\n const m8: Text<\"inline\", void> = mention(\n new Person({\n id: new URL(\"https://example.com/ap/actor/bot\"),\n preferredUsername: \"bot\",\n }),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m8.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/ap/actor/bot\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>' +\n \"bot@example.com</span></a>\",\n );\n const tags8 = await Array.fromAsync(m8.getTags(session));\n assert.deepStrictEqual(tags8.length, 1);\n assert.ok(tags8[0] instanceof Mention);\n assert.deepStrictEqual(tags8[0].name, \"@bot@example.com\");\n assert.deepStrictEqual(\n tags8[0].href,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n const cache8 = m8.getCachedObjects();\n assert.deepStrictEqual(cache8.length, 1);\n assert.ok(cache8[0] instanceof Person);\n assert.deepStrictEqual(\n cache8[0].id,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n\n const m9: Text<\"inline\", void> = mention(\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(m9.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/ap/actor/bot\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>' +\n \"bot@example.com</span></a>\",\n );\n const tags9 = await Array.fromAsync(m9.getTags(session));\n assert.deepStrictEqual(tags9.length, 1);\n assert.ok(tags9[0] instanceof Mention);\n assert.deepStrictEqual(tags9[0].name, \"@bot@example.com\");\n assert.deepStrictEqual(\n tags9[0].href,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n const cache9 = m9.getCachedObjects();\n assert.deepStrictEqual(cache9.length, 1);\n assert.ok(cache9[0] instanceof Person);\n assert.deepStrictEqual(\n cache9[0].id,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n});\n\ntest(\"hashtag()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"inline\", void> = hashtag(\"Fediverse\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/tags/fediverse\" class=\"mention hashtag\" ' +\n 'rel=\"tag\" target=\"_blank\">#<span>Fediverse</span></a>',\n );\n const tags = await Array.fromAsync(t.getTags(session));\n assert.deepStrictEqual(tags.length, 1);\n assert.ok(tags[0] instanceof Hashtag);\n assert.deepStrictEqual(tags[0].name, \"#fediverse\");\n assert.deepStrictEqual(\n tags[0].href,\n new URL(\"https://example.com/tags/fediverse\"),\n );\n assert.deepStrictEqual(t.getCachedObjects(), []);\n});\n\ntest(\"em()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"inline\", void> = em(\"Hello, World\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<em>Hello, World</em>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t.getTags(session)), []);\n assert.deepStrictEqual(t.getCachedObjects(), []);\n});\n\ntest(\"strong()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"inline\", void> = strong(\"Hello, World\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<strong>Hello, World</strong>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t.getTags(session)), []);\n assert.deepStrictEqual(t.getCachedObjects(), []);\n});\n\ntest(\"link()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"inline\", void> = link(em(\"label\"), \"https://example.com/\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/\" target=\"_blank\"><em>label</em></a>',\n );\n assert.deepStrictEqual(await Array.fromAsync(t.getTags(session)), []);\n assert.deepStrictEqual(t.getCachedObjects(), []);\n\n const t2: Text<\"inline\", void> = link(\"label\", \"https://example.com/\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t2.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/\" target=\"_blank\">label</a>',\n );\n assert.deepStrictEqual(await Array.fromAsync(t2.getTags(session)), []);\n assert.deepStrictEqual(t2.getCachedObjects(), []);\n\n const t3: Text<\"inline\", void> = link(\"https://example.com/\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t3.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/\" target=\"_blank\">https://example.com/</a>',\n );\n assert.deepStrictEqual(await Array.fromAsync(t3.getTags(session)), []);\n assert.deepStrictEqual(t3.getCachedObjects(), []);\n\n const t4: Text<\"inline\", void> = link(em(\"label\"), \"https://example.com/\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t4.getHtml(session))).join(\"\"),\n '<a href=\"https://example.com/\" target=\"_blank\"><em>label</em></a>',\n );\n assert.deepStrictEqual(await Array.fromAsync(t4.getTags(session)), []);\n assert.deepStrictEqual(t4.getCachedObjects(), []);\n});\n\ntest(\"code()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const t: Text<\"inline\", void> = code(\"a + b\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<code>a + b</code>\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t.getTags(session)), []);\n assert.deepStrictEqual(t.getCachedObjects(), []);\n});\n\ntest(\"markdown()\", async () => {\n const session = bot.getSession(\"https://example.com\");\n const md = `Here's a Markdown text.\n\n- I can have a list.\n- I can have a **bold** text.\n- I can have an _italic_ text.\n- I can mention @fedify@hollo.social.\n- I can tag #Hashtag.`;\n const t: Text<\"block\", void> = markdown(md);\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<p>Here's a Markdown text.</p>\\n<ul>\\n\" +\n \"<li>I can have a list.</li>\\n\" +\n \"<li>I can have a <strong>bold</strong> text.</li>\\n\" +\n \"<li>I can have an <em>italic</em> text.</li>\\n\" +\n \"<li>I can mention \" +\n '<a translate=\"no\" class=\"h-card u-url mention\" target=\"_blank\" href=\"https://hollo.social/@fedify\">' +\n '<span class=\"at\">@</span><span class=\"user\">fedify</span>' +\n '<span class=\"at\">@</span><span class=\"domain\">hollo.social</span></a>.</li>\\n' +\n '<li>I can tag <a class=\"mention hashtag\" rel=\"tag\" target=\"_blank\" href=\"https://example.com/tags/hashtag\">#<span>Hashtag</span></a>.</li>\\n' +\n \"</ul>\\n\",\n );\n const tags = await Array.fromAsync(t.getTags(session));\n assert.deepStrictEqual(tags.length, 2);\n assert.ok(tags[0] instanceof Mention);\n assert.deepStrictEqual(tags[0].name, \"@fedify@hollo.social\");\n assert.deepStrictEqual(tags[0].href, new URL(\"https://hollo.social/@fedify\"));\n assert.ok(tags[1] instanceof Hashtag);\n assert.deepStrictEqual(tags[1].name, \"#hashtag\");\n assert.deepStrictEqual(\n tags[1].href,\n new URL(\"https://example.com/tags/hashtag\"),\n );\n const cache = t.getCachedObjects();\n assert.deepStrictEqual(cache.length, 1);\n assert.ok(cache[0] instanceof Person);\n assert.deepStrictEqual(cache[0].id, new URL(\"https://hollo.social/@fedify\"));\n\n const t2: Text<\"block\", void> = markdown(\"@fedify@hollo.social\", {\n mentions: false,\n });\n assert.deepStrictEqual(\n (await Array.fromAsync(t2.getHtml(session))).join(\"\"),\n \"<p>@fedify@hollo.social</p>\\n\",\n );\n assert.deepStrictEqual(await Array.fromAsync(t2.getTags(session)), []);\n assert.deepStrictEqual(t2.getCachedObjects(), []);\n\n const t3: Text<\"block\", void> = markdown(\"@bot@example.com\");\n assert.deepStrictEqual(\n (await Array.fromAsync(t3.getHtml(session))).join(\"\"),\n '<p><a translate=\"no\" class=\"h-card u-url mention\" target=\"_blank\" href=\"https://example.com/ap/actor/bot\">' +\n '<span class=\"at\">@</span><span class=\"user\">bot</span>' +\n '<span class=\"at\">@</span><span class=\"domain\">example.com</span></a></p>\\n',\n );\n const tags3 = await Array.fromAsync(t3.getTags(session));\n assert.deepStrictEqual(tags3.length, 1);\n assert.ok(tags3[0] instanceof Mention);\n assert.deepStrictEqual(tags3[0].name, \"@bot@example.com\");\n assert.deepStrictEqual(\n tags3[0].href,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n const cache3 = t3.getCachedObjects();\n assert.deepStrictEqual(cache3.length, 1);\n assert.ok(cache3[0] instanceof Person);\n assert.deepStrictEqual(\n cache3[0].id,\n new URL(\"https://example.com/ap/actor/bot\"),\n );\n});\n\ndescribe(\"customEmoji(), CustomEmojiText\", () => {\n const localBot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n username: \"bot\",\n });\n const session = localBot.getSession(\"https://example.com\");\n const emojiData: CustomEmoji = {\n type: \"image/png\",\n url: \"https://example.com/emoji.png\",\n };\n const deferredEmoji = localBot.addCustomEmoji(\"testEmoji\", emojiData);\n const emojiObject = deferredEmoji(session); // Get the Emoji object\n\n test(\"customEmoji() function\", () => {\n const emojiText = customEmoji<void>(deferredEmoji);\n assert.ok(emojiText instanceof CustomEmojiText);\n assert.deepStrictEqual(\n (emojiText as CustomEmojiText<void>).getEmoji(session),\n emojiObject,\n );\n\n const emojiTextDirect = customEmoji<void>(emojiObject);\n assert.ok(emojiTextDirect instanceof CustomEmojiText);\n assert.deepStrictEqual(\n (emojiTextDirect as CustomEmojiText<void>).getEmoji(session),\n emojiObject,\n );\n });\n\n test(\"CustomEmojiText.getHtml()\", async () => {\n const emojiText = new CustomEmojiText(deferredEmoji);\n assert.deepStrictEqual(\n (await Array.fromAsync(emojiText.getHtml(session))).join(\"\"),\n \"\\u200b:testEmoji:\\u200b\", // Zero-width spaces around name\n );\n\n // Test with Emoji object directly\n const emojiTextDirect = new CustomEmojiText<void>(emojiObject);\n assert.deepStrictEqual(\n (await Array.fromAsync(emojiTextDirect.getHtml(session))).join(\"\"),\n \"\\u200b:testEmoji:\\u200b\",\n );\n\n // Test with emoji without name\n const emojiNoName = new Emoji({\n id: new URL(\"https://example.com/ap/emoji/noname\"),\n icon: new Image({ url: new URL(\"https://example.com/noname.png\") }),\n });\n const emojiTextNoName = new CustomEmojiText<void>(emojiNoName);\n assert.deepStrictEqual(\n (await Array.fromAsync(emojiTextNoName.getHtml(session))).join(\"\"),\n \"\",\n );\n });\n\n test(\"CustomEmojiText.getTags()\", async () => {\n const emojiText = new CustomEmojiText(deferredEmoji);\n const tags = await Array.fromAsync(emojiText.getTags(session));\n assert.deepStrictEqual(tags.length, 1);\n assert.ok(tags[0] instanceof Emoji);\n assert.deepStrictEqual(tags[0].id, emojiObject.id);\n assert.deepStrictEqual(tags[0].name, emojiObject.name);\n\n // Test with Emoji object directly\n const emojiTextDirect = new CustomEmojiText<void>(emojiObject);\n const tagsDirect = await Array.fromAsync(emojiTextDirect.getTags(session));\n assert.deepStrictEqual(tagsDirect.length, 1);\n assert.deepStrictEqual(tagsDirect[0], emojiObject);\n });\n\n test(\"CustomEmojiText.getCachedObjects()\", () => {\n const emojiText = new CustomEmojiText(deferredEmoji);\n assert.deepStrictEqual(emojiText.getCachedObjects(), []); // CustomEmojiText doesn't cache objects itself\n\n const emojiTextDirect = new CustomEmojiText(emojiObject);\n assert.deepStrictEqual(emojiTextDirect.getCachedObjects(), []);\n });\n});\n\ntest(\"customEmoji()\", async () => {\n const localBot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n username: \"bot\",\n });\n const session = localBot.getSession(\"https://example.com\");\n const emojiData1: CustomEmoji = {\n type: \"image/png\",\n url: \"https://example.com/emoji1.png\",\n };\n const emojiData2: CustomEmoji = {\n type: \"image/gif\",\n file: \"/path/to/emoji2.gif\",\n };\n const deferredEmoji1 = localBot.addCustomEmoji(\"emoji1\", emojiData1);\n const deferredEmoji2 = localBot.addCustomEmoji(\"emoji2\", emojiData2);\n const emojiObject1 = deferredEmoji1(session);\n const emojiObject2 = deferredEmoji2(session);\n\n const t = text<void>`Hello ${customEmoji(deferredEmoji1)} world ${\n customEmoji(emojiObject2)\n }!`;\n\n // Test getHtml()\n assert.deepStrictEqual(\n (await Array.fromAsync(t.getHtml(session))).join(\"\"),\n \"<p>Hello \\u200b:emoji1:\\u200b world \\u200b:emoji2:\\u200b!</p>\",\n );\n\n // Test getTags()\n const tags = await Array.fromAsync(t.getTags(session));\n assert.deepStrictEqual(tags.length, 2);\n assert.ok(tags[0] instanceof Emoji);\n assert.deepStrictEqual(tags[0].id, emojiObject1.id);\n assert.ok(tags[1] instanceof Emoji);\n assert.deepStrictEqual(tags[1].id, emojiObject2.id);\n\n // Test getCachedObjects()\n assert.deepStrictEqual(t.getCachedObjects(), []); // TemplatedText itself doesn't cache, relies on children\n});\n\n// cSpell: ignore apos\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/botkit",
3
- "version": "0.4.0-dev.184+a99f7e05",
3
+ "version": "0.4.0-dev.186+05ac3701",
4
4
  "description": "A framework for creating ActivityPub bots",
5
5
  "license": "AGPL-3.0-only",
6
6
  "author": {
@@ -84,9 +84,9 @@
84
84
  "README.md"
85
85
  ],
86
86
  "dependencies": {
87
- "@fedify/fedify": "2.1.0",
88
- "@fedify/vocab": "2.1.0",
89
- "@fedify/vocab-runtime": "2.1.0",
87
+ "@fedify/fedify": "2.1.2",
88
+ "@fedify/vocab": "2.1.2",
89
+ "@fedify/vocab-runtime": "2.1.2",
90
90
  "@fedify/markdown-it-hashtag": "^0.3.0",
91
91
  "@fedify/markdown-it-mention": "^0.3.0",
92
92
  "@js-temporal/polyfill": "^0.5.1",