lunibee 0.2.3 → 0.2.4

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.
Files changed (61) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +225 -225
  3. package/dist/builders/attachment.d.ts +8 -0
  4. package/dist/builders/commands.d.ts +122 -65
  5. package/dist/builders/components.d.ts +10 -31
  6. package/dist/builders/embed.d.ts +66 -33
  7. package/dist/builders/index.js +97 -131
  8. package/dist/builders/index.js.map +8 -8
  9. package/dist/collection/cache.d.ts +13 -6
  10. package/dist/collection/index.d.ts +90 -17
  11. package/dist/collection/index.js +442 -266
  12. package/dist/collection/index.js.map +4 -4
  13. package/dist/core/index.d.ts +8 -0
  14. package/dist/core/index.js +607 -352
  15. package/dist/core/index.js.map +47 -47
  16. package/dist/core/permissions.d.ts +7 -3
  17. package/dist/formatters/index.js +9 -5
  18. package/dist/formatters/index.js.map +3 -3
  19. package/dist/handlers/index.js +5 -10
  20. package/dist/handlers/index.js.map +3 -3
  21. package/dist/index.js +769 -587
  22. package/dist/index.js.map +65 -65
  23. package/dist/managers/base.d.ts +22 -14
  24. package/dist/managers/index.d.ts +2 -1
  25. package/dist/managers/index.js +445 -276
  26. package/dist/managers/index.js.map +26 -26
  27. package/dist/managers/message.d.ts +7 -3
  28. package/dist/rest/errors.d.ts +14 -7
  29. package/dist/rest/index.d.ts +24 -12
  30. package/dist/rest/index.js +54 -17
  31. package/dist/rest/index.js.map +14 -14
  32. package/dist/rest/redis.d.ts +1 -1
  33. package/dist/rest/route.d.ts +8 -4
  34. package/dist/rest/routes.d.ts +102 -48
  35. package/dist/rest/transport.d.ts +10 -5
  36. package/dist/rest/webhook.d.ts +9 -5
  37. package/dist/sharding/bus.d.ts +34 -17
  38. package/dist/sharding/index.d.ts +34 -17
  39. package/dist/sharding/index.js +64 -32
  40. package/dist/sharding/index.js.map +17 -17
  41. package/dist/structures/base.d.ts +19 -10
  42. package/dist/structures/channels.d.ts +28 -14
  43. package/dist/structures/index.js +9 -59
  44. package/dist/structures/index.js.map +19 -18
  45. package/dist/structures/interactions.d.ts +96 -48
  46. package/dist/structures/resources.d.ts +88 -44
  47. package/dist/types/gateway.d.ts +1 -1
  48. package/dist/types/index.js +20 -22
  49. package/dist/types/index.js.map +4 -4
  50. package/dist/utils/index.js.map +2 -2
  51. package/dist/voice/index.d.ts +12 -4
  52. package/dist/voice/index.js +14 -18
  53. package/dist/voice/index.js.map +3 -3
  54. package/dist/ws/decoder.d.ts +6 -2
  55. package/dist/ws/index.d.ts +25 -13
  56. package/dist/ws/index.js +63 -31
  57. package/dist/ws/index.js.map +14 -14
  58. package/dist/ws/protocol.d.ts +10 -2
  59. package/dist/ws/session.d.ts +14 -4
  60. package/dist/ws/state.d.ts +22 -11
  61. package/package.json +15 -14
