lunibee 0.1.6 → 0.1.8

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 (80) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +223 -223
  3. package/dist/builders/commands.d.ts +39 -0
  4. package/dist/builders/components.d.ts +37 -12
  5. package/dist/builders/embed.d.ts +3 -1
  6. package/dist/builders/index.d.ts +2 -2
  7. package/dist/builders/index.js +192 -29
  8. package/dist/builders/index.js.map +9 -7
  9. package/dist/collection/index.d.ts +30 -0
  10. package/dist/collection/index.js +79 -5
  11. package/dist/collection/index.js.map +4 -4
  12. package/dist/core/events.d.ts +88 -2
  13. package/dist/core/index.d.ts +46 -85
  14. package/dist/core/index.js +2395 -789
  15. package/dist/core/index.js.map +44 -22
  16. package/dist/core/permissions.d.ts +112 -53
  17. package/dist/formatters/index.d.ts +43 -3
  18. package/dist/formatters/index.js +64 -1
  19. package/dist/formatters/index.js.map +3 -3
  20. package/dist/handlers/index.js.map +2 -2
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.js +3783 -1009
  23. package/dist/index.js.map +63 -38
  24. package/dist/managers/emoji.d.ts +38 -0
  25. package/dist/managers/guild-resources.d.ts +109 -0
  26. package/dist/managers/guild.d.ts +117 -1
  27. package/dist/managers/index.d.ts +37 -1
  28. package/dist/managers/index.js +1125 -81
  29. package/dist/managers/index.js.map +25 -20
  30. package/dist/rest/decoder.d.ts +23 -0
  31. package/dist/rest/errors.d.ts +20 -0
  32. package/dist/rest/index.d.ts +119 -25
  33. package/dist/rest/index.js +676 -204
  34. package/dist/rest/index.js.map +14 -6
  35. package/dist/rest/limiter.d.ts +42 -0
  36. package/dist/rest/redis.d.ts +54 -0
  37. package/dist/rest/route.d.ts +31 -0
  38. package/dist/rest/routes.d.ts +24 -0
  39. package/dist/rest/scheduler.d.ts +42 -0
  40. package/dist/rest/store.d.ts +67 -0
  41. package/dist/rest/transport.d.ts +40 -0
  42. package/dist/rest/webhook.d.ts +2 -2
  43. package/dist/sharding/bus.d.ts +31 -0
  44. package/dist/sharding/cluster.d.ts +71 -0
  45. package/dist/sharding/index.d.ts +18 -2
  46. package/dist/sharding/index.js +1202 -317
  47. package/dist/sharding/index.js.map +18 -7
  48. package/dist/structures/audit-log.d.ts +26 -0
  49. package/dist/structures/base.d.ts +40 -0
  50. package/dist/structures/channels.d.ts +56 -0
  51. package/dist/structures/index.d.ts +30 -1
  52. package/dist/structures/index.js +963 -87
  53. package/dist/structures/index.js.map +17 -10
  54. package/dist/structures/interactions.d.ts +12 -52
  55. package/dist/structures/options.d.ts +55 -0
  56. package/dist/structures/resources.d.ts +194 -6
  57. package/dist/types/gateway-events.d.ts +132 -0
  58. package/dist/types/gateway.d.ts +181 -0
  59. package/dist/types/index.d.ts +78 -263
  60. package/dist/types/index.js +44 -2
  61. package/dist/types/index.js.map +5 -4
  62. package/dist/utils/index.js.map +2 -2
  63. package/dist/voice/index.d.ts +116 -0
  64. package/dist/voice/index.js +261 -10
  65. package/dist/voice/index.js.map +3 -3
  66. package/dist/ws/close-codes.d.ts +23 -0
  67. package/dist/ws/decoder.d.ts +58 -0
  68. package/dist/ws/heartbeat.d.ts +87 -0
  69. package/dist/ws/index.d.ts +24 -32
  70. package/dist/ws/index.js +920 -318
  71. package/dist/ws/index.js.map +15 -5
  72. package/dist/ws/opcodes.d.ts +14 -0
  73. package/dist/ws/protocol.d.ts +110 -0
  74. package/dist/ws/reconnect.d.ts +108 -0
  75. package/dist/ws/send-budget.d.ts +17 -0
  76. package/dist/ws/session.d.ts +100 -0
  77. package/dist/ws/state.d.ts +27 -0
  78. package/dist/ws/transport.d.ts +80 -0
  79. package/package.json +23 -22
  80. package/dist/structures/permissions.d.ts +0 -73
