@@ -6,34 +6,36 @@ export type BitFieldResolvable =
66 | string
77 | string [ ]
88 | BitField [ ]
9+ | bigint
10+ | Array < bigint >
911
1012/** Bit Field utility to work with Bits and Flags */
1113export class BitField {
12- flags : { [ name : string ] : number } = { }
13- bitfield : number
14+ # flags: { [ name : string ] : number | bigint } = { }
15+ bitfield : bigint
1416
15- constructor ( flags : { [ name : string ] : number } , bits : any ) {
16- this . flags = flags
17- this . bitfield = BitField . resolve ( this . flags , bits )
17+ constructor ( flags : { [ name : string ] : number | bigint } , bits : any ) {
18+ this . # flags = flags
19+ this . bitfield = BitField . resolve ( this . # flags, bits )
1820 }
1921
2022 any ( bit : BitFieldResolvable ) : boolean {
21- return ( this . bitfield & BitField . resolve ( this . flags , bit ) ) !== 0
23+ return ( this . bitfield & BitField . resolve ( this . # flags, bit ) ) !== 0n
2224 }
2325
2426 equals ( bit : BitFieldResolvable ) : boolean {
25- return this . bitfield === BitField . resolve ( this . flags , bit )
27+ return this . bitfield === BitField . resolve ( this . # flags, bit )
2628 }
2729
2830 has ( bit : BitFieldResolvable , ...args : any [ ] ) : boolean {
2931 if ( Array . isArray ( bit ) ) return ( bit . every as any ) ( ( p : any ) => this . has ( p ) )
30- bit = BitField . resolve ( this . flags , bit )
32+ bit = BitField . resolve ( this . # flags, bit )
3133 return ( this . bitfield & bit ) === bit
3234 }
3335
3436 missing ( bits : any , ...hasParams : any [ ] ) : string [ ] {
3537 if ( ! Array . isArray ( bits ) )
36- bits = new BitField ( this . flags , bits ) . toArray ( false )
38+ bits = new BitField ( this . # flags, bits ) . toArray ( false )
3739 return bits . filter ( ( p : any ) => ! this . has ( p , ...hasParams ) )
3840 }
3941
@@ -42,58 +44,63 @@ export class BitField {
4244 }
4345
4446 add ( ...bits : BitFieldResolvable [ ] ) : BitField {
45- let total = 0
47+ let total = 0n
4648 for ( const bit of bits ) {
47- total |= BitField . resolve ( this . flags , bit )
49+ total |= BitField . resolve ( this . # flags, bit )
4850 }
4951 if ( Object . isFrozen ( this ) )
50- return new BitField ( this . flags , this . bitfield | total )
52+ return new BitField ( this . # flags, this . bitfield | total )
5153 this . bitfield |= total
5254 return this
5355 }
5456
5557 remove ( ...bits : BitFieldResolvable [ ] ) : BitField {
56- let total = 0
58+ let total = 0n
5759 for ( const bit of bits ) {
58- total |= BitField . resolve ( this . flags , bit )
60+ total |= BitField . resolve ( this . # flags, bit )
5961 }
6062 if ( Object . isFrozen ( this ) )
61- return new BitField ( this . flags , this . bitfield & ~ total )
63+ return new BitField ( this . # flags, this . bitfield & ~ total )
6264 this . bitfield &= ~ total
6365 return this
6466 }
6567
66- serialize ( ...hasParams : any [ ] ) : { [ key : string ] : any } {
67- const serialized : { [ key : string ] : any } = { }
68- for ( const [ flag , bit ] of Object . entries ( this . flags ) )
68+ flags ( ) : { [ name : string ] : bigint | number } {
69+ return this . #flags
70+ }
71+
72+ serialize ( ...hasParams : any [ ] ) : { [ key : string ] : boolean } {
73+ const serialized : { [ key : string ] : boolean } = { }
74+ for ( const [ flag , bit ] of Object . entries ( this . #flags) )
6975 serialized [ flag ] = this . has (
70- BitField . resolve ( this . flags , bit ) ,
76+ BitField . resolve ( this . # flags, bit ) ,
7177 ...hasParams
7278 )
7379 return serialized
7480 }
7581
7682 toArray ( ...hasParams : any [ ] ) : string [ ] {
77- return Object . keys ( this . flags ) . filter ( ( bit ) =>
78- this . has ( BitField . resolve ( this . flags , bit ) , ...hasParams )
83+ return Object . keys ( this . # flags) . filter ( ( bit ) =>
84+ this . has ( BitField . resolve ( this . # flags, bit ) , ...hasParams )
7985 )
8086 }
8187
82- toJSON ( ) : number {
83- return this . bitfield
88+ toJSON ( ) : string {
89+ return this . bitfield . toString ( )
8490 }
8591
86- valueOf ( ) : number {
92+ valueOf ( ) : bigint {
8793 return this . bitfield
8894 }
8995
9096 * [ Symbol . iterator ] ( ) : Iterator < string > {
9197 yield * this . toArray ( )
9298 }
9399
94- static resolve ( flags : any , bit : BitFieldResolvable = 0 ) : number {
95- if ( typeof bit === 'string' && ! isNaN ( parseInt ( bit ) ) ) return parseInt ( bit )
96- if ( typeof bit === 'number' && bit >= 0 ) return bit
100+ static resolve ( flags : any , bit : BitFieldResolvable = 0n ) : bigint {
101+ if ( typeof bit === 'bigint' ) return bit
102+ if ( typeof bit === 'string' && ! isNaN ( parseInt ( bit ) ) ) return BigInt ( bit )
103+ if ( typeof bit === 'number' && bit >= 0 ) return BigInt ( bit )
97104 if ( bit instanceof BitField ) return this . resolve ( flags , bit . bitfield )
98105 if ( Array . isArray ( bit ) )
99106 return ( bit . map as any ) ( ( p : any ) => this . resolve ( flags , p ) ) . reduce (
0 commit comments