@fluxerjs/util 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Data structure that allows efficient storage of multiple flags (bits) in a single number.
3
+ */
4
+ type BitFieldResolvable<S extends string> = S | number | BitField<S> | (S | number | BitField<S>)[];
5
+ declare class BitField<S extends string> {
6
+ static Flags: Record<string, number>;
7
+ defaultBit: number;
8
+ bitfield: number;
9
+ constructor(bits?: BitFieldResolvable<S>);
10
+ get [Symbol.toStringTag](): string;
11
+ static resolve<S extends string>(bit: BitFieldResolvable<S>): number;
12
+ has(bit: BitFieldResolvable<S>): boolean;
13
+ add(...bits: BitFieldResolvable<S>[]): this;
14
+ remove(...bits: BitFieldResolvable<S>[]): this;
15
+ serialize(): Record<S, boolean>;
16
+ toArray(): S[];
17
+ toJSON(): number;
18
+ valueOf(): number;
19
+ equals(bitfield: BitField<S>): boolean;
20
+ freeze(): Readonly<BitField<S>>;
21
+ }
22
+
23
+ /** Fluxer epoch (2015-01-01 00:00:00 UTC) in milliseconds */
24
+ declare const FLUXER_EPOCH = 1420070400000n;
25
+ /**
26
+ * Utilities for Fluxer snowflake IDs.
27
+ * Fluxer uses Twitter Snowflakes with a custom epoch.
28
+ */
29
+ declare class SnowflakeUtil {
30
+ static readonly EPOCH = 1420070400000n;
31
+ /**
32
+ * Converts a snowflake to a Unix timestamp in milliseconds.
33
+ */
34
+ static timestampFromSnowflake(snowflake: string): number;
35
+ /**
36
+ * Converts a snowflake to a Date.
37
+ */
38
+ static dateFromSnowflake(snowflake: string): Date;
39
+ /**
40
+ * Converts a Unix timestamp (ms) to a snowflake string.
41
+ * Useful for pagination (before/after).
42
+ */
43
+ static snowflakeFromTimestamp(timestamp: number): string;
44
+ /**
45
+ * Deconstructs a snowflake into its components.
46
+ */
47
+ static deconstruct(snowflake: string): {
48
+ timestamp: number;
49
+ date: Date;
50
+ workerId: number;
51
+ processId: number;
52
+ increment: number;
53
+ };
54
+ /**
55
+ * Checks if a string is a valid snowflake format (numeric string, 0 or positive).
56
+ */
57
+ static isValid(snowflake: string): boolean;
58
+ }
59
+
60
+ /**
61
+ * Permission flags (Discord-compatible subset used by Fluxer).
62
+ * Values are bit positions; actual permission value is 1 << n.
63
+ */
64
+ declare const PermissionFlags: {
65
+ readonly CreateInstantInvite: number;
66
+ readonly KickMembers: number;
67
+ readonly BanMembers: number;
68
+ readonly Administrator: number;
69
+ readonly ManageChannels: number;
70
+ readonly ManageGuild: number;
71
+ readonly AddReactions: number;
72
+ readonly ViewAuditLog: number;
73
+ readonly PrioritySpeaker: number;
74
+ readonly Stream: number;
75
+ readonly ViewChannel: number;
76
+ readonly SendMessages: number;
77
+ readonly SendTtsMessages: number;
78
+ readonly ManageMessages: number;
79
+ readonly EmbedLinks: number;
80
+ readonly AttachFiles: number;
81
+ readonly ReadMessageHistory: number;
82
+ readonly MentionEveryone: number;
83
+ readonly UseExternalEmojis: number;
84
+ readonly ViewGuildInsights: number;
85
+ readonly Connect: number;
86
+ readonly Speak: number;
87
+ readonly MuteMembers: number;
88
+ readonly DeafenMembers: number;
89
+ readonly MoveMembers: number;
90
+ readonly UseVad: number;
91
+ readonly ChangeNickname: number;
92
+ readonly ManageNicknames: number;
93
+ readonly ManageRoles: number;
94
+ readonly ManageWebhooks: number;
95
+ readonly ManageEmojisAndStickers: number;
96
+ readonly UseApplicationCommands: number;
97
+ readonly RequestToSpeak: number;
98
+ readonly ManageEvents: number;
99
+ readonly ManageThreads: number;
100
+ readonly CreatePublicThreads: number;
101
+ readonly CreatePrivateThreads: number;
102
+ readonly UseExternalStickers: number;
103
+ readonly SendMessagesInThreads: number;
104
+ };
105
+ type PermissionString = keyof typeof PermissionFlags;
106
+ declare class PermissionsBitField extends BitField<PermissionString> {
107
+ static Flags: {
108
+ readonly CreateInstantInvite: number;
109
+ readonly KickMembers: number;
110
+ readonly BanMembers: number;
111
+ readonly Administrator: number;
112
+ readonly ManageChannels: number;
113
+ readonly ManageGuild: number;
114
+ readonly AddReactions: number;
115
+ readonly ViewAuditLog: number;
116
+ readonly PrioritySpeaker: number;
117
+ readonly Stream: number;
118
+ readonly ViewChannel: number;
119
+ readonly SendMessages: number;
120
+ readonly SendTtsMessages: number;
121
+ readonly ManageMessages: number;
122
+ readonly EmbedLinks: number;
123
+ readonly AttachFiles: number;
124
+ readonly ReadMessageHistory: number;
125
+ readonly MentionEveryone: number;
126
+ readonly UseExternalEmojis: number;
127
+ readonly ViewGuildInsights: number;
128
+ readonly Connect: number;
129
+ readonly Speak: number;
130
+ readonly MuteMembers: number;
131
+ readonly DeafenMembers: number;
132
+ readonly MoveMembers: number;
133
+ readonly UseVad: number;
134
+ readonly ChangeNickname: number;
135
+ readonly ManageNicknames: number;
136
+ readonly ManageRoles: number;
137
+ readonly ManageWebhooks: number;
138
+ readonly ManageEmojisAndStickers: number;
139
+ readonly UseApplicationCommands: number;
140
+ readonly RequestToSpeak: number;
141
+ readonly ManageEvents: number;
142
+ readonly ManageThreads: number;
143
+ readonly CreatePublicThreads: number;
144
+ readonly CreatePrivateThreads: number;
145
+ readonly UseExternalStickers: number;
146
+ readonly SendMessagesInThreads: number;
147
+ };
148
+ }
149
+ type PermissionResolvable = BitFieldResolvable<PermissionString>;
150
+
151
+ declare const MessageFlagsBits: {
152
+ readonly Crossposted: number;
153
+ readonly IsCrosspost: number;
154
+ readonly SuppressEmbeds: number;
155
+ readonly SourceMessageDeleted: number;
156
+ readonly Urgent: number;
157
+ readonly HasThread: number;
158
+ readonly Ephemeral: number;
159
+ readonly Loading: number;
160
+ readonly FailToLinkToRole: number;
161
+ readonly SuppressNotifications: number;
162
+ readonly IsVoiceMessage: number;
163
+ readonly CompactAttachments: number;
164
+ };
165
+ type MessageFlagsString = keyof typeof MessageFlagsBits;
166
+ declare class MessageFlagsBitField extends BitField<MessageFlagsString> {
167
+ static Flags: {
168
+ readonly Crossposted: number;
169
+ readonly IsCrosspost: number;
170
+ readonly SuppressEmbeds: number;
171
+ readonly SourceMessageDeleted: number;
172
+ readonly Urgent: number;
173
+ readonly HasThread: number;
174
+ readonly Ephemeral: number;
175
+ readonly Loading: number;
176
+ readonly FailToLinkToRole: number;
177
+ readonly SuppressNotifications: number;
178
+ readonly IsVoiceMessage: number;
179
+ readonly CompactAttachments: number;
180
+ };
181
+ }
182
+ type MessageFlagsResolvable = BitFieldResolvable<MessageFlagsString>;
183
+
184
+ declare const UserFlagsBits: {
185
+ readonly Staff: number;
186
+ readonly Partner: number;
187
+ readonly Hypesquad: number;
188
+ readonly BugHunterLevel1: number;
189
+ readonly HypeSquadOnlineHouse1: number;
190
+ readonly HypeSquadOnlineHouse2: number;
191
+ readonly HypeSquadOnlineHouse3: number;
192
+ readonly PremiumEarlySupporter: number;
193
+ readonly BugHunterLevel2: number;
194
+ readonly VerifiedBot: number;
195
+ readonly VerifiedDeveloper: number;
196
+ readonly CertifiedModerator: number;
197
+ readonly BotHttpInteractions: number;
198
+ readonly FriendlyBot: number;
199
+ readonly FriendlyBotManualApproval: number;
200
+ };
201
+ type UserFlagsString = keyof typeof UserFlagsBits;
202
+ declare class UserFlagsBitField extends BitField<UserFlagsString> {
203
+ static Flags: {
204
+ readonly Staff: number;
205
+ readonly Partner: number;
206
+ readonly Hypesquad: number;
207
+ readonly BugHunterLevel1: number;
208
+ readonly HypeSquadOnlineHouse1: number;
209
+ readonly HypeSquadOnlineHouse2: number;
210
+ readonly HypeSquadOnlineHouse3: number;
211
+ readonly PremiumEarlySupporter: number;
212
+ readonly BugHunterLevel2: number;
213
+ readonly VerifiedBot: number;
214
+ readonly VerifiedDeveloper: number;
215
+ readonly CertifiedModerator: number;
216
+ readonly BotHttpInteractions: number;
217
+ readonly FriendlyBot: number;
218
+ readonly FriendlyBotManualApproval: number;
219
+ };
220
+ }
221
+ type UserFlagsResolvable = BitFieldResolvable<UserFlagsString>;
222
+
223
+ /**
224
+ * Format a number as a hex color string.
225
+ */
226
+ declare function formatColor(color: number): string;
227
+ /**
228
+ * Escape markdown formatting characters in a string.
229
+ */
230
+ declare function escapeMarkdown(text: string): string;
231
+ /**
232
+ * Format a Unix timestamp for Fluxer/Discord style timestamps.
233
+ * @param timestamp - Unix timestamp in seconds
234
+ * @param style - t, T, d, D, f, F, R, etc.
235
+ */
236
+ declare function formatTimestamp(timestamp: number, style?: 't' | 'T' | 'd' | 'D' | 'f' | 'F' | 'R'): string;
237
+ /**
238
+ * Truncate a string to a maximum length with an optional suffix.
239
+ */
240
+ declare function truncate(str: string, maxLength: number, suffix?: string): string;
241
+
242
+ /**
243
+ * Resolve a color from various input types to a number (0-16777215).
244
+ */
245
+ declare function resolveColor(color: number | string | [number, number, number]): number;
246
+ /**
247
+ * Parse an emoji string (e.g. :name:123 or unicode) into id and name.
248
+ */
249
+ declare function parseEmoji(emoji: string): {
250
+ id: string | null;
251
+ name: string;
252
+ } | null;
253
+ /**
254
+ * Convert emoji to the format used in API (for reactions etc).
255
+ * Custom: "name:id", Unicode: "unicode"
256
+ */
257
+ declare function formatEmoji(emoji: {
258
+ id: string | null;
259
+ name: string;
260
+ animated?: boolean;
261
+ }): string;
262
+
263
+ export { BitField, type BitFieldResolvable, FLUXER_EPOCH, MessageFlagsBitField, MessageFlagsBits, type MessageFlagsResolvable, type MessageFlagsString, PermissionFlags, type PermissionResolvable, type PermissionString, PermissionsBitField, SnowflakeUtil, UserFlagsBitField, UserFlagsBits, type UserFlagsResolvable, type UserFlagsString, escapeMarkdown, formatColor, formatEmoji, formatTimestamp, parseEmoji, resolveColor, truncate };
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Data structure that allows efficient storage of multiple flags (bits) in a single number.
3
+ */
4
+ type BitFieldResolvable<S extends string> = S | number | BitField<S> | (S | number | BitField<S>)[];
5
+ declare class BitField<S extends string> {
6
+ static Flags: Record<string, number>;
7
+ defaultBit: number;
8
+ bitfield: number;
9
+ constructor(bits?: BitFieldResolvable<S>);
10
+ get [Symbol.toStringTag](): string;
11
+ static resolve<S extends string>(bit: BitFieldResolvable<S>): number;
12
+ has(bit: BitFieldResolvable<S>): boolean;
13
+ add(...bits: BitFieldResolvable<S>[]): this;
14
+ remove(...bits: BitFieldResolvable<S>[]): this;
15
+ serialize(): Record<S, boolean>;
16
+ toArray(): S[];
17
+ toJSON(): number;
18
+ valueOf(): number;
19
+ equals(bitfield: BitField<S>): boolean;
20
+ freeze(): Readonly<BitField<S>>;
21
+ }
22
+
23
+ /** Fluxer epoch (2015-01-01 00:00:00 UTC) in milliseconds */
24
+ declare const FLUXER_EPOCH = 1420070400000n;
25
+ /**
26
+ * Utilities for Fluxer snowflake IDs.
27
+ * Fluxer uses Twitter Snowflakes with a custom epoch.
28
+ */
29
+ declare class SnowflakeUtil {
30
+ static readonly EPOCH = 1420070400000n;
31
+ /**
32
+ * Converts a snowflake to a Unix timestamp in milliseconds.
33
+ */
34
+ static timestampFromSnowflake(snowflake: string): number;
35
+ /**
36
+ * Converts a snowflake to a Date.
37
+ */
38
+ static dateFromSnowflake(snowflake: string): Date;
39
+ /**
40
+ * Converts a Unix timestamp (ms) to a snowflake string.
41
+ * Useful for pagination (before/after).
42
+ */
43
+ static snowflakeFromTimestamp(timestamp: number): string;
44
+ /**
45
+ * Deconstructs a snowflake into its components.
46
+ */
47
+ static deconstruct(snowflake: string): {
48
+ timestamp: number;
49
+ date: Date;
50
+ workerId: number;
51
+ processId: number;
52
+ increment: number;
53
+ };
54
+ /**
55
+ * Checks if a string is a valid snowflake format (numeric string, 0 or positive).
56
+ */
57
+ static isValid(snowflake: string): boolean;
58
+ }
59
+
60
+ /**
61
+ * Permission flags (Discord-compatible subset used by Fluxer).
62
+ * Values are bit positions; actual permission value is 1 << n.
63
+ */
64
+ declare const PermissionFlags: {
65
+ readonly CreateInstantInvite: number;
66
+ readonly KickMembers: number;
67
+ readonly BanMembers: number;
68
+ readonly Administrator: number;
69
+ readonly ManageChannels: number;
70
+ readonly ManageGuild: number;
71
+ readonly AddReactions: number;
72
+ readonly ViewAuditLog: number;
73
+ readonly PrioritySpeaker: number;
74
+ readonly Stream: number;
75
+ readonly ViewChannel: number;
76
+ readonly SendMessages: number;
77
+ readonly SendTtsMessages: number;
78
+ readonly ManageMessages: number;
79
+ readonly EmbedLinks: number;
80
+ readonly AttachFiles: number;
81
+ readonly ReadMessageHistory: number;
82
+ readonly MentionEveryone: number;
83
+ readonly UseExternalEmojis: number;
84
+ readonly ViewGuildInsights: number;
85
+ readonly Connect: number;
86
+ readonly Speak: number;
87
+ readonly MuteMembers: number;
88
+ readonly DeafenMembers: number;
89
+ readonly MoveMembers: number;
90
+ readonly UseVad: number;
91
+ readonly ChangeNickname: number;
92
+ readonly ManageNicknames: number;
93
+ readonly ManageRoles: number;
94
+ readonly ManageWebhooks: number;
95
+ readonly ManageEmojisAndStickers: number;
96
+ readonly UseApplicationCommands: number;
97
+ readonly RequestToSpeak: number;
98
+ readonly ManageEvents: number;
99
+ readonly ManageThreads: number;
100
+ readonly CreatePublicThreads: number;
101
+ readonly CreatePrivateThreads: number;
102
+ readonly UseExternalStickers: number;
103
+ readonly SendMessagesInThreads: number;
104
+ };
105
+ type PermissionString = keyof typeof PermissionFlags;
106
+ declare class PermissionsBitField extends BitField<PermissionString> {
107
+ static Flags: {
108
+ readonly CreateInstantInvite: number;
109
+ readonly KickMembers: number;
110
+ readonly BanMembers: number;
111
+ readonly Administrator: number;
112
+ readonly ManageChannels: number;
113
+ readonly ManageGuild: number;
114
+ readonly AddReactions: number;
115
+ readonly ViewAuditLog: number;
116
+ readonly PrioritySpeaker: number;
117
+ readonly Stream: number;
118
+ readonly ViewChannel: number;
119
+ readonly SendMessages: number;
120
+ readonly SendTtsMessages: number;
121
+ readonly ManageMessages: number;
122
+ readonly EmbedLinks: number;
123
+ readonly AttachFiles: number;
124
+ readonly ReadMessageHistory: number;
125
+ readonly MentionEveryone: number;
126
+ readonly UseExternalEmojis: number;
127
+ readonly ViewGuildInsights: number;
128
+ readonly Connect: number;
129
+ readonly Speak: number;
130
+ readonly MuteMembers: number;
131
+ readonly DeafenMembers: number;
132
+ readonly MoveMembers: number;
133
+ readonly UseVad: number;
134
+ readonly ChangeNickname: number;
135
+ readonly ManageNicknames: number;
136
+ readonly ManageRoles: number;
137
+ readonly ManageWebhooks: number;
138
+ readonly ManageEmojisAndStickers: number;
139
+ readonly UseApplicationCommands: number;
140
+ readonly RequestToSpeak: number;
141
+ readonly ManageEvents: number;
142
+ readonly ManageThreads: number;
143
+ readonly CreatePublicThreads: number;
144
+ readonly CreatePrivateThreads: number;
145
+ readonly UseExternalStickers: number;
146
+ readonly SendMessagesInThreads: number;
147
+ };
148
+ }
149
+ type PermissionResolvable = BitFieldResolvable<PermissionString>;
150
+
151
+ declare const MessageFlagsBits: {
152
+ readonly Crossposted: number;
153
+ readonly IsCrosspost: number;
154
+ readonly SuppressEmbeds: number;
155
+ readonly SourceMessageDeleted: number;
156
+ readonly Urgent: number;
157
+ readonly HasThread: number;
158
+ readonly Ephemeral: number;
159
+ readonly Loading: number;
160
+ readonly FailToLinkToRole: number;
161
+ readonly SuppressNotifications: number;
162
+ readonly IsVoiceMessage: number;
163
+ readonly CompactAttachments: number;
164
+ };
165
+ type MessageFlagsString = keyof typeof MessageFlagsBits;
166
+ declare class MessageFlagsBitField extends BitField<MessageFlagsString> {
167
+ static Flags: {
168
+ readonly Crossposted: number;
169
+ readonly IsCrosspost: number;
170
+ readonly SuppressEmbeds: number;
171
+ readonly SourceMessageDeleted: number;
172
+ readonly Urgent: number;
173
+ readonly HasThread: number;
174
+ readonly Ephemeral: number;
175
+ readonly Loading: number;
176
+ readonly FailToLinkToRole: number;
177
+ readonly SuppressNotifications: number;
178
+ readonly IsVoiceMessage: number;
179
+ readonly CompactAttachments: number;
180
+ };
181
+ }
182
+ type MessageFlagsResolvable = BitFieldResolvable<MessageFlagsString>;
183
+
184
+ declare const UserFlagsBits: {
185
+ readonly Staff: number;
186
+ readonly Partner: number;
187
+ readonly Hypesquad: number;
188
+ readonly BugHunterLevel1: number;
189
+ readonly HypeSquadOnlineHouse1: number;
190
+ readonly HypeSquadOnlineHouse2: number;
191
+ readonly HypeSquadOnlineHouse3: number;
192
+ readonly PremiumEarlySupporter: number;
193
+ readonly BugHunterLevel2: number;
194
+ readonly VerifiedBot: number;
195
+ readonly VerifiedDeveloper: number;
196
+ readonly CertifiedModerator: number;
197
+ readonly BotHttpInteractions: number;
198
+ readonly FriendlyBot: number;
199
+ readonly FriendlyBotManualApproval: number;
200
+ };
201
+ type UserFlagsString = keyof typeof UserFlagsBits;
202
+ declare class UserFlagsBitField extends BitField<UserFlagsString> {
203
+ static Flags: {
204
+ readonly Staff: number;
205
+ readonly Partner: number;
206
+ readonly Hypesquad: number;
207
+ readonly BugHunterLevel1: number;
208
+ readonly HypeSquadOnlineHouse1: number;
209
+ readonly HypeSquadOnlineHouse2: number;
210
+ readonly HypeSquadOnlineHouse3: number;
211
+ readonly PremiumEarlySupporter: number;
212
+ readonly BugHunterLevel2: number;
213
+ readonly VerifiedBot: number;
214
+ readonly VerifiedDeveloper: number;
215
+ readonly CertifiedModerator: number;
216
+ readonly BotHttpInteractions: number;
217
+ readonly FriendlyBot: number;
218
+ readonly FriendlyBotManualApproval: number;
219
+ };
220
+ }
221
+ type UserFlagsResolvable = BitFieldResolvable<UserFlagsString>;
222
+
223
+ /**
224
+ * Format a number as a hex color string.
225
+ */
226
+ declare function formatColor(color: number): string;
227
+ /**
228
+ * Escape markdown formatting characters in a string.
229
+ */
230
+ declare function escapeMarkdown(text: string): string;
231
+ /**
232
+ * Format a Unix timestamp for Fluxer/Discord style timestamps.
233
+ * @param timestamp - Unix timestamp in seconds
234
+ * @param style - t, T, d, D, f, F, R, etc.
235
+ */
236
+ declare function formatTimestamp(timestamp: number, style?: 't' | 'T' | 'd' | 'D' | 'f' | 'F' | 'R'): string;
237
+ /**
238
+ * Truncate a string to a maximum length with an optional suffix.
239
+ */
240
+ declare function truncate(str: string, maxLength: number, suffix?: string): string;
241
+
242
+ /**
243
+ * Resolve a color from various input types to a number (0-16777215).
244
+ */
245
+ declare function resolveColor(color: number | string | [number, number, number]): number;
246
+ /**
247
+ * Parse an emoji string (e.g. :name:123 or unicode) into id and name.
248
+ */
249
+ declare function parseEmoji(emoji: string): {
250
+ id: string | null;
251
+ name: string;
252
+ } | null;
253
+ /**
254
+ * Convert emoji to the format used in API (for reactions etc).
255
+ * Custom: "name:id", Unicode: "unicode"
256
+ */
257
+ declare function formatEmoji(emoji: {
258
+ id: string | null;
259
+ name: string;
260
+ animated?: boolean;
261
+ }): string;
262
+
263
+ export { BitField, type BitFieldResolvable, FLUXER_EPOCH, MessageFlagsBitField, MessageFlagsBits, type MessageFlagsResolvable, type MessageFlagsString, PermissionFlags, type PermissionResolvable, type PermissionString, PermissionsBitField, SnowflakeUtil, UserFlagsBitField, UserFlagsBits, type UserFlagsResolvable, type UserFlagsString, escapeMarkdown, formatColor, formatEmoji, formatTimestamp, parseEmoji, resolveColor, truncate };
package/dist/index.js ADDED
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ BitField: () => BitField,
24
+ FLUXER_EPOCH: () => FLUXER_EPOCH,
25
+ MessageFlagsBitField: () => MessageFlagsBitField,
26
+ MessageFlagsBits: () => MessageFlagsBits,
27
+ PermissionFlags: () => PermissionFlags,
28
+ PermissionsBitField: () => PermissionsBitField,
29
+ SnowflakeUtil: () => SnowflakeUtil,
30
+ UserFlagsBitField: () => UserFlagsBitField,
31
+ UserFlagsBits: () => UserFlagsBits,
32
+ escapeMarkdown: () => escapeMarkdown,
33
+ formatColor: () => formatColor,
34
+ formatEmoji: () => formatEmoji,
35
+ formatTimestamp: () => formatTimestamp,
36
+ parseEmoji: () => parseEmoji,
37
+ resolveColor: () => resolveColor,
38
+ truncate: () => truncate
39
+ });
40
+ module.exports = __toCommonJS(index_exports);
41
+
42
+ // src/BitField.ts
43
+ var BitField = class _BitField {
44
+ static Flags = {};
45
+ defaultBit = 0;
46
+ bitfield;
47
+ constructor(bits = 0) {
48
+ const Ctor = this.constructor;
49
+ this.bitfield = Ctor.resolve(bits);
50
+ }
51
+ get [Symbol.toStringTag]() {
52
+ return `BitField${this.bitfield}`;
53
+ }
54
+ static resolve(bit) {
55
+ const Flags = this.Flags;
56
+ if (typeof bit === "number" && bit >= 0) return bit;
57
+ if (bit instanceof _BitField) return bit.bitfield;
58
+ if (Array.isArray(bit)) return bit.map((b) => this.resolve(b)).reduce((a, b) => a | b, 0);
59
+ if (typeof bit === "string" && typeof Flags[bit] !== "undefined") return Flags[bit];
60
+ throw new RangeError(`Invalid bitfield flag or number: ${bit}`);
61
+ }
62
+ has(bit) {
63
+ bit = this.constructor.resolve(bit);
64
+ return (this.bitfield & bit) === bit;
65
+ }
66
+ add(...bits) {
67
+ let total = 0;
68
+ for (const bit of bits) {
69
+ total |= this.constructor.resolve(bit);
70
+ }
71
+ this.bitfield |= total;
72
+ return this;
73
+ }
74
+ remove(...bits) {
75
+ let total = 0;
76
+ for (const bit of bits) {
77
+ total |= this.constructor.resolve(bit);
78
+ }
79
+ this.bitfield &= ~total;
80
+ return this;
81
+ }
82
+ serialize() {
83
+ const Flags = this.constructor.Flags;
84
+ const serialized = {};
85
+ for (const [key, value] of Object.entries(Flags)) {
86
+ serialized[key] = (this.bitfield & value) === value;
87
+ }
88
+ return serialized;
89
+ }
90
+ toArray() {
91
+ const Flags = this.constructor.Flags;
92
+ return Object.entries(Flags).filter(([, value]) => (this.bitfield & value) === value).map(([key]) => key);
93
+ }
94
+ toJSON() {
95
+ return this.bitfield;
96
+ }
97
+ valueOf() {
98
+ return this.bitfield;
99
+ }
100
+ equals(bitfield) {
101
+ return this.bitfield === bitfield.bitfield;
102
+ }
103
+ freeze() {
104
+ return Object.freeze(this);
105
+ }
106
+ };
107
+
108
+ // src/SnowflakeUtil.ts
109
+ var FLUXER_EPOCH = 1420070400000n;
110
+ var SnowflakeUtil = class {
111
+ static EPOCH = FLUXER_EPOCH;
112
+ /**
113
+ * Converts a snowflake to a Unix timestamp in milliseconds.
114
+ */
115
+ static timestampFromSnowflake(snowflake) {
116
+ return Number((BigInt(snowflake) >> 22n) + FLUXER_EPOCH);
117
+ }
118
+ /**
119
+ * Converts a snowflake to a Date.
120
+ */
121
+ static dateFromSnowflake(snowflake) {
122
+ return new Date(this.timestampFromSnowflake(snowflake));
123
+ }
124
+ /**
125
+ * Converts a Unix timestamp (ms) to a snowflake string.
126
+ * Useful for pagination (before/after).
127
+ */
128
+ static snowflakeFromTimestamp(timestamp) {
129
+ return (BigInt(timestamp) - FLUXER_EPOCH << 22n).toString();
130
+ }
131
+ /**
132
+ * Deconstructs a snowflake into its components.
133
+ */
134
+ static deconstruct(snowflake) {
135
+ const big = BigInt(snowflake);
136
+ return {
137
+ timestamp: Number((big >> 22n) + FLUXER_EPOCH),
138
+ date: new Date(Number((big >> 22n) + FLUXER_EPOCH)),
139
+ workerId: Number(big >> 17n & 0x1fn),
140
+ processId: Number(big >> 12n & 0x1fn),
141
+ increment: Number(big & 0xfffn)
142
+ };
143
+ }
144
+ /**
145
+ * Checks if a string is a valid snowflake format (numeric string, 0 or positive).
146
+ */
147
+ static isValid(snowflake) {
148
+ return /^(0|[1-9]\d*)$/.test(snowflake) && snowflake.length <= 20;
149
+ }
150
+ };
151
+
152
+ // src/PermissionsBitField.ts
153
+ var PermissionFlags = {
154
+ CreateInstantInvite: 1 << 0,
155
+ KickMembers: 1 << 1,
156
+ BanMembers: 1 << 2,
157
+ Administrator: 1 << 3,
158
+ ManageChannels: 1 << 4,
159
+ ManageGuild: 1 << 5,
160
+ AddReactions: 1 << 6,
161
+ ViewAuditLog: 1 << 7,
162
+ PrioritySpeaker: 1 << 8,
163
+ Stream: 1 << 9,
164
+ ViewChannel: 1 << 10,
165
+ SendMessages: 1 << 11,
166
+ SendTtsMessages: 1 << 12,
167
+ ManageMessages: 1 << 13,
168
+ EmbedLinks: 1 << 14,
169
+ AttachFiles: 1 << 15,
170
+ ReadMessageHistory: 1 << 16,
171
+ MentionEveryone: 1 << 17,
172
+ UseExternalEmojis: 1 << 18,
173
+ ViewGuildInsights: 1 << 19,
174
+ Connect: 1 << 20,
175
+ Speak: 1 << 21,
176
+ MuteMembers: 1 << 22,
177
+ DeafenMembers: 1 << 23,
178
+ MoveMembers: 1 << 24,
179
+ UseVad: 1 << 25,
180
+ ChangeNickname: 1 << 26,
181
+ ManageNicknames: 1 << 27,
182
+ ManageRoles: 1 << 28,
183
+ ManageWebhooks: 1 << 29,
184
+ ManageEmojisAndStickers: 1 << 30,
185
+ UseApplicationCommands: 1 << 31,
186
+ RequestToSpeak: 1 << 32,
187
+ ManageEvents: 1 << 33,
188
+ ManageThreads: 1 << 34,
189
+ CreatePublicThreads: 1 << 35,
190
+ CreatePrivateThreads: 1 << 36,
191
+ UseExternalStickers: 1 << 37,
192
+ SendMessagesInThreads: 1 << 38
193
+ };
194
+ var PermissionsBitField = class extends BitField {
195
+ static Flags = PermissionFlags;
196
+ };
197
+
198
+ // src/MessageFlagsBitField.ts
199
+ var MessageFlagsBits = {
200
+ Crossposted: 1 << 0,
201
+ IsCrosspost: 1 << 1,
202
+ SuppressEmbeds: 1 << 2,
203
+ SourceMessageDeleted: 1 << 3,
204
+ Urgent: 1 << 4,
205
+ HasThread: 1 << 5,
206
+ Ephemeral: 1 << 6,
207
+ Loading: 1 << 7,
208
+ FailToLinkToRole: 1 << 8,
209
+ SuppressNotifications: 1 << 12,
210
+ IsVoiceMessage: 1 << 13,
211
+ CompactAttachments: 1 << 17
212
+ };
213
+ var MessageFlagsBitField = class extends BitField {
214
+ static Flags = MessageFlagsBits;
215
+ };
216
+
217
+ // src/UserFlagsBitField.ts
218
+ var UserFlagsBits = {
219
+ Staff: 1 << 0,
220
+ Partner: 1 << 1,
221
+ Hypesquad: 1 << 2,
222
+ BugHunterLevel1: 1 << 3,
223
+ HypeSquadOnlineHouse1: 1 << 6,
224
+ HypeSquadOnlineHouse2: 1 << 7,
225
+ HypeSquadOnlineHouse3: 1 << 8,
226
+ PremiumEarlySupporter: 1 << 9,
227
+ BugHunterLevel2: 1 << 14,
228
+ VerifiedBot: 1 << 16,
229
+ VerifiedDeveloper: 1 << 17,
230
+ CertifiedModerator: 1 << 18,
231
+ BotHttpInteractions: 1 << 19,
232
+ FriendlyBot: 1 << 20,
233
+ FriendlyBotManualApproval: 1 << 21
234
+ };
235
+ var UserFlagsBitField = class extends BitField {
236
+ static Flags = UserFlagsBits;
237
+ };
238
+
239
+ // src/formatters.ts
240
+ function formatColor(color) {
241
+ const hex = color.toString(16).padStart(6, "0");
242
+ return `#${hex}`;
243
+ }
244
+ function escapeMarkdown(text) {
245
+ return text.replace(/([\\*_`~|])/g, "\\$1");
246
+ }
247
+ function formatTimestamp(timestamp, style) {
248
+ const suffix = style ? `:${style}` : "";
249
+ return `<t:${Math.floor(timestamp / 1e3)}${suffix}>`;
250
+ }
251
+ function truncate(str, maxLength, suffix = "...") {
252
+ if (str.length <= maxLength) return str;
253
+ return str.slice(0, maxLength - suffix.length) + suffix;
254
+ }
255
+
256
+ // src/resolvers.ts
257
+ function resolveColor(color) {
258
+ if (typeof color === "number") {
259
+ if (color < 0 || color > 16777215) throw new RangeError("Color must be between 0 and 16777215");
260
+ return color;
261
+ }
262
+ if (Array.isArray(color)) {
263
+ const [r, g, b] = color;
264
+ return r << 16 | g << 8 | b;
265
+ }
266
+ if (typeof color === "string") {
267
+ const hex = color.replace(/^#/, "");
268
+ if (!/^[0-9a-fA-F]{6}$/.test(hex)) throw new RangeError("Invalid hex color");
269
+ return parseInt(hex, 16);
270
+ }
271
+ throw new TypeError("Color must be a number, hex string, or RGB array");
272
+ }
273
+ function parseEmoji(emoji) {
274
+ const custom = /^<a?:\w+:(\d+)>$/;
275
+ const match = emoji.match(custom);
276
+ if (match) {
277
+ const name = emoji.slice(emoji.indexOf(":") + 1, emoji.lastIndexOf(":"));
278
+ return { id: match[1], name };
279
+ }
280
+ if (emoji.length > 0) return { id: null, name: emoji };
281
+ return null;
282
+ }
283
+ function formatEmoji(emoji) {
284
+ if (emoji.id) {
285
+ const prefix = emoji.animated ? "a" : "";
286
+ return `${prefix}:${emoji.name}:${emoji.id}`;
287
+ }
288
+ return encodeURIComponent(emoji.name);
289
+ }
290
+ // Annotate the CommonJS export names for ESM import in node:
291
+ 0 && (module.exports = {
292
+ BitField,
293
+ FLUXER_EPOCH,
294
+ MessageFlagsBitField,
295
+ MessageFlagsBits,
296
+ PermissionFlags,
297
+ PermissionsBitField,
298
+ SnowflakeUtil,
299
+ UserFlagsBitField,
300
+ UserFlagsBits,
301
+ escapeMarkdown,
302
+ formatColor,
303
+ formatEmoji,
304
+ formatTimestamp,
305
+ parseEmoji,
306
+ resolveColor,
307
+ truncate
308
+ });
package/dist/index.mjs ADDED
@@ -0,0 +1,266 @@
1
+ // src/BitField.ts
2
+ var BitField = class _BitField {
3
+ static Flags = {};
4
+ defaultBit = 0;
5
+ bitfield;
6
+ constructor(bits = 0) {
7
+ const Ctor = this.constructor;
8
+ this.bitfield = Ctor.resolve(bits);
9
+ }
10
+ get [Symbol.toStringTag]() {
11
+ return `BitField${this.bitfield}`;
12
+ }
13
+ static resolve(bit) {
14
+ const Flags = this.Flags;
15
+ if (typeof bit === "number" && bit >= 0) return bit;
16
+ if (bit instanceof _BitField) return bit.bitfield;
17
+ if (Array.isArray(bit)) return bit.map((b) => this.resolve(b)).reduce((a, b) => a | b, 0);
18
+ if (typeof bit === "string" && typeof Flags[bit] !== "undefined") return Flags[bit];
19
+ throw new RangeError(`Invalid bitfield flag or number: ${bit}`);
20
+ }
21
+ has(bit) {
22
+ bit = this.constructor.resolve(bit);
23
+ return (this.bitfield & bit) === bit;
24
+ }
25
+ add(...bits) {
26
+ let total = 0;
27
+ for (const bit of bits) {
28
+ total |= this.constructor.resolve(bit);
29
+ }
30
+ this.bitfield |= total;
31
+ return this;
32
+ }
33
+ remove(...bits) {
34
+ let total = 0;
35
+ for (const bit of bits) {
36
+ total |= this.constructor.resolve(bit);
37
+ }
38
+ this.bitfield &= ~total;
39
+ return this;
40
+ }
41
+ serialize() {
42
+ const Flags = this.constructor.Flags;
43
+ const serialized = {};
44
+ for (const [key, value] of Object.entries(Flags)) {
45
+ serialized[key] = (this.bitfield & value) === value;
46
+ }
47
+ return serialized;
48
+ }
49
+ toArray() {
50
+ const Flags = this.constructor.Flags;
51
+ return Object.entries(Flags).filter(([, value]) => (this.bitfield & value) === value).map(([key]) => key);
52
+ }
53
+ toJSON() {
54
+ return this.bitfield;
55
+ }
56
+ valueOf() {
57
+ return this.bitfield;
58
+ }
59
+ equals(bitfield) {
60
+ return this.bitfield === bitfield.bitfield;
61
+ }
62
+ freeze() {
63
+ return Object.freeze(this);
64
+ }
65
+ };
66
+
67
+ // src/SnowflakeUtil.ts
68
+ var FLUXER_EPOCH = 1420070400000n;
69
+ var SnowflakeUtil = class {
70
+ static EPOCH = FLUXER_EPOCH;
71
+ /**
72
+ * Converts a snowflake to a Unix timestamp in milliseconds.
73
+ */
74
+ static timestampFromSnowflake(snowflake) {
75
+ return Number((BigInt(snowflake) >> 22n) + FLUXER_EPOCH);
76
+ }
77
+ /**
78
+ * Converts a snowflake to a Date.
79
+ */
80
+ static dateFromSnowflake(snowflake) {
81
+ return new Date(this.timestampFromSnowflake(snowflake));
82
+ }
83
+ /**
84
+ * Converts a Unix timestamp (ms) to a snowflake string.
85
+ * Useful for pagination (before/after).
86
+ */
87
+ static snowflakeFromTimestamp(timestamp) {
88
+ return (BigInt(timestamp) - FLUXER_EPOCH << 22n).toString();
89
+ }
90
+ /**
91
+ * Deconstructs a snowflake into its components.
92
+ */
93
+ static deconstruct(snowflake) {
94
+ const big = BigInt(snowflake);
95
+ return {
96
+ timestamp: Number((big >> 22n) + FLUXER_EPOCH),
97
+ date: new Date(Number((big >> 22n) + FLUXER_EPOCH)),
98
+ workerId: Number(big >> 17n & 0x1fn),
99
+ processId: Number(big >> 12n & 0x1fn),
100
+ increment: Number(big & 0xfffn)
101
+ };
102
+ }
103
+ /**
104
+ * Checks if a string is a valid snowflake format (numeric string, 0 or positive).
105
+ */
106
+ static isValid(snowflake) {
107
+ return /^(0|[1-9]\d*)$/.test(snowflake) && snowflake.length <= 20;
108
+ }
109
+ };
110
+
111
+ // src/PermissionsBitField.ts
112
+ var PermissionFlags = {
113
+ CreateInstantInvite: 1 << 0,
114
+ KickMembers: 1 << 1,
115
+ BanMembers: 1 << 2,
116
+ Administrator: 1 << 3,
117
+ ManageChannels: 1 << 4,
118
+ ManageGuild: 1 << 5,
119
+ AddReactions: 1 << 6,
120
+ ViewAuditLog: 1 << 7,
121
+ PrioritySpeaker: 1 << 8,
122
+ Stream: 1 << 9,
123
+ ViewChannel: 1 << 10,
124
+ SendMessages: 1 << 11,
125
+ SendTtsMessages: 1 << 12,
126
+ ManageMessages: 1 << 13,
127
+ EmbedLinks: 1 << 14,
128
+ AttachFiles: 1 << 15,
129
+ ReadMessageHistory: 1 << 16,
130
+ MentionEveryone: 1 << 17,
131
+ UseExternalEmojis: 1 << 18,
132
+ ViewGuildInsights: 1 << 19,
133
+ Connect: 1 << 20,
134
+ Speak: 1 << 21,
135
+ MuteMembers: 1 << 22,
136
+ DeafenMembers: 1 << 23,
137
+ MoveMembers: 1 << 24,
138
+ UseVad: 1 << 25,
139
+ ChangeNickname: 1 << 26,
140
+ ManageNicknames: 1 << 27,
141
+ ManageRoles: 1 << 28,
142
+ ManageWebhooks: 1 << 29,
143
+ ManageEmojisAndStickers: 1 << 30,
144
+ UseApplicationCommands: 1 << 31,
145
+ RequestToSpeak: 1 << 32,
146
+ ManageEvents: 1 << 33,
147
+ ManageThreads: 1 << 34,
148
+ CreatePublicThreads: 1 << 35,
149
+ CreatePrivateThreads: 1 << 36,
150
+ UseExternalStickers: 1 << 37,
151
+ SendMessagesInThreads: 1 << 38
152
+ };
153
+ var PermissionsBitField = class extends BitField {
154
+ static Flags = PermissionFlags;
155
+ };
156
+
157
+ // src/MessageFlagsBitField.ts
158
+ var MessageFlagsBits = {
159
+ Crossposted: 1 << 0,
160
+ IsCrosspost: 1 << 1,
161
+ SuppressEmbeds: 1 << 2,
162
+ SourceMessageDeleted: 1 << 3,
163
+ Urgent: 1 << 4,
164
+ HasThread: 1 << 5,
165
+ Ephemeral: 1 << 6,
166
+ Loading: 1 << 7,
167
+ FailToLinkToRole: 1 << 8,
168
+ SuppressNotifications: 1 << 12,
169
+ IsVoiceMessage: 1 << 13,
170
+ CompactAttachments: 1 << 17
171
+ };
172
+ var MessageFlagsBitField = class extends BitField {
173
+ static Flags = MessageFlagsBits;
174
+ };
175
+
176
+ // src/UserFlagsBitField.ts
177
+ var UserFlagsBits = {
178
+ Staff: 1 << 0,
179
+ Partner: 1 << 1,
180
+ Hypesquad: 1 << 2,
181
+ BugHunterLevel1: 1 << 3,
182
+ HypeSquadOnlineHouse1: 1 << 6,
183
+ HypeSquadOnlineHouse2: 1 << 7,
184
+ HypeSquadOnlineHouse3: 1 << 8,
185
+ PremiumEarlySupporter: 1 << 9,
186
+ BugHunterLevel2: 1 << 14,
187
+ VerifiedBot: 1 << 16,
188
+ VerifiedDeveloper: 1 << 17,
189
+ CertifiedModerator: 1 << 18,
190
+ BotHttpInteractions: 1 << 19,
191
+ FriendlyBot: 1 << 20,
192
+ FriendlyBotManualApproval: 1 << 21
193
+ };
194
+ var UserFlagsBitField = class extends BitField {
195
+ static Flags = UserFlagsBits;
196
+ };
197
+
198
+ // src/formatters.ts
199
+ function formatColor(color) {
200
+ const hex = color.toString(16).padStart(6, "0");
201
+ return `#${hex}`;
202
+ }
203
+ function escapeMarkdown(text) {
204
+ return text.replace(/([\\*_`~|])/g, "\\$1");
205
+ }
206
+ function formatTimestamp(timestamp, style) {
207
+ const suffix = style ? `:${style}` : "";
208
+ return `<t:${Math.floor(timestamp / 1e3)}${suffix}>`;
209
+ }
210
+ function truncate(str, maxLength, suffix = "...") {
211
+ if (str.length <= maxLength) return str;
212
+ return str.slice(0, maxLength - suffix.length) + suffix;
213
+ }
214
+
215
+ // src/resolvers.ts
216
+ function resolveColor(color) {
217
+ if (typeof color === "number") {
218
+ if (color < 0 || color > 16777215) throw new RangeError("Color must be between 0 and 16777215");
219
+ return color;
220
+ }
221
+ if (Array.isArray(color)) {
222
+ const [r, g, b] = color;
223
+ return r << 16 | g << 8 | b;
224
+ }
225
+ if (typeof color === "string") {
226
+ const hex = color.replace(/^#/, "");
227
+ if (!/^[0-9a-fA-F]{6}$/.test(hex)) throw new RangeError("Invalid hex color");
228
+ return parseInt(hex, 16);
229
+ }
230
+ throw new TypeError("Color must be a number, hex string, or RGB array");
231
+ }
232
+ function parseEmoji(emoji) {
233
+ const custom = /^<a?:\w+:(\d+)>$/;
234
+ const match = emoji.match(custom);
235
+ if (match) {
236
+ const name = emoji.slice(emoji.indexOf(":") + 1, emoji.lastIndexOf(":"));
237
+ return { id: match[1], name };
238
+ }
239
+ if (emoji.length > 0) return { id: null, name: emoji };
240
+ return null;
241
+ }
242
+ function formatEmoji(emoji) {
243
+ if (emoji.id) {
244
+ const prefix = emoji.animated ? "a" : "";
245
+ return `${prefix}:${emoji.name}:${emoji.id}`;
246
+ }
247
+ return encodeURIComponent(emoji.name);
248
+ }
249
+ export {
250
+ BitField,
251
+ FLUXER_EPOCH,
252
+ MessageFlagsBitField,
253
+ MessageFlagsBits,
254
+ PermissionFlags,
255
+ PermissionsBitField,
256
+ SnowflakeUtil,
257
+ UserFlagsBitField,
258
+ UserFlagsBits,
259
+ escapeMarkdown,
260
+ formatColor,
261
+ formatEmoji,
262
+ formatTimestamp,
263
+ parseEmoji,
264
+ resolveColor,
265
+ truncate
266
+ };
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@fluxerjs/util",
3
+ "publishConfig": {
4
+ "access": "public"
5
+ },
6
+ "version": "1.0.2",
7
+ "description": "Shared utilities for @fluxerjs/core",
8
+ "main": "./dist/index.js",
9
+ "module": "./dist/index.mjs",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.mjs",
15
+ "require": "./dist/index.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "devDependencies": {
22
+ "tsup": "^8.3.0",
23
+ "typescript": "^5.6.0"
24
+ },
25
+ "scripts": {
26
+ "build": "tsup src/index.ts --format cjs,esm --dts",
27
+ "clean": "rm -rf dist"
28
+ }
29
+ }