@jubbio/core 1.0.0

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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/dist/Client.d.ts +147 -0
  4. package/dist/Client.js +471 -0
  5. package/dist/builders/ActionRowBuilder.d.ts +53 -0
  6. package/dist/builders/ActionRowBuilder.js +68 -0
  7. package/dist/builders/ButtonBuilder.d.ts +77 -0
  8. package/dist/builders/ButtonBuilder.js +96 -0
  9. package/dist/builders/EmbedBuilder.d.ts +157 -0
  10. package/dist/builders/EmbedBuilder.js +199 -0
  11. package/dist/builders/ModalBuilder.d.ts +122 -0
  12. package/dist/builders/ModalBuilder.js +162 -0
  13. package/dist/builders/SelectMenuBuilder.d.ts +123 -0
  14. package/dist/builders/SelectMenuBuilder.js +165 -0
  15. package/dist/builders/SlashCommandBuilder.d.ts +197 -0
  16. package/dist/builders/SlashCommandBuilder.js +324 -0
  17. package/dist/builders/index.d.ts +9 -0
  18. package/dist/builders/index.js +26 -0
  19. package/dist/enums.d.ts +196 -0
  20. package/dist/enums.js +216 -0
  21. package/dist/index.d.ts +25 -0
  22. package/dist/index.js +128 -0
  23. package/dist/managers/BaseManager.d.ts +69 -0
  24. package/dist/managers/BaseManager.js +106 -0
  25. package/dist/managers/ChannelManager.d.ts +98 -0
  26. package/dist/managers/ChannelManager.js +209 -0
  27. package/dist/managers/GuildMemberManager.d.ts +74 -0
  28. package/dist/managers/GuildMemberManager.js +156 -0
  29. package/dist/managers/RoleManager.d.ts +84 -0
  30. package/dist/managers/RoleManager.js +207 -0
  31. package/dist/managers/index.d.ts +7 -0
  32. package/dist/managers/index.js +24 -0
  33. package/dist/rest/REST.d.ts +483 -0
  34. package/dist/rest/REST.js +805 -0
  35. package/dist/rest/index.d.ts +1 -0
  36. package/dist/rest/index.js +18 -0
  37. package/dist/sharding/ShardingManager.d.ts +179 -0
  38. package/dist/sharding/ShardingManager.js +375 -0
  39. package/dist/sharding/index.d.ts +4 -0
  40. package/dist/sharding/index.js +21 -0
  41. package/dist/structures/Channel.d.ts +120 -0
  42. package/dist/structures/Channel.js +224 -0
  43. package/dist/structures/Collection.d.ts +53 -0
  44. package/dist/structures/Collection.js +115 -0
  45. package/dist/structures/Guild.d.ts +59 -0
  46. package/dist/structures/Guild.js +90 -0
  47. package/dist/structures/GuildMember.d.ts +130 -0
  48. package/dist/structures/GuildMember.js +208 -0
  49. package/dist/structures/Interaction.d.ts +224 -0
  50. package/dist/structures/Interaction.js +404 -0
  51. package/dist/structures/Message.d.ts +93 -0
  52. package/dist/structures/Message.js +145 -0
  53. package/dist/structures/User.d.ts +37 -0
  54. package/dist/structures/User.js +65 -0
  55. package/dist/structures/index.d.ts +7 -0
  56. package/dist/structures/index.js +25 -0
  57. package/dist/structures.d.ts +1 -0
  58. package/dist/structures.js +19 -0
  59. package/dist/types.d.ts +255 -0
  60. package/dist/types.js +3 -0
  61. package/dist/utils/BitField.d.ts +66 -0
  62. package/dist/utils/BitField.js +138 -0
  63. package/dist/utils/Collection.d.ts +116 -0
  64. package/dist/utils/Collection.js +265 -0
  65. package/dist/utils/Collector.d.ts +152 -0
  66. package/dist/utils/Collector.js +314 -0
  67. package/dist/utils/DataResolver.d.ts +61 -0
  68. package/dist/utils/DataResolver.js +146 -0
  69. package/dist/utils/Formatters.d.ts +145 -0
  70. package/dist/utils/Formatters.js +213 -0
  71. package/dist/utils/IntentsBitField.d.ts +85 -0
  72. package/dist/utils/IntentsBitField.js +99 -0
  73. package/dist/utils/Partials.d.ts +105 -0
  74. package/dist/utils/Partials.js +149 -0
  75. package/dist/utils/PermissionsBitField.d.ts +118 -0
  76. package/dist/utils/PermissionsBitField.js +145 -0
  77. package/dist/utils/SnowflakeUtil.d.ts +63 -0
  78. package/dist/utils/SnowflakeUtil.js +93 -0
  79. package/dist/utils/Sweepers.d.ts +127 -0
  80. package/dist/utils/Sweepers.js +270 -0
  81. package/dist/utils/index.d.ts +13 -0
  82. package/dist/utils/index.js +30 -0
  83. package/package.json +37 -0
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Snowflake utilities
3
+ * API compatible with Discord.js SnowflakeUtil
4
+ */
5
+ /**
6
+ * A container for useful snowflake-related methods
7
+ */
8
+ export declare class SnowflakeUtil {
9
+ /**
10
+ * Jubbio's epoch value
11
+ */
12
+ static readonly EPOCH = 1420070400000n;
13
+ /**
14
+ * Generates a snowflake ID
15
+ * @param timestamp Timestamp or date to generate from
16
+ */
17
+ static generate(timestamp?: number | Date): string;
18
+ /**
19
+ * Deconstructs a snowflake ID
20
+ * @param snowflake Snowflake to deconstruct
21
+ */
22
+ static deconstruct(snowflake: string): DeconstructedSnowflake;
23
+ /**
24
+ * Retrieves the timestamp from a snowflake
25
+ * @param snowflake Snowflake to get the timestamp from
26
+ */
27
+ static timestampFrom(snowflake: string): number;
28
+ /**
29
+ * Retrieves the date from a snowflake
30
+ * @param snowflake Snowflake to get the date from
31
+ */
32
+ static dateFrom(snowflake: string): Date;
33
+ /**
34
+ * Compares two snowflakes
35
+ * @param a First snowflake
36
+ * @param b Second snowflake
37
+ * @returns -1 if a < b, 0 if a === b, 1 if a > b
38
+ */
39
+ static compare(a: string, b: string): -1 | 0 | 1;
40
+ /**
41
+ * Checks if a value is a valid snowflake
42
+ * @param value Value to check
43
+ */
44
+ static isValid(value: unknown): value is string;
45
+ }
46
+ /**
47
+ * Deconstructed snowflake data
48
+ */
49
+ export interface DeconstructedSnowflake {
50
+ /** Timestamp the snowflake was created */
51
+ timestamp: number;
52
+ /** Date the snowflake was created */
53
+ date: Date;
54
+ /** Worker ID in the snowflake */
55
+ workerId: number;
56
+ /** Process ID in the snowflake */
57
+ processId: number;
58
+ /** Increment in the snowflake */
59
+ increment: number;
60
+ /** Binary representation of the snowflake */
61
+ binary: string;
62
+ }
63
+ export default SnowflakeUtil;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /**
3
+ * Snowflake utilities
4
+ * API compatible with Discord.js SnowflakeUtil
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SnowflakeUtil = void 0;
8
+ // Jubbio epoch (same as Discord: 2015-01-01T00:00:00.000Z)
9
+ const EPOCH = 1420070400000n;
10
+ /**
11
+ * A container for useful snowflake-related methods
12
+ */
13
+ class SnowflakeUtil {
14
+ /**
15
+ * Jubbio's epoch value
16
+ */
17
+ static EPOCH = EPOCH;
18
+ /**
19
+ * Generates a snowflake ID
20
+ * @param timestamp Timestamp or date to generate from
21
+ */
22
+ static generate(timestamp = Date.now()) {
23
+ const time = timestamp instanceof Date ? timestamp.getTime() : timestamp;
24
+ return ((BigInt(time) - EPOCH) << 22n).toString();
25
+ }
26
+ /**
27
+ * Deconstructs a snowflake ID
28
+ * @param snowflake Snowflake to deconstruct
29
+ */
30
+ static deconstruct(snowflake) {
31
+ const bigIntSnowflake = BigInt(snowflake);
32
+ return {
33
+ timestamp: Number((bigIntSnowflake >> 22n) + EPOCH),
34
+ get date() {
35
+ return new Date(this.timestamp);
36
+ },
37
+ workerId: Number((bigIntSnowflake & 0x3e0000n) >> 17n),
38
+ processId: Number((bigIntSnowflake & 0x1f000n) >> 12n),
39
+ increment: Number(bigIntSnowflake & 0xfffn),
40
+ binary: bigIntSnowflake.toString(2).padStart(64, '0'),
41
+ };
42
+ }
43
+ /**
44
+ * Retrieves the timestamp from a snowflake
45
+ * @param snowflake Snowflake to get the timestamp from
46
+ */
47
+ static timestampFrom(snowflake) {
48
+ return Number((BigInt(snowflake) >> 22n) + EPOCH);
49
+ }
50
+ /**
51
+ * Retrieves the date from a snowflake
52
+ * @param snowflake Snowflake to get the date from
53
+ */
54
+ static dateFrom(snowflake) {
55
+ return new Date(SnowflakeUtil.timestampFrom(snowflake));
56
+ }
57
+ /**
58
+ * Compares two snowflakes
59
+ * @param a First snowflake
60
+ * @param b Second snowflake
61
+ * @returns -1 if a < b, 0 if a === b, 1 if a > b
62
+ */
63
+ static compare(a, b) {
64
+ const bigA = BigInt(a);
65
+ const bigB = BigInt(b);
66
+ if (bigA < bigB)
67
+ return -1;
68
+ if (bigA > bigB)
69
+ return 1;
70
+ return 0;
71
+ }
72
+ /**
73
+ * Checks if a value is a valid snowflake
74
+ * @param value Value to check
75
+ */
76
+ static isValid(value) {
77
+ if (typeof value !== 'string')
78
+ return false;
79
+ if (!/^\d{17,20}$/.test(value))
80
+ return false;
81
+ try {
82
+ const timestamp = SnowflakeUtil.timestampFrom(value);
83
+ return timestamp > Number(EPOCH) && timestamp < Date.now() + 1000 * 60 * 60 * 24 * 365; // Within reasonable range
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ }
90
+ exports.SnowflakeUtil = SnowflakeUtil;
91
+ // Export as default too for convenience
92
+ exports.default = SnowflakeUtil;
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU25vd2ZsYWtlVXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9Tbm93Zmxha2VVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILDJEQUEyRDtBQUMzRCxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUM7QUFFN0I7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFDeEI7O09BRUc7SUFDSCxNQUFNLENBQVUsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUU5Qjs7O09BR0c7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQTJCLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDbkQsTUFBTSxJQUFJLEdBQUcsU0FBUyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDekUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQWlCO1FBQ2xDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxPQUFPO1lBQ0wsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLGVBQWUsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDbkQsSUFBSSxJQUFJO2dCQUNOLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFDRCxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQztZQUN0RCxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQztZQUN0RCxTQUFTLEVBQUUsTUFBTSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUM7WUFDM0MsTUFBTSxFQUFFLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUM7U0FDdEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQWlCO1FBQ3BDLE9BQU8sTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQWlCO1FBQy9CLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDakMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLElBQUksR0FBRyxJQUFJO1lBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFJLElBQUksR0FBRyxJQUFJO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUIsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFjO1FBQzNCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzdDLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckQsT0FBTyxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLDBCQUEwQjtRQUNwSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQzs7QUE1RUgsc0NBNkVDO0FBb0JELHdDQUF3QztBQUN4QyxrQkFBZSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogU25vd2ZsYWtlIHV0aWxpdGllc1xyXG4gKiBBUEkgY29tcGF0aWJsZSB3aXRoIERpc2NvcmQuanMgU25vd2ZsYWtlVXRpbFxyXG4gKi9cclxuXHJcbi8vIEp1YmJpbyBlcG9jaCAoc2FtZSBhcyBEaXNjb3JkOiAyMDE1LTAxLTAxVDAwOjAwOjAwLjAwMFopXHJcbmNvbnN0IEVQT0NIID0gMTQyMDA3MDQwMDAwMG47XHJcblxyXG4vKipcclxuICogQSBjb250YWluZXIgZm9yIHVzZWZ1bCBzbm93Zmxha2UtcmVsYXRlZCBtZXRob2RzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU25vd2ZsYWtlVXRpbCB7XHJcbiAgLyoqXHJcbiAgICogSnViYmlvJ3MgZXBvY2ggdmFsdWVcclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgRVBPQ0ggPSBFUE9DSDtcclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGEgc25vd2ZsYWtlIElEXHJcbiAgICogQHBhcmFtIHRpbWVzdGFtcCBUaW1lc3RhbXAgb3IgZGF0ZSB0byBnZW5lcmF0ZSBmcm9tXHJcbiAgICovXHJcbiAgc3RhdGljIGdlbmVyYXRlKHRpbWVzdGFtcDogbnVtYmVyIHwgRGF0ZSA9IERhdGUubm93KCkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGltZSA9IHRpbWVzdGFtcCBpbnN0YW5jZW9mIERhdGUgPyB0aW1lc3RhbXAuZ2V0VGltZSgpIDogdGltZXN0YW1wO1xyXG4gICAgcmV0dXJuICgoQmlnSW50KHRpbWUpIC0gRVBPQ0gpIDw8IDIybikudG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlY29uc3RydWN0cyBhIHNub3dmbGFrZSBJRFxyXG4gICAqIEBwYXJhbSBzbm93Zmxha2UgU25vd2ZsYWtlIHRvIGRlY29uc3RydWN0XHJcbiAgICovXHJcbiAgc3RhdGljIGRlY29uc3RydWN0KHNub3dmbGFrZTogc3RyaW5nKTogRGVjb25zdHJ1Y3RlZFNub3dmbGFrZSB7XHJcbiAgICBjb25zdCBiaWdJbnRTbm93Zmxha2UgPSBCaWdJbnQoc25vd2ZsYWtlKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRpbWVzdGFtcDogTnVtYmVyKChiaWdJbnRTbm93Zmxha2UgPj4gMjJuKSArIEVQT0NIKSxcclxuICAgICAgZ2V0IGRhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudGltZXN0YW1wKTtcclxuICAgICAgfSxcclxuICAgICAgd29ya2VySWQ6IE51bWJlcigoYmlnSW50U25vd2ZsYWtlICYgMHgzRTAwMDBuKSA+PiAxN24pLFxyXG4gICAgICBwcm9jZXNzSWQ6IE51bWJlcigoYmlnSW50U25vd2ZsYWtlICYgMHgxRjAwMG4pID4+IDEybiksXHJcbiAgICAgIGluY3JlbWVudDogTnVtYmVyKGJpZ0ludFNub3dmbGFrZSAmIDB4RkZGbiksXHJcbiAgICAgIGJpbmFyeTogYmlnSW50U25vd2ZsYWtlLnRvU3RyaW5nKDIpLnBhZFN0YXJ0KDY0LCAnMCcpLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgdGltZXN0YW1wIGZyb20gYSBzbm93Zmxha2VcclxuICAgKiBAcGFyYW0gc25vd2ZsYWtlIFNub3dmbGFrZSB0byBnZXQgdGhlIHRpbWVzdGFtcCBmcm9tXHJcbiAgICovXHJcbiAgc3RhdGljIHRpbWVzdGFtcEZyb20oc25vd2ZsYWtlOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE51bWJlcigoQmlnSW50KHNub3dmbGFrZSkgPj4gMjJuKSArIEVQT0NIKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgZGF0ZSBmcm9tIGEgc25vd2ZsYWtlXHJcbiAgICogQHBhcmFtIHNub3dmbGFrZSBTbm93Zmxha2UgdG8gZ2V0IHRoZSBkYXRlIGZyb21cclxuICAgKi9cclxuICBzdGF0aWMgZGF0ZUZyb20oc25vd2ZsYWtlOiBzdHJpbmcpOiBEYXRlIHtcclxuICAgIHJldHVybiBuZXcgRGF0ZShTbm93Zmxha2VVdGlsLnRpbWVzdGFtcEZyb20oc25vd2ZsYWtlKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wYXJlcyB0d28gc25vd2ZsYWtlc1xyXG4gICAqIEBwYXJhbSBhIEZpcnN0IHNub3dmbGFrZVxyXG4gICAqIEBwYXJhbSBiIFNlY29uZCBzbm93Zmxha2VcclxuICAgKiBAcmV0dXJucyAtMSBpZiBhIDwgYiwgMCBpZiBhID09PSBiLCAxIGlmIGEgPiBiXHJcbiAgICovXHJcbiAgc3RhdGljIGNvbXBhcmUoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiAtMSB8IDAgfCAxIHtcclxuICAgIGNvbnN0IGJpZ0EgPSBCaWdJbnQoYSk7XHJcbiAgICBjb25zdCBiaWdCID0gQmlnSW50KGIpO1xyXG4gICAgaWYgKGJpZ0EgPCBiaWdCKSByZXR1cm4gLTE7XHJcbiAgICBpZiAoYmlnQSA+IGJpZ0IpIHJldHVybiAxO1xyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIHNub3dmbGFrZVxyXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBjaGVja1xyXG4gICAqL1xyXG4gIHN0YXRpYyBpc1ZhbGlkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAoIS9eXFxkezE3LDIwfSQvLnRlc3QodmFsdWUpKSByZXR1cm4gZmFsc2U7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBTbm93Zmxha2VVdGlsLnRpbWVzdGFtcEZyb20odmFsdWUpO1xyXG4gICAgICByZXR1cm4gdGltZXN0YW1wID4gTnVtYmVyKEVQT0NIKSAmJiB0aW1lc3RhbXAgPCBEYXRlLm5vdygpICsgMTAwMCAqIDYwICogNjAgKiAyNCAqIDM2NTsgLy8gV2l0aGluIHJlYXNvbmFibGUgcmFuZ2VcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRGVjb25zdHJ1Y3RlZCBzbm93Zmxha2UgZGF0YVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEZWNvbnN0cnVjdGVkU25vd2ZsYWtlIHtcclxuICAvKiogVGltZXN0YW1wIHRoZSBzbm93Zmxha2Ugd2FzIGNyZWF0ZWQgKi9cclxuICB0aW1lc3RhbXA6IG51bWJlcjtcclxuICAvKiogRGF0ZSB0aGUgc25vd2ZsYWtlIHdhcyBjcmVhdGVkICovXHJcbiAgZGF0ZTogRGF0ZTtcclxuICAvKiogV29ya2VyIElEIGluIHRoZSBzbm93Zmxha2UgKi9cclxuICB3b3JrZXJJZDogbnVtYmVyO1xyXG4gIC8qKiBQcm9jZXNzIElEIGluIHRoZSBzbm93Zmxha2UgKi9cclxuICBwcm9jZXNzSWQ6IG51bWJlcjtcclxuICAvKiogSW5jcmVtZW50IGluIHRoZSBzbm93Zmxha2UgKi9cclxuICBpbmNyZW1lbnQ6IG51bWJlcjtcclxuICAvKiogQmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzbm93Zmxha2UgKi9cclxuICBiaW5hcnk6IHN0cmluZztcclxufVxyXG5cclxuLy8gRXhwb3J0IGFzIGRlZmF1bHQgdG9vIGZvciBjb252ZW5pZW5jZVxyXG5leHBvcnQgZGVmYXVsdCBTbm93Zmxha2VVdGlsO1xyXG4iXX0=
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Sweepers - Automatic cache cleanup utilities
3
+ */
4
+ import { Collection } from './Collection';
5
+ /**
6
+ * Sweeper options for a specific cache
7
+ */
8
+ export interface SweeperOptions {
9
+ /** Interval in seconds between sweeps */
10
+ interval: number;
11
+ /** Filter function to determine what to sweep */
12
+ filter: () => (value: any, key: string, collection: Collection<string, any>) => boolean;
13
+ }
14
+ /**
15
+ * Global sweeper configuration
16
+ */
17
+ export interface SweeperDefinitions {
18
+ /** Sweep application commands */
19
+ applicationCommands?: SweeperOptions;
20
+ /** Sweep bans */
21
+ bans?: SweeperOptions;
22
+ /** Sweep emojis */
23
+ emojis?: SweeperOptions;
24
+ /** Sweep invites */
25
+ invites?: SweeperOptions;
26
+ /** Sweep guild members */
27
+ guildMembers?: SweeperOptions;
28
+ /** Sweep messages */
29
+ messages?: SweeperOptions;
30
+ /** Sweep presences */
31
+ presences?: SweeperOptions;
32
+ /** Sweep reactions */
33
+ reactions?: SweeperOptions;
34
+ /** Sweep stage instances */
35
+ stageInstances?: SweeperOptions;
36
+ /** Sweep stickers */
37
+ stickers?: SweeperOptions;
38
+ /** Sweep thread members */
39
+ threadMembers?: SweeperOptions;
40
+ /** Sweep threads */
41
+ threads?: SweeperOptions;
42
+ /** Sweep users */
43
+ users?: SweeperOptions;
44
+ /** Sweep voice states */
45
+ voiceStates?: SweeperOptions;
46
+ }
47
+ /**
48
+ * Sweeper filters - predefined filter functions
49
+ */
50
+ export declare const Sweepers: {
51
+ /**
52
+ * Filter that sweeps items older than a certain lifetime
53
+ */
54
+ filterByLifetime<T extends {
55
+ createdTimestamp?: number;
56
+ createdAt?: Date;
57
+ }>(options?: {
58
+ lifetime?: number;
59
+ getComparisonTimestamp?: (value: T) => number;
60
+ excludeFromSweep?: (value: T) => boolean;
61
+ }): () => (value: T) => boolean;
62
+ /**
63
+ * Filter that sweeps archived threads
64
+ */
65
+ archivedThreadSweepFilter(lifetime?: number): () => (thread: any) => boolean;
66
+ /**
67
+ * Filter that sweeps expired invites
68
+ */
69
+ expiredInviteSweepFilter(): () => (invite: any) => boolean;
70
+ /**
71
+ * Filter that sweeps outdated presences
72
+ */
73
+ outdatedPresenceSweepFilter(lifetime?: number): () => (presence: any) => boolean;
74
+ /**
75
+ * Filter that sweeps all items (use with caution)
76
+ */
77
+ sweepAll(): () => () => boolean;
78
+ /**
79
+ * Filter that sweeps nothing
80
+ */
81
+ sweepNone(): () => () => boolean;
82
+ };
83
+ /**
84
+ * Sweeper manager class
85
+ */
86
+ export declare class SweeperManager {
87
+ private client;
88
+ private intervals;
89
+ private options;
90
+ constructor(client: any, options?: SweeperDefinitions);
91
+ /**
92
+ * Start all configured sweepers
93
+ */
94
+ start(): void;
95
+ /**
96
+ * Start a specific sweeper
97
+ */
98
+ private startSweeper;
99
+ /**
100
+ * Stop a specific sweeper
101
+ */
102
+ stopSweeper(name: keyof SweeperDefinitions): void;
103
+ /**
104
+ * Stop all sweepers
105
+ */
106
+ stop(): void;
107
+ /**
108
+ * Manually trigger a sweep
109
+ */
110
+ sweep(name: keyof SweeperDefinitions, filter?: () => (value: any, key: string, collection: Collection<string, any>) => boolean): number;
111
+ /**
112
+ * Get the cache for a sweeper type
113
+ */
114
+ private getCache;
115
+ /**
116
+ * Get sweeper statistics
117
+ */
118
+ getStats(): Record<string, {
119
+ interval: number;
120
+ running: boolean;
121
+ }>;
122
+ }
123
+ /**
124
+ * Default sweeper options for common use cases
125
+ */
126
+ export declare const DefaultSweeperOptions: SweeperDefinitions;
127
+ export default SweeperManager;
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ /**
3
+ * Sweepers - Automatic cache cleanup utilities
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DefaultSweeperOptions = exports.SweeperManager = exports.Sweepers = void 0;
7
+ /**
8
+ * Sweeper filters - predefined filter functions
9
+ */
10
+ exports.Sweepers = {
11
+ /**
12
+ * Filter that sweeps items older than a certain lifetime
13
+ */
14
+ filterByLifetime(options = {}) {
15
+ const lifetime = options.lifetime ?? 14400; // 4 hours default
16
+ const getTimestamp = options.getComparisonTimestamp ??
17
+ ((v) => v.createdTimestamp ?? v.createdAt?.getTime() ?? 0);
18
+ const exclude = options.excludeFromSweep ?? (() => false);
19
+ return () => {
20
+ const now = Date.now();
21
+ const cutoff = now - (lifetime * 1000);
22
+ return (value) => {
23
+ if (exclude(value))
24
+ return false;
25
+ const timestamp = getTimestamp(value);
26
+ return timestamp < cutoff;
27
+ };
28
+ };
29
+ },
30
+ /**
31
+ * Filter that sweeps archived threads
32
+ */
33
+ archivedThreadSweepFilter(lifetime = 14400) {
34
+ return () => {
35
+ const now = Date.now();
36
+ const cutoff = now - (lifetime * 1000);
37
+ return (thread) => {
38
+ if (!thread.archived)
39
+ return false;
40
+ const archivedAt = thread.archivedAt?.getTime() ?? thread.archiveTimestamp ?? 0;
41
+ return archivedAt < cutoff;
42
+ };
43
+ };
44
+ },
45
+ /**
46
+ * Filter that sweeps expired invites
47
+ */
48
+ expiredInviteSweepFilter() {
49
+ return () => {
50
+ const now = Date.now();
51
+ return (invite) => {
52
+ if (!invite.expiresAt && !invite.expiresTimestamp)
53
+ return false;
54
+ const expiresAt = invite.expiresAt?.getTime() ?? invite.expiresTimestamp ?? Infinity;
55
+ return expiresAt < now;
56
+ };
57
+ };
58
+ },
59
+ /**
60
+ * Filter that sweeps outdated presences
61
+ */
62
+ outdatedPresenceSweepFilter(lifetime = 21600) {
63
+ return () => {
64
+ const now = Date.now();
65
+ const cutoff = now - (lifetime * 1000);
66
+ return (presence) => {
67
+ const lastUpdate = presence.lastModified ?? presence.updatedAt?.getTime() ?? 0;
68
+ return lastUpdate < cutoff;
69
+ };
70
+ };
71
+ },
72
+ /**
73
+ * Filter that sweeps all items (use with caution)
74
+ */
75
+ sweepAll() {
76
+ return () => () => true;
77
+ },
78
+ /**
79
+ * Filter that sweeps nothing
80
+ */
81
+ sweepNone() {
82
+ return () => () => false;
83
+ },
84
+ };
85
+ /**
86
+ * Sweeper manager class
87
+ */
88
+ class SweeperManager {
89
+ client;
90
+ intervals = new Map();
91
+ options;
92
+ constructor(client, options = {}) {
93
+ this.client = client;
94
+ this.options = options;
95
+ }
96
+ /**
97
+ * Start all configured sweepers
98
+ */
99
+ start() {
100
+ for (const [key, config] of Object.entries(this.options)) {
101
+ if (config && config.interval > 0) {
102
+ this.startSweeper(key, config);
103
+ }
104
+ }
105
+ }
106
+ /**
107
+ * Start a specific sweeper
108
+ */
109
+ startSweeper(name, config) {
110
+ // Clear existing interval if any
111
+ this.stopSweeper(name);
112
+ const interval = setInterval(() => {
113
+ this.sweep(name, config.filter);
114
+ }, config.interval * 1000);
115
+ this.intervals.set(name, interval);
116
+ }
117
+ /**
118
+ * Stop a specific sweeper
119
+ */
120
+ stopSweeper(name) {
121
+ const interval = this.intervals.get(name);
122
+ if (interval) {
123
+ clearInterval(interval);
124
+ this.intervals.delete(name);
125
+ }
126
+ }
127
+ /**
128
+ * Stop all sweepers
129
+ */
130
+ stop() {
131
+ for (const name of this.intervals.keys()) {
132
+ this.stopSweeper(name);
133
+ }
134
+ }
135
+ /**
136
+ * Manually trigger a sweep
137
+ */
138
+ sweep(name, filter) {
139
+ const cache = this.getCache(name);
140
+ if (!cache)
141
+ return 0;
142
+ const filterFn = filter ?? this.options[name]?.filter;
143
+ if (!filterFn)
144
+ return 0;
145
+ return cache.sweep(filterFn());
146
+ }
147
+ /**
148
+ * Get the cache for a sweeper type
149
+ */
150
+ getCache(name) {
151
+ switch (name) {
152
+ case 'users':
153
+ return this.client.users?.cache ?? null;
154
+ case 'guildMembers':
155
+ // Sweep across all guilds
156
+ let memberCount = 0;
157
+ this.client.guilds?.cache.forEach((guild) => {
158
+ if (guild.members?.cache) {
159
+ const filter = this.options.guildMembers?.filter;
160
+ if (filter)
161
+ memberCount += guild.members.cache.sweep(filter());
162
+ }
163
+ });
164
+ return null; // Already handled
165
+ case 'messages':
166
+ // Sweep across all channels
167
+ this.client.channels?.cache.forEach((channel) => {
168
+ if (channel.messages?.cache) {
169
+ const filter = this.options.messages?.filter;
170
+ if (filter)
171
+ channel.messages.cache.sweep(filter());
172
+ }
173
+ });
174
+ return null;
175
+ case 'threads':
176
+ return this.client.channels?.cache.filter((c) => c.isThread?.()) ?? null;
177
+ case 'presences':
178
+ // Sweep across all guilds
179
+ this.client.guilds?.cache.forEach((guild) => {
180
+ if (guild.presences?.cache) {
181
+ const filter = this.options.presences?.filter;
182
+ if (filter)
183
+ guild.presences.cache.sweep(filter());
184
+ }
185
+ });
186
+ return null;
187
+ case 'voiceStates':
188
+ this.client.guilds?.cache.forEach((guild) => {
189
+ if (guild.voiceStates?.cache) {
190
+ const filter = this.options.voiceStates?.filter;
191
+ if (filter)
192
+ guild.voiceStates.cache.sweep(filter());
193
+ }
194
+ });
195
+ return null;
196
+ case 'reactions':
197
+ // Sweep reactions from all messages
198
+ this.client.channels?.cache.forEach((channel) => {
199
+ channel.messages?.cache.forEach((message) => {
200
+ if (message.reactions?.cache) {
201
+ const filter = this.options.reactions?.filter;
202
+ if (filter)
203
+ message.reactions.cache.sweep(filter());
204
+ }
205
+ });
206
+ });
207
+ return null;
208
+ case 'emojis':
209
+ return this.client.emojis?.cache ?? null;
210
+ case 'stickers':
211
+ return this.client.stickers?.cache ?? null;
212
+ case 'invites':
213
+ // Sweep across all guilds
214
+ this.client.guilds?.cache.forEach((guild) => {
215
+ if (guild.invites?.cache) {
216
+ const filter = this.options.invites?.filter;
217
+ if (filter)
218
+ guild.invites.cache.sweep(filter());
219
+ }
220
+ });
221
+ return null;
222
+ case 'bans':
223
+ this.client.guilds?.cache.forEach((guild) => {
224
+ if (guild.bans?.cache) {
225
+ const filter = this.options.bans?.filter;
226
+ if (filter)
227
+ guild.bans.cache.sweep(filter());
228
+ }
229
+ });
230
+ return null;
231
+ default:
232
+ return null;
233
+ }
234
+ }
235
+ /**
236
+ * Get sweeper statistics
237
+ */
238
+ getStats() {
239
+ const stats = {};
240
+ for (const [name, config] of Object.entries(this.options)) {
241
+ if (config) {
242
+ stats[name] = {
243
+ interval: config.interval,
244
+ running: this.intervals.has(name),
245
+ };
246
+ }
247
+ }
248
+ return stats;
249
+ }
250
+ }
251
+ exports.SweeperManager = SweeperManager;
252
+ /**
253
+ * Default sweeper options for common use cases
254
+ */
255
+ exports.DefaultSweeperOptions = {
256
+ messages: {
257
+ interval: 3600, // 1 hour
258
+ filter: exports.Sweepers.filterByLifetime({ lifetime: 1800 }), // 30 minutes
259
+ },
260
+ threads: {
261
+ interval: 3600,
262
+ filter: exports.Sweepers.archivedThreadSweepFilter(14400), // 4 hours
263
+ },
264
+ invites: {
265
+ interval: 3600,
266
+ filter: exports.Sweepers.expiredInviteSweepFilter(),
267
+ },
268
+ };
269
+ exports.default = SweeperManager;
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3dlZXBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvU3dlZXBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFnREg7O0dBRUc7QUFDVSxRQUFBLFFBQVEsR0FBRztJQUN0Qjs7T0FFRztJQUNILGdCQUFnQixDQUE0RCxVQUl4RSxFQUFFO1FBQ0osTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsQ0FBQyxrQkFBa0I7UUFDOUQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLHNCQUFzQjtZQUNqRCxDQUFDLENBQUMsQ0FBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxRCxPQUFPLEdBQUcsRUFBRTtZQUNWLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QixNQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFFdkMsT0FBTyxDQUFDLEtBQVEsRUFBRSxFQUFFO2dCQUNsQixJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQUUsT0FBTyxLQUFLLENBQUM7Z0JBQ2pDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEMsT0FBTyxTQUFTLEdBQUcsTUFBTSxDQUFDO1lBQzVCLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILHlCQUF5QixDQUFDLFFBQVEsR0FBRyxLQUFLO1FBQ3hDLE9BQU8sR0FBRyxFQUFFO1lBQ1YsTUFBTSxHQUFHLEdB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QWE7S0FDckU7SUFDRCxPQUFPLEVBQUU7UUFDUCxRQUFRLEVBQUUsSUFBSTtRQUNkLE1BQU0sRUFBRSxnQkFBUSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVU7S0FDOUQ7SUFDRCxPQUFPLEVBQUU7UUFDUCxRQUFRLEVBQUUsSUFBSTtRQUNkLE1BQU0sRUFBRSxnQkFBUSxDQUFDLHdCQUF3QixFQUFFO0tBQzVDO0NBQ0YsQ0FBQztBQUVGLGtCQUFlLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBTd2VlcGVycyAtIEF1dG9tYXRpYyBjYWNoZSBjbGVhbnVwIHV0aWxpdGllc1xyXG4gKi9cclxuXHJcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuL0NvbGxlY3Rpb24nO1xyXG5cclxuLyoqXHJcbiAqIFN3ZWVwZXIgb3B0aW9ucyBmb3IgYSBzcGVjaWZpYyBjYWNoZVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTd2VlcGVyT3B0aW9ucyB7XHJcbiAgLyoqIEludGVydmFsIGluIHNlY29uZHMgYmV0d2VlbiBzd2VlcHMgKi9cclxuICBpbnRlcnZhbDogbnVtYmVyO1xyXG4gIC8qKiBGaWx0ZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdG8gc3dlZXAgKi9cclxuICBmaWx0ZXI6ICgpID0+ICh2YWx1ZTogYW55LCBrZXk6IHN0cmluZywgY29sbGVjdGlvbjogQ29sbGVjdGlvbjxzdHJpbmcsIGFueT4pID0+IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHbG9iYWwgc3dlZXBlciBjb25maWd1cmF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN3ZWVwZXJEZWZpbml0aW9ucyB7XHJcbiAgLyoqIFN3ZWVwIGFwcGxpY2F0aW9uIGNvbW1hbmRzICovXHJcbiAgYXBwbGljYXRpb25Db21tYW5kcz86IFN3ZWVwZXJPcHRpb25zO1xyXG4gIC8qKiBTd2VlcCBiYW5zICovXHJcbiAgYmFucz86IFN3ZWVwZXJPcHRpb25zO1xyXG4gIC8qKiBTd2VlcCBlbW9qaXMgKi9cclxuICBlbW9qaXM/OiBTd2VlcGVyT3B0aW9ucztcclxuICAvKiogU3dlZXAgaW52aXRlcyAqL1xyXG4gIGludml0ZXM/OiBTd2VlcGVyT3B0aW9ucztcclxuICAvKiogU3dlZXAgZ3VpbGQgbWVtYmVycyAqL1xyXG4gIGd1aWxkTWVtYmVycz86IFN3ZWVwZXJPcHRpb25zO1xyXG4gIC8qKiBTd2VlcCBtZXNzYWdlcyAqL1xyXG4gIG1lc3NhZ2VzPzogU3dlZXBlck9wdGlvbnM7XHJcbiAgLyoqIFN3ZWVwIHByZXNlbmNlcyAqL1xyXG4gIHByZXNlbmNlcz86IFN3ZWVwZXJPcHRpb25zO1xyXG4gIC8qKiBTd2VlcCByZWFjdGlvbnMgKi9cclxuICByZWFjdGlvbnM/OiBTd2VlcGVyT3B0aW9ucztcclxuICAvKiogU3dlZXAgc3RhZ2UgaW5zdGFuY2VzICovXHJcbiAgc3RhZ2VJbnN0YW5jZXM/OiBTd2VlcGVyT3B0aW9ucztcclxuICAvKiogU3dlZXAgc3RpY2tlcnMgKi9cclxuICBzdGlja2Vycz86IFN3ZWVwZXJPcHRpb25zO1xyXG4gIC8qKiBTd2VlcCB0aHJlYWQgbWVtYmVycyAqL1xyXG4gIHRocmVhZE1lbWJlcnM/OiBTd2VlcGVyT3B0aW9ucztcclxuICAvKiogU3dlZXAgdGhyZWFkcyAqL1xyXG4gIHRocmVhZHM/OiBTd2VlcGVyT3B0aW9ucztcclxuICAvKiogU3dlZXAgdXNlcnMgKi9cclxuICB1c2Vycz86IFN3ZWVwZXJPcHRpb25zO1xyXG4gIC8qKiBTd2VlcCB2b2ljZSBzdGF0ZXMgKi9cclxuICB2b2ljZVN0YXRlcz86IFN3ZWVwZXJPcHRpb25zO1xyXG59XHJcblxyXG4vKipcclxuICogU3dlZXBlciBmaWx0ZXJzIC0gcHJlZGVmaW5lZCBmaWx0ZXIgZnVuY3Rpb25zXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3dlZXBlcnMgPSB7XHJcbiAgLyoqXHJcbiAgICogRmlsdGVyIHRoYXQgc3dlZXBzIGl0ZW1zIG9sZGVyIHRoYW4gYSBjZXJ0YWluIGxpZmV0aW1lXHJcbiAgICovXHJcbiAgZmlsdGVyQnlMaWZldGltZTxUIGV4dGVuZHMgeyBjcmVhdGVkVGltZXN0YW1wPzogbnVtYmVyOyBjcmVhdGVkQXQ/OiBEYXRlIH0+KG9wdGlvbnM6IHtcclxuICAgIGxpZmV0aW1lPzogbnVtYmVyO1xyXG4gICAgZ2V0Q29tcGFyaXNvblRpbWVzdGFtcD86ICh2YWx1ZTogVCkgPT4gbnVtYmVyO1xyXG4gICAgZXhjbHVkZUZyb21Td2VlcD86ICh2YWx1ZTogVCkgPT4gYm9vbGVhbjtcclxuICB9ID0ge30pIHtcclxuICAgIGNvbnN0IGxpZmV0aW1lID0gb3B0aW9ucy5saWZldGltZSA/PyAxNDQwMDsgLy8gNCBob3VycyBkZWZhdWx0XHJcbiAgICBjb25zdCBnZXRUaW1lc3RhbXAgPSBvcHRpb25zLmdldENvbXBhcmlzb25UaW1lc3RhbXAgPz8gXHJcbiAgICAgICgodjogVCkgPT4gdi5jcmVhdGVkVGltZXN0YW1wID8/IHYuY3JlYXRlZEF0Py5nZXRUaW1lKCkgPz8gMCk7XHJcbiAgICBjb25zdCBleGNsdWRlID0gb3B0aW9ucy5leGNsdWRlRnJvbVN3ZWVwID8/ICgoKSA9PiBmYWxzZSk7XHJcbiAgICBcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcbiAgICAgIGNvbnN0IGN1dG9mZiA9IG5vdyAtIChsaWZldGltZSAqIDEwMDApO1xyXG4gICAgICBcclxuICAgICAgcmV0dXJuICh2YWx1ZTogVCkgPT4ge1xyXG4gICAgICAgIGlmIChleGNsdWRlKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGdldFRpbWVzdGFtcCh2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRpbWVzdGFtcCA8IGN1dG9mZjtcclxuICAgICAgfTtcclxuICAgIH07XHJcbiAgfSxcclxuXHJcbiAgLyoqXHJcbiAgICogRmlsdGVyIHRoYXQgc3dlZXBzIGFyY2hpdmVkIHRocmVhZHNcclxuICAgKi9cclxuICBhcmNoaXZlZFRocmVhZFN3ZWVwRmlsdGVyKGxpZmV0aW1lID0gMTQ0MDApIHtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcbiAgICAgIGNvbnN0IGN1dG9mZiA9IG5vdyAtIChsaWZldGltZSAqIDEwMDApO1xyXG4gICAgICBcclxuICAgICAgcmV0dXJuICh0aHJlYWQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhyZWFkLmFyY2hpdmVkKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgYXJjaGl2ZWRBdCA9IHRocmVhZC5hcmNoaXZlZEF0Py5nZXRUaW1lKCkgPz8gdGhyZWFkLmFyY2hpdmVUaW1lc3RhbXAgPz8gMDtcclxuICAgICAgICByZXR1cm4gYXJjaGl2ZWRBdCA8IGN1dG9mZjtcclxuICAgICAgfTtcclxuICAgIH07XHJcbiAgfSxcclxuXHJcbiAgLyoqXHJcbiAgICogRmlsdGVyIHRoYXQgc3dlZXBzIGV4cGlyZWQgaW52aXRlc1xyXG4gICAqL1xyXG4gIGV4cGlyZWRJbnZpdGVTd2VlcEZpbHRlcigpIHtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcbiAgICAgIHJldHVybiAoaW52aXRlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWludml0ZS5leHBpcmVzQXQgJiYgIWludml0ZS5leHBpcmVzVGltZXN0YW1wKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gaW52aXRlLmV4cGlyZXNBdD8uZ2V0VGltZSgpID8/IGludml0ZS5leHBpcmVzVGltZXN0YW1wID8/IEluZmluaXR5O1xyXG4gICAgICAgIHJldHVybiBleHBpcmVzQXQgPCBub3c7XHJcbiAgICAgIH07XHJcbiAgICB9O1xyXG4gIH0sXHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbHRlciB0aGF0IHN3ZWVwcyBvdXRkYXRlZCBwcmVzZW5jZXNcclxuICAgKi9cclxuICBvdXRkYXRlZFByZXNlbmNlU3dlZXBGaWx0ZXIobGlmZXRpbWUgPSAyMTYwMCkge1xyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgY29uc3QgY3V0b2ZmID0gbm93IC0gKGxpZmV0aW1lICogMTAwMCk7XHJcbiAgICAgIFxyXG4gICAgICByZXR1cm4gKHByZXNlbmNlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBsYXN0VXBkYXRlID0gcHJlc2VuY2UubGFzdE1vZGlmaWVkID8/IHByZXNlbmNlLnVwZGF0ZWRBdD8uZ2V0VGltZSgpID8/IDA7XHJcbiAgICAgICAgcmV0dXJuIGxhc3RVcGRhdGUgPCBjdXRvZmY7XHJcbiAgICAgIH07XHJcbiAgICB9O1xyXG4gIH0sXHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbHRlciB0aGF0IHN3ZWVwcyBhbGwgaXRlbXMgKHVzZSB3aXRoIGNhdXRpb24pXHJcbiAgICovXHJcbiAgc3dlZXBBbGwoKSB7XHJcbiAgICByZXR1cm4gKCkgPT4gKCkgPT4gdHJ1ZTtcclxuICB9LFxyXG5cclxuICAvKipcclxuICAgKiBGaWx0ZXIgdGhhdCBzd2VlcHMgbm90aGluZ1xyXG4gICAqL1xyXG4gIHN3ZWVwTm9uZSgpIHtcclxuICAgIHJldHVybiAoKSA9PiAoKSA9PiBmYWxzZTtcclxuICB9LFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFN3ZWVwZXIgbWFuYWdlciBjbGFzc1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN3ZWVwZXJNYW5hZ2VyIHtcclxuICBwcml2YXRlIGNsaWVudDogYW55O1xyXG4gIHByaXZhdGUgaW50ZXJ2YWxzOiBNYXA8c3RyaW5nLCBOb2RlSlMuVGltZW91dD4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBvcHRpb25zOiBTd2VlcGVyRGVmaW5pdGlvbnM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogYW55LCBvcHRpb25zOiBTd2VlcGVyRGVmaW5pdGlvbnMgPSB7fSkge1xyXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RhcnQgYWxsIGNvbmZpZ3VyZWQgc3dlZXBlcnNcclxuICAgKi9cclxuICBzdGFydCgpOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3QgW2tleSwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9wdGlvbnMpKSB7XHJcbiAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmludGVydmFsID4gMCkge1xyXG4gICAgICAgIHRoaXMuc3RhcnRTd2VlcGVyKGtleSBhcyBrZXlvZiBTd2VlcGVyRGVmaW5pdGlvbnMsIGNvbmZpZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0IGEgc3BlY2lmaWMgc3dlZXBlclxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhcnRTd2VlcGVyKG5hbWU6IGtleW9mIFN3ZWVwZXJEZWZpbml0aW9ucywgY29uZmlnOiBTd2VlcGVyT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgaW50ZXJ2YWwgaWYgYW55XHJcbiAgICB0aGlzLnN0b3BTd2VlcGVyKG5hbWUpO1xyXG4gICAgXHJcbiAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy5zd2VlcChuYW1lLCBjb25maWcuZmlsdGVyKTtcclxuICAgIH0sIGNvbmZpZy5pbnRlcnZhbCAqIDEwMDApO1xyXG4gICAgXHJcbiAgICB0aGlzLmludGVydmFscy5zZXQobmFtZSwgaW50ZXJ2YWwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RvcCBhIHNwZWNpZmljIHN3ZWVwZXJcclxuICAgKi9cclxuICBzdG9wU3dlZXBlcihuYW1lOiBrZXlvZiBTd2VlcGVyRGVmaW5pdGlvbnMpOiB2b2lkIHtcclxuICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5pbnRlcnZhbHMuZ2V0KG5hbWUpO1xyXG4gICAgaWYgKGludGVydmFsKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xyXG4gICAgICB0aGlzLmludGVydmFscy5kZWxldGUobmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdG9wIGFsbCBzd2VlcGVyc1xyXG4gICAqL1xyXG4gIHN0b3AoKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5pbnRlcnZhbHMua2V5cygpKSB7XHJcbiAgICAgIHRoaXMuc3RvcFN3ZWVwZXIobmFtZSBhcyBrZXlvZiBTd2VlcGVyRGVmaW5pdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFudWFsbHkgdHJpZ2dlciBhIHN3ZWVwXHJcbiAgICovXHJcbiAgc3dlZXAobmFtZToga2V5b2YgU3dlZXBlckRlZmluaXRpb25zLCBmaWx0ZXI/OiAoKSA9PiAodmFsdWU6IGFueSwga2V5OiBzdHJpbmcsIGNvbGxlY3Rpb246IENvbGxlY3Rpb248c3RyaW5nLCBhbnk+KSA9PiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5nZXRDYWNoZShuYW1lKTtcclxuICAgIGlmICghY2FjaGUpIHJldHVybiAwO1xyXG4gICAgXHJcbiAgICBjb25zdCBmaWx0ZXJGbiA9IGZpbHRlciA/PyB0aGlzLm9wdGlvbnNbbmFtZV0/LmZpbHRlcjtcclxuICAgIGlmICghZmlsdGVyRm4pIHJldHVybiAwO1xyXG4gICAgXHJcbiAgICByZXR1cm4gY2FjaGUuc3dlZXAoZmlsdGVyRm4oKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGNhY2hlIGZvciBhIHN3ZWVwZXIgdHlwZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0Q2FjaGUobmFtZToga2V5b2YgU3dlZXBlckRlZmluaXRpb25zKTogQ29sbGVjdGlvbjxzdHJpbmcsIGFueT4gfCBudWxsIHtcclxuICAgIHN3aXRjaCAobmFtZSkge1xyXG4gICAgICBjYXNlICd1c2Vycyc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnVzZXJzPy5jYWNoZSA/PyBudWxsO1xyXG4gICAgICBjYXNlICdndWlsZE1lbWJlcnMnOlxyXG4gICAgICAgIC8vIFN3ZWVwIGFjcm9zcyBhbGwgZ3VpbGRzXHJcbiAgICAgICAgbGV0IG1lbWJlckNvdW50ID0gMDtcclxuICAgICAgICB0aGlzLmNsaWVudC5ndWlsZHM/LmNhY2hlLmZvckVhY2goKGd1aWxkOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChndWlsZC5tZW1iZXJzPy5jYWNoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLm9wdGlvbnMuZ3VpbGRNZW1iZXJzPy5maWx0ZXI7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIpIG1lbWJlckNvdW50ICs9IGd1aWxkLm1lbWJlcnMuY2FjaGUuc3dlZXAoZmlsdGVyKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBudWxsOyAvLyBBbHJlYWR5IGhhbmRsZWRcclxuICAgICAgY2FzZSAnbWVzc2FnZXMnOlxyXG4gICAgICAgIC8vIFN3ZWVwIGFjcm9zcyBhbGwgY2hhbm5lbHNcclxuICAgICAgICB0aGlzLmNsaWVudC5jaGFubmVscz8uY2FjaGUuZm9yRWFjaCgoY2hhbm5lbDogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoY2hhbm5lbC5tZXNzYWdlcz8uY2FjaGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5vcHRpb25zLm1lc3NhZ2VzPy5maWx0ZXI7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIpIGNoYW5uZWwubWVzc2FnZXMuY2FjaGUuc3dlZXAoZmlsdGVyKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICd0aHJlYWRzJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuY2hhbm5lbHM/LmNhY2hlLmZpbHRlcigoYzogYW55KSA9PiBjLmlzVGhyZWFkPy4oKSkgPz8gbnVsbDtcclxuICAgICAgY2FzZSAncHJlc2VuY2VzJzpcclxuICAgICAgICAvLyBTd2VlcCBhY3Jvc3MgYWxsIGd1aWxkc1xyXG4gICAgICAgIHRoaXMuY2xpZW50Lmd1aWxkcz8uY2FjaGUuZm9yRWFjaCgoZ3VpbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGd1aWxkLnByZXNlbmNlcz8uY2FjaGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5vcHRpb25zLnByZXNlbmNlcz8uZmlsdGVyO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyKSBndWlsZC5wcmVzZW5jZXMuY2FjaGUuc3dlZXAoZmlsdGVyKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICd2b2ljZVN0YXRlcyc6XHJcbiAgICAgICAgdGhpcy5jbGllbnQuZ3VpbGRzPy5jYWNoZS5mb3JFYWNoKChndWlsZDogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZ3VpbGQudm9pY2VTdGF0ZXM/LmNhY2hlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMub3B0aW9ucy52b2ljZVN0YXRlcz8uZmlsdGVyO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyKSBndWlsZC52b2ljZVN0YXRlcy5jYWNoZS5zd2VlcChmaWx0ZXIoKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIGNhc2UgJ3JlYWN0aW9ucyc6XHJcbiAgICAgICAgLy8gU3dlZXAgcmVhY3Rpb25zIGZyb20gYWxsIG1lc3NhZ2VzXHJcbiAgICAgICAgdGhpcy5jbGllbnQuY2hhbm5lbHM/LmNhY2hlLmZvckVhY2goKGNoYW5uZWw6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY2hhbm5lbC5tZXNzYWdlcz8uY2FjaGUuZm9yRWFjaCgobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLnJlYWN0aW9ucz8uY2FjaGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLm9wdGlvbnMucmVhY3Rpb25zPy5maWx0ZXI7XHJcbiAgICAgICAgICAgICAgaWYgKGZpbHRlcikgbWVzc2FnZS5yZWFjdGlvbnMuY2FjaGUuc3dlZXAoZmlsdGVyKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgY2FzZSAnZW1vamlzJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZW1vamlzPy5jYWNoZSA/PyBudWxsO1xyXG4gICAgICBjYXNlICdzdGlja2Vycyc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnN0aWNrZXJzPy5jYWNoZSA/PyBudWxsO1xyXG4gICAgICBjYXNlICdpbnZpdGVzJzpcclxuICAgICAgICAvLyBTd2VlcCBhY3Jvc3MgYWxsIGd1aWxkc1xyXG4gICAgICAgIHRoaXMuY2xpZW50Lmd1aWxkcz8uY2FjaGUuZm9yRWFjaCgoZ3VpbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGd1aWxkLmludml0ZXM/LmNhY2hlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMub3B0aW9ucy5pbnZpdGVzPy5maWx0ZXI7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIpIGd1aWxkLmludml0ZXMuY2FjaGUuc3dlZXAoZmlsdGVyKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICdiYW5zJzpcclxuICAgICAgICB0aGlzLmNsaWVudC5ndWlsZHM/LmNhY2hlLmZvckVhY2goKGd1aWxkOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChndWlsZC5iYW5zPy5jYWNoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLm9wdGlvbnMuYmFucz8uZmlsdGVyO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyKSBndWlsZC5iYW5zLmNhY2hlLnN3ZWVwKGZpbHRlcigpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBzd2VlcGVyIHN0YXRpc3RpY3NcclxuICAgKi9cclxuICBnZXRTdGF0cygpOiBSZWNvcmQ8c3RyaW5nLCB7IGludGVydmFsOiBudW1iZXI7IHJ1bm5pbmc6IGJvb2xlYW4gfT4ge1xyXG4gICAgY29uc3Qgc3RhdHM6IFJlY29yZDxzdHJpbmcsIHsgaW50ZXJ2YWw6IG51bWJlcjsgcnVubmluZzogYm9vbGVhbiB9PiA9IHt9O1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgaWYgKGNvbmZpZykge1xyXG4gICAgICAgIHN0YXRzW25hbWVdID0ge1xyXG4gICAgICAgICAgaW50ZXJ2YWw6IGNvbmZpZy5pbnRlcnZhbCxcclxuICAgICAgICAgIHJ1bm5pbmc6IHRoaXMuaW50ZXJ2YWxzLmhhcyhuYW1lKSxcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBzdGF0cztcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWZhdWx0IHN3ZWVwZXIgb3B0aW9ucyBmb3IgY29tbW9uIHVzZSBjYXNlc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERlZmF1bHRTd2VlcGVyT3B0aW9uczogU3dlZXBlckRlZmluaXRpb25zID0ge1xyXG4gIG1lc3NhZ2VzOiB7XHJcbiAgICBpbnRlcnZhbDogMzYwMCwgLy8gMSBob3VyXHJcbiAgICBmaWx0ZXI6IFN3ZWVwZXJzLmZpbHRlckJ5TGlmZXRpbWUoeyBsaWZldGltZTogMTgwMCB9KSwgLy8gMzAgbWludXRlc1xyXG4gIH0sXHJcbiAgdGhyZWFkczoge1xyXG4gICAgaW50ZXJ2YWw6IDM2MDAsXHJcbiAgICBmaWx0ZXI6IFN3ZWVwZXJzLmFyY2hpdmVkVGhyZWFkU3dlZXBGaWx0ZXIoMTQ0MDApLCAvLyA0IGhvdXJzXHJcbiAgfSxcclxuICBpbnZpdGVzOiB7XHJcbiAgICBpbnRlcnZhbDogMzYwMCxcclxuICAgIGZpbHRlcjogU3dlZXBlcnMuZXhwaXJlZEludml0ZVN3ZWVwRmlsdGVyKCksXHJcbiAgfSxcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN3ZWVwZXJNYW5hZ2VyO1xyXG4iXX0=
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Utility exports
3
+ */
4
+ export * from './Collection';
5
+ export * from './Formatters';
6
+ export * from './SnowflakeUtil';
7
+ export * from './BitField';
8
+ export * from './PermissionsBitField';
9
+ export * from './IntentsBitField';
10
+ export * from './DataResolver';
11
+ export * from './Collector';
12
+ export * from './Partials';
13
+ export * from './Sweepers';
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ /**
3
+ * Utility exports
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./Collection"), exports);
21
+ __exportStar(require("./Formatters"), exports);
22
+ __exportStar(require("./SnowflakeUtil"), exports);
23
+ __exportStar(require("./BitField"), exports);
24
+ __exportStar(require("./PermissionsBitField"), exports);
25
+ __exportStar(require("./IntentsBitField"), exports);
26
+ __exportStar(require("./DataResolver"), exports);
27
+ __exportStar(require("./Collector"), exports);
28
+ __exportStar(require("./Partials"), exports);
29
+ __exportStar(require("./Sweepers"), exports);
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsK0NBQTZCO0FBQzdCLCtDQUE2QjtBQUM3QixrREFBZ0M7QUFDaEMsNkNBQTJCO0FBQzNCLHdEQUFzQztBQUN0QyxvREFBa0M7QUFDbEMsaURBQStCO0FBQy9CLDhDQUE0QjtBQUM1Qiw2Q0FBMkI7QUFDM0IsNkNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFV0aWxpdHkgZXhwb3J0c1xyXG4gKi9cclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbic7XHJcbmV4cG9ydCAqIGZyb20gJy4vRm9ybWF0dGVycyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vU25vd2ZsYWtlVXRpbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vQml0RmllbGQnO1xyXG5leHBvcnQgKiBmcm9tICcuL1Blcm1pc3Npb25zQml0RmllbGQnO1xyXG5leHBvcnQgKiBmcm9tICcuL0ludGVudHNCaXRGaWVsZCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vRGF0YVJlc29sdmVyJztcclxuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0b3InO1xyXG5leHBvcnQgKiBmcm9tICcuL1BhcnRpYWxzJztcclxuZXhwb3J0ICogZnJvbSAnLi9Td2VlcGVycyc7XHJcbiJdfQ==