@discordeno/utils 19.0.0-next.cebe1f4 → 19.0.0-next.cf5e033

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 (129) hide show
  1. package/README.md +6 -143
  2. package/dist/cjs/Collection.cjs +122 -0
  3. package/dist/cjs/base64.cjs +276 -0
  4. package/dist/cjs/bucket.cjs +96 -0
  5. package/dist/cjs/builders/embeds.cjs +291 -0
  6. package/dist/cjs/builders.cjs +27 -0
  7. package/dist/cjs/casing.cjs +79 -0
  8. package/dist/cjs/colors.cjs +456 -0
  9. package/dist/cjs/hash.cjs +37 -0
  10. package/dist/cjs/images.cjs +136 -0
  11. package/dist/cjs/index.cjs +36 -0
  12. package/dist/cjs/logger.cjs +157 -0
  13. package/dist/cjs/oauth2.cjs +26 -0
  14. package/dist/cjs/permissions.cjs +35 -0
  15. package/dist/cjs/reactions.cjs +21 -0
  16. package/dist/cjs/token.cjs +38 -0
  17. package/dist/cjs/typeguards.cjs +52 -0
  18. package/dist/cjs/urlToBase64.cjs +19 -0
  19. package/dist/cjs/urls.cjs +32 -0
  20. package/dist/cjs/utils.cjs +28 -0
  21. package/dist/esm/Collection.js +112 -0
  22. package/dist/esm/base64.js +262 -0
  23. package/dist/esm/bucket.js +81 -0
  24. package/dist/esm/builders/embeds.js +290 -0
  25. package/dist/esm/builders.js +5 -0
  26. package/dist/esm/casing.js +55 -0
  27. package/dist/esm/colors.js +467 -0
  28. package/dist/esm/hash.js +19 -0
  29. package/dist/esm/images.js +179 -0
  30. package/dist/esm/index.js +19 -0
  31. package/dist/esm/logger.js +130 -0
  32. package/dist/esm/oauth2.js +16 -0
  33. package/dist/esm/permissions.js +17 -0
  34. package/dist/esm/reactions.js +11 -0
  35. package/dist/esm/token.js +20 -0
  36. package/dist/esm/typeguards.js +22 -0
  37. package/dist/esm/urlToBase64.js +9 -0
  38. package/dist/esm/urls.js +11 -0
  39. package/dist/esm/utils.js +12 -0
  40. package/dist/{Collection.d.ts → types/Collection.d.ts} +2 -3
  41. package/dist/types/Collection.d.ts.map +1 -0
  42. package/dist/types/base64.d.ts.map +1 -0
  43. package/dist/{bucket.d.ts → types/bucket.d.ts} +9 -2
  44. package/dist/types/bucket.d.ts.map +1 -0
  45. package/dist/types/builders/embeds.d.ts +142 -0
  46. package/dist/types/builders/embeds.d.ts.map +1 -0
  47. package/dist/types/builders.d.ts +4 -0
  48. package/dist/types/builders.d.ts.map +1 -0
  49. package/dist/types/casing.d.ts.map +1 -0
  50. package/dist/types/colors.d.ts.map +1 -0
  51. package/dist/types/hash.d.ts.map +1 -0
  52. package/dist/types/images.d.ts +202 -0
  53. package/dist/types/images.d.ts.map +1 -0
  54. package/dist/{index.d.ts → types/index.d.ts} +4 -1
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/logger.d.ts.map +1 -0
  57. package/dist/types/oauth2.d.ts +69 -0
  58. package/dist/types/oauth2.d.ts.map +1 -0
  59. package/dist/types/permissions.d.ts.map +1 -0
  60. package/dist/types/reactions.d.ts.map +1 -0
  61. package/dist/{token.d.ts → types/token.d.ts} +1 -1
  62. package/dist/types/token.d.ts.map +1 -0
  63. package/dist/types/typeguards.d.ts +8 -0
  64. package/dist/types/typeguards.d.ts.map +1 -0
  65. package/dist/types/urlToBase64.d.ts.map +1 -0
  66. package/dist/types/urls.d.ts +5 -0
  67. package/dist/types/urls.d.ts.map +1 -0
  68. package/dist/types/utils.d.ts.map +1 -0
  69. package/package.json +29 -26
  70. package/dist/Collection.d.ts.map +0 -1
  71. package/dist/Collection.js +0 -113
  72. package/dist/Collection.js.map +0 -1
  73. package/dist/base64.d.ts.map +0 -1
  74. package/dist/base64.js +0 -262
  75. package/dist/base64.js.map +0 -1
  76. package/dist/bucket.d.ts.map +0 -1
  77. package/dist/bucket.js +0 -74
  78. package/dist/bucket.js.map +0 -1
  79. package/dist/casing.d.ts.map +0 -1
  80. package/dist/casing.js +0 -51
  81. package/dist/casing.js.map +0 -1
  82. package/dist/colors.d.ts.map +0 -1
  83. package/dist/colors.js +0 -467
  84. package/dist/colors.js.map +0 -1
  85. package/dist/hash.d.ts.map +0 -1
  86. package/dist/hash.js +0 -19
  87. package/dist/hash.js.map +0 -1
  88. package/dist/images.d.ts +0 -68
  89. package/dist/images.d.ts.map +0 -1
  90. package/dist/images.js +0 -66
  91. package/dist/images.js.map +0 -1
  92. package/dist/index.d.ts.map +0 -1
  93. package/dist/index.js +0 -16
  94. package/dist/index.js.map +0 -1
  95. package/dist/interactions.d.ts +0 -3
  96. package/dist/interactions.d.ts.map +0 -1
  97. package/dist/interactions.js +0 -41
  98. package/dist/interactions.js.map +0 -1
  99. package/dist/logger.d.ts.map +0 -1
  100. package/dist/logger.js +0 -130
  101. package/dist/logger.js.map +0 -1
  102. package/dist/permissions.d.ts.map +0 -1
  103. package/dist/permissions.js +0 -17
  104. package/dist/permissions.js.map +0 -1
  105. package/dist/reactions.d.ts.map +0 -1
  106. package/dist/reactions.js +0 -11
  107. package/dist/reactions.js.map +0 -1
  108. package/dist/token.d.ts.map +0 -1
  109. package/dist/token.js +0 -16
  110. package/dist/token.js.map +0 -1
  111. package/dist/typeguards.d.ts +0 -6
  112. package/dist/typeguards.d.ts.map +0 -1
  113. package/dist/typeguards.js +0 -15
  114. package/dist/typeguards.js.map +0 -1
  115. package/dist/urlToBase64.d.ts.map +0 -1
  116. package/dist/urlToBase64.js +0 -10
  117. package/dist/urlToBase64.js.map +0 -1
  118. package/dist/utils.d.ts.map +0 -1
  119. package/dist/utils.js +0 -15
  120. package/dist/utils.js.map +0 -1
  121. /package/dist/{base64.d.ts → types/base64.d.ts} +0 -0
  122. /package/dist/{casing.d.ts → types/casing.d.ts} +0 -0
  123. /package/dist/{colors.d.ts → types/colors.d.ts} +0 -0
  124. /package/dist/{hash.d.ts → types/hash.d.ts} +0 -0
  125. /package/dist/{logger.d.ts → types/logger.d.ts} +0 -0
  126. /package/dist/{permissions.d.ts → types/permissions.d.ts} +0 -0
  127. /package/dist/{reactions.d.ts → types/reactions.d.ts} +0 -0
  128. /package/dist/{urlToBase64.d.ts → types/urlToBase64.d.ts} +0 -0
  129. /package/dist/{utils.d.ts → types/utils.d.ts} +0 -0
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "LeakyBucket", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return LeakyBucket;
9
+ }
10
+ });
11
+ const _logger = /*#__PURE__*/ _interop_require_default(require("./logger.cjs"));
12
+ const _utils = require("./utils.cjs");
13
+ function _interop_require_default(obj) {
14
+ return obj && obj.__esModule ? obj : {
15
+ default: obj
16
+ };
17
+ }
18
+ let LeakyBucket = class LeakyBucket {
19
+ constructor(options){
20
+ /** The amount of requests that have been used up already. */ this.used = 0;
21
+ /** The queue of requests to acquire an available request. Mapped by <shardId, resolve()> */ this.queue = [];
22
+ /** Whether or not the queue is already processing. */ this.processing = false;
23
+ this.max = options?.max ?? 1;
24
+ this.refillAmount = options?.refillAmount ? options.refillAmount > this.max ? this.max : options.refillAmount : 1;
25
+ this.refillInterval = options?.refillInterval ?? 5000;
26
+ this.logger = options?.logger ?? _logger.default;
27
+ }
28
+ /** The amount of requests that still remain. */ get remaining() {
29
+ return this.max < this.used ? 0 : this.max - this.used;
30
+ }
31
+ /** Refills the bucket as needed. */ refillBucket() {
32
+ this.logger.debug(`[LeakyBucket] Timeout for leaky bucket requests executed. Refilling bucket.`);
33
+ // Lower the used amount by the refill amount
34
+ this.used = this.refillAmount > this.used ? 0 : this.used - this.refillAmount;
35
+ // Reset the refillsAt timestamp since it just got refilled
36
+ this.refillsAt = undefined;
37
+ // Reset the timeoutId
38
+ clearTimeout(this.timeoutId);
39
+ this.timeoutId = undefined;
40
+ if (this.used > 0) {
41
+ this.timeoutId = setTimeout(()=>{
42
+ this.refillBucket();
43
+ }, this.refillInterval);
44
+ this.refillsAt = Date.now() + this.refillInterval;
45
+ }
46
+ }
47
+ /** Begin processing the queue. */ async processQueue() {
48
+ this.logger.debug('[LeakyBucket] Processing queue');
49
+ // There is already a queue that is processing
50
+ if (this.processing) return this.logger.debug('[LeakyBucket] Queue is already processing.');
51
+ this.processing = true;
52
+ // Begin going through the queue.
53
+ while(this.queue.length){
54
+ if (this.remaining) {
55
+ this.logger.debug(`[LeakyBucket] Processing queue. Remaining: ${this.remaining} Length: ${this.queue.length}`);
56
+ // Resolves the promise allowing the paused execution of this request to resolve and continue.
57
+ this.queue.shift()?.();
58
+ // A request can be made
59
+ this.used++;
60
+ // Create a new timeout for this request if none exists.
61
+ if (!this.timeoutId) {
62
+ this.logger.debug(`[LeakyBucket] Creating new timeout for leaky bucket requests.`);
63
+ this.timeoutId = setTimeout(()=>{
64
+ this.refillBucket();
65
+ }, this.refillInterval);
66
+ // Set the time for when this refill will occur.
67
+ this.refillsAt = Date.now() + this.refillInterval;
68
+ }
69
+ } else if (this.refillsAt) {
70
+ const now = Date.now();
71
+ // If there is time left until next refill, just delay execution.
72
+ if (this.refillsAt > now) {
73
+ this.logger.debug(`[LeakyBucket] Delaying execution of leaky bucket requests for ${this.refillsAt - now}ms`);
74
+ await (0, _utils.delay)(this.refillsAt - now);
75
+ this.logger.debug(`[LeakyBucket] Resuming execution`);
76
+ } else {
77
+ this.logger.debug(`[LeakyBucket] Delaying execution of leaky bucket requests for 1000ms`);
78
+ await (0, _utils.delay)(1000);
79
+ }
80
+ }
81
+ }
82
+ // Loop has ended mark false so it can restart later when needed
83
+ this.processing = false;
84
+ }
85
+ /** Pauses the execution until the request is available to be made. */ async acquire(highPriority) {
86
+ return await new Promise((resolve)=>{
87
+ // High priority requests get added to the start of the queue
88
+ if (highPriority) this.queue.unshift(resolve);
89
+ else this.queue.push(resolve);
90
+ // Each request should trigger the queue to be processed.
91
+ void this.processQueue();
92
+ });
93
+ }
94
+ };
95
+
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWNrZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlci5qcydcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSAnLi91dGlscy5qcydcblxuZXhwb3J0IGNsYXNzIExlYWt5QnVja2V0IGltcGxlbWVudHMgTGVha3lCdWNrZXRPcHRpb25zIHtcbiAgbWF4OiBudW1iZXJcbiAgcmVmaWxsSW50ZXJ2YWw6IG51bWJlclxuICByZWZpbGxBbW91bnQ6IG51bWJlclxuXG4gIC8qKiBUaGUgYW1vdW50IG9mIHJlcXVlc3RzIHRoYXQgaGF2ZSBiZWVuIHVzZWQgdXAgYWxyZWFkeS4gKi9cbiAgdXNlZDogbnVtYmVyID0gMFxuICAvKiogVGhlIHF1ZXVlIG9mIHJlcXVlc3RzIHRvIGFjcXVpcmUgYW4gYXZhaWxhYmxlIHJlcXVlc3QuIE1hcHBlZCBieSA8c2hhcmRJZCwgcmVzb2x2ZSgpPiAqL1xuICBxdWV1ZTogQXJyYXk8KHZhbHVlOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4pID0+IHZvaWQ+ID0gW11cbiAgLyoqIFdoZXRoZXIgb3Igbm90IHRoZSBxdWV1ZSBpcyBhbHJlYWR5IHByb2Nlc3NpbmcuICovXG4gIHByb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZVxuICAvKiogVGhlIHRpbWVvdXQgaWQgZm9yIHRoZSB0aW1lciB0byByZWR1Y2UgdGhlIHVzZWQgYW1vdW50IGJ5IHRoZSByZWZpbGwgYW1vdW50LiAqL1xuICB0aW1lb3V0SWQ/OiBOb2RlSlMuVGltZW91dFxuICAvKiogVGhlIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgd2hlbiB0aGUgbmV4dCByZWZpbGwgaXMgc2NoZWR1bGVkLiAqL1xuICByZWZpbGxzQXQ/OiBudW1iZXJcbiAgLyoqIExvZ2dlciB1c2VkIGluIHRoZSBsZWFreSBidWNrZXQgKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogTGVha3lCdWNrZXRPcHRpb25zKSB7XG4gICAgdGhpcy5tYXggPSBvcHRpb25zPy5tYXggPz8gMVxuICAgIHRoaXMucmVmaWxsQW1vdW50ID0gb3B0aW9ucz8ucmVmaWxsQW1vdW50ID8gKG9wdGlvbnMucmVmaWxsQW1vdW50ID4gdGhpcy5tYXggPyB0aGlzLm1heCA6IG9wdGlvbnMucmVmaWxsQW1vdW50KSA6IDFcbiAgICB0aGlzLnJlZmlsbEludGVydmFsID0gb3B0aW9ucz8ucmVmaWxsSW50ZXJ2YWwgPz8gNTAwMFxuICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucz8ubG9nZ2VyID8/IGxvZ2dlclxuICB9XG5cbiAgLyoqIFRoZSBhbW91bnQgb2YgcmVxdWVzdHMgdGhhdCBzdGlsbCByZW1haW4uICovXG4gIGdldCByZW1haW5pbmcoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYXggPCB0aGlzLnVzZWQgPyAwIDogdGhpcy5tYXggLSB0aGlzLnVzZWRcbiAgfVxuXG4gIC8qKiBSZWZpbGxzIHRoZSBidWNrZXQgYXMgbmVlZGVkLiAqL1xuICByZWZpbGxCdWNrZXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtMZWFreUJ1Y2tldF0gVGltZW91dCBmb3IgbGVha3kgYnVja2V0IHJlcXVlc3RzIGV4ZWN1dGVkLiBSZWZpbGxpbmcgYnVja2V0LmApXG4gICAgLy8gTG93ZXIgdGhlIHVzZWQgYW1vdW50IGJ5IHRoZSByZWZpbGwgYW1vdW50XG4gICAgdGhpcy51c2VkID0gdGhpcy5yZWZpbGxBbW91bnQgPiB0aGlzLnVzZWQgPyAwIDogdGhpcy51c2VkIC0gdGhpcy5yZWZpbGxBbW91bnRcbiAgICAvLyBSZXNldCB0aGUgcmVmaWxsc0F0IHRpbWVzdGFtcCBzaW5jZSBpdCBqdXN0IGdvdCByZWZpbGxlZFxuICAgIHRoaXMucmVmaWxsc0F0ID0gdW5kZWZpbmVkXG4gICAgLy8gUmVzZXQgdGhlIHRpbWVvdXRJZFxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZClcbiAgICB0aGlzLnRpbWVvdXRJZCA9IHVuZGVmaW5lZFxuXG4gICAgaWYgKHRoaXMudXNlZCA+IDApIHtcbiAgICAgIHRoaXMudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVmaWxsQnVja2V0KClcbiAgICAgIH0sIHRoaXMucmVmaWxsSW50ZXJ2YWwpXG4gICAgICB0aGlzLnJlZmlsbHNBdCA9IERhdGUubm93KCkgKyB0aGlzLnJlZmlsbEludGVydmFsXG4gICAgfVxuICB9XG5cbiAgLyoqIEJlZ2luIHByb2Nlc3NpbmcgdGhlIHF1ZXVlLiAqL1xuICBhc3luYyBwcm9jZXNzUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1tMZWFreUJ1Y2tldF0gUHJvY2Vzc2luZyBxdWV1ZScpXG5cbiAgICAvLyBUaGVyZSBpcyBhbHJlYWR5IGEgcXVldWUgdGhhdCBpcyBwcm9jZXNzaW5nXG4gICAgaWYgKHRoaXMucHJvY2Vzc2luZykgcmV0dXJuIHRoaXMubG9nZ2VyLmRlYnVnKCdbTGVha3lCdWNrZXRdIFF1ZXVlIGlzIGFscmVhZHkgcHJvY2Vzc2luZy4nKVxuXG4gICAgdGhpcy5wcm9jZXNzaW5nID0gdHJ1ZVxuXG4gICAgLy8gQmVnaW4gZ29pbmcgdGhyb3VnaCB0aGUgcXVldWUuXG4gICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5yZW1haW5pbmcpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtMZWFreUJ1Y2tldF0gUHJvY2Vzc2luZyBxdWV1ZS4gUmVtYWluaW5nOiAke3RoaXMucmVtYWluaW5nfSBMZW5ndGg6ICR7dGhpcy5xdWV1ZS5sZW5ndGh9YClcbiAgICAgICAgLy8gUmVzb2x2ZXMgdGhlIHByb21pc2UgYWxsb3dpbmcgdGhlIHBhdXNlZCBleGVjdXRpb24gb2YgdGhpcyByZXF1ZXN0IHRvIHJlc29sdmUgYW5kIGNvbnRpbnVlLlxuICAgICAgICB0aGlzLnF1ZXVlLnNoaWZ0KCk/LigpXG4gICAgICAgIC8vIEEgcmVxdWVzdCBjYW4gYmUgbWFkZVxuICAgICAgICB0aGlzLnVzZWQrK1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyB0aW1lb3V0IGZvciB0aGlzIHJlcXVlc3QgaWYgbm9uZSBleGlzdHMuXG4gICAgICAgIGlmICghdGhpcy50aW1lb3V0SWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0xlYWt5QnVja2V0XSBDcmVhdGluZyBuZXcgdGltZW91dCBmb3IgbGVha3kgYnVja2V0IHJlcXVlc3RzLmApXG5cbiAgICAgICAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZpbGxCdWNrZXQoKVxuICAgICAgICAgIH0sIHRoaXMucmVmaWxsSW50ZXJ2YWwpXG4gICAgICAgICAgLy8gU2V0IHRoZSB0aW1lIGZvciB3aGVuIHRoaXMgcmVmaWxsIHdpbGwgb2NjdXIuXG4gICAgICAgICAgdGhpcy5yZWZpbGxzQXQgPSBEYXRlLm5vdygpICsgdGhpcy5yZWZpbGxJbnRlcnZhbFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGEgcmVmaWxsIGlzIHNjaGVkdWxlZCwgc2luY2Ugd2UgaGF2ZSB1c2VkIHVwIGFsbCBhdmFpbGFibGUgcmVxdWVzdHNcbiAgICAgIGVsc2UgaWYgKHRoaXMucmVmaWxsc0F0KSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgdGltZSBsZWZ0IHVudGlsIG5leHQgcmVmaWxsLCBqdXN0IGRlbGF5IGV4ZWN1dGlvbi5cbiAgICAgICAgaWYgKHRoaXMucmVmaWxsc0F0ID4gbm93KSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtMZWFreUJ1Y2tldF0gRGVsYXlpbmcgZXhlY3V0aW9uIG9mIGxlYWt5IGJ1Y2tldCByZXF1ZXN0cyBmb3IgJHt0aGlzLnJlZmlsbHNBdCAtIG5vd31tc2ApXG4gICAgICAgICAgYXdhaXQgZGVsYXkodGhpcy5yZWZpbGxzQXQgLSBub3cpXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtMZWFreUJ1Y2tldF0gUmVzdW1pbmcgZXhlY3V0aW9uYClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSByZWZpbGxzQXQgaGFzIHBhc3NlZCBidXQgdGhlIHRpbWVvdXQgZGlkbid0IHlldCBleGVjdXRlIGRlbGF5IHRoZSBleGVjdXRpb25cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtMZWFreUJ1Y2tldF0gRGVsYXlpbmcgZXhlY3V0aW9uIG9mIGxlYWt5IGJ1Y2tldCByZXF1ZXN0cyBmb3IgMTAwMG1zYClcbiAgICAgICAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9vcCBoYXMgZW5kZWQgbWFyayBmYWxzZSBzbyBpdCBjYW4gcmVzdGFydCBsYXRlciB3aGVuIG5lZWRlZFxuICAgIHRoaXMucHJvY2Vzc2luZyA9IGZhbHNlXG4gIH1cblxuICAvKiogUGF1c2VzIHRoZSBleGVjdXRpb24gdW50aWwgdGhlIHJlcXVlc3QgaXMgYXZhaWxhYmxlIHRvIGJlIG1hZGUuICovXG4gIGFzeW5jIGFjcXVpcmUoaGlnaFByaW9yaXR5PzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaCBwcmlvcml0eSByZXF1ZXN0cyBnZXQgYWRkZWQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBxdWV1ZVxuICAgICAgaWYgKGhpZ2hQcmlvcml0eSkgdGhpcy5xdWV1ZS51bnNoaWZ0KHJlc29sdmUpXG4gICAgICAvLyBBbGwgb3RoZXIgcmVxdWVzdHMgZ2V0IHB1c2hlZCB0byB0aGUgZW5kLlxuICAgICAgZWxzZSB0aGlzLnF1ZXVlLnB1c2gocmVzb2x2ZSlcblxuICAgICAgLy8gRWFjaCByZXF1ZXN0IHNob3VsZCB0cmlnZ2VyIHRoZSBxdWV1ZSB0byBiZSBwcm9jZXNzZWQuXG4gICAgICB2b2lkIHRoaXMucHJvY2Vzc1F1ZXVlKClcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGVha3lCdWNrZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIE1heCByZXF1ZXN0cyBhbGxvd2VkIGF0IG9uY2UuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIG1heD86IG51bWJlclxuICAvKipcbiAgICogSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcmVmaWxscy5cbiAgICogQGRlZmF1bHQgNTAwMFxuICAgKi9cbiAgcmVmaWxsSW50ZXJ2YWw/OiBudW1iZXJcbiAgLyoqXG4gICAqIEFtb3VudCBvZiByZXF1ZXN0cyB0byByZWZpbGwgYXQgZWFjaCBpbnRlcnZhbC5cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVmaWxsQW1vdW50PzogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIHRoYXQgdGhlIGxlYWt5IGJ1Y2tldCB3aWxsIHVzZVxuICAgKiBAZGVmYXVsdCBsb2dnZXIgLy8gVGhlIGxvZ2dlciBleHBvcnRlZCBieSBgQGRpc2NvcmRlbm8vdXRpbHNgXG4gICAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbn1cbiJdLCJuYW1lcyI6WyJMZWFreUJ1Y2tldCIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInVzZWQiLCJxdWV1ZSIsInByb2Nlc3NpbmciLCJtYXgiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImxvZ2dlciIsInJlbWFpbmluZyIsInJlZmlsbEJ1Y2tldCIsImRlYnVnIiwicmVmaWxsc0F0IiwidW5kZWZpbmVkIiwiY2xlYXJUaW1lb3V0IiwidGltZW91dElkIiwic2V0VGltZW91dCIsIkRhdGUiLCJub3ciLCJwcm9jZXNzUXVldWUiLCJsZW5ndGgiLCJzaGlmdCIsImRlbGF5IiwiYWNxdWlyZSIsImhpZ2hQcmlvcml0eSIsIlByb21pc2UiLCJyZXNvbHZlIiwidW5zaGlmdCIsInB1c2giXSwibWFwcGluZ3MiOiI7Ozs7K0JBR2FBOzs7ZUFBQUE7OzsrREFITTt1QkFDRzs7Ozs7O0FBRWYsSUFBQSxBQUFNQSxjQUFOLE1BQU1BO0lBa0JYQyxZQUFZQyxPQUE0QixDQUFFO1FBYjFDLDJEQUEyRCxRQUMzREMsT0FBZTtRQUNmLDBGQUEwRixRQUMxRkMsUUFBMEQsRUFBRTtRQUM1RCxvREFBb0QsUUFDcERDLGFBQXNCO1FBU3BCLElBQUksQ0FBQ0MsR0FBRyxHQUFHSixTQUFTSSxPQUFPO1FBQzNCLElBQUksQ0FBQ0MsWUFBWSxHQUFHTCxTQUFTSyxlQUFnQkwsUUFBUUssWUFBWSxHQUFHLElBQUksQ0FBQ0QsR0FBRyxHQUFHLElBQUksQ0FBQ0EsR0FBRyxHQUFHSixRQUFRSyxZQUFZLEdBQUk7UUFDbEgsSUFBSSxDQUFDQyxjQUFjLEdBQUdOLFNBQVNNLGtCQUFrQjtRQUNqRCxJQUFJLENBQUNDLE1BQU0sR0FBR1AsU0FBU08sVUFBVUEsZUFBTTtJQUN6QztJQUVBLDhDQUE4QyxHQUM5QyxJQUFJQyxZQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQ0osR0FBRyxHQUFHLElBQUksQ0FBQ0gsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDRyxHQUFHLEdBQUcsSUFBSSxDQUFDSCxJQUFJO0lBQ3hEO0lBRUEsa0NBQWtDLEdBQ2xDUSxlQUFxQjtRQUNuQixJQUFJLENBQUNGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUMsMkVBQTJFLENBQUM7UUFDL0YsNkNBQTZDO1FBQzdDLElBQUksQ0FBQ1QsSUFBSSxHQUFHLElBQUksQ0FBQ0ksWUFBWSxHQUFHLElBQUksQ0FBQ0osSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDQSxJQUFJLEdB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
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "EmbedsBuilder", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return EmbedsBuilder;
9
+ }
10
+ });
11
+ let EmbedsBuilder = class EmbedsBuilder extends Array {
12
+ #currentEmbedIndex;
13
+ /**
14
+ * Adds a new field to the embed fields array.
15
+ *
16
+ * @param {string} name - Field name
17
+ * @param {string} value - Field value
18
+ * @param {?boolean} [inline=false] - Field should be inline or not.
19
+ * @returns {EmbedsBuilder}
20
+ */ addField(name, value, inline) {
21
+ if (this.#currentEmbed.fields === undefined) {
22
+ this.#currentEmbed.fields = [];
23
+ }
24
+ this.#currentEmbed.fields.push({
25
+ name,
26
+ value,
27
+ inline
28
+ });
29
+ return this;
30
+ }
31
+ /**
32
+ * Creates a blank embed.
33
+ *
34
+ * @returns {EmbedsBuilder}
35
+ */ newEmbed() {
36
+ if (this.length >= 10) {
37
+ throw new Error('Maximum embed count exceeded. You can not have more than 10 embeds.');
38
+ }
39
+ this.push({});
40
+ this.setCurrentEmbed();
41
+ return this;
42
+ }
43
+ /**
44
+ * Set the current embed author.
45
+ *
46
+ * @param {string} name - Name of the author
47
+ * @param {?Omit<DiscordEmbedAuthor, 'name'>} [options] - Extra author options
48
+ * @returns {EmbedsBuilder}
49
+ */ setAuthor(name, options) {
50
+ this.#currentEmbed.author = {
51
+ ...this.#currentEmbed.author,
52
+ ...options,
53
+ name
54
+ };
55
+ return this;
56
+ }
57
+ /**
58
+ * Set the color on the side of the current embed.
59
+ *
60
+ * @param {(number | string)} color - The color, in base16 or hex color code
61
+ * @returns {EmbedsBuilder}
62
+ */ setColor(color) {
63
+ if (typeof color === 'string') {
64
+ const convertedValue = parseInt(color.replace('#', ''), 16);
65
+ color = Number.isNaN(convertedValue) ? 0 : convertedValue;
66
+ }
67
+ this.#currentEmbed.color = color;
68
+ return this;
69
+ }
70
+ /**
71
+ * Set the current embed to a different index.
72
+ *
73
+ * WARNING: Only use this method if you know what you're doing. Make sure to set it back to the latest when you're done.
74
+ *
75
+ * @param {?number} [index] - The index of the embed in the EmbedsBuilder array
76
+ * @returns {EmbedsBuilder}
77
+ */ setCurrentEmbed(index) {
78
+ if (index === undefined) {
79
+ this.#currentEmbedIndex = this.length - 1;
80
+ return this;
81
+ }
82
+ if (index >= this.length || index < 0) {
83
+ throw new Error('Can not set the current embed to a index out of bounds.');
84
+ }
85
+ this.#currentEmbedIndex = index;
86
+ return this;
87
+ }
88
+ /**
89
+ * Set the description of the current embed.
90
+ *
91
+ * @param {string} description - Description
92
+ * @returns {EmbedsBuilder}
93
+ */ setDescription(description) {
94
+ this.#currentEmbed.description = description;
95
+ return this;
96
+ }
97
+ /**
98
+ * Overwrite all fields on the current embed.
99
+ *
100
+ * @param {DiscordEmbedField[]} fields
101
+ * @returns {EmbedsBuilder}
102
+ */ setFields(fields) {
103
+ this.#currentEmbed.fields = fields;
104
+ return this;
105
+ }
106
+ /**
107
+ * Set the footer in the current embed.
108
+ *
109
+ * @param {string} text - The text to display in the footer
110
+ * @param {?Omit<DiscordEmbedFooter, 'text'>} [options]
111
+ * @returns {EmbedsBuilder}
112
+ */ setFooter(text, options) {
113
+ this.#currentEmbed.footer = {
114
+ ...this.#currentEmbed.footer,
115
+ ...options,
116
+ text
117
+ };
118
+ return this;
119
+ }
120
+ /**
121
+ * Set the image in the current embed.
122
+ *
123
+ * @param {string} url - URL of the image
124
+ * @param {?Omit<DiscordEmbedImage, 'url'>} [options]
125
+ * @returns {EmbedsBuilder}
126
+ */ setImage(url, options) {
127
+ this.#currentEmbed.image = {
128
+ ...this.#currentEmbed.image,
129
+ ...options,
130
+ url
131
+ };
132
+ return this;
133
+ }
134
+ /**
135
+ * Set the provider of the current embed.
136
+ *
137
+ * @param {string} name
138
+ * @param {?string} [url]
139
+ * @returns {EmbedsBuilder}
140
+ */ setProvider(name, url) {
141
+ this.#currentEmbed.provider = {
142
+ name,
143
+ url
144
+ };
145
+ return this;
146
+ }
147
+ /**
148
+ * Set the color of the current embed to a random value.
149
+ *
150
+ * @returns {EmbedsBuilder}
151
+ */ setRandomColor() {
152
+ return this.setColor(Math.floor(Math.random() * (0xffffff + 1)));
153
+ }
154
+ /**
155
+ * Set the title of the current embed.
156
+ *
157
+ * @param {string} title
158
+ * @param {?string} [url]
159
+ * @returns {EmbedsBuilder}
160
+ */ setTitle(title, url) {
161
+ this.#currentEmbed.title = title;
162
+ if (url) {
163
+ this.setUrl(url);
164
+ }
165
+ return this;
166
+ }
167
+ /**
168
+ * Set the timestamp of the current embed.
169
+ *
170
+ * @param {?(string | number | Date)} [timestamp]
171
+ * @returns {EmbedsBuilder}
172
+ */ setTimestamp(timestamp) {
173
+ this.#currentEmbed.timestamp = new Date(timestamp).toISOString();
174
+ return this;
175
+ }
176
+ /**
177
+ * Set the thumbnail of the current embed.
178
+ *
179
+ * @param {string} url - URL of the image
180
+ * @param {?Omit<DiscordEmbedThumbnail, 'url'>} [options]
181
+ * @returns {EmbedsBuilder}
182
+ */ setThumbnail(url, options) {
183
+ this.#currentEmbed.thumbnail = {
184
+ ...this.#currentEmbed.thumbnail,
185
+ ...options,
186
+ url
187
+ };
188
+ return this;
189
+ }
190
+ /**
191
+ * Set the URL of the current embed title.
192
+ *
193
+ * @param {string} url
194
+ * @returns {EmbedsBuilder}
195
+ */ setUrl(url) {
196
+ this.#currentEmbed.url = url;
197
+ return this;
198
+ }
199
+ /**
200
+ * Set the video of the current embed.
201
+ *
202
+ * @param {string} url
203
+ * @param {?Omit<DiscordEmbedVideo, 'url'>} [options]
204
+ * @returns {EmbedsBuilder}
205
+ */ setVideo(url, options) {
206
+ this.#currentEmbed.video = {
207
+ ...this.#currentEmbed.video,
208
+ ...options,
209
+ url
210
+ };
211
+ return this;
212
+ }
213
+ /**
214
+ * Validate all embeds available against current known Discord limits to help prevent bad requests.
215
+ *
216
+ * @returns {EmbedsBuilder}
217
+ */ validate() {
218
+ let totalCharacters = 0;
219
+ if (this.length > 10) {
220
+ throw new Error('You can not have more than 10 embeds on a single message.');
221
+ }
222
+ this.forEach(({ author, description, fields, footer, title }, index)=>{
223
+ if (title) {
224
+ const trimmedTitle = title.trim();
225
+ if (trimmedTitle.length > 256) {
226
+ throw new Error(`Title of embed ${index} can not be longer than 256 characters.`);
227
+ }
228
+ totalCharacters += trimmedTitle.length;
229
+ }
230
+ if (description) {
231
+ const trimmedDescription = description.trim();
232
+ if (trimmedDescription.length > 4096) {
233
+ throw new Error(`Description of embed ${index} can not be longer than 4096 characters.`);
234
+ }
235
+ totalCharacters += trimmedDescription.length;
236
+ }
237
+ if (fields) {
238
+ if (fields.length > 25) {
239
+ throw new Error(`embed ${index} can not have more than 25 fields.`);
240
+ }
241
+ fields.forEach(({ name, value }, fieldIndex)=>{
242
+ const trimmedName = name.trim();
243
+ const trimmedValue = value.trim();
244
+ if (trimmedName.length > 256) {
245
+ throw new Error(`Name of field ${fieldIndex} on embed ${index} can not be longer than 256 characters.`);
246
+ }
247
+ if (trimmedValue.length > 4096) {
248
+ throw new Error(`Value of field ${fieldIndex} on embed ${index} can not be longer than 1024 characters.`);
249
+ }
250
+ totalCharacters += trimmedName.length;
251
+ totalCharacters += trimmedValue.length;
252
+ });
253
+ }
254
+ if (footer) {
255
+ const trimmedFooterText = footer.text.trim();
256
+ if (trimmedFooterText.length > 2048) {
257
+ throw new Error(`Footer text of embed ${index} can not be longer than 2048 characters.`);
258
+ }
259
+ totalCharacters += trimmedFooterText.length;
260
+ }
261
+ if (author) {
262
+ const trimmedAuthorName = author.name.trim();
263
+ if (trimmedAuthorName.length > 256) {
264
+ throw new Error(`Author name of embed ${index} can not be longer than 256 characters.`);
265
+ }
266
+ totalCharacters += trimmedAuthorName.length;
267
+ }
268
+ });
269
+ if (totalCharacters > 6000) {
270
+ throw new Error('Total character length of all embeds can not exceed 6000 characters.');
271
+ }
272
+ return this;
273
+ }
274
+ /**
275
+ * Returns the current embed.
276
+ *
277
+ * @readonly
278
+ * @type {DiscordEmbed}
279
+ */ get #currentEmbed() {
280
+ if (this.length === 0) {
281
+ this.newEmbed();
282
+ this.setCurrentEmbed();
283
+ }
284
+ return this[this.#currentEmbedIndex];
285
+ }
286
+ constructor(...args){
287
+ super(...args), this.#currentEmbedIndex = 0;
288
+ }
289
+ };
290
+
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWlsZGVycy9lbWJlZHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBEaXNjb3JkRW1iZWQsXG4gIERpc2NvcmRFbWJlZEF1dGhvcixcbiAgRGlzY29yZEVtYmVkRmllbGQsXG4gIERpc2NvcmRFbWJlZEZvb3RlcixcbiAgRGlzY29yZEVtYmVkSW1hZ2UsXG4gIERpc2NvcmRFbWJlZFRodW1ibmFpbCxcbiAgRGlzY29yZEVtYmVkVmlkZW8sXG59IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuXG4vKipcbiAqIEEgYnVpbGRlciB0byBoZWxwIGNyZWF0ZSBEaXNjb3JkIGVtYmVkcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZW1iZWRzID0gbmV3IEVtYmVkQnVpbGRlcigpXG4gKiAgLnNldFRpdGxlKCdNeSBFbWJlZCcpXG4gKiAgLnNldERlc2NyaXB0aW9uKCdUaGlzIGlzIG15IG5ldyBlbWJlZCcpXG4gKiAgLm5ld0VtYmVkKClcbiAqICAuc2V0VGl0bGUoJ015IFNlY29uZCBFbWJlZCcpXG4gKi9cbmV4cG9ydCBjbGFzcyBFbWJlZHNCdWlsZGVyIGV4dGVuZHMgQXJyYXk8RGlzY29yZEVtYmVkPiB7XG4gICNjdXJyZW50RW1iZWRJbmRleDogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGZpZWxkIHRvIHRoZSBlbWJlZCBmaWVsZHMgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gRmllbGQgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBGaWVsZCB2YWx1ZVxuICAgKiBAcGFyYW0gez9ib29sZWFufSBbaW5saW5lPWZhbHNlXSAtIEZpZWxkIHNob3VsZCBiZSBpbmxpbmUgb3Igbm90LlxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIGFkZEZpZWxkKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgaW5saW5lPzogYm9vbGVhbik6IHRoaXMge1xuICAgIGlmICh0aGlzLiNjdXJyZW50RW1iZWQuZmllbGRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuI2N1cnJlbnRFbWJlZC5maWVsZHMgPSBbXVxuICAgIH1cblxuICAgIHRoaXMuI2N1cnJlbnRFbWJlZC5maWVsZHMucHVzaCh7XG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBpbmxpbmUsXG4gICAgfSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGJsYW5rIGVtYmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIG5ld0VtYmVkKCk6IHRoaXMge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+PSAxMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGVtYmVkIGNvdW50IGV4Y2VlZGVkLiBZb3UgY2FuIG5vdCBoYXZlIG1vcmUgdGhhbiAxMCBlbWJlZHMuJylcbiAgICB9XG5cbiAgICB0aGlzLnB1c2goe30pXG4gICAgdGhpcy5zZXRDdXJyZW50RW1iZWQoKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGN1cnJlbnQgZW1iZWQgYXV0aG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUgb2YgdGhlIGF1dGhvclxuICAgKiBAcGFyYW0gez9PbWl0PERpc2NvcmRFbWJlZEF1dGhvciwgJ25hbWUnPn0gW29wdGlvbnNdIC0gRXh0cmEgYXV0aG9yIG9wdGlvbnNcbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRBdXRob3IobmFtZTogc3RyaW5nLCBvcHRpb25zPzogT21pdDxEaXNjb3JkRW1iZWRBdXRob3IsICduYW1lJz4pOiB0aGlzIHtcbiAgICB0aGlzLiNjdXJyZW50RW1iZWQuYXV0aG9yID0ge1xuICAgICAgLi4udGhpcy4jY3VycmVudEVtYmVkLmF1dGhvcixcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBuYW1lLFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb2xvciBvbiB0aGUgc2lkZSBvZiB0aGUgY3VycmVudCBlbWJlZC5cbiAgICpcbiAgICogQHBhcmFtIHsobnVtYmVyIHwgc3RyaW5nKX0gY29sb3IgLSBUaGUgY29sb3IsIGluIGJhc2UxNiBvciBoZXggY29sb3IgY29kZVxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldENvbG9yKGNvbG9yOiBudW1iZXIgfCBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAodHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBwYXJzZUludChjb2xvci5yZXBsYWNlKCcjJywgJycpLCAxNilcbiAgICAgIGNvbG9yID0gTnVtYmVyLmlzTmFOKGNvbnZlcnRlZFZhbHVlKSA/IDAgOiBjb252ZXJ0ZWRWYWx1ZVxuICAgIH1cblxuICAgIHRoaXMuI2N1cnJlbnRFbWJlZC5jb2xvciA9IGNvbG9yXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VycmVudCBlbWJlZCB0byBhIGRpZmZlcmVudCBpbmRleC5cbiAgICpcbiAgICogV0FSTklORzogT25seSB1c2UgdGhpcyBtZXRob2QgaWYgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuIE1ha2Ugc3VyZSB0byBzZXQgaXQgYmFjayB0byB0aGUgbGF0ZXN0IHdoZW4geW91J3JlIGRvbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7P251bWJlcn0gW2luZGV4XSAtIFRoZSBpbmRleCBvZiB0aGUgZW1iZWQgaW4gdGhlIEVtYmVkc0J1aWxkZXIgYXJyYXlcbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRDdXJyZW50RW1iZWQoaW5kZXg/OiBudW1iZXIpOiB0aGlzIHtcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy4jY3VycmVudEVtYmVkSW5kZXggPSB0aGlzLmxlbmd0aCAtIDFcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGggfHwgaW5kZXggPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3Qgc2V0IHRoZSBjdXJyZW50IGVtYmVkIHRvIGEgaW5kZXggb3V0IG9mIGJvdW5kcy4nKVxuICAgIH1cblxuICAgIHRoaXMuI2N1cnJlbnRFbWJlZEluZGV4ID0gaW5kZXhcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudCBlbWJlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb25cbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy4jY3VycmVudEVtYmVkLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb25cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogT3ZlcndyaXRlIGFsbCBmaWVsZHMgb24gdGhlIGN1cnJlbnQgZW1iZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RGlzY29yZEVtYmVkRmllbGRbXX0gZmllbGRzXG4gICAqIEByZXR1cm5zIHtFbWJlZHNCdWlsZGVyfVxuICAgKi9cbiAgc2V0RmllbGRzKGZpZWxkczogRGlzY29yZEVtYmVkRmllbGRbXSk6IHRoaXMge1xuICAgIHRoaXMuI2N1cnJlbnRFbWJlZC5maWVsZHMgPSBmaWVsZHNcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBmb290ZXIgaW4gdGhlIGN1cnJlbnQgZW1iZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIHRleHQgdG8gZGlzcGxheSBpbiB0aGUgZm9vdGVyXG4gICAqIEBwYXJhbSB7P09taXQ8RGlzY29yZEVtYmVkRm9vdGVyLCAndGV4dCc+fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRGb290ZXIodGV4dDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxEaXNjb3JkRW1iZWRGb290ZXIsICd0ZXh0Jz4pOiB0aGlzIHtcbiAgICB0aGlzLiNjdXJyZW50RW1iZWQuZm9vdGVyID0ge1xuICAgICAgLi4udGhpcy4jY3VycmVudEVtYmVkLmZvb3RlcixcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0ZXh0LFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBpbWFnZSBpbiB0aGUgY3VycmVudCBlbWJlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFVSTCBvZiB0aGUgaW1hZ2VcbiAgICogQHBhcmFtIHs/T21pdDxEaXNjb3JkRW1iZWRJbWFnZSwgJ3VybCc+fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRJbWFnZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8RGlzY29yZEVtYmVkSW1hZ2UsICd1cmwnPik6IHRoaXMge1xuICAgIHRoaXMuI2N1cnJlbnRFbWJlZC5pbWFnZSA9IHtcbiAgICAgIC4uLnRoaXMuI2N1cnJlbnRFbWJlZC5pbWFnZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB1cmwsXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHByb3ZpZGVyIG9mIHRoZSBjdXJyZW50IGVtYmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0gez9zdHJpbmd9IFt1cmxdXG4gICAqIEByZXR1cm5zIHtFbWJlZHNCdWlsZGVyfVxuICAgKi9cbiAgc2V0UHJvdmlkZXIobmFtZTogc3RyaW5nLCB1cmw/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLiNjdXJyZW50RW1iZWQucHJvdmlkZXIgPSB7XG4gICAgICBuYW1lLFxuICAgICAgdXJsLFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb2xvciBvZiB0aGUgY3VycmVudCBlbWJlZCB0byBhIHJhbmRvbSB2YWx1ZS5cbiAgICpcbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRSYW5kb21Db2xvcigpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5zZXRDb2xvcihNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoMHhmZmZmZmYgKyAxKSkpXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0aXRsZSBvZiB0aGUgY3VycmVudCBlbWJlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gW3VybF1cbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nLCB1cmw/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLiNjdXJyZW50RW1iZWQudGl0bGUgPSB0aXRsZVxuXG4gICAgaWYgKHVybCkge1xuICAgICAgdGhpcy5zZXRVcmwodXJsKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnQgZW1iZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7PyhzdHJpbmcgfCBudW1iZXIgfCBEYXRlKX0gW3RpbWVzdGFtcF1cbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRUaW1lc3RhbXAodGltZXN0YW1wPzogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSk6IHRoaXMge1xuICAgIHRoaXMuI2N1cnJlbnRFbWJlZC50aW1lc3RhbXAgPSBuZXcgRGF0ZSh0aW1lc3RhbXAhKS50b0lTT1N0cmluZygpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdGh1bWJuYWlsIG9mIHRoZSBjdXJyZW50IGVtYmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVVJMIG9mIHRoZSBpbWFnZVxuICAgKiBAcGFyYW0gez9PbWl0PERpc2NvcmRFbWJlZFRodW1ibmFpbCwgJ3VybCc+fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRUaHVtYm5haWwodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PERpc2NvcmRFbWJlZFRodW1ibmFpbCwgJ3VybCc+KTogdGhpcyB7XG4gICAgdGhpcy4jY3VycmVudEVtYmVkLnRodW1ibmFpbCA9IHtcbiAgICAgIC4uLnRoaXMuI2N1cnJlbnRFbWJlZC50aHVtYm5haWwsXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdXJsLFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBVUkwgb2YgdGhlIGN1cnJlbnQgZW1iZWQgdGl0bGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRVcmwodXJsOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLiNjdXJyZW50RW1iZWQudXJsID0gdXJsXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmlkZW8gb2YgdGhlIGN1cnJlbnQgZW1iZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHs/T21pdDxEaXNjb3JkRW1iZWRWaWRlbywgJ3VybCc+fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRWaWRlbyh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8RGlzY29yZEVtYmVkVmlkZW8sICd1cmwnPik6IHRoaXMge1xuICAgIHRoaXMuI2N1cnJlbnRFbWJlZC52aWRlbyA9IHtcbiAgICAgIC4uLnRoaXMuI2N1cnJlbnRFbWJlZC52aWRlbyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB1cmwsXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbGwgZW1iZWRzIGF2YWlsYWJsZSBhZ2FpbnN0IGN1cnJlbnQga25vd24gRGlzY29yZCBsaW1pdHMgdG8gaGVscCBwcmV2ZW50IGJhZCByZXF1ZXN0cy5cbiAgICpcbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICB2YWxpZGF0ZSgpOiB0aGlzIHtcbiAgICBsZXQgdG90YWxDaGFyYWN0ZXJzID0gMFxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMTApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbiBub3QgaGF2ZSBtb3JlIHRoYW4gMTAgZW1iZWRzIG9uIGEgc2luZ2xlIG1lc3NhZ2UuJylcbiAgICB9XG5cbiAgICB0aGlzLmZvckVhY2goKHsgYXV0aG9yLCBkZXNjcmlwdGlvbiwgZmllbGRzLCBmb290ZXIsIHRpdGxlIH0sIGluZGV4KSA9PiB7XG4gICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZFRpdGxlID0gdGl0bGUudHJpbSgpXG5cbiAgICAgICAgaWYgKHRyaW1tZWRUaXRsZS5sZW5ndGggPiAyNTYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpdGxlIG9mIGVtYmVkICR7aW5kZXh9IGNhbiBub3QgYmUgbG9uZ2VyIHRoYW4gMjU2IGNoYXJhY3RlcnMuYClcbiAgICAgICAgfVxuXG4gICAgICAgIHRvdGFsQ2hhcmFjdGVycyArPSB0cmltbWVkVGl0bGUubGVuZ3RoXG4gICAgICB9XG5cbiAgICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCB0cmltbWVkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi50cmltKClcblxuICAgICAgICBpZiAodHJpbW1lZERlc2NyaXB0aW9uLmxlbmd0aCA+IDQwOTYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlc2NyaXB0aW9uIG9mIGVtYmVkICR7aW5kZXh9IGNhbiBub3QgYmUgbG9uZ2VyIHRoYW4gNDA5NiBjaGFyYWN0ZXJzLmApXG4gICAgICAgIH1cblxuICAgICAgICB0b3RhbENoYXJhY3RlcnMgKz0gdHJpbW1lZERlc2NyaXB0aW9uLmxlbmd0aFxuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gMjUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGVtYmVkICR7aW5kZXh9IGNhbiBub3QgaGF2ZSBtb3JlIHRoYW4gMjUgZmllbGRzLmApXG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoeyBuYW1lLCB2YWx1ZSB9LCBmaWVsZEluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJpbW1lZE5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IHZhbHVlLnRyaW0oKVxuXG4gICAgICAgICAgaWYgKHRyaW1tZWROYW1lLmxlbmd0aCA+IDI1Nikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOYW1lIG9mIGZpZWxkICR7ZmllbGRJbmRleH0gb24gZW1iZWQgJHtpbmRleH0gY2FuIG5vdCBiZSBsb25nZXIgdGhhbiAyNTYgY2hhcmFjdGVycy5gKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmltbWVkVmFsdWUubGVuZ3RoID4gNDA5Nikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWx1ZSBvZiBmaWVsZCAke2ZpZWxkSW5kZXh9IG9uIGVtYmVkICR7aW5kZXh9IGNhbiBub3QgYmUgbG9uZ2VyIHRoYW4gMTAyNCBjaGFyYWN0ZXJzLmApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdG90YWxDaGFyYWN0ZXJzICs9IHRyaW1tZWROYW1lLmxlbmd0aFxuICAgICAgICAgIHRvdGFsQ2hhcmFjdGVycyArPSB0cmltbWVkVmFsdWUubGVuZ3RoXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChmb290ZXIpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZEZvb3RlclRleHQgPSBmb290ZXIudGV4dC50cmltKClcblxuICAgICAgICBpZiAodHJpbW1lZEZvb3RlclRleHQubGVuZ3RoID4gMjA0OCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9vdGVyIHRleHQgb2YgZW1iZWQgJHtpbmRleH0gY2FuIG5vdCBiZSBsb25nZXIgdGhhbiAyMDQ4IGNoYXJhY3RlcnMuYClcbiAgICAgICAgfVxuXG4gICAgICAgIHRvdGFsQ2hhcmFjdGVycyArPSB0cmltbWVkRm9vdGVyVGV4dC5sZW5ndGhcbiAgICAgIH1cblxuICAgICAgaWYgKGF1dGhvcikge1xuICAgICAgICBjb25zdCB0cmltbWVkQXV0aG9yTmFtZSA9IGF1dGhvci5uYW1lLnRyaW0oKVxuXG4gICAgICAgIGlmICh0cmltbWVkQXV0aG9yTmFtZS5sZW5ndGggPiAyNTYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF1dGhvciBuYW1lIG9mIGVtYmVkICR7aW5kZXh9IGNhbiBub3QgYmUgbG9uZ2VyIHRoYW4gMjU2IGNoYXJhY3RlcnMuYClcbiAgICAgICAgfVxuXG4gICAgICAgIHRvdGFsQ2hhcmFjdGVycyArPSB0cmltbWVkQXV0aG9yTmFtZS5sZW5ndGhcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHRvdGFsQ2hhcmFjdGVycyA+IDYwMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVG90YWwgY2hhcmFjdGVyIGxlbmd0aCBvZiBhbGwgZW1iZWRzIGNhbiBub3QgZXhjZWVkIDYwMDAgY2hhcmFjdGVycy4nKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBlbWJlZC5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtEaXNjb3JkRW1iZWR9XG4gICAqL1xuICBnZXQgI2N1cnJlbnRFbWJlZCgpOiBEaXNjb3JkRW1iZWQge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5uZXdFbWJlZCgpXG4gICAgICB0aGlzLnNldEN1cnJlbnRFbWJlZCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNbdGhpcy4jY3VycmVudEVtYmVkSW5kZXhdXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJFbWJlZHNCdWlsZGVyIiwiQXJyYXkiLCJhZGRGaWVsZCIsIm5hbWUiLCJ2YWx1ZSIsImlubGluZSIsImZpZWxkcyIsInVuZGVmaW5lZCIsInB1c2giLCJuZXdFbWJlZCIsImxlbmd0aCIsIkVycm9yIiwic2V0Q3VycmVudEVtYmVkIiwic2V0QXV0aG9yIiwib3B0aW9ucyIsImF1dGhvciIsInNldENvbG9yIiwiY29sb3IiLCJjb252ZXJ0ZWRWYWx1ZSIsInBhcnNlSW50IiwicmVwbGFjZSIsIk51bWJlciIsImlzTmFOIiwiaW5kZXgiLCJzZXREZXNjcmlwdGlvbiIsImRlc2NyaXB0aW9uIiwic2V0RmllbGRzIiwic2V0Rm9vdGVyIiwidGV4dCIsImZvb3RlciIsInNldEltYWdlIiwidXJsIiwiaW1hZ2UiLCJzZXRQcm92aWRlciIsInByb3ZpZGVyIiwic2V0UmFuZG9tQ29sb3IiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJzZXRUaXRsZSIsInRpdGxlIiwic2V0VXJsIiwic2V0VGltZXN0YW1wIiwidGltZXN0YW1wIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwic2V0VGh1bWJuYWlsIiwidGh1bWJuYWlsIiwic2V0VmlkZW8iLCJ2aWRlbyIsInZhbGlkYXRlIiwidG90YWxDaGFyYWN0ZXJzIiwiZm9yRWFjaCIsInRyaW1tZWRUaXRsZSIsInRyaW0iLCJ0cmltbWVkRGVzY3JpcHRpb24iLCJmaWVsZEluZGV4IiwidHJpbW1lZE5hbWUiLCJ0cmltbWVkVmFsdWUiLCJ0cmltbWVkRm9vdGVyVGV4dCIsInRyaW1tZWRBdXRob3JOYW1lIl0sIm1hcHBpbmdzIjoiOzs7OytCQW9CYUE7OztlQUFBQTs7O0FBQU4sSUFBQSxBQUFNQSxnQkFBTixNQUFNQSxzQkFBc0JDO0lBQ2pDLENBQUEsaUJBQWtCLENBQVk7SUFFOUI7Ozs7Ozs7R0FPQyxHQUNEQyxTQUFTQyxJQUFZLEVBQUVDLEtBQWEsRUFBRUMsTUFBZ0IsRUFBUTtRQUM1RCxJQUFJLElBQUksQ0FBQyxDQUFBLFlBQWEsQ0FBQ0MsTUFBTSxLQUFLQyxXQUFXO1lBQzNDLElBQUksQ0FBQyxDQUFBLFlBQWEsQ0FBQ0QsTUFBTSxHQUFHLEVBQUU7UUFDaEM7UUFFQSxJQUFJLENBQUMsQ0FBQSxZQUFhLENBQUNBLE1BQU0sQ0FBQ0UsSUFBSSxDQUFDO1lBQzdCTDtZQUNBQztZQUNBQztRQUNGO1FBRUEsT0FBTyxJQUFJO0lBQ2I7SUFFQTs7OztHQUlDLEdBQ0RJLFdBQWlCO1FBQ2YsSUFBSSxJQUFJLENBQUNDLE1BQU0sSUFBSSxJQUFJO1lBQ3JCLE1BQU0sSUFBSUMsTUFBTTtRQUNsQjtRQUVBLElBQUksQ0FBQ0gsSUFBSSxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUNJLGVBQWU7UUFFcEIsT0FBTyxJQUFJO0lBQ2I7SUFFQTs7Ozs7O0dBTUMsR0FDREMsVUFBVVYsSUFBWSxFQUFFVyxPQUEwQyxFQUFRO1FBQ3hFLElBQUksQ0FBQyxDQUFBLFlBQWEsQ0FBQ0MsTUFBTSxHQUFHO1lBQzFCLEdBQUcsSUFBSSxDQUFDLENBQUEsWUFBYSxDQUFDQSxNQUFNO1lBQzVCLEdBQUdELE9BQU87WUFDVlg7UUFDRjtRQUVBLE9BQU8sSUFBSTtJQUNiO0lBRUE7Ozs7O0dBS0MsR0FDRGEsU0FBU0MsS0FBc0IsRUFB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
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "createEmbeds", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return createEmbeds;
9
+ }
10
+ });
11
+ const _embeds = _export_star(require("./builders/embeds.cjs"), exports);
12
+ function _export_star(from, to) {
13
+ Object.keys(from).forEach(function(k) {
14
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
15
+ Object.defineProperty(to, k, {
16
+ enumerable: true,
17
+ get: function() {
18
+ return from[k];
19
+ }
20
+ });
21
+ }
22
+ });
23
+ return from;
24
+ }
25
+ const createEmbeds = ()=>new _embeds.EmbedsBuilder();
26
+
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbWJlZHNCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVycy9lbWJlZHMuanMnXG5cbmV4cG9ydCAqIGZyb20gJy4vYnVpbGRlcnMvZW1iZWRzLmpzJ1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRW1iZWRzID0gKCk6IEVtYmVkc0J1aWxkZXIgPT4gbmV3IEVtYmVkc0J1aWxkZXIoKVxuIl0sIm5hbWVzIjpbImNyZWF0ZUVtYmVkcyIsIkVtYmVkc0J1aWxkZXIiXSwibWFwcGluZ3MiOiI7Ozs7K0JBSWFBOzs7ZUFBQUE7OztxQ0FKaUI7Ozs7Ozs7Ozs7Ozs7O0FBSXZCLE1BQU1BLGVBQWUsSUFBcUIsSUFBSUMscUJBQWEifQ==
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ camelToSnakeCase: function() {
13
+ return camelToSnakeCase;
14
+ },
15
+ camelize: function() {
16
+ return camelize;
17
+ },
18
+ snakeToCamelCase: function() {
19
+ return snakeToCamelCase;
20
+ },
21
+ snakelize: function() {
22
+ return snakelize;
23
+ }
24
+ });
25
+ function camelize(object) {
26
+ if (Array.isArray(object)) {
27
+ return object.map((element)=>camelize(element));
28
+ }
29
+ if (typeof object === 'object' && object !== null) {
30
+ const obj = {};
31
+ Object.keys(object).forEach((key)=>{
32
+ // @ts-expect-error js hack
33
+ ;
34
+ obj[snakeToCamelCase(key)] = camelize(object[key]);
35
+ });
36
+ return obj;
37
+ }
38
+ return object;
39
+ }
40
+ function snakelize(object) {
41
+ if (Array.isArray(object)) {
42
+ return object.map((element)=>snakelize(element));
43
+ }
44
+ if (typeof object === 'object' && object !== null) {
45
+ const obj = {};
46
+ Object.keys(object).forEach((key)=>{
47
+ // @ts-expect-error js hack
48
+ ;
49
+ obj[camelToSnakeCase(key)] = snakelize(object[key]);
50
+ });
51
+ return obj;
52
+ }
53
+ return object;
54
+ }
55
+ function snakeToCamelCase(str) {
56
+ if (!str.includes('_')) return str;
57
+ let result = '';
58
+ for(let i = 0, len = str.length; i < len; ++i){
59
+ if (str[i] === '_') {
60
+ result += str[++i].toUpperCase();
61
+ continue;
62
+ }
63
+ result += str[i];
64
+ }
65
+ return result;
66
+ }
67
+ function camelToSnakeCase(str) {
68
+ let result = '';
69
+ for(let i = 0, len = str.length; i < len; ++i){
70
+ if (str[i] >= 'A' && str[i] <= 'Z') {
71
+ result += `_${str[i].toLowerCase()}`;
72
+ continue;
73
+ }
74
+ result += str[i];
75
+ }
76
+ return result;
77
+ }
78
+
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYXNpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYW1lbGl6ZSwgU25ha2VsaXplIH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbGl6ZTxUPihvYmplY3Q6IFQpOiBDYW1lbGl6ZTxUPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0Lm1hcCgoZWxlbWVudCkgPT4gY2FtZWxpemUoZWxlbWVudCkpIGFzIENhbWVsaXplPFQ+XG4gIH1cblxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgY29uc3Qgb2JqID0ge30gYXMgQ2FtZWxpemU8VD5cbiAgICA7KE9iamVjdC5rZXlzKG9iamVjdCkgYXMgQXJyYXk8a2V5b2YgVD4pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBqcyBoYWNrXG4gICAgICA7KG9ialtzbmFrZVRvQ2FtZWxDYXNlKGtleSldIGFzIENhbWVsaXplPChUICYgb2JqZWN0KVtrZXlvZiBUXT4pID0gY2FtZWxpemUob2JqZWN0W2tleV0pXG4gICAgfSlcbiAgICByZXR1cm4gb2JqXG4gIH1cbiAgcmV0dXJuIG9iamVjdCBhcyBDYW1lbGl6ZTxUPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gc25ha2VsaXplPFQ+KG9iamVjdDogVCk6IFNuYWtlbGl6ZTxUPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0Lm1hcCgoZWxlbWVudCkgPT4gc25ha2VsaXplKGVsZW1lbnQpKSBhcyBTbmFrZWxpemU8VD5cbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICBjb25zdCBvYmogPSB7fSBhcyBTbmFrZWxpemU8VD5cbiAgICA7KE9iamVjdC5rZXlzKG9iamVjdCkgYXMgQXJyYXk8a2V5b2YgVD4pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBqcyBoYWNrXG4gICAgICA7KG9ialtjYW1lbFRvU25ha2VDYXNlKGtleSldIGFzIFNuYWtlbGl6ZTwoVCAmIG9iamVjdClba2V5b2YgVF0+KSA9IHNuYWtlbGl6ZShvYmplY3Rba2V5XSlcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuICByZXR1cm4gb2JqZWN0IGFzIFNuYWtlbGl6ZTxUPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gc25ha2VUb0NhbWVsQ2FzZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghc3RyLmluY2x1ZGVzKCdfJykpIHJldHVybiBzdHJcblxuICBsZXQgcmVzdWx0ID0gJydcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChzdHJbaV0gPT09ICdfJykge1xuICAgICAgcmVzdWx0ICs9IHN0clsrK2ldLnRvVXBwZXJDYXNlKClcblxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICByZXN1bHQgKz0gc3RyW2ldXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbFRvU25ha2VDYXNlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoc3RyW2ldID49ICdBJyAmJiBzdHJbaV0gPD0gJ1onKSB7XG4gICAgICByZXN1bHQgKz0gYF8ke3N0cltpXS50b0xvd2VyQ2FzZSgpfWBcblxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICByZXN1bHQgKz0gc3RyW2ldXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG4iXSwibmFtZXMiOlsiY2FtZWxUb1NuYWtlQ2FzZSIsImNhbWVsaXplIiwic25ha2VUb0NhbWVsQ2FzZSIsInNuYWtlbGl6ZSIsIm9iamVjdCIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsImVsZW1lbnQiLCJvYmoiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsInN0ciIsImluY2x1ZGVzIiwicmVzdWx0IiwiaSIsImxlbiIsImxlbmd0aCIsInRvVXBwZXJDYXNlIiwidG9Mb3dlckNhc2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBbURnQkEsZ0JBQWdCO2VBQWhCQTs7SUFqREFDLFFBQVE7ZUFBUkE7O0lBZ0NBQyxnQkFBZ0I7ZUFBaEJBOztJQWhCQUMsU0FBUztlQUFUQTs7O0FBaEJULFNBQVNGLFNBQVlHLE1BQVM7SUFDbkMsSUFBSUMsTUFBTUMsT0FBTyxDQUFDRixTQUFTO1FBQ3pCLE9BQU9BLE9BQU9HLEdBQUcsQ0FBQyxDQUFDQyxVQUFZUCxTQUFTTztJQUMxQztJQUVBLElBQUksT0FBT0osV0FBVyxZQUFZQSxXQUFXLE1BQU07UUFDakQsTUFBTUssTUFBTSxDQUFDO1FBQ1hDLE9BQU9DLElBQUksQ0FBQ1AsUUFBMkJRLE9BQU8sQ0FBQyxDQUFDQztZQUNoRCwyQkFBMkI7O1lBQ3pCSixHQUFHLENBQUNQLGlCQUFpQlcsS0FBSyxHQUF1Q1osU0FBU0csTUFBTSxDQUFDUyxJQUFJO1FBQ3pGO1FBQ0EsT0FBT0o7SUFDVDtJQUNBLE9BQU9MO0FBQ1Q7QUFFTyxTQUFTRCxVQUFhQyxNQUFTO0lBQ3BDLElBQUlDLE1BQU1DLE9BQU8sQ0FBQ0YsU0FBUztRQUN6QixPQUFPQSxPQUFPRyxHQUFHLENBQUMsQ0FBQ0MsVUFBWUwsVUFBVUs7SUFDM0M7SUFFQSxJQUFJLE9BQU9KLFdBQVcsWUFBWUEsV0FBVyxNQUFNO1FBQ2pELE1BQU1LLE1BQU0sQ0FBQztRQUNYQyxPQUFPQyxJQUFJLENBQUNQLFFBQTJCUSxPQUFPLENBQUMsQ0FBQ0M7WUFDaEQsMkJBQTJCOztZQUN6QkosR0FBRyxDQUFDVCxpQkFBaUJhLEtBQUssR0FBd0NWLFVBQVVDLE1BQU0sQ0FBQ1MsSUFBSTtRQUMzRjtRQUNBLE9BQU9KO0lBQ1Q7SUFDQSxPQUFPTDtBQUNUO0FBRU8sU0FBU0YsaUJBQWlCWSxHQUFXO0lBQzFDLElBQUksQ0FBQ0EsSUFBSUMsUUFBUSxDQUFDLE1BQU0sT0FBT0Q7SUFFL0IsSUFBSUUsU0FBUztJQUNiLElBQUssSUFBSUMsSUFBSSxHQUFHQyxNQUFNSixJQUFJSyxNQUFNLEVBQUVGLElBQUlDLEtBQUssRUFBRUQsRUFBRztRQUM5QyxJQUFJSCxHQUFHLENBQUNHLEVBQUUsS0FBSyxLQUFLO1lBQ2xCRCxVQUFVRixHQUFHLENBQUMsRUFBRUcsRUFBRSxDQUFDRyxXQUFXO1lBRTlCO1FBQ0Y7UUFFQUosVUFBVUYsR0FBRyxDQUFDRyxFQUFFO0lBQ2xCO0lBRUEsT0FBT0Q7QUFDVDtBQUVPLFNBQVNoQixpQkFBaUJjLEdBQVc7SUFDMUMsSUFBSUUsU0FBUztJQUNiLElBQUssSUFBSUMsSUFBSSxHQUFHQyxNQUFNSixJQUFJSyxNQUFNLEVBQUVGLElBQUlDLEtBQUssRUFBRUQsRUFBRztRQUM5QyxJQUFJSCxHQUFHLENBQUNHLEVBQUUsSUFBSSxPQUFPSCxHQUFHLENBQUNHLEVBQUUsSUFBSSxLQUFLO1lBQ2xDRCxVQUFVLENBQUMsQ0FBQyxFQUFFRixHQUFHLENBQUNHLEVBQUUsQ0FBQ0ksV0FBVyxJQUFJO1lBRXBDO1FBQ0Y7UUFFQUwsVUFBVUYsR0FBRyxDQUFDRyxFQUFFO0lBQ2xCO0lBRUEsT0FBT0Q7QUFDVCJ9