@@ -0,0 +1,38 @@
1
+ import { Manager } from "./base.js";
2
+ import { Emoji } from "@lunibee/structures";
3
+ import { type REST } from "@lunibee/rest";
4
+ /** Strict payload for creating a custom guild emoji. */
5
+ export interface EmojiCreateOptions {
6
+ /** Emoji name (1-32 chars, alphanumeric + underscores). */
7
+ name: string;
8
+ /** Base64-encoded 128x128 image data URI. */
9
+ image: string;
10
+ /** Role IDs allowed to use the emoji. */
11
+ roles?: string[];
12
+ }
13
+ /** Strict payload for editing a custom guild emoji. */
14
+ export interface EmojiEditOptions {
15
+ /** New emoji name. */
16
+ name?: string;
17
+ /** Role IDs allowed to use the emoji. */
18
+ roles?: string[];
19
+ }
20
+ /** Manages custom emojis for a guild. */
21
+ export declare class EmojiManager extends Manager<string, Emoji> {
22
+ #private;
23
+ constructor(rest: REST, guildId: string);
24
+ /** Fetches an emoji by ID from Discord. */
25
+ fetch(emojiId: string): Promise<Emoji>;
26
+ /** Fetches all emojis for this guild. */
27
+ fetchAll(): Promise<Emoji[]>;
28
+ /** Creates a new custom emoji. */
29
+ create(options: EmojiCreateOptions): Promise<Emoji>;
30
+ /** Edits an existing custom emoji. */
31
+ edit(emojiId: string, options: EmojiEditOptions): Promise<Emoji>;
32
+ /** Deletes a custom emoji. */
33
+ deleteEmoji(emojiId: string): Promise<void>;
34
+ /** Upserts an emoji into the manager cache. Custom emojis are keyed by their
35
+ * snowflake ID; unicode emojis (no ID) are keyed by `unicode:${name}` so repeated
36
+ * upserts reuse the same cached instance instead of allocating a new one each call. */
37
+ upsert(data: ConstructorParameters<typeof Emoji>[0]): Emoji;
38
+ }
@@ -0,0 +1,109 @@
1
+ import { Manager } from "./base.js";
2
+ import { type REST } from "@lunibee/rest";
3
+ import type { APIGuildScheduledEvent, APIStageInstance, UserData } from "@lunibee/types";
4
+ /** Raw Discord ban object. */
5
+ export interface APIBan {
6
+ user: UserData;
7
+ reason: string | null;
8
+ }
9
+ /** Options for {@link GuildBanManager.create}. */
10
+ export interface GuildBanCreateOptions {
11
+ /** Seconds of message history to delete (0-604800). */
12
+ deleteMessageSeconds?: number;
13
+ /** Audit-log reason. */
14
+ reason?: string;
15
+ }
16
+ /** Manages a guild's bans, cached by user ID. Discord.js-familiar. */
17
+ export declare class GuildBanManager extends Manager<string, APIBan> {
18
+ #private;
19
+ readonly guildId: string;
20
+ constructor(rest: REST, guildId: string);
21
+ /** Fetches one ban. */
22
+ fetch(userId: string): Promise<APIBan>;
23
+ /** Fetches a page of bans (`limit` 1-1000, `before`/`after` user-ID cursors). */
24
+ fetchAll(options?: {
25
+ limit?: number;
26
+ before?: string;
27
+ after?: string;
28
+ }): Promise<APIBan[]>;
29
+ /** Bans a user. */
30
+ create(userId: string, options?: GuildBanCreateOptions): Promise<void>;
31
+ /** Lifts a ban. */
32
+ remove(userId: string, reason?: string): Promise<void>;
33
+ }
34
+ /** Fields accepted when creating or editing a scheduled event. */
35
+ export type GuildScheduledEventOptions = Partial<Omit<APIGuildScheduledEvent, "id" | "guild_id" | "creator" | "user_count">> & Record<string, unknown>;
36
+ /** Manages a guild's scheduled events, cached by event ID. Discord.js-familiar. */
37
+ export declare class GuildScheduledEventManager extends Manager<string, APIGuildScheduledEvent> {
38
+ #private;
39
+ readonly guildId: string;
40
+ constructor(rest: REST, guildId: string);
41
+ /** Fetches one event. */
42
+ fetch(eventId: string, options?: {
43
+ withUserCount?: boolean;
44
+ }): Promise<APIGuildScheduledEvent>;
45
+ /** Fetches every event in the guild. */
46
+ fetchAll(options?: {
47
+ withUserCount?: boolean;
48
+ }): Promise<APIGuildScheduledEvent[]>;
49
+ /** Creates an event. */
50
+ create(options: GuildScheduledEventOptions, reason?: string): Promise<APIGuildScheduledEvent>;
51
+ /** Edits an event. */
52
+ edit(eventId: string, options: GuildScheduledEventOptions, reason?: string): Promise<APIGuildScheduledEvent>;
53
+ /** Deletes an event. */
54
+ remove(eventId: string): Promise<void>;
55
+ /** Fetches users subscribed to an event (`limit` 1-100). */
56
+ fetchSubscribers(eventId: string, options?: {
57
+ limit?: number;
58
+ withMember?: boolean;
59
+ before?: string;
60
+ after?: string;
61
+ }): Promise<{
62
+ guild_scheduled_event_id: string;
63
+ user: UserData;
64
+ }[]>;
65
+ }
66
+ /** Options for creating a stage instance. */
67
+ export interface StageInstanceCreateOptions {
68
+ topic: string;
69
+ privacyLevel?: number;
70
+ sendStartNotification?: boolean;
71
+ guildScheduledEventId?: string;
72
+ }
73
+ /** Manages stage instances, cached by stage channel ID. Discord.js-familiar. */
74
+ export declare class StageInstanceManager extends Manager<string, APIStageInstance> {
75
+ #private;
76
+ constructor(rest: REST);
77
+ /** Starts a stage instance in a stage channel. */
78
+ create(channelId: string, options: StageInstanceCreateOptions, reason?: string): Promise<APIStageInstance>;
79
+ /** Fetches the stage instance of a stage channel. */
80
+ fetch(channelId: string): Promise<APIStageInstance>;
81
+ /** Edits a stage instance's topic or privacy level. */
82
+ edit(channelId: string, options: {
83
+ topic?: string;
84
+ privacyLevel?: number;
85
+ }, reason?: string): Promise<APIStageInstance>;
86
+ /** Ends a stage instance. */
87
+ remove(channelId: string, reason?: string): Promise<void>;
88
+ }
89
+ /** Overwrite target type: 0 = role, 1 = member. */
90
+ export type PermissionOverwriteTargetType = 0 | 1;
91
+ /** Permission values accepted by {@link PermissionOverwriteManager.edit}. */
92
+ export interface PermissionOverwriteOptions {
93
+ /** Target type: 0 = role, 1 = member. */
94
+ type: PermissionOverwriteTargetType;
95
+ /** Allowed permission bits. */
96
+ allow?: bigint | number | string;
97
+ /** Denied permission bits. */
98
+ deny?: bigint | number | string;
99
+ }
100
+ /** Manages a channel's permission overwrites. Discord.js-familiar. */
101
+ export declare class PermissionOverwriteManager {
102
+ #private;
103
+ readonly channelId: string;
104
+ constructor(rest: REST, channelId: string);
105
+ /** Creates or replaces the overwrite for a role or member. */
106
+ edit(overwriteId: string, options: PermissionOverwriteOptions, reason?: string): Promise<void>;
107
+ /** Deletes the overwrite for a role or member. */
108
+ remove(overwriteId: string, reason?: string): Promise<void>;
109
+ }
@@ -1,5 +1,6 @@
1
1
  import { ResourceManager } from "./base.js";