@@ -122,8 +122,9 @@ export declare const Permissions: {
122
122
  * positions. Mirrors discord.js's `PermissionFlagsBits`, so bitwise composition
123
123
  * (`Flags.A | Flags.B`) OR-s the bits instead of concatenating strings.
124
124
  *
125
- * Implemented as a `const` object rather than a TS `enum` because enums cannot
126
- * hold bigint members; the same-named union type below preserves usage as a type.
125
+ * The same object as {@link Permissions}, under the discord.js name. It is a
126
+ * `const` object rather than a TS `enum` because enums cannot hold bigint
127
+ * members; the same-named union type below preserves usage as a type.
127
128
  */
128
129
  export declare const PermissionFlagsBits: {
129
130
  readonly CreateInstantInvite: bigint;
@@ -394,11 +395,14 @@ export interface PermissionContext {
394
395
  roles: readonly PermissionRole[];
395
396
  /** Channel overwrites; omit for guild-level permissions. */
396
397
  overwrites?: readonly PermissionOverwrite[];
398
+ /** When the member's timeout ends; while it is in the future the member keeps only View Channel and Read Message History. */
399
+ timedOutUntil?: Date | number | null;
397
400
  }
398
401
  /**
399
402
  * Resolves a member's effective permissions the way Discord does: base
400
403
  * permissions from `@everyone` and the member's roles (owner and
401
404
  * administrator get everything), then the channel's `@everyone` overwrite,
402
- * the combined role overwrites, and finally the member overwrite.
405
+ * the combined role overwrites, and finally the member overwrite. A member
406
+ * whose timeout has not ended keeps only View Channel and Read Message History.
403
407
  */
404
408
  export declare function computePermissions(context: PermissionContext): PermissionSet;
@@ -38,13 +38,17 @@ function inlineCode(text) {
38
38
  return `\`${text}\``;
39
39
  }
40
40
  function codeBlock(text, language = "") {
41
- return `\`\`\`${language}
42
- ${text}
41
+ const safe = text.replace(/```/g, "`\u200B``");
42
+ const lang = language.replace(/[^\w+#.-]/g, "");
43
+ return `\`\`\`${lang}
44
+ ${safe}
43
45
  \`\`\``;
44
46
  }
45
47
  function link(label, url, title) {
46
- const titlePart = title ? ` "${title}"` : "";
47
- return `[${label}](${url}${titlePart})`;
48
+ const text = label.replace(/[[\]\\]/g, "\\$&").replace(/\n/g, " ");
49
+ const target = url.replace(/[()\s"]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase().padStart(2, "0")}`);
50
+ const titlePart = title ? ` "${title.replace(/["\n]/g, "")}"` : "";
51
+ return `[${text}](${target}${titlePart})`;
48
52
  }
49
53
  function blockQuote(text) {
50
54
  return text.split(`
@@ -103,4 +107,4 @@ export {
103
107
  userMention
104
108
  };
105
109
 
106
- //# debugId=5BA83CBED742A82864756E2164756E21
110
+ //# debugId=8E29C8A8AAEFEA0D64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../packages/formatters/src/index.ts"],
4
4
  "sourcesContent": [
5
- "// ─── Mentions ──────────────────────────────────────────────────────────────────\n\n/** Creates a user mention from a Discord snowflake. */\nexport function userMention(id: string): string {\n return `<@${validateSnowflake(id, \"User ID\")}>`;\n}\n\n/** Creates a channel mention from a Discord snowflake. */\nexport function channelMention(id: string): string {\n return `<#${validateSnowflake(id, \"Channel ID\")}>`;\n}\n\n/** Creates a role mention from a Discord snowflake. */\nexport function roleMention(id: string): string {\n return `<@&${validateSnowflake(id, \"Role ID\")}>`;\n}\n\n// ─── Timestamps ────────────────────────────────────────────────────────────────\n\n/** Discord timestamp style formats. */\nexport type TimestampStyle = \"t\" | \"T\" | \"d\" | \"D\" | \"f\" | \"F\" | \"R\";\n\n/** Creates a Discord timestamp tag.\n * @param unixSeconds Unix timestamp in seconds.\n * @param style Optional display style: t=short time, T=long time, d=short date, D=long date, f=short datetime, F=long datetime, R=relative.\n */\nexport function timestamp(\n unixSeconds: number,\n style?: TimestampStyle | string,\n): string {\n if (!Number.isFinite(unixSeconds))\n throw new TypeError(\"Timestamp must be a finite Unix timestamp.\");\n if (style !== undefined && !/^[tTdDfFR]$/.test(style))\n throw new RangeError(\"Invalid Discord timestamp style.\");\n return `<t:${Math.floor(unixSeconds)}${style ? `:${style}` : \"\"}>`;\n}\n\n// ─── Markdown ─────────────────────────────────────────────────────────────────\n\n/** Wraps text in Discord bold markdown. */\nexport function bold(text: string): string {\n return `**${text}**`;\n}\n\n/** Wraps text in Discord italic markdown. */\nexport function italic(text: string): string {\n return `_${text}_`;\n}\n\n/** Wraps text in Discord underline markdown. */\nexport function underline(text: string): string {\n return `__${text}__`;\n}\n\n/** Wraps text in Discord strikethrough markdown. */\nexport function strikethrough(text: string): string {\n return `~~${text}~~`;\n}\n\n/** Wraps text in a Discord spoiler tag (shown masked until clicked). */\nexport function spoiler(text: string): string {\n return `||${text}||`;\n}\n\n/** Alias for spoiler — hides text until revealed. */\nexport function masked(text: string): string {\n return spoiler(text);\n}\n\n/** Wraps text in Discord inline code. */\nexport function inlineCode(text: string): string {\n return `\\`${text}\\``;\n}\n\n/** Wraps text in a Discord fenced code block.\n * @param text Code content.\n * @param language Optional language identifier for syntax highlighting.\n */\nexport function codeBlock(text: string, language = \"\"): string {\n return `\\`\\`\\`${language}\\n${text}\\n\\`\\`\\``;\n}\n\n/** Creates a Discord masked hyperlink: [label](url).\n * @param label Display text.\n * @param url Destination URL.\n * @param title Optional hover title.\n */\nexport function link(label: string, url: string, title?: string): string {\n const titlePart = title ? ` \"${title}\"` : \"\";\n return `[${label}](${url}${titlePart})`;\n}\n\n/** Wraps each line of text in a Discord block quote (> prefix). */\nexport function blockQuote(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n}\n\n/** Creates a Discord heading at the given level (1–3). */\nexport function heading(text: string, level: 1 | 2 | 3 = 1): string {\n return `${\"#\".repeat(level)} ${text}`;\n}\n\n/** Wraps text in Discord's subtext markdown (-# prefix). */\nexport function subtext(text: string): string {\n return `-# ${text}`;\n}\n\n/** Creates a numbered ordered list from items. */\nexport function orderedList(...items: string[]): string {\n return items.map((item, i) => `${i + 1}. ${item}`).join(\"\\n\");\n}\n\n/** Creates an unordered bullet list from items. */\nexport function bulletList(...items: string[]): string {\n return items.map((item) => `- ${item}`).join(\"\\n\");\n}\n\n// ─── Utilities ─────────────────────────────────────────────────────────────────\n\n/** Escapes Discord markdown control characters in a string. */\nexport function escapeMarkdown(value: string): string {\n return value.replace(/[\\\\*_`~|>]/g, \"\\\\$&\");\n}\n\nfunction validateSnowflake(id: string, field: string): string {\n const len = id.length;\n if (len < 1 || len > 20) {\n throw new TypeError(`${field} must be a valid Discord snowflake.`);\n }\n for (let i = 0; i < len; i++) {\n const code = id.charCodeAt(i);\n if (code < 48 || code > 57) {\n throw new TypeError(`${field} must be a valid Discord snowflake.`);\n }\n }\n return id;\n}\n"
5
+ "// ─── Mentions ──────────────────────────────────────────────────────────────────\r\n\r\n/** Creates a user mention from a Discord snowflake. */\r\nexport function userMention(id: string): string {\r\n return `<@${validateSnowflake(id, \"User ID\")}>`;\r\n}\r\n\r\n/** Creates a channel mention from a Discord snowflake. */\r\nexport function channelMention(id: string): string {\r\n return `<#${validateSnowflake(id, \"Channel ID\")}>`;\r\n}\r\n\r\n/** Creates a role mention from a Discord snowflake. */\r\nexport function roleMention(id: string): string {\r\n return `<@&${validateSnowflake(id, \"Role ID\")}>`;\r\n}\r\n\r\n// ─── Timestamps ────────────────────────────────────────────────────────────────\r\n\r\n/** Discord timestamp style formats. */\r\nexport type TimestampStyle = \"t\" | \"T\" | \"d\" | \"D\" | \"f\" | \"F\" | \"R\";\r\n\r\n/** Creates a Discord timestamp tag.\r\n * @param unixSeconds Unix timestamp in seconds.\r\n * @param style Optional display style: t=short time, T=long time, d=short date, D=long date, f=short datetime, F=long datetime, R=relative.\r\n */\r\nexport function timestamp(\r\n unixSeconds: number,\r\n style?: TimestampStyle | string,\r\n): string {\r\n if (!Number.isFinite(unixSeconds))\r\n throw new TypeError(\"Timestamp must be a finite Unix timestamp.\");\r\n if (style !== undefined && !/^[tTdDfFR]$/.test(style))\r\n throw new RangeError(\"Invalid Discord timestamp style.\");\r\n return `<t:${Math.floor(unixSeconds)}${style ? `:${style}` : \"\"}>`;\r\n}\r\n\r\n// ─── Markdown ─────────────────────────────────────────────────────────────────\r\n\r\n/** Wraps text in Discord bold markdown. */\r\nexport function bold(text: string): string {\r\n return `**${text}**`;\r\n}\r\n\r\n/** Wraps text in Discord italic markdown. */\r\nexport function italic(text: string): string {\r\n return `_${text}_`;\r\n}\r\n\r\n/** Wraps text in Discord underline markdown. */\r\nexport function underline(text: string): string {\r\n return `__${text}__`;\r\n}\r\n\r\n/** Wraps text in Discord strikethrough markdown. */\r\nexport function strikethrough(text: string): string {\r\n return `~~${text}~~`;\r\n}\r\n\r\n/** Wraps text in a Discord spoiler tag (shown masked until clicked). */\r\nexport function spoiler(text: string): string {\r\n return `||${text}||`;\r\n}\r\n\r\n/** Alias for spoiler — hides text until revealed. */\r\nexport function masked(text: string): string {\r\n return spoiler(text);\r\n}\r\n\r\n/** Wraps text in Discord inline code. */\r\nexport function inlineCode(text: string): string {\r\n return `\\`${text}\\``;\r\n}\r\n\r\n/** Wraps text in a Discord fenced code block.\r\n * @param text Code content.\r\n * @param language Optional language identifier for syntax highlighting.\r\n */\r\nexport function codeBlock(text: string, language = \"\"): string {\r\n // A zero-width space between backticks keeps the text from closing the block.\r\n const safe = text.replace(/```/g, \"`\\u200b``\");\r\n const lang = language.replace(/[^\\w+#.-]/g, \"\");\r\n return `\\`\\`\\`${lang}\\n${safe}\\n\\`\\`\\``;\r\n}\r\n\r\n/** Creates a Discord masked hyperlink: [label](url).\r\n * @param label Display text.\r\n * @param url Destination URL.\r\n * @param title Optional hover title.\r\n */\r\nexport function link(label: string, url: string, title?: string): string {\r\n // Brackets in the label and parentheses, quotes or spaces in the URL would\r\n // otherwise end the link early and let the rest render as a second link.\r\n const text = label.replace(/[[\\]\\\\]/g, \"\\\\$&\").replace(/\\n/g, \" \");\r\n const target = url.replace(\r\n /[()\\s\"]/g,\r\n (c) =>\r\n `%${c.charCodeAt(0).toString(16).toUpperCase().padStart(2, \"0\")}`,\r\n );\r\n const titlePart = title ? ` \"${title.replace(/[\"\\n]/g, \"\")}\"` : \"\";\r\n return `[${text}](${target}${titlePart})`;\r\n}\r\n\r\n/** Wraps each line of text in a Discord block quote (> prefix). */\r\nexport function blockQuote(text: string): string {\r\n return text\r\n .split(\"\\n\")\r\n .map((line) => `> ${line}`)\r\n .join(\"\\n\");\r\n}\r\n\r\n/** Creates a Discord heading at the given level (1–3). */\r\nexport function heading(text: string, level: 1 | 2 | 3 = 1): string {\r\n return `${\"#\".repeat(level)} ${text}`;\r\n}\r\n\r\n/** Wraps text in Discord's subtext markdown (-# prefix). */\r\nexport function subtext(text: string): string {\r\n return `-# ${text}`;\r\n}\r\n\r\n/** Creates a numbered ordered list from items. */\r\nexport function orderedList(...items: string[]): string {\r\n return items.map((item, i) => `${i + 1}. ${item}`).join(\"\\n\");\r\n}\r\n\r\n/** Creates an unordered bullet list from items. */\r\nexport function bulletList(...items: string[]): string {\r\n return items.map((item) => `- ${item}`).join(\"\\n\");\r\n}\r\n\r\n// ─── Utilities ─────────────────────────────────────────────────────────────────\r\n\r\n/** Escapes Discord markdown control characters in a string. */\r\nexport function escapeMarkdown(value: string): string {\r\n return value.replace(/[\\\\*_`~|>]/g, \"\\\\$&\");\r\n}\r\n\r\nfunction validateSnowflake(id: string, field: string): string {\r\n const len = id.length;\r\n if (len < 1 || len > 20) {\r\n throw new TypeError(`${field} must be a valid Discord snowflake.`);\r\n }\r\n for (let i = 0; i < len; i++) {\r\n const code = id.charCodeAt(i);\r\n if (code < 48 || code > 57) {\r\n throw new TypeError(`${field} must be a valid Discord snowflake.`);\r\n }\r\n }\r\n return id;\r\n}\r\n"
6
6
  ],
7
- "mappings": ";;AAGO,SAAS,WAAW,CAAC,IAAoB;AAAA,EAC5C,OAAO,KAAK,kBAAkB,IAAI,SAAS;AAAA;AAIxC,SAAS,cAAc,CAAC,IAAoB;AAAA,EAC/C,OAAO,KAAK,kBAAkB,IAAI,YAAY;AAAA;AAI3C,SAAS,WAAW,CAAC,IAAoB;AAAA,EAC5C,OAAO,MAAM,kBAAkB,IAAI,SAAS;AAAA;AAYzC,SAAS,SAAS,CACrB,aACA,OACM;AAAA,EACN,IAAI,CAAC,OAAO,SAAS,WAAW;AAAA,IAC5B,MAAM,IAAI,UAAU,4CAA4C;AAAA,EACpE,IAAI,UAAU,aAAa,CAAC,cAAc,KAAK,KAAK;AAAA,IAChD,MAAM,IAAI,WAAW,kCAAkC;AAAA,EAC3D,OAAO,MAAM,KAAK,MAAM,WAAW,IAAI,QAAQ,IAAI,UAAU;AAAA;AAM1D,SAAS,IAAI,CAAC,MAAsB;AAAA,EACvC,OAAO,KAAK;AAAA;AAIT,SAAS,MAAM,CAAC,MAAsB;AAAA,EACzC,OAAO,IAAI;AAAA;AAIR,SAAS,SAAS,CAAC,MAAsB;AAAA,EAC5C,OAAO,KAAK;AAAA;AAIT,SAAS,aAAa,CAAC,MAAsB;AAAA,EAChD,OAAO,KAAK;AAAA;AAIT,SAAS,OAAO,CAAC,MAAsB;AAAA,EAC1C,OAAO,KAAK;AAAA;AAIT,SAAS,MAAM,CAAC,MAAsB;AAAA,EACzC,OAAO,QAAQ,IAAI;AAAA;AAIhB,SAAS,UAAU,CAAC,MAAsB;AAAA,EAC7C,OAAO,KAAK;AAAA;AAOT,SAAS,SAAS,CAAC,MAAc,WAAW,IAAY;AAAA,EAC3D,OAAO,SAAS;AAAA,EAAa;AAAA;AAAA;AAQ1B,SAAS,IAAI,CAAC,OAAe,KAAa,OAAwB;AAAA,EACrE,MAAM,YAAY,QAAQ,KAAK,WAAW;AAAA,EAC1C,OAAO,IAAI,UAAU,MAAM;AAAA;AAIxB,SAAS,UAAU,CAAC,MAAsB;AAAA,EAC7C,OAAO,KACF,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,SAAS,KAAK,MAAM,EACzB,KAAK;AAAA,CAAI;AAAA;AAIX,SAAS,OAAO,CAAC,MAAc,QAAmB,GAAW;AAAA,EAChE,OAAO,GAAG,IAAI,OAAO,KAAK,KAAK;AAAA;AAI5B,SAAS,OAAO,CAAC,MAAsB;AAAA,EAC1C,OAAO,MAAM;AAAA;AAIV,SAAS,WAAW,IAAI,OAAyB;AAAA,EACpD,OAAO,MAAM,IAAI,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,MAAM,EAAE,KAAK;AAAA,CAAI;AAAA;AAIzD,SAAS,UAAU,IAAI,OAAyB;AAAA,EACnD,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,KAAK;AAAA,CAAI;AAAA;AAM9C,SAAS,cAAc,CAAC,OAAuB;AAAA,EAClD,OAAO,MAAM,QAAQ,eAAe,MAAM;AAAA;AAG9C,SAAS,iBAAiB,CAAC,IAAY,OAAuB;AAAA,EAC1D,MAAM,MAAM,GAAG;AAAA,EACf,IAAI,MAAM,KAAK,MAAM,IAAI;AAAA,IACrB,MAAM,IAAI,UAAU,GAAG,0CAA0C;AAAA,EACrE;AAAA,EACA,SAAS,IAAI,EAAG,IAAI,KAAK,KAAK;AAAA,IAC1B,MAAM,OAAO,GAAG,WAAW,CAAC;AAAA,IAC5B,IAAI,OAAO,MAAM,OAAO,IAAI;AAAA,MACxB,MAAM,IAAI,UAAU,GAAG,0CAA0C;AAAA,IACrE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA;",
8
- "debugId": "5BA83CBED742A82864756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "8E29C8A8AAEFEA0D64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,14 +1,9 @@
1
1
  // @bun
2
2
  // packages/handlers/src/index.ts
3
3
  class HandlerRegistry {
4
- #handlers = new Map;
4
+ #handlers = {};
5
5
  on(event, handler) {
6
- let handlers = this.#handlers.get(event);
7
- if (!handlers) {
8
- handlers = new Set;
9
- this.#handlers.set(event, handlers);
10
- }
11
- handlers.add(handler);
6
+ (this.#handlers[event] ??= new Set).add(handler);
12
7
  return this;
13
8
  }
14
9
  once(event, handler) {
@@ -19,11 +14,11 @@ class HandlerRegistry {
19
14
  return this.on(event, wrapped);
20
15
  }
21
16
  off(event, handler) {
22
- this.#handlers.get(event)?.delete(handler);
17
+ this.#handlers[event]?.delete(handler);
23
18
  return this;
24
19
  }
25
20
  async dispatch(event, ...args) {
26
- for (const handler of this.#handlers.get(event) ?? [])
21
+ for (const handler of this.#handlers[event] ?? [])
27
22
  await handler(...args);
28
23
  }
29
24
  emit(event, ...args) {
@@ -34,4 +29,4 @@ export {
34
29
  HandlerRegistry
35
30
  };
36
31
 
37
- //# debugId=C1392DF8895F311564756E2164756E21
32
+ //# debugId=E15872A5899BA4D864756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../packages/handlers/src/index.ts"],
4
4
  "sourcesContent": [
5
- "/** A typed handler registry for Lunibee events. */\nexport class HandlerRegistry<\n Events extends { [K in keyof Events]: unknown[] },\n> {\n /** Registered event handlers. */\n readonly #handlers = new Map<\n keyof Events,\n Set<(...args: any[]) => unknown>\n >();\n /** Registers a handler for an event. @param event Event key. @param handler Handler callback. @returns This registry. */\n public on<K extends keyof Events>(\n event: K,\n handler: (...args: Events[K]) => unknown,\n ): this {\n let handlers = this.#handlers.get(event);\n if (!handlers) {\n handlers = new Set();\n this.#handlers.set(event, handlers);\n }\n handlers.add(handler);\n return this;\n }\n /** Registers a one-shot handler. @param event Event key. @param handler Handler callback. @returns This registry. */\n public once<K extends keyof Events>(\n event: K,\n handler: (...args: Events[K]) => unknown,\n ): this {\n const wrapped = (...args: Events[K]) => {\n this.off(event, wrapped);\n return handler(...args);\n };\n return this.on(event, wrapped);\n }\n /** Removes a handler. @param event Event key. @param handler Handler callback. @returns This registry. */\n public off<K extends keyof Events>(\n event: K,\n handler: (...args: Events[K]) => unknown,\n ): this {\n this.#handlers.get(event)?.delete(handler);\n return this;\n }\n /** Dispatches an event to registered handlers. @param event Event key. @param args Event arguments. @returns A promise fulfilled after handlers complete. */\n public async dispatch<K extends keyof Events>(\n event: K,\n ...args: Events[K]\n ): Promise<void> {\n for (const handler of this.#handlers.get(event) ?? [])\n await handler(...args);\n }\n /** Emits an event using the conventional emitter name. @param event Event key. @param args Event arguments. @returns A promise fulfilled after handlers complete. */\n public emit<K extends keyof Events>(\n event: K,\n ...args: Events[K]\n ): Promise<void> {\n return this.dispatch(event, ...args);\n }\n}\n"
5
+ "/** A typed handler registry for Lunibee events. */\r\nexport class HandlerRegistry<\r\n Events extends { [K in keyof Events]: unknown[] },\r\n> {\r\n /** Registered event handlers. */\r\n readonly #handlers: {\r\n [K in keyof Events]?: Set<(...args: Events[K]) => unknown>;\r\n } = {};\r\n /** Registers a handler for an event. @param event Event key. @param handler Handler callback. @returns This registry. */\r\n public on<K extends keyof Events>(\r\n event: K,\r\n handler: (...args: Events[K]) => unknown,\r\n ): this {\r\n (this.#handlers[event] ??= new Set()).add(handler);\r\n return this;\r\n }\r\n /** Registers a one-shot handler. @param event Event key. @param handler Handler callback. @returns This registry. */\r\n public once<K extends keyof Events>(\r\n event: K,\r\n handler: (...args: Events[K]) => unknown,\r\n ): this {\r\n const wrapped = (...args: Events[K]) => {\r\n this.off(event, wrapped);\r\n return handler(...args);\r\n };\r\n return this.on(event, wrapped);\r\n }\r\n /** Removes a handler. @param event Event key. @param handler Handler callback. @returns This registry. */\r\n public off<K extends keyof Events>(\r\n event: K,\r\n handler: (...args: Events[K]) => unknown,\r\n ): this {\r\n this.#handlers[event]?.delete(handler);\r\n return this;\r\n }\r\n /** Dispatches an event to registered handlers. @param event Event key. @param args Event arguments. @returns A promise fulfilled after handlers complete. */\r\n public async dispatch<K extends keyof Events>(\r\n event: K,\r\n ...args: Events[K]\r\n ): Promise<void> {\r\n for (const handler of this.#handlers[event] ?? [])\r\n await handler(...args);\r\n }\r\n /** Emits an event using the conventional emitter name. @param event Event key. @param args Event arguments. @returns A promise fulfilled after handlers complete. */\r\n public emit<K extends keyof Events>(\r\n event: K,\r\n ...args: Events[K]\r\n ): Promise<void> {\r\n return this.dispatch(event, ...args);\r\n }\r\n}\r\n"
6
6
  ],
7
- "mappings": ";;AACO,MAAM,gBAEX;AAAA,EAEW,YAAY,IAAI;AAAA,EAKlB,EAA0B,CAC7B,OACA,SACI;AAAA,IACJ,IAAI,WAAW,KAAK,UAAU,IAAI,KAAK;AAAA,IACvC,IAAI,CAAC,UAAU;AAAA,MACX,WAAW,IAAI;AAAA,MACf,KAAK,UAAU,IAAI,OAAO,QAAQ;AAAA,IACtC;AAAA,IACA,SAAS,IAAI,OAAO;AAAA,IACpB,OAAO;AAAA;AAAA,EAGJ,IAA4B,CAC/B,OACA,SACI;AAAA,IACJ,MAAM,UAAU,IAAI,SAAoB;AAAA,MACpC,KAAK,IAAI,OAAO,OAAO;AAAA,MACvB,OAAO,QAAQ,GAAG,IAAI;AAAA;AAAA,IAE1B,OAAO,KAAK,GAAG,OAAO,OAAO;AAAA;AAAA,EAG1B,GAA2B,CAC9B,OACA,SACI;AAAA,IACJ,KAAK,UAAU,IAAI,KAAK,GAAG,OAAO,OAAO;AAAA,IACzC,OAAO;AAAA;AAAA,OAGE,SAAgC,CACzC,UACG,MACU;AAAA,IACb,WAAW,WAAW,KAAK,UAAU,IAAI,KAAK,KAAK,CAAC;AAAA,MAChD,MAAM,QAAQ,GAAG,IAAI;AAAA;AAAA,EAGtB,IAA4B,CAC/B,UACG,MACU;AAAA,IACb,OAAO,KAAK,SAAS,OAAO,GAAG,IAAI;AAAA;AAE3C;",
8
- "debugId": "C1392DF8895F311564756E2164756E21",
7
+ "mappings": ";;AACO,MAAM,gBAEX;AAAA,EAEW,YAEL,CAAC;AAAA,EAEE,EAA0B,CAC7B,OACA,SACI;AAAA,KACH,KAAK,UAAU,WAAW,IAAI,KAAO,IAAI,OAAO;AAAA,IACjD,OAAO;AAAA;AAAA,EAGJ,IAA4B,CAC/B,OACA,SACI;AAAA,IACJ,MAAM,UAAU,IAAI,SAAoB;AAAA,MACpC,KAAK,IAAI,OAAO,OAAO;AAAA,MACvB,OAAO,QAAQ,GAAG,IAAI;AAAA;AAAA,IAE1B,OAAO,KAAK,GAAG,OAAO,OAAO;AAAA;AAAA,EAG1B,GAA2B,CAC9B,OACA,SACI;AAAA,IACJ,KAAK,UAAU,QAAQ,OAAO,OAAO;AAAA,IACrC,OAAO;AAAA;AAAA,OAGE,SAAgC,CACzC,UACG,MACU;AAAA,IACb,WAAW,WAAW,KAAK,UAAU,UAAU,CAAC;AAAA,MAC5C,MAAM,QAAQ,GAAG,IAAI;AAAA;AAAA,EAGtB,IAA4B,CAC/B,UACG,MACU;AAAA,IACb,OAAO,KAAK,SAAS,OAAO,GAAG,IAAI;AAAA;AAE3C;",
8
+ "debugId": "E15872A5899BA4D864756E2164756E21",
9
9
  "names": []
10
10
  }