@jubbio/core 1.1.20 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Client.js +13 -14
- package/dist/cjs/Client.d.ts +157 -0
- package/dist/cjs/Client.js +640 -0
- package/dist/cjs/builders/ActionRowBuilder.d.ts +53 -0
- package/dist/cjs/builders/ActionRowBuilder.js +68 -0
- package/dist/cjs/builders/ButtonBuilder.d.ts +77 -0
- package/dist/cjs/builders/ButtonBuilder.js +96 -0
- package/dist/cjs/builders/EmbedBuilder.d.ts +157 -0
- package/dist/cjs/builders/EmbedBuilder.js +208 -0
- package/dist/cjs/builders/ModalBuilder.d.ts +122 -0
- package/dist/cjs/builders/ModalBuilder.js +162 -0
- package/dist/cjs/builders/SelectMenuBuilder.d.ts +123 -0
- package/dist/cjs/builders/SelectMenuBuilder.js +165 -0
- package/dist/cjs/builders/SlashCommandBuilder.d.ts +197 -0
- package/dist/cjs/builders/SlashCommandBuilder.js +324 -0
- package/dist/cjs/builders/index.d.ts +9 -0
- package/dist/cjs/builders/index.js +26 -0
- package/dist/cjs/enums.d.ts +191 -0
- package/dist/cjs/enums.js +211 -0
- package/dist/cjs/index.d.ts +25 -0
- package/dist/cjs/index.js +130 -0
- package/dist/cjs/managers/BaseManager.d.ts +69 -0
- package/dist/cjs/managers/BaseManager.js +106 -0
- package/dist/cjs/managers/ChannelManager.d.ts +95 -0
- package/dist/cjs/managers/ChannelManager.js +205 -0
- package/dist/cjs/managers/GuildMemberManager.d.ts +74 -0
- package/dist/cjs/managers/GuildMemberManager.js +157 -0
- package/dist/cjs/managers/RoleManager.d.ts +84 -0
- package/dist/cjs/managers/RoleManager.js +207 -0
- package/dist/cjs/managers/index.d.ts +7 -0
- package/dist/cjs/managers/index.js +24 -0
- package/dist/cjs/rest/REST.d.ts +527 -0
- package/dist/cjs/rest/REST.js +904 -0
- package/dist/cjs/rest/index.d.ts +1 -0
- package/dist/cjs/rest/index.js +18 -0
- package/dist/cjs/sharding/ShardingManager.d.ts +179 -0
- package/dist/cjs/sharding/ShardingManager.js +375 -0
- package/dist/cjs/sharding/index.d.ts +4 -0
- package/dist/cjs/sharding/index.js +21 -0
- package/dist/cjs/structures/Channel.d.ts +122 -0
- package/dist/cjs/structures/Channel.js +240 -0
- package/dist/cjs/structures/Collection.d.ts +53 -0
- package/dist/cjs/structures/Collection.js +115 -0
- package/dist/cjs/structures/Guild.d.ts +59 -0
- package/dist/cjs/structures/Guild.js +94 -0
- package/dist/cjs/structures/GuildMember.d.ts +174 -0
- package/dist/cjs/structures/GuildMember.js +311 -0
- package/dist/cjs/structures/Interaction.d.ts +245 -0
- package/dist/cjs/structures/Interaction.js +450 -0
- package/dist/cjs/structures/Message.d.ts +98 -0
- package/dist/cjs/structures/Message.js +195 -0
- package/dist/cjs/structures/User.d.ts +37 -0
- package/dist/cjs/structures/User.js +65 -0
- package/dist/cjs/structures/index.d.ts +7 -0
- package/dist/cjs/structures/index.js +25 -0
- package/dist/cjs/structures.d.ts +1 -0
- package/dist/cjs/structures.js +19 -0
- package/dist/cjs/types.d.ts +255 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/utils/BitField.d.ts +66 -0
- package/dist/cjs/utils/BitField.js +138 -0
- package/dist/cjs/utils/Collection.d.ts +116 -0
- package/dist/cjs/utils/Collection.js +265 -0
- package/dist/cjs/utils/Collector.d.ts +152 -0
- package/dist/cjs/utils/Collector.js +314 -0
- package/dist/cjs/utils/DataResolver.d.ts +61 -0
- package/dist/cjs/utils/DataResolver.js +146 -0
- package/dist/cjs/utils/Formatters.d.ts +145 -0
- package/dist/cjs/utils/Formatters.js +213 -0
- package/dist/cjs/utils/IntentsBitField.d.ts +85 -0
- package/dist/cjs/utils/IntentsBitField.js +99 -0
- package/dist/cjs/utils/Partials.d.ts +104 -0
- package/dist/cjs/utils/Partials.js +148 -0
- package/dist/cjs/utils/PermissionsBitField.d.ts +118 -0
- package/dist/cjs/utils/PermissionsBitField.js +145 -0
- package/dist/cjs/utils/SnowflakeUtil.d.ts +63 -0
- package/dist/cjs/utils/SnowflakeUtil.js +93 -0
- package/dist/cjs/utils/Sweepers.d.ts +119 -0
- package/dist/cjs/utils/Sweepers.js +249 -0
- package/dist/cjs/utils/index.d.ts +13 -0
- package/dist/cjs/utils/index.js +30 -0
- package/dist/esm/Client.js +634 -0
- package/dist/esm/builders/ActionRowBuilder.js +64 -0
- package/dist/esm/builders/ButtonBuilder.js +92 -0
- package/dist/esm/builders/EmbedBuilder.js +204 -0
- package/dist/esm/builders/ModalBuilder.js +157 -0
- package/dist/esm/builders/SelectMenuBuilder.js +161 -0
- package/dist/esm/builders/SlashCommandBuilder.js +311 -0
- package/dist/esm/builders/index.js +10 -0
- package/dist/esm/enums.js +208 -0
- package/dist/esm/index.js +34 -0
- package/dist/esm/managers/BaseManager.js +100 -0
- package/dist/esm/managers/ChannelManager.js +200 -0
- package/dist/esm/managers/GuildMemberManager.js +153 -0
- package/dist/esm/managers/RoleManager.js +203 -0
- package/dist/esm/managers/index.js +8 -0
- package/dist/esm/rest/REST.js +900 -0
- package/dist/esm/rest/index.js +2 -0
- package/dist/esm/sharding/ShardingManager.js +366 -0
- package/dist/esm/sharding/index.js +5 -0
- package/dist/esm/structures/Channel.js +232 -0
- package/dist/esm/structures/Collection.js +111 -0
- package/dist/esm/structures/Guild.js +90 -0
- package/dist/esm/structures/GuildMember.js +306 -0
- package/dist/esm/structures/Interaction.js +438 -0
- package/dist/esm/structures/Message.js +191 -0
- package/dist/esm/structures/User.js +61 -0
- package/dist/esm/structures/index.js +9 -0
- package/dist/esm/structures.js +3 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/utils/BitField.js +134 -0
- package/dist/esm/utils/Collection.js +261 -0
- package/dist/esm/utils/Collector.js +305 -0
- package/dist/esm/utils/DataResolver.js +142 -0
- package/dist/esm/utils/Formatters.js +191 -0
- package/dist/esm/utils/IntentsBitField.js +93 -0
- package/dist/esm/utils/Partials.js +137 -0
- package/dist/esm/utils/PermissionsBitField.js +141 -0
- package/dist/esm/utils/SnowflakeUtil.js +89 -0
- package/dist/esm/utils/Sweepers.js +245 -0
- package/dist/esm/utils/index.js +14 -0
- package/dist/rest/REST.js +8 -1
- package/dist/structures/Interaction.js +3 -5
- package/dist/structures/Message.js +56 -2
- package/package.json +14 -4
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic BitField class
|
|
3
|
+
* API compatible with Discord.js BitField
|
|
4
|
+
*/
|
|
5
|
+
export type BitFieldResolvable<S extends string, N extends bigint | number> = N | N[] | S | S[] | BitField<S, N>;
|
|
6
|
+
/**
|
|
7
|
+
* Data structure for bit fields
|
|
8
|
+
*/
|
|
9
|
+
export declare class BitField<S extends string = string, N extends bigint | number = bigint> {
|
|
10
|
+
/** The raw bits */
|
|
11
|
+
bitfield: N;
|
|
12
|
+
/** Flags for this bitfield (override in subclass) */
|
|
13
|
+
static Flags: Record<string, bigint | number>;
|
|
14
|
+
/** Default bit value */
|
|
15
|
+
static DefaultBit: bigint | number;
|
|
16
|
+
constructor(bits?: BitFieldResolvable<S, N>);
|
|
17
|
+
/**
|
|
18
|
+
* Check if this bitfield has a bit
|
|
19
|
+
*/
|
|
20
|
+
has(bit: BitFieldResolvable<S, N>): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Check if this bitfield has any of the bits
|
|
23
|
+
*/
|
|
24
|
+
any(bits: BitFieldResolvable<S, N>): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Add bits to this bitfield
|
|
27
|
+
*/
|
|
28
|
+
add(...bits: BitFieldResolvable<S, N>[]): this;
|
|
29
|
+
/**
|
|
30
|
+
* Remove bits from this bitfield
|
|
31
|
+
*/
|
|
32
|
+
remove(...bits: BitFieldResolvable<S, N>[]): this;
|
|
33
|
+
/**
|
|
34
|
+
* Serialize to array of flag names
|
|
35
|
+
*/
|
|
36
|
+
toArray(): S[];
|
|
37
|
+
/**
|
|
38
|
+
* Serialize to JSON
|
|
39
|
+
*/
|
|
40
|
+
toJSON(): string | number;
|
|
41
|
+
/**
|
|
42
|
+
* Get string representation
|
|
43
|
+
*/
|
|
44
|
+
toString(): string;
|
|
45
|
+
/**
|
|
46
|
+
* Get iterator
|
|
47
|
+
*/
|
|
48
|
+
[Symbol.iterator](): IterableIterator<S>;
|
|
49
|
+
/**
|
|
50
|
+
* Freeze this bitfield
|
|
51
|
+
*/
|
|
52
|
+
freeze(): Readonly<this>;
|
|
53
|
+
/**
|
|
54
|
+
* Check equality
|
|
55
|
+
*/
|
|
56
|
+
equals(other: BitFieldResolvable<S, N>): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Clone this bitfield
|
|
59
|
+
*/
|
|
60
|
+
clone(): BitField<S, N>;
|
|
61
|
+
/**
|
|
62
|
+
* Resolve a bit to the numeric type
|
|
63
|
+
*/
|
|
64
|
+
static resolve<S extends string, N extends bigint | number>(bit: BitFieldResolvable<S, N>): N;
|
|
65
|
+
}
|
|
66
|
+
export default BitField;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Generic BitField class
|
|
4
|
+
* API compatible with Discord.js BitField
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.BitField = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Data structure for bit fields
|
|
10
|
+
*/
|
|
11
|
+
class BitField {
|
|
12
|
+
/** The raw bits */
|
|
13
|
+
bitfield;
|
|
14
|
+
/** Flags for this bitfield (override in subclass) */
|
|
15
|
+
static Flags = {};
|
|
16
|
+
/** Default bit value */
|
|
17
|
+
static DefaultBit = 0n;
|
|
18
|
+
constructor(bits = BitField.DefaultBit) {
|
|
19
|
+
this.bitfield = this.constructor.resolve(bits);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if this bitfield has a bit
|
|
23
|
+
*/
|
|
24
|
+
has(bit) {
|
|
25
|
+
const resolved = this.constructor.resolve(bit);
|
|
26
|
+
return (this.bitfield & resolved) === resolved;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if this bitfield has any of the bits
|
|
30
|
+
*/
|
|
31
|
+
any(bits) {
|
|
32
|
+
const resolved = this.constructor.resolve(bits);
|
|
33
|
+
return (this.bitfield & resolved) !== 0n;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Add bits to this bitfield
|
|
37
|
+
*/
|
|
38
|
+
add(...bits) {
|
|
39
|
+
let total = 0n;
|
|
40
|
+
for (const bit of bits) {
|
|
41
|
+
total |= this.constructor.resolve(bit);
|
|
42
|
+
}
|
|
43
|
+
this.bitfield |= total;
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Remove bits from this bitfield
|
|
48
|
+
*/
|
|
49
|
+
remove(...bits) {
|
|
50
|
+
let total = 0n;
|
|
51
|
+
for (const bit of bits) {
|
|
52
|
+
total |= this.constructor.resolve(bit);
|
|
53
|
+
}
|
|
54
|
+
this.bitfield &= ~total;
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Serialize to array of flag names
|
|
59
|
+
*/
|
|
60
|
+
toArray() {
|
|
61
|
+
const flags = this.constructor.Flags;
|
|
62
|
+
const result = [];
|
|
63
|
+
for (const [name, bit] of Object.entries(flags)) {
|
|
64
|
+
if (this.bitfield & bit) {
|
|
65
|
+
result.push(name);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Serialize to JSON
|
|
72
|
+
*/
|
|
73
|
+
toJSON() {
|
|
74
|
+
return typeof this.bitfield === 'bigint'
|
|
75
|
+
? this.bitfield.toString()
|
|
76
|
+
: this.bitfield;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get string representation
|
|
80
|
+
*/
|
|
81
|
+
toString() {
|
|
82
|
+
return this.bitfield.toString();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get iterator
|
|
86
|
+
*/
|
|
87
|
+
*[Symbol.iterator]() {
|
|
88
|
+
yield* this.toArray();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Freeze this bitfield
|
|
92
|
+
*/
|
|
93
|
+
freeze() {
|
|
94
|
+
return Object.freeze(this);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check equality
|
|
98
|
+
*/
|
|
99
|
+
equals(other) {
|
|
100
|
+
return this.bitfield === this.constructor.resolve(other);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Clone this bitfield
|
|
104
|
+
*/
|
|
105
|
+
clone() {
|
|
106
|
+
return new this.constructor(this.bitfield);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resolve a bit to the numeric type
|
|
110
|
+
*/
|
|
111
|
+
static resolve(bit) {
|
|
112
|
+
if (typeof bit === 'bigint' || typeof bit === 'number') {
|
|
113
|
+
return bit;
|
|
114
|
+
}
|
|
115
|
+
if (bit instanceof BitField) {
|
|
116
|
+
return bit.bitfield;
|
|
117
|
+
}
|
|
118
|
+
if (typeof bit === 'string') {
|
|
119
|
+
const resolved = this.Flags[bit];
|
|
120
|
+
if (resolved === undefined) {
|
|
121
|
+
throw new Error(`Unknown bit: ${bit}`);
|
|
122
|
+
}
|
|
123
|
+
return resolved;
|
|
124
|
+
}
|
|
125
|
+
if (Array.isArray(bit)) {
|
|
126
|
+
let result = this.DefaultBit;
|
|
127
|
+
for (const b of bit) {
|
|
128
|
+
const resolved = this.resolve(b);
|
|
129
|
+
result |= resolved;
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
throw new Error(`Invalid bit: ${bit}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.BitField = BitField;
|
|
137
|
+
exports.default = BitField;
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQml0RmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvQml0RmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7O0FBU0g7O0dBRUc7QUFDSCxNQUFhLFFBQVE7SUFDbkIsbUJBQW1CO0lBQ1osUUFBUSxDQUFJO0lBRW5CLHFEQUFxRDtJQUNyRCxNQUFNLENBQUMsS0FBSyxHQUFvQyxFQUFFLENBQUM7SUFFbkQsd0JBQXdCO0lBQ3hCLE1BQU0sQ0FBQyxVQUFVLEdBQW9CLEVBQUUsQ0FBQztJQUV4QyxZQUFZLE9BQWlDLFFBQVEsQ0FBQyxVQUFlO1FBQ25FLElBQUksQ0FBQyxRQUFRLEdBQUksSUFBSSxDQUFDLFdBQStCLENBQUMsT0FBTyxDQUFPLElBQUksQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUcsQ0FBQyxHQUE2QjtRQUMvQixNQUFNLFFBQVEsR0FBSSxJQUFJLENBQUMsV0FBK0IsQ0FBQyxPQUFPLENBQU8sR0FBRyxDQUFDLENBQUM7UUFDMUUsT0FBTyxDQUFFLElBQUksQ0FBQyxRQUFtQixHQUFJLFFBQW1CLENBQUMsS0FBTSxRQUFtQixDQUFDO0lBQ3JGLENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUcsQ0FBQyxJQUE4QjtRQUNoQyxNQUFNLFFBQVEsR0FBSSxJQUFJLENBQUMsV0FBK0IsQ0FBQyxPQUFPLENBQU8sSUFBSSxDQUFDLENBQUM7UUFDM0UsT0FBTyxDQUFFLElBQUksQ0FBQyxRQUFtQixHQUFJLFFBQW1CLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRyxDQUFDLEdBQUcsSUFBZ0M7UUFDckMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixLQUFLLElBQUssSUFBSSxDQUFDLFdBQStCLENBQUMsT0FBTyxD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WUFDdkIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQW9CLENBQUM7WUFDdkMsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxJQUFJLFFBQWtCLENBQUM7WUFDL0IsQ0FBQztZQUNELE9BQU8sTUFBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O0FBaEpILDRCQWlKQztBQUVELGtCQUFlLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJpYyBCaXRGaWVsZCBjbGFzc1xuICogQVBJIGNvbXBhdGlibGUgd2l0aCBEaXNjb3JkLmpzIEJpdEZpZWxkXG4gKi9cblxuZXhwb3J0IHR5cGUgQml0RmllbGRSZXNvbHZhYmxlPFMgZXh0ZW5kcyBzdHJpbmcsIE4gZXh0ZW5kcyBiaWdpbnQgfCBudW1iZXI+ID0gXG4gIHwgTiBcbiAgfCBOW10gXG4gIHwgUyBcbiAgfCBTW10gXG4gIHwgQml0RmllbGQ8UywgTj47XG5cbi8qKlxuICogRGF0YSBzdHJ1Y3R1cmUgZm9yIGJpdCBmaWVsZHNcbiAqL1xuZXhwb3J0IGNsYXNzIEJpdEZpZWxkPFMgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIE4gZXh0ZW5kcyBiaWdpbnQgfCBudW1iZXIgPSBiaWdpbnQ+IHtcbiAgLyoqIFRoZSByYXcgYml0cyAqL1xuICBwdWJsaWMgYml0ZmllbGQ6IE47XG5cbiAgLyoqIEZsYWdzIGZvciB0aGlzIGJpdGZpZWxkIChvdmVycmlkZSBpbiBzdWJjbGFzcykgKi9cbiAgc3RhdGljIEZsYWdzOiBSZWNvcmQ8c3RyaW5nLCBiaWdpbnQgfCBudW1iZXI+ID0ge307XG5cbiAgLyoqIERlZmF1bHQgYml0IHZhbHVlICovXG4gIHN0YXRpYyBEZWZhdWx0Qml0OiBiaWdpbnQgfCBudW1iZXIgPSAwbjtcblxuICBjb25zdHJ1Y3RvcihiaXRzOiBCaXRGaWVsZFJlc29sdmFibGU8UywgTj4gPSBCaXRGaWVsZC5EZWZhdWx0Qml0IGFzIE4pIHtcbiAgICB0aGlzLmJpdGZpZWxkID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIEJpdEZpZWxkKS5yZXNvbHZlPFMsIE4+KGJpdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgYml0ZmllbGQgaGFzIGEgYml0XG4gICAqL1xuICBoYXMoYml0OiBCaXRGaWVsZFJlc29sdmFibGU8UywgTj4pOiBib29sZWFuIHtcbiAgICBjb25zdCByZXNvbHZlZCA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCaXRGaWVsZCkucmVzb2x2ZTxTLCBOPihiaXQpO1xuICAgIHJldHVybiAoKHRoaXMuYml0ZmllbGQgYXMgYmlnaW50KSAmIChyZXNvbHZlZCBhcyBiaWdpbnQpKSA9PT0gKHJlc29sdmVkIGFzIGJpZ2ludCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyBiaXRmaWVsZCBoYXMgYW55IG9mIHRoZSBiaXRzXG4gICAqL1xuICBhbnkoYml0czogQml0RmllbGRSZXNvbHZhYmxlPFMsIE4+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQml0RmllbGQpLnJlc29sdmU8UywgTj4oYml0cyk7XG4gICAgcmV0dXJuICgodGhpcy5iaXRmaWVsZCBhcyBiaWdpbnQpICYgKHJlc29sdmVkIGFzIGJpZ2ludCkpICE9PSAwbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYml0cyB0byB0aGlzIGJpdGZpZWxkXG4gICAqL1xuICBhZGQoLi4uYml0czogQml0RmllbGRSZXNvbHZhYmxlPFMsIE4+W10pOiB0aGlzIHtcbiAgICBsZXQgdG90YWwgPSAwbjtcbiAgICBmb3IgKGNvbnN0IGJpdCBvZiBiaXRzKSB7XG4gICAgICB0b3RhbCB8PSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQml0RmllbGQpLnJlc29sdmU8UywgTj4oYml0KSBhcyBiaWdpbnQ7XG4gICAgfVxuICAgICh0aGlzLmJpdGZpZWxkIGFzIGJpZ2ludCkgfD0gdG90YWw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGJpdHMgZnJvbSB0aGlzIGJpdGZpZWxkXG4gICAqL1xuICByZW1vdmUoLi4uYml0czogQml0RmllbGRSZXNvbHZhYmxlPFMsIE4+W10pOiB0aGlzIHtcbiAgICBsZXQgdG90YWwgPSAwbjtcbiAgICBmb3IgKGNvbnN0IGJpdCBvZiBiaXRzKSB7XG4gICAgICB0b3RhbCB8PSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQml0RmllbGQpLnJlc29sdmU8UywgTj4oYml0KSBhcyBiaWdpbnQ7XG4gICAgfVxuICAgICh0aGlzLmJpdGZpZWxkIGFzIGJpZ2ludCkgJj0gfnRvdGFsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0byBhcnJheSBvZiBmbGFnIG5hbWVzXG4gICAqL1xuICB0b0FycmF5KCk6IFNbXSB7XG4gICAgY29uc3QgZmxhZ3MgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQml0RmllbGQpLkZsYWdzO1xuICAgIGNvbnN0IHJlc3VsdDogU1tdID0gW107XG4gICAgXG4gICAgZm9yIChjb25zdCBbbmFtZSwgYml0XSBvZiBPYmplY3QuZW50cmllcyhmbGFncykpIHtcbiAgICAgIGlmICgodGhpcy5iaXRmaWVsZCBhcyBiaWdpbnQpICYgKGJpdCBhcyBiaWdpbnQpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5hbWUgYXMgUyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRvIEpTT05cbiAgICovXG4gIHRvSlNPTigpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5iaXRmaWVsZCA9PT0gJ2JpZ2ludCcgXG4gICAgICA/IHRoaXMuYml0ZmllbGQudG9TdHJpbmcoKSBcbiAgICAgIDogdGhpcy5iaXRmaWVsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAqL1xuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJpdGZpZWxkLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGl0ZXJhdG9yXG4gICAqL1xuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxTPiB7XG4gICAgeWllbGQqIHRoaXMudG9BcnJheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSB0aGlzIGJpdGZpZWxkXG4gICAqL1xuICBmcmVlemUoKTogUmVhZG9ubHk8dGhpcz4ge1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGVxdWFsaXR5XG4gICAqL1xuICBlcXVhbHMob3RoZXI6IEJpdEZpZWxkUmVzb2x2YWJsZTxTLCBOPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJpdGZpZWxkID09PSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQml0RmllbGQpLnJlc29sdmU8UywgTj4ob3RoZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb25lIHRoaXMgYml0ZmllbGRcbiAgICovXG4gIGNsb25lKCk6IEJpdEZpZWxkPFMsIE4+IHtcbiAgICByZXR1cm4gbmV3ICh0aGlzLmNvbnN0cnVjdG9yIGFzIG5ldyAoYml0czogTikgPT4gQml0RmllbGQ8UywgTj4pKHRoaXMuYml0ZmllbGQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBiaXQgdG8gdGhlIG51bWVyaWMgdHlwZVxuICAgKi9cbiAgc3RhdGljIHJlc29sdmU8UyBleHRlbmRzIHN0cmluZywgTiBleHRlbmRzIGJpZ2ludCB8IG51bWJlcj4oYml0OiBCaXRGaWVsZFJlc29sdmFibGU8UywgTj4pOiBOIHtcbiAgICBpZiAodHlwZW9mIGJpdCA9PT0gJ2JpZ2ludCcgfHwgdHlwZW9mIGJpdCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBiaXQgYXMgTjtcbiAgICB9XG5cbiAgICBpZiAoYml0IGluc3RhbmNlb2YgQml0RmllbGQpIHtcbiAgICAgIHJldHVybiBiaXQuYml0ZmllbGQgYXMgTjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJpdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5GbGFnc1tiaXRdO1xuICAgICAgaWYgKHJlc29sdmVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGJpdDogJHtiaXR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZWQgYXMgTjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShiaXQpKSB7XG4gICAgICBsZXQgcmVzdWx0ID0gdGhpcy5EZWZhdWx0Qml0IGFzIGJpZ2ludDtcbiAgICAgIGZvciAoY29uc3QgYiBvZiBiaXQpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmU8UywgTj4oYik7XG4gICAgICAgIHJlc3VsdCB8PSByZXNvbHZlZCBhcyBiaWdpbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0IGFzIE47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGJpdDogJHtiaXR9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQml0RmllbGQ7XG4iXX0=
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Map with additional utility methods
|
|
3
|
+
*/
|
|
4
|
+
export declare class Collection<K, V> extends Map<K, V> {
|
|
5
|
+
/**
|
|
6
|
+
* Identical to Map.get()
|
|
7
|
+
* Ensures the value exists
|
|
8
|
+
*/
|
|
9
|
+
ensure(key: K, defaultValueGenerator: (key: K, collection: this) => V): V;
|
|
10
|
+
/**
|
|
11
|
+
* Checks if all items pass a test
|
|
12
|
+
*/
|
|
13
|
+
every(fn: (value: V, key: K, collection: this) => boolean): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Checks if any item passes a test
|
|
16
|
+
*/
|
|
17
|
+
some(fn: (value: V, key: K, collection: this) => boolean): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Identical to Array.filter(), but returns a Collection
|
|
20
|
+
*/
|
|
21
|
+
filter(fn: (value: V, key: K, collection: this) => boolean): Collection<K, V>;
|
|
22
|
+
/**
|
|
23
|
+
* Partitions the collection into two collections
|
|
24
|
+
*/
|
|
25
|
+
partition(fn: (value: V, key: K, collection: this) => boolean): [Collection<K, V>, Collection<K, V>];
|
|
26
|
+
/**
|
|
27
|
+
* Maps each item to another value
|
|
28
|
+
*/
|
|
29
|
+
map<T>(fn: (value: V, key: K, collection: this) => T): T[];
|
|
30
|
+
/**
|
|
31
|
+
* Maps each item to another value into a Collection
|
|
32
|
+
*/
|
|
33
|
+
mapValues<T>(fn: (value: V, key: K, collection: this) => T): Collection<K, T>;
|
|
34
|
+
/**
|
|
35
|
+
* Searches for a single item
|
|
36
|
+
*/
|
|
37
|
+
find(fn: (value: V, key: K, collection: this) => boolean): V | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Searches for the key of a single item
|
|
40
|
+
*/
|
|
41
|
+
findKey(fn: (value: V, key: K, collection: this) => boolean): K | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Removes items that satisfy the provided filter function
|
|
44
|
+
*/
|
|
45
|
+
sweep(fn: (value: V, key: K, collection: this) => boolean): number;
|
|
46
|
+
/**
|
|
47
|
+
* Reduces the collection to a single value
|
|
48
|
+
*/
|
|
49
|
+
reduce<T>(fn: (accumulator: T, value: V, key: K, collection: this) => T, initialValue: T): T;
|
|
50
|
+
/**
|
|
51
|
+
* Identical to Array.forEach()
|
|
52
|
+
*/
|
|
53
|
+
each(fn: (value: V, key: K, collection: this) => void): this;
|
|
54
|
+
/**
|
|
55
|
+
* Returns the first item(s) in the collection
|
|
56
|
+
*/
|
|
57
|
+
first(): V | undefined;
|
|
58
|
+
first(amount: number): V[];
|
|
59
|
+
/**
|
|
60
|
+
* Returns the first key(s) in the collection
|
|
61
|
+
*/
|
|
62
|
+
firstKey(): K | undefined;
|
|
63
|
+
firstKey(amount: number): K[];
|
|
64
|
+
/**
|
|
65
|
+
* Returns the last item(s) in the collection
|
|
66
|
+
*/
|
|
67
|
+
last(): V | undefined;
|
|
68
|
+
last(amount: number): V[];
|
|
69
|
+
/**
|
|
70
|
+
* Returns the last key(s) in the collection
|
|
71
|
+
*/
|
|
72
|
+
lastKey(): K | undefined;
|
|
73
|
+
lastKey(amount: number): K[];
|
|
74
|
+
/**
|
|
75
|
+
* Returns a random item from the collection
|
|
76
|
+
*/
|
|
77
|
+
random(): V | undefined;
|
|
78
|
+
random(amount: number): V[];
|
|
79
|
+
/**
|
|
80
|
+
* Returns a random key from the collection
|
|
81
|
+
*/
|
|
82
|
+
randomKey(): K | undefined;
|
|
83
|
+
randomKey(amount: number): K[];
|
|
84
|
+
/**
|
|
85
|
+
* Combines this collection with others
|
|
86
|
+
*/
|
|
87
|
+
concat(...collections: Collection<K, V>[]): Collection<K, V>;
|
|
88
|
+
/**
|
|
89
|
+
* Checks if this collection shares identical items with another
|
|
90
|
+
*/
|
|
91
|
+
equals(collection: Collection<K, V>): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Creates an identical shallow copy of this collection
|
|
94
|
+
*/
|
|
95
|
+
clone(): Collection<K, V>;
|
|
96
|
+
/**
|
|
97
|
+
* Sorts the collection and returns it
|
|
98
|
+
*/
|
|
99
|
+
sort(compareFunction?: (firstValue: V, secondValue: V, firstKey: K, secondKey: K) => number): this;
|
|
100
|
+
/**
|
|
101
|
+
* Sorts the collection by keys and returns it
|
|
102
|
+
*/
|
|
103
|
+
sortByKey(compareFunction?: (firstKey: K, secondKey: K, firstValue: V, secondValue: V) => number): this;
|
|
104
|
+
/**
|
|
105
|
+
* Returns an array of items
|
|
106
|
+
*/
|
|
107
|
+
toJSON(): V[];
|
|
108
|
+
/**
|
|
109
|
+
* Default sort function
|
|
110
|
+
*/
|
|
111
|
+
private static defaultSort;
|
|
112
|
+
/**
|
|
113
|
+
* Creates a Collection from an array
|
|
114
|
+
*/
|
|
115
|
+
static from<K, V>(entries: Iterable<readonly [K, V]>): Collection<K, V>;
|
|
116
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Collection = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* A Map with additional utility methods
|
|
6
|
+
*/
|
|
7
|
+
class Collection extends Map {
|
|
8
|
+
/**
|
|
9
|
+
* Identical to Map.get()
|
|
10
|
+
* Ensures the value exists
|
|
11
|
+
*/
|
|
12
|
+
ensure(key, defaultValueGenerator) {
|
|
13
|
+
if (this.has(key))
|
|
14
|
+
return this.get(key);
|
|
15
|
+
const defaultValue = defaultValueGenerator(key, this);
|
|
16
|
+
this.set(key, defaultValue);
|
|
17
|
+
return defaultValue;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Checks if all items pass a test
|
|
21
|
+
*/
|
|
22
|
+
every(fn) {
|
|
23
|
+
for (const [key, val] of this) {
|
|
24
|
+
if (!fn(val, key, this))
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Checks if any item passes a test
|
|
31
|
+
*/
|
|
32
|
+
some(fn) {
|
|
33
|
+
for (const [key, val] of this) {
|
|
34
|
+
if (fn(val, key, this))
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Identical to Array.filter(), but returns a Collection
|
|
41
|
+
*/
|
|
42
|
+
filter(fn) {
|
|
43
|
+
const results = new Collection();
|
|
44
|
+
for (const [key, val] of this) {
|
|
45
|
+
if (fn(val, key, this))
|
|
46
|
+
results.set(key, val);
|
|
47
|
+
}
|
|
48
|
+
return results;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Partitions the collection into two collections
|
|
52
|
+
*/
|
|
53
|
+
partition(fn) {
|
|
54
|
+
const results = [new Collection(), new Collection()];
|
|
55
|
+
for (const [key, val] of this) {
|
|
56
|
+
if (fn(val, key, this)) {
|
|
57
|
+
results[0].set(key, val);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
results[1].set(key, val);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Maps each item to another value
|
|
67
|
+
*/
|
|
68
|
+
map(fn) {
|
|
69
|
+
const results = [];
|
|
70
|
+
for (const [key, val] of this) {
|
|
71
|
+
results.push(fn(val, key, this));
|
|
72
|
+
}
|
|
73
|
+
return results;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Maps each item to another value into a Collection
|
|
77
|
+
*/
|
|
78
|
+
mapValues(fn) {
|
|
79
|
+
const results = new Collection();
|
|
80
|
+
for (const [key, val] of this) {
|
|
81
|
+
results.set(key, fn(val, key, this));
|
|
82
|
+
}
|
|
83
|
+
return results;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Searches for a single item
|
|
87
|
+
*/
|
|
88
|
+
find(fn) {
|
|
89
|
+
for (const [key, val] of this) {
|
|
90
|
+
if (fn(val, key, this))
|
|
91
|
+
return val;
|
|
92
|
+
}
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Searches for the key of a single item
|
|
97
|
+
*/
|
|
98
|
+
findKey(fn) {
|
|
99
|
+
for (const [key, val] of this) {
|
|
100
|
+
if (fn(val, key, this))
|
|
101
|
+
return key;
|
|
102
|
+
}
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Removes items that satisfy the provided filter function
|
|
107
|
+
*/
|
|
108
|
+
sweep(fn) {
|
|
109
|
+
const previousSize = this.size;
|
|
110
|
+
for (const [key, val] of this) {
|
|
111
|
+
if (fn(val, key, this))
|
|
112
|
+
this.delete(key);
|
|
113
|
+
}
|
|
114
|
+
return previousSize - this.size;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Reduces the collection to a single value
|
|
118
|
+
*/
|
|
119
|
+
reduce(fn, initialValue) {
|
|
120
|
+
let accumulator = initialValue;
|
|
121
|
+
for (const [key, val] of this) {
|
|
122
|
+
accumulator = fn(accumulator, val, key, this);
|
|
123
|
+
}
|
|
124
|
+
return accumulator;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Identical to Array.forEach()
|
|
128
|
+
*/
|
|
129
|
+
each(fn) {
|
|
130
|
+
for (const [key, val] of this) {
|
|
131
|
+
fn(val, key, this);
|
|
132
|
+
}
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
first(amount) {
|
|
136
|
+
if (amount === undefined)
|
|
137
|
+
return this.values().next().value;
|
|
138
|
+
if (amount < 0)
|
|
139
|
+
return this.last(amount * -1);
|
|
140
|
+
amount = Math.min(this.size, amount);
|
|
141
|
+
const iter = this.values();
|
|
142
|
+
return Array.from({ length: amount }, () => iter.next().value);
|
|
143
|
+
}
|
|
144
|
+
firstKey(amount) {
|
|
145
|
+
if (amount === undefined)
|
|
146
|
+
return this.keys().next().value;
|
|
147
|
+
if (amount < 0)
|
|
148
|
+
return this.lastKey(amount * -1);
|
|
149
|
+
amount = Math.min(this.size, amount);
|
|
150
|
+
const iter = this.keys();
|
|
151
|
+
return Array.from({ length: amount }, () => iter.next().value);
|
|
152
|
+
}
|
|
153
|
+
last(amount) {
|
|
154
|
+
const arr = [...this.values()];
|
|
155
|
+
if (amount === undefined)
|
|
156
|
+
return arr[arr.length - 1];
|
|
157
|
+
if (amount < 0)
|
|
158
|
+
return this.first(amount * -1);
|
|
159
|
+
if (!amount)
|
|
160
|
+
return [];
|
|
161
|
+
return arr.slice(-amount);
|
|
162
|
+
}
|
|
163
|
+
lastKey(amount) {
|
|
164
|
+
const arr = [...this.keys()];
|
|
165
|
+
if (amount === undefined)
|
|
166
|
+
return arr[arr.length - 1];
|
|
167
|
+
if (amount < 0)
|
|
168
|
+
return this.firstKey(amount * -1);
|
|
169
|
+
if (!amount)
|
|
170
|
+
return [];
|
|
171
|
+
return arr.slice(-amount);
|
|
172
|
+
}
|
|
173
|
+
random(amount) {
|
|
174
|
+
const arr = [...this.values()];
|
|
175
|
+
if (amount === undefined)
|
|
176
|
+
return arr[Math.floor(Math.random() * arr.length)];
|
|
177
|
+
if (!arr.length || !amount)
|
|
178
|
+
return [];
|
|
179
|
+
return Array.from({ length: Math.min(amount, arr.length) }, () => arr.splice(Math.floor(Math.random() * arr.length), 1)[0]);
|
|
180
|
+
}
|
|
181
|
+
randomKey(amount) {
|
|
182
|
+
const arr = [...this.keys()];
|
|
183
|
+
if (amount === undefined)
|
|
184
|
+
return arr[Math.floor(Math.random() * arr.length)];
|
|
185
|
+
if (!arr.length || !amount)
|
|
186
|
+
return [];
|
|
187
|
+
return Array.from({ length: Math.min(amount, arr.length) }, () => arr.splice(Math.floor(Math.random() * arr.length), 1)[0]);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Combines this collection with others
|
|
191
|
+
*/
|
|
192
|
+
concat(...collections) {
|
|
193
|
+
const newColl = this.clone();
|
|
194
|
+
for (const coll of collections) {
|
|
195
|
+
for (const [key, val] of coll)
|
|
196
|
+
newColl.set(key, val);
|
|
197
|
+
}
|
|
198
|
+
return newColl;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Checks if this collection shares identical items with another
|
|
202
|
+
*/
|
|
203
|
+
equals(collection) {
|
|
204
|
+
if (this === collection)
|
|
205
|
+
return true;
|
|
206
|
+
if (this.size !== collection.size)
|
|
207
|
+
return false;
|
|
208
|
+
for (const [key, value] of this) {
|
|
209
|
+
if (!collection.has(key) || value !== collection.get(key)) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Creates an identical shallow copy of this collection
|
|
217
|
+
*/
|
|
218
|
+
clone() {
|
|
219
|
+
return new Collection(this);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Sorts the collection and returns it
|
|
223
|
+
*/
|
|
224
|
+
sort(compareFunction = Collection.defaultSort) {
|
|
225
|
+
const entries = [...this.entries()];
|
|
226
|
+
entries.sort((a, b) => compareFunction(a[1], b[1], a[0], b[0]));
|
|
227
|
+
this.clear();
|
|
228
|
+
for (const [k, v] of entries) {
|
|
229
|
+
this.set(k, v);
|
|
230
|
+
}
|
|
231
|
+
return this;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Sorts the collection by keys and returns it
|
|
235
|
+
*/
|
|
236
|
+
sortByKey(compareFunction = Collection.defaultSort) {
|
|
237
|
+
const entries = [...this.entries()];
|
|
238
|
+
entries.sort((a, b) => compareFunction(a[0], b[0], a[1], b[1]));
|
|
239
|
+
this.clear();
|
|
240
|
+
for (const [k, v] of entries) {
|
|
241
|
+
this.set(k, v);
|
|
242
|
+
}
|
|
243
|
+
return this;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Returns an array of items
|
|
247
|
+
*/
|
|
248
|
+
toJSON() {
|
|
249
|
+
return [...this.values()];
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Default sort function
|
|
253
|
+
*/
|
|
254
|
+
static defaultSort(firstValue, secondValue) {
|
|
255
|
+
return Number(firstValue > secondValue) || Number(firstValue === secondValue) - 1;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Creates a Collection from an array
|
|
259
|
+
*/
|
|
260
|
+
static from(entries) {
|
|
261
|
+
return new Collection(entries);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
exports.Collection = Collection;
|
|
265
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9Db2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsTUFBYSxVQUFpQixTQUFRLEdBQVM7SUFDN0M7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEdBQU0sRUFBRSxxQkFBc0Q7UUFDbkUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUUsQ0FBQztRQUN6QyxNQUFNLFlBQVksR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDNUIsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEVBQW1EO1FBQ3ZELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksQ0FBQyxFQUFtRDtRQUN0RCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDOUIsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEVBQW1EO1FBQ3hELE1BQU0sT0FBTyxH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QUFDO1FBQzdCLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksTUFBTSxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2QixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBT0QsTUFBTSxDQUFDLE1BQWU7UUFDcEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5SCxDQUFDO0lBT0QsU0FBUyxDQUFDLE1BQWU7UUFDdkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUksTUFBTSxLQUFL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Q0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsV0FBVyxDQUFJLFVBQWEsRUFBRSxXQUFjO1FBQ3pELE9BQU8sTUFBTSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFPLE9BQWtDO1FBQ2xELE9BQU8sSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBOVJELGdDQThSQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBNYXAgd2l0aCBhZGRpdGlvbmFsIHV0aWxpdHkgbWV0aG9kc1xuICovXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbjxLLCBWPiBleHRlbmRzIE1hcDxLLCBWPiB7XG4gIC8qKlxuICAgKiBJZGVudGljYWwgdG8gTWFwLmdldCgpXG4gICAqIEVuc3VyZXMgdGhlIHZhbHVlIGV4aXN0c1xuICAgKi9cbiAgZW5zdXJlKGtleTogSywgZGVmYXVsdFZhbHVlR2VuZXJhdG9yOiAoa2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBWKTogViB7XG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHJldHVybiB0aGlzLmdldChrZXkpITtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWVHZW5lcmF0b3Ioa2V5LCB0aGlzKTtcbiAgICB0aGlzLnNldChrZXksIGRlZmF1bHRWYWx1ZSk7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYWxsIGl0ZW1zIHBhc3MgYSB0ZXN0XG4gICAqL1xuICBldmVyeShmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xuICAgICAgaWYgKCFmbih2YWwsIGtleSwgdGhpcykpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFueSBpdGVtIHBhc3NlcyBhIHRlc3RcbiAgICovXG4gIHNvbWUoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcbiAgICAgIGlmIChmbih2YWwsIGtleSwgdGhpcykpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSWRlbnRpY2FsIHRvIEFycmF5LmZpbHRlcigpLCBidXQgcmV0dXJucyBhIENvbGxlY3Rpb25cbiAgICovXG4gIGZpbHRlcihmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4pOiBDb2xsZWN0aW9uPEssIFY+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IENvbGxlY3Rpb248SywgVj4oKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xuICAgICAgaWYgKGZuKHZhbCwga2V5LCB0aGlzKSkgcmVzdWx0cy5zZXQoa2V5LCB2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb25zIHRoZSBjb2xsZWN0aW9uIGludG8gdHdvIGNvbGxlY3Rpb25zXG4gICAqL1xuICBwYXJ0aXRpb24oZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuKTogW0NvbGxlY3Rpb248SywgVj4sIENvbGxlY3Rpb248SywgVj5dIHtcbiAgICBjb25zdCByZXN1bHRzOiBbQ29sbGVjdGlvbjxLLCBWPiwgQ29sbGVjdGlvbjxLLCBWPl0gPSBbbmV3IENvbGxlY3Rpb248SywgVj4oKSwgbmV3IENvbGxlY3Rpb248SywgVj4oKV07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcbiAgICAgIGlmIChmbih2YWwsIGtleSwgdGhpcykpIHtcbiAgICAgICAgcmVzdWx0c1swXS5zZXQoa2V5LCB2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0c1sxXS5zZXQoa2V5LCB2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGVhY2ggaXRlbSB0byBhbm90aGVyIHZhbHVlXG4gICAqL1xuICBtYXA8VD4oZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBUKTogVFtdIHtcbiAgICBjb25zdCByZXN1bHRzOiBUW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xuICAgICAgcmVzdWx0cy5wdXNoKGZuKHZhbCwga2V5LCB0aGlzKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgZWFjaCBpdGVtIHRvIGFub3RoZXIgdmFsdWUgaW50byBhIENvbGxlY3Rpb25cbiAgICovXG4gIG1hcFZhbHVlczxUPihmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IFQpOiBDb2xsZWN0aW9uPEssIFQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IENvbGxlY3Rpb248SywgVD4oKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xuICAgICAgcmVzdWx0cy5zZXQoa2V5LCBmbih2YWwsIGtleSwgdGhpcykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBmb3IgYSBzaW5nbGUgaXRlbVxuICAgKi9cbiAgZmluZChmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4pOiBWIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xuICAgICAgaWYgKGZuKHZhbCwga2V5LCB0aGlzKSkgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBmb3IgdGhlIGtleSBvZiBhIHNpbmdsZSBpdGVtXG4gICAqL1xuICBmaW5kS2V5KGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gYm9vbGVhbik6IEsgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XG4gICAgICBpZiAoZm4odmFsLCBrZXksIHRoaXMpKSByZXR1cm4ga2V5O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgaXRlbXMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBmaWx0ZXIgZnVuY3Rpb25cbiAgICovXG4gIHN3ZWVwKGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgY29uc3QgcHJldmlvdXNTaXplID0gdGhpcy5zaXplO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XG4gICAgICBpZiAoZm4odmFsLCBrZXksIHRoaXMpKSB0aGlzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcHJldmlvdXNTaXplIC0gdGhpcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHVjZXMgdGhlIGNvbGxlY3Rpb24gdG8gYSBzaW5nbGUgdmFsdWVcbiAgICovXG4gIHJlZHVjZTxUPihmbjogKGFjY3VtdWxhdG9yOiBULCB2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBULCBpbml0aWFsVmFsdWU6IFQpOiBUIHtcbiAgICBsZXQgYWNjdW11bGF0b3IgPSBpbml0aWFsVmFsdWU7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gZm4oYWNjdW11bGF0b3IsIHZhbCwga2V5LCB0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aWNhbCB0byBBcnJheS5mb3JFYWNoKClcbiAgICovXG4gIGVhY2goZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcbiAgICAgIGZuKHZhbCwga2V5LCB0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlyc3QgaXRlbShzKSBpbiB0aGUgY29sbGVjdGlvblxuICAgKi9cbiAgZmlyc3QoKTogViB8IHVuZGVmaW5lZDtcbiAgZmlyc3QoYW1vdW50OiBudW1iZXIpOiBWW107XG4gIGZpcnN0KGFtb3VudD86IG51bWJlcik6IFYgfCBWW10gfCB1bmRlZmluZWQge1xuICAgIGlmIChhbW91bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgIGlmIChhbW91bnQgPCAwKSByZXR1cm4gdGhpcy5sYXN0KGFtb3VudCAqIC0xKTtcbiAgICBhbW91bnQgPSBNYXRoLm1pbih0aGlzLnNpemUsIGFtb3VudCk7XG4gICAgY29uc3QgaXRlciA9IHRoaXMudmFsdWVzKCk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGFtb3VudCB9LCAoKSA9PiBpdGVyLm5leHQoKS52YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlyc3Qga2V5KHMpIGluIHRoZSBjb2xsZWN0aW9uXG4gICAqL1xuICBmaXJzdEtleSgpOiBLIHwgdW5kZWZpbmVkO1xuICBmaXJzdEtleShhbW91bnQ6IG51bWJlcik6IEtbXTtcbiAgZmlyc3RLZXkoYW1vdW50PzogbnVtYmVyKTogSyB8IEtbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGFtb3VudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgIGlmIChhbW91bnQgPCAwKSByZXR1cm4gdGhpcy5sYXN0S2V5KGFtb3VudCAqIC0xKTtcbiAgICBhbW91bnQgPSBNYXRoLm1pbih0aGlzLnNpemUsIGFtb3VudCk7XG4gICAgY29uc3QgaXRlciA9IHRoaXMua2V5cygpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBhbW91bnQgfSwgKCkgPT4gaXRlci5uZXh0KCkudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhc3QgaXRlbShzKSBpbiB0aGUgY29sbGVjdGlvblxuICAgKi9cbiAgbGFzdCgpOiBWIHwgdW5kZWZpbmVkO1xuICBsYXN0KGFtb3VudDogbnVtYmVyKTogVltdO1xuICBsYXN0KGFtb3VudD86IG51bWJlcik6IFYgfCBWW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGFyciA9IFsuLi50aGlzLnZhbHVlcygpXTtcbiAgICBpZiAoYW1vdW50ID09PSB1bmRlZmluZWQpIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xuICAgIGlmIChhbW91bnQgPCAwKSByZXR1cm4gdGhpcy5maXJzdChhbW91bnQgKiAtMSk7XG4gICAgaWYgKCFhbW91bnQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXJyLnNsaWNlKC1hbW91bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhc3Qga2V5KHMpIGluIHRoZSBjb2xsZWN0aW9uXG4gICAqL1xuICBsYXN0S2V5KCk6IEsgfCB1bmRlZmluZWQ7XG4gIGxhc3RLZXkoYW1vdW50OiBudW1iZXIpOiBLW107XG4gIGxhc3RLZXkoYW1vdW50PzogbnVtYmVyKTogSyB8IEtbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYXJyID0gWy4uLnRoaXMua2V5cygpXTtcbiAgICBpZiAoYW1vdW50ID09PSB1bmRlZmluZWQpIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xuICAgIGlmIChhbW91bnQgPCAwKSByZXR1cm4gdGhpcy5maXJzdEtleShhbW91bnQgKiAtMSk7XG4gICAgaWYgKCFhbW91bnQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXJyLnNsaWNlKC1hbW91bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSByYW5kb20gaXRlbSBmcm9tIHRoZSBjb2xsZWN0aW9uXG4gICAqL1xuICByYW5kb20oKTogViB8IHVuZGVmaW5lZDtcbiAgcmFuZG9tKGFtb3VudDogbnVtYmVyKTogVltdO1xuICByYW5kb20oYW1vdW50PzogbnVtYmVyKTogViB8IFZbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYXJyID0gWy4uLnRoaXMudmFsdWVzKCldO1xuICAgIGlmIChhbW91bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGFycltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhcnIubGVuZ3RoKV07XG4gICAgaWYgKCFhcnIubGVuZ3RoIHx8ICFhbW91bnQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogTWF0aC5taW4oYW1vdW50LCBhcnIubGVuZ3RoKSB9LCAoKSA9PiBhcnIuc3BsaWNlKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFyci5sZW5ndGgpLCAxKVswXSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHJhbmRvbSBrZXkgZnJvbSB0aGUgY29sbGVjdGlvblxuICAgKi9cbiAgcmFuZG9tS2V5KCk6IEsgfCB1bmRlZmluZWQ7XG4gIHJhbmRvbUtleShhbW91bnQ6IG51bWJlcik6IEtbXTtcbiAgcmFuZG9tS2V5KGFtb3VudD86IG51bWJlcik6IEsgfCBLW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGFyciA9IFsuLi50aGlzLmtleXMoKV07XG4gICAgaWYgKGFtb3VudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYXJyW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFyci5sZW5ndGgpXTtcbiAgICBpZiAoIWFyci5sZW5ndGggfHwgIWFtb3VudCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1pbihhbW91bnQsIGFyci5sZW5ndGgpIH0sICgpID0+IGFyci5zcGxpY2UoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCksIDEpWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21iaW5lcyB0aGlzIGNvbGxlY3Rpb24gd2l0aCBvdGhlcnNcbiAgICovXG4gIGNvbmNhdCguLi5jb2xsZWN0aW9uczogQ29sbGVjdGlvbjxLLCBWPltdKTogQ29sbGVjdGlvbjxLLCBWPiB7XG4gICAgY29uc3QgbmV3Q29sbCA9IHRoaXMuY2xvbmUoKTtcbiAgICBmb3IgKGNvbnN0IGNvbGwgb2YgY29sbGVjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBjb2xsKSBuZXdDb2xsLnNldChrZXksIHZhbCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdDb2xsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGlzIGNvbGxlY3Rpb24gc2hhcmVzIGlkZW50aWNhbCBpdGVtcyB3aXRoIGFub3RoZXJcbiAgICovXG4gIGVxdWFscyhjb2xsZWN0aW9uOiBDb2xsZWN0aW9uPEssIFY+KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMgPT09IGNvbGxlY3Rpb24pIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLnNpemUgIT09IGNvbGxlY3Rpb24uc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMpIHtcbiAgICAgIGlmICghY29sbGVjdGlvbi5oYXMoa2V5KSB8fCB2YWx1ZSAhPT0gY29sbGVjdGlvbi5nZXQoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaWRlbnRpY2FsIHNoYWxsb3cgY29weSBvZiB0aGlzIGNvbGxlY3Rpb25cbiAgICovXG4gIGNsb25lKCk6IENvbGxlY3Rpb248SywgVj4ge1xuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgY29sbGVjdGlvbiBhbmQgcmV0dXJucyBpdFxuICAgKi9cbiAgc29ydChjb21wYXJlRnVuY3Rpb246IChmaXJzdFZhbHVlOiBWLCBzZWNvbmRWYWx1ZTogViwgZmlyc3RLZXk6IEssIHNlY29uZEtleTogSykgPT4gbnVtYmVyID0gQ29sbGVjdGlvbi5kZWZhdWx0U29ydCk6IHRoaXMge1xuICAgIGNvbnN0IGVudHJpZXMgPSBbLi4udGhpcy5lbnRyaWVzKCldO1xuICAgIGVudHJpZXMuc29ydCgoYSwgYikgPT4gY29tcGFyZUZ1bmN0aW9uKGFbMV0sIGJbMV0sIGFbMF0sIGJbMF0pKTtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgZW50cmllcykge1xuICAgICAgdGhpcy5zZXQoaywgdik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSBjb2xsZWN0aW9uIGJ5IGtleXMgYW5kIHJldHVybnMgaXRcbiAgICovXG4gIHNvcnRCeUtleShjb21wYXJlRnVuY3Rpb246IChmaXJzdEtleTogSywgc2Vjb25kS2V5OiBLLCBmaXJzdFZhbHVlOiBWLCBzZWNvbmRWYWx1ZTogVikgPT4gbnVtYmVyID0gQ29sbGVjdGlvbi5kZWZhdWx0U29ydCk6IHRoaXMge1xuICAgIGNvbnN0IGVudHJpZXMgPSBbLi4udGhpcy5lbnRyaWVzKCldO1xuICAgIGVudHJpZXMuc29ydCgoYSwgYikgPT4gY29tcGFyZUZ1bmN0aW9uKGFbMF0sIGJbMF0sIGFbMV0sIGJbMV0pKTtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgZW50cmllcykge1xuICAgICAgdGhpcy5zZXQoaywgdik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgaXRlbXNcbiAgICovXG4gIHRvSlNPTigpOiBWW10ge1xuICAgIHJldHVybiBbLi4udGhpcy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBzb3J0IGZ1bmN0aW9uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0U29ydDxWPihmaXJzdFZhbHVlOiBWLCBzZWNvbmRWYWx1ZTogVik6IG51bWJlciB7XG4gICAgcmV0dXJuIE51bWJlcihmaXJzdFZhbHVlID4gc2Vjb25kVmFsdWUpIHx8IE51bWJlcihmaXJzdFZhbHVlID09PSBzZWNvbmRWYWx1ZSkgLSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDb2xsZWN0aW9uIGZyb20gYW4gYXJyYXlcbiAgICovXG4gIHN0YXRpYyBmcm9tPEssIFY+KGVudHJpZXM6IEl0ZXJhYmxlPHJlYWRvbmx5IFtLLCBWXT4pOiBDb2xsZWN0aW9uPEssIFY+IHtcbiAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24oZW50cmllcyk7XG4gIH1cbn1cbiJdfQ==
|