2
- import { Guild } from "@lunibee/structures";
2
+ import { GuildBanManager, GuildScheduledEventManager } from "./guild-resources.js";
3
+ import { Guild, AutoModerationRule } from "@lunibee/structures";
3
4
  import { type REST } from "@lunibee/rest";
4
5
  import { type APIChannel, type APIGuildPreview, type APIInvite, type APIWebhook } from "@lunibee/types";
5
6
  export interface GuildCreateOptions extends Record<string, unknown> {
@@ -10,6 +11,10 @@ export interface GuildEditOptions extends Record<string, unknown> {
10
11
  export declare class GuildManager extends ResourceManager<string, Guild> {
11
12
  #private;
12
13
  constructor(rest: REST);
14
+ /** Ban manager for a guild (one instance per guild). */
15
+ bans(guildId: string): GuildBanManager;
16
+ /** Scheduled-event manager for a guild (one instance per guild). */
17
+ scheduledEvents(guildId: string): GuildScheduledEventManager;
13
18
  /** Creates a new guild. (Bot must be in fewer than 10 guilds). */
14
19
  create(options: GuildCreateOptions): Promise<Guild>;
15
20
  /** Modifies a guild's settings. */
@@ -27,4 +32,115 @@ export declare class GuildManager extends ResourceManager<string, Guild> {
27
32
  fetchWebhooks(id: string): Promise<APIWebhook[]>;
28
33
  /** Fetches all invites in the guild. */
29
34
  fetchInvites(id: string): Promise<APIInvite[]>;
35
+ /**
36
+ * Fetches audit log entries for a guild.
37
+ * @param guildId Guild identifier.
38
+ * @param options Filter options: userId (filter by actor), actionType (AuditLogEvent number), before (entry ID cursor), limit (1–100, default 50).
39
+ * @returns Typed audit log response with `audit_log_entries` and related resources.
40
+ */
41
+ fetchAuditLog(guildId: string, options?: {
42
+ userId?: string;
43
+ actionType?: number;
44
+ before?: string;
45
+ after?: string;
46
+ limit?: number;
47
+ }): Promise<AuditLogResponse>;
48
+ /**
49
+ * Fetches members from a guild (paginated).
50
+ * @param guildId Guild identifier.
51
+ * @param options Fetch options: limit (1–1000, default 100), after (member ID cursor).
52
+ * @returns Array of raw member data payloads.
53
+ */
54
+ fetchMembers(guildId: string, options?: {
55
+ limit?: number;
56
+ after?: string;
57
+ }): Promise<Record<string, unknown>[]>;
58
+ /** Fetches a list of all auto moderation rules currently configured for guild. */
59
+ fetchAutoModerationRules(guildId: string): Promise<AutoModerationRule[]>;
60
+ /** Fetches a single auto moderation rule. */
61
+ fetchAutoModerationRule(guildId: string, ruleId: string): Promise<AutoModerationRule>;
62
+ /** Creates a new auto moderation rule. */
63
+ createAutoModerationRule(guildId: string, options: Record<string, unknown>): Promise<AutoModerationRule>;
64
+ /** Modifies an existing auto moderation rule. */
65
+ editAutoModerationRule(guildId: string, ruleId: string, options: Record<string, unknown>): Promise<AutoModerationRule>;
66
+ /** Deletes an auto moderation rule. */
67
+ deleteAutoModerationRule(guildId: string, ruleId: string): Promise<void>;
30
68
  }
69
+ /** A single audit log entry as returned by the Discord API. */
70
+ export interface AuditLogEntry {
71
+ id: string;
72
+ action_type: number;
73
+ user_id: string | null;
74
+ target_id: string | null;
75
+ reason?: string;
76
+ changes?: Array<{
77
+ key: string;
78
+ old_value?: unknown;
79
+ new_value?: unknown;
80
+ }>;
81
+ options?: Record<string, unknown>;
82
+ }
83
+ /** Discord API audit log response payload. */
84
+ export interface AuditLogResponse {
85
+ audit_log_entries: AuditLogEntry[];
86
+ users: Record<string, unknown>[];
87
+ integrations: Record<string, unknown>[];
88
+ webhooks: Record<string, unknown>[];
89
+ guild_scheduled_events: Record<string, unknown>[];
90
+ threads: Record<string, unknown>[];
91
+ application_commands: Record<string, unknown>[];
92
+ }
93
+ /** Known Discord audit log event type numbers. */
94
+ export declare const AuditLogEvent: {
95
+ readonly GuildUpdate: 1;
96
+ readonly ChannelCreate: 10;
97
+ readonly ChannelUpdate: 11;
98
+ readonly ChannelDelete: 12;
99
+ readonly ChannelOverwriteCreate: 13;
100
+ readonly ChannelOverwriteUpdate: 14;
101
+ readonly ChannelOverwriteDelete: 15;
102
+ readonly MemberKick: 20;
103
+ readonly MemberPrune: 21;
104
+ readonly MemberBanAdd: 22;
105
+ readonly MemberBanRemove: 23;
106
+ readonly MemberUpdate: 24;
107
+ readonly MemberRoleUpdate: 25;
108
+ readonly MemberMove: 26;
109
+ readonly MemberDisconnect: 27;
110
+ readonly BotAdd: 28;
111
+ readonly RoleCreate: 30;
112
+ readonly RoleUpdate: 31;
113
+ readonly RoleDelete: 32;
114
+ readonly InviteCreate: 40;
115
+ readonly InviteUpdate: 41;
116
+ readonly InviteDelete: 42;
117
+ readonly WebhookCreate: 50;
118
+ readonly WebhookUpdate: 51;
119
+ readonly WebhookDelete: 52;
120
+ readonly EmojiCreate: 60;
121
+ readonly EmojiUpdate: 61;
122
+ readonly EmojiDelete: 62;
123
+ readonly MessageDelete: 72;
124
+ readonly MessageBulkDelete: 73;
125
+ readonly MessagePin: 74;
126
+ readonly MessageUnpin: 75;
127
+ readonly IntegrationCreate: 80;
128
+ readonly IntegrationUpdate: 81;
129
+ readonly IntegrationDelete: 82;
130
+ readonly StageInstanceCreate: 83;
131
+ readonly StageInstanceUpdate: 84;
132
+ readonly StageInstanceDelete: 85;
133
+ readonly StickerCreate: 90;
134
+ readonly StickerUpdate: 91;
135
+ readonly StickerDelete: 92;
136
+ readonly ScheduledEventCreate: 100;
137
+ readonly ScheduledEventUpdate: 101;
138
+ readonly ScheduledEventDelete: 102;
139
+ readonly ThreadCreate: 110;
140
+ readonly ThreadUpdate: 111;
141
+ readonly ThreadDelete: 112;
142
+ readonly AutoModerationRuleCreate: 140;
143
+ readonly AutoModerationRuleUpdate: 141;
144
+ readonly AutoModerationRuleDelete: 142;
145
+ readonly AutoModerationBlockMessage: 143;
146
+ };
@@ -1,11 +1,15 @@
1
1
  import { Manager } from "./base.js";
2
2
  export { Manager, ResourceManager } from "./base.js";
3
+ /** Discord.js-familiar alias for {@link ResourceManager}. */
4
+ export { ResourceManager as CachedManager } from "./base.js";
3
5
  import { REST } from "@lunibee/rest";
4
6
  import { Channel, Message, User } from "@lunibee/structures";
5
7
  import { MessageManager, type MessageCreateOptions as ManagerMessageCreateOptions } from "./message.js";
6
8
  import { ThreadManager } from "./thread.js";
7
9
  export { UserManager } from "./user.js";
8
10
  export { GuildManager } from "./guild.js";
11
+ export type { AuditLogEntry, AuditLogResponse } from "./guild.js";
12
+ export { AuditLogEvent } from "./guild.js";
9
13
  export type MessageCreateOptions = ManagerMessageCreateOptions;
10
14
  export type MessageEditOptions = Record<string, unknown> & {
11
15
  content?: string;
@@ -35,10 +39,13 @@ export interface ChannelCreateOptions extends Record<string, unknown> {
35
39
  parent_id?: string | null;
36
40
  }
37
41
  export type ChannelEditOptions = Record<string, unknown>;
42
+ import { PermissionOverwriteManager } from "./guild-resources.js";
38
43
  export declare class ChannelManager extends Manager<string, Channel> {
39
44
  #private;
40
45
  constructor(rest: REST);
41
46
  messages(channelId: string): MessageManager;
47
+ /** Permission overwrite manager for a channel. */
48
+ permissionOverwrites(channelId: string): PermissionOverwriteManager;
42
49
  threads(channelId: string): ThreadManager;
43
50
  fetch(channelId: string): Promise<Channel>;
44
51
  resolve(channelId: string): Promise<Channel>;
@@ -47,6 +54,12 @@ export declare class ChannelManager extends Manager<string, Channel> {
47
54
  create(guildId: string, options: ChannelCreateOptions): Promise<Channel>;
48
55
  edit(channelId: string, options: ChannelEditOptions): Promise<Channel>;
49
56
  deleteChannel(channelId: string): Promise<void>;
57
+ /** Evicts a channel, dropping its per-channel message manager with it.
58
+ * Overrides {@link Manager.delete} so cache eviction driven by a Gateway
59
+ * `CHANNEL_DELETE`/`THREAD_DELETE` — which calls `delete` rather than
60
+ * {@link deleteChannel} — releases the message manager and its cached
61
+ * messages too, instead of retaining them for the client's lifetime. */
62
+ delete(channelId: string): boolean;
50
63
  send(channelId: string, options: MessageCreateOptions): Promise<Message>;
51
64
  sendMessage(channelId: string, options: MessageCreateOptions): Promise<Message>;
52
65
  fetchMessage(channelId: string, messageId: string, options?: MessageFetchOptions): Promise<Message>;
@@ -56,6 +69,8 @@ export declare class ChannelManager extends Manager<string, Channel> {
56
69
  deleteMessage(channelId: string, messageId: string): Promise<void>;
57
70
  deleteCachedMessage(channelId: string, messageId: string): boolean;
58
71
  crosspostMessage(channelId: string, messageId: string): Promise<Message>;
72
+ /** Bulk-deletes messages in a channel.
73
+ * @throws {RangeError} If fewer than 2 or more than 100 message IDs are provided. */
59
74
  bulkDeleteMessages(channelId: string, messageIds: Iterable<string>): Promise<void>;
60
75
  addReaction(channelId: string, messageId: string, emoji: string): Promise<void>;
61
76
  fetchReactions(channelId: string, messageId: string, emoji: string, options?: ReactionFetchOptions): Promise<User[]>;
@@ -66,7 +81,26 @@ export declare class ChannelManager extends Manager<string, Channel> {
66
81
  pinMessage(channelId: string, messageId: string): Promise<void>;
67
82
  unpinMessage(channelId: string, messageId: string): Promise<void>;
68
83
  createThreadFromMessage(channelId: string, messageId: string, options: MessageThreadOptions): Promise<Channel>;
69
- delete(channelId: string): boolean;
84
+ /**
85
+ * Fetches a page of messages with cursor metadata.
86
+ * @param channelId Channel to fetch from.
87
+ * @param options Page options — `before`, `after`, `around`, and `limit` (max 100).
88
+ * @returns `{ messages, before, after, hasMore }` — use `before` or `after` as cursors for the next page.
89
+ */
90
+ fetchPage(channelId: string, options?: MessageQueryOptions): Promise<{
91
+ messages: Message[];
92
+ before?: string;
93
+ after?: string;
94
+ hasMore: boolean;
95
+ }>;
96
+ /**
97
+ * Bulk-deletes 2–100 messages from a channel.
98
+ * Only messages younger than 14 days are accepted by Discord.
99
+ * @param channelId Channel to delete from.
100
+ * @param messageIds Array of message IDs to delete.
101
+ * @throws {RangeError} If fewer than 2 or more than 100 IDs are provided.
102
+ */
103
+ bulkDelete(channelId: string, messageIds: string[]): Promise<void>;
70
104
  clear(): void;
71
105
  }
72
106
  export type CreateMessageOptions = MessageCreateOptions;
@@ -75,3 +109,5 @@ export { ThreadManager } from "./thread.js";
75
109
  export { RoleManager, type RoleCreateOptions, type RoleEditOptions, } from "./role.js";
76
110
  export { GuildMemberManager, type MemberEditOptions, type BanOptions, } from "./member.js";
77
111
  export { ApplicationCommandManager } from "./application.js";
112
+ export { GuildBanManager, GuildScheduledEventManager, StageInstanceManager, PermissionOverwriteManager, type APIBan, type GuildBanCreateOptions, type GuildScheduledEventOptions, type StageInstanceCreateOptions, type PermissionOverwriteOptions, type PermissionOverwriteTargetType, } from "./guild-resources.js";
113
+ export { EmojiManager, type EmojiCreateOptions, type EmojiEditOptions, } from "./emoji.js";