@sapphire/bitfield 1.2.3-next.d4ebe803.0 → 1.2.3-next.d8c5d05d
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/README.md +0 -1
- package/dist/cjs/index.cjs +14 -28
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.mjs +14 -28
- package/dist/esm/index.mjs.map +1 -1
- package/dist/iife/index.global.js +14 -28
- package/dist/iife/index.global.js.map +1 -1
- package/package.json +11 -10
package/README.md
CHANGED
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
**BitField utilities for JavaScript.**
|
|
8
8
|
|
|
9
9
|
[](https://github.com/sapphiredev/utilities/blob/main/LICENSE.md)
|
|
10
|
-
[](https://codecov.io/gh/sapphiredev/utilities)
|
|
11
10
|
[](https://bundlephobia.com/result?p=@sapphire/bitfield)
|
|
12
11
|
[](https://www.npmjs.com/package/@sapphire/bitfield)
|
|
13
12
|
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -3,14 +3,12 @@
|
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
5
5
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
|
-
var __publicField = (obj, key, value) =>
|
|
7
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
8
|
-
return value;
|
|
9
|
-
};
|
|
6
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
10
7
|
|
|
11
8
|
// src/lib/BitField.ts
|
|
12
9
|
var FlagEntriesSymbol = Symbol("@sapphire/bitfield.flags.entries");
|
|
13
10
|
var _a;
|
|
11
|
+
_a = FlagEntriesSymbol;
|
|
14
12
|
var _BitField = class _BitField {
|
|
15
13
|
constructor(flags) {
|
|
16
14
|
__publicField(this, "type");
|
|
@@ -36,12 +34,9 @@ var _BitField = class _BitField {
|
|
|
36
34
|
this.zero = 0;
|
|
37
35
|
let mask = 0;
|
|
38
36
|
for (const [key, value] of entries) {
|
|
39
|
-
if (typeof value !== "number")
|
|
40
|
-
|
|
41
|
-
if (value
|
|
42
|
-
throw new RangeError(`The property "${key}" does not resolve to a safe bitfield value`);
|
|
43
|
-
if (value <= 0)
|
|
44
|
-
throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
37
|
+
if (typeof value !== "number") throw new TypeError(`The property "${key}" does not resolve to a number`);
|
|
38
|
+
if (value !== (value | 0)) throw new RangeError(`The property "${key}" does not resolve to a safe bitfield value`);
|
|
39
|
+
if (value <= 0) throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
45
40
|
mask |= value;
|
|
46
41
|
}
|
|
47
42
|
this.mask = mask;
|
|
@@ -49,10 +44,8 @@ var _BitField = class _BitField {
|
|
|
49
44
|
this.zero = 0n;
|
|
50
45
|
let mask = 0n;
|
|
51
46
|
for (const [key, value] of entries) {
|
|
52
|
-
if (typeof value !== "bigint")
|
|
53
|
-
|
|
54
|
-
if (value <= 0n)
|
|
55
|
-
throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
47
|
+
if (typeof value !== "bigint") throw new TypeError(`The property "${key}" does not resolve to a bigint`);
|
|
48
|
+
if (value <= 0n) throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
56
49
|
mask |= value;
|
|
57
50
|
}
|
|
58
51
|
this.mask = mask;
|
|
@@ -70,14 +63,12 @@ var _BitField = class _BitField {
|
|
|
70
63
|
resolve(resolvable) {
|
|
71
64
|
switch (typeof resolvable) {
|
|
72
65
|
case "string":
|
|
73
|
-
if (resolvable in this.flags)
|
|
74
|
-
return this.flags[resolvable];
|
|
66
|
+
if (resolvable in this.flags) return this.flags[resolvable];
|
|
75
67
|
throw new RangeError("Received a name that could not be resolved to a property of flags");
|
|
76
68
|
case this.type:
|
|
77
69
|
return resolvable & this.mask;
|
|
78
70
|
case "object":
|
|
79
|
-
if (Array.isArray(resolvable))
|
|
80
|
-
return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);
|
|
71
|
+
if (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);
|
|
81
72
|
throw new TypeError("Received an object value that is not an Array");
|
|
82
73
|
default:
|
|
83
74
|
throw new TypeError(`Received a value that is not either type "string", type "${this.type}", or an Array`);
|
|
@@ -248,8 +239,7 @@ var _BitField = class _BitField {
|
|
|
248
239
|
*toKeys(field) {
|
|
249
240
|
const bits = this.resolve(field);
|
|
250
241
|
for (const [key, bit] of this[FlagEntriesSymbol]) {
|
|
251
|
-
if ((bits & bit) === bit)
|
|
252
|
-
yield key;
|
|
242
|
+
if ((bits & bit) === bit) yield key;
|
|
253
243
|
}
|
|
254
244
|
}
|
|
255
245
|
/**
|
|
@@ -272,8 +262,7 @@ var _BitField = class _BitField {
|
|
|
272
262
|
*toValues(field) {
|
|
273
263
|
const bits = this.resolve(field);
|
|
274
264
|
for (const [_, bit] of this[FlagEntriesSymbol]) {
|
|
275
|
-
if ((bits & bit) === bit)
|
|
276
|
-
yield bit;
|
|
265
|
+
if ((bits & bit) === bit) yield bit;
|
|
277
266
|
}
|
|
278
267
|
}
|
|
279
268
|
/**
|
|
@@ -296,8 +285,7 @@ var _BitField = class _BitField {
|
|
|
296
285
|
*toEntries(field) {
|
|
297
286
|
const bits = this.resolve(field);
|
|
298
287
|
for (const [key, bit] of this[FlagEntriesSymbol]) {
|
|
299
|
-
if ((bits & bit) === bit)
|
|
300
|
-
yield [key, bit];
|
|
288
|
+
if ((bits & bit) === bit) yield [key, bit];
|
|
301
289
|
}
|
|
302
290
|
}
|
|
303
291
|
/**
|
|
@@ -328,7 +316,6 @@ var _BitField = class _BitField {
|
|
|
328
316
|
return Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit]));
|
|
329
317
|
}
|
|
330
318
|
};
|
|
331
|
-
_a = FlagEntriesSymbol;
|
|
332
319
|
__name(_BitField, "BitField");
|
|
333
320
|
var BitField = _BitField;
|
|
334
321
|
|
|
@@ -336,8 +323,7 @@ var BitField = _BitField;
|
|
|
336
323
|
function enumToObject(enumObject) {
|
|
337
324
|
const result = {};
|
|
338
325
|
for (const [key, value] of Object.entries(enumObject)) {
|
|
339
|
-
if (Number.isNaN(Number(key)))
|
|
340
|
-
result[key] = value;
|
|
326
|
+
if (Number.isNaN(Number(key))) result[key] = value;
|
|
341
327
|
}
|
|
342
328
|
return result;
|
|
343
329
|
}
|
|
@@ -345,5 +331,5 @@ __name(enumToObject, "enumToObject");
|
|
|
345
331
|
|
|
346
332
|
exports.BitField = BitField;
|
|
347
333
|
exports.enumToObject = enumToObject;
|
|
348
|
-
//# sourceMappingURL=
|
|
334
|
+
//# sourceMappingURL=index.cjs.map
|
|
349
335
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/BitField.ts","../../src/lib/utilities.ts"],"names":[],"mappings":"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","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/BitField.ts","../../src/lib/utilities.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
4
|
-
var __publicField = (obj, key, value) =>
|
|
5
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
|
-
return value;
|
|
7
|
-
};
|
|
4
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
8
5
|
|
|
9
6
|
// src/lib/BitField.ts
|
|
10
7
|
var FlagEntriesSymbol = Symbol("@sapphire/bitfield.flags.entries");
|
|
11
8
|
var _a;
|
|
9
|
+
_a = FlagEntriesSymbol;
|
|
12
10
|
var _BitField = class _BitField {
|
|
13
11
|
constructor(flags) {
|
|
14
12
|
__publicField(this, "type");
|
|
@@ -34,12 +32,9 @@ var _BitField = class _BitField {
|
|
|
34
32
|
this.zero = 0;
|
|
35
33
|
let mask = 0;
|
|
36
34
|
for (const [key, value] of entries) {
|
|
37
|
-
if (typeof value !== "number")
|
|
38
|
-
|
|
39
|
-
if (value
|
|
40
|
-
throw new RangeError(`The property "${key}" does not resolve to a safe bitfield value`);
|
|
41
|
-
if (value <= 0)
|
|
42
|
-
throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
35
|
+
if (typeof value !== "number") throw new TypeError(`The property "${key}" does not resolve to a number`);
|
|
36
|
+
if (value !== (value | 0)) throw new RangeError(`The property "${key}" does not resolve to a safe bitfield value`);
|
|
37
|
+
if (value <= 0) throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
43
38
|
mask |= value;
|
|
44
39
|
}
|
|
45
40
|
this.mask = mask;
|
|
@@ -47,10 +42,8 @@ var _BitField = class _BitField {
|
|
|
47
42
|
this.zero = 0n;
|
|
48
43
|
let mask = 0n;
|
|
49
44
|
for (const [key, value] of entries) {
|
|
50
|
-
if (typeof value !== "bigint")
|
|
51
|
-
|
|
52
|
-
if (value <= 0n)
|
|
53
|
-
throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
45
|
+
if (typeof value !== "bigint") throw new TypeError(`The property "${key}" does not resolve to a bigint`);
|
|
46
|
+
if (value <= 0n) throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
54
47
|
mask |= value;
|
|
55
48
|
}
|
|
56
49
|
this.mask = mask;
|
|
@@ -68,14 +61,12 @@ var _BitField = class _BitField {
|
|
|
68
61
|
resolve(resolvable) {
|
|
69
62
|
switch (typeof resolvable) {
|
|
70
63
|
case "string":
|
|
71
|
-
if (resolvable in this.flags)
|
|
72
|
-
return this.flags[resolvable];
|
|
64
|
+
if (resolvable in this.flags) return this.flags[resolvable];
|
|
73
65
|
throw new RangeError("Received a name that could not be resolved to a property of flags");
|
|
74
66
|
case this.type:
|
|
75
67
|
return resolvable & this.mask;
|
|
76
68
|
case "object":
|
|
77
|
-
if (Array.isArray(resolvable))
|
|
78
|
-
return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);
|
|
69
|
+
if (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);
|
|
79
70
|
throw new TypeError("Received an object value that is not an Array");
|
|
80
71
|
default:
|
|
81
72
|
throw new TypeError(`Received a value that is not either type "string", type "${this.type}", or an Array`);
|
|
@@ -246,8 +237,7 @@ var _BitField = class _BitField {
|
|
|
246
237
|
*toKeys(field) {
|
|
247
238
|
const bits = this.resolve(field);
|
|
248
239
|
for (const [key, bit] of this[FlagEntriesSymbol]) {
|
|
249
|
-
if ((bits & bit) === bit)
|
|
250
|
-
yield key;
|
|
240
|
+
if ((bits & bit) === bit) yield key;
|
|
251
241
|
}
|
|
252
242
|
}
|
|
253
243
|
/**
|
|
@@ -270,8 +260,7 @@ var _BitField = class _BitField {
|
|
|
270
260
|
*toValues(field) {
|
|
271
261
|
const bits = this.resolve(field);
|
|
272
262
|
for (const [_, bit] of this[FlagEntriesSymbol]) {
|
|
273
|
-
if ((bits & bit) === bit)
|
|
274
|
-
yield bit;
|
|
263
|
+
if ((bits & bit) === bit) yield bit;
|
|
275
264
|
}
|
|
276
265
|
}
|
|
277
266
|
/**
|
|
@@ -294,8 +283,7 @@ var _BitField = class _BitField {
|
|
|
294
283
|
*toEntries(field) {
|
|
295
284
|
const bits = this.resolve(field);
|
|
296
285
|
for (const [key, bit] of this[FlagEntriesSymbol]) {
|
|
297
|
-
if ((bits & bit) === bit)
|
|
298
|
-
yield [key, bit];
|
|
286
|
+
if ((bits & bit) === bit) yield [key, bit];
|
|
299
287
|
}
|
|
300
288
|
}
|
|
301
289
|
/**
|
|
@@ -326,7 +314,6 @@ var _BitField = class _BitField {
|
|
|
326
314
|
return Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit]));
|
|
327
315
|
}
|
|
328
316
|
};
|
|
329
|
-
_a = FlagEntriesSymbol;
|
|
330
317
|
__name(_BitField, "BitField");
|
|
331
318
|
var BitField = _BitField;
|
|
332
319
|
|
|
@@ -334,13 +321,12 @@ var BitField = _BitField;
|
|
|
334
321
|
function enumToObject(enumObject) {
|
|
335
322
|
const result = {};
|
|
336
323
|
for (const [key, value] of Object.entries(enumObject)) {
|
|
337
|
-
if (Number.isNaN(Number(key)))
|
|
338
|
-
result[key] = value;
|
|
324
|
+
if (Number.isNaN(Number(key))) result[key] = value;
|
|
339
325
|
}
|
|
340
326
|
return result;
|
|
341
327
|
}
|
|
342
328
|
__name(enumToObject, "enumToObject");
|
|
343
329
|
|
|
344
330
|
export { BitField, enumToObject };
|
|
345
|
-
//# sourceMappingURL=
|
|
331
|
+
//# sourceMappingURL=index.mjs.map
|
|
346
332
|
//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/BitField.ts","../../src/lib/utilities.ts"],"names":[],"mappings":"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","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/BitField.ts","../../src/lib/utilities.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
|
|
@@ -4,14 +4,12 @@ var SapphireBitField = (function (exports) {
|
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
5
5
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
6
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
-
var __publicField = (obj, key, value) =>
|
|
8
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
9
|
-
return value;
|
|
10
|
-
};
|
|
7
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
11
8
|
|
|
12
9
|
// src/lib/BitField.ts
|
|
13
10
|
var FlagEntriesSymbol = Symbol("@sapphire/bitfield.flags.entries");
|
|
14
11
|
var _a;
|
|
12
|
+
_a = FlagEntriesSymbol;
|
|
15
13
|
var _BitField = class _BitField {
|
|
16
14
|
constructor(flags) {
|
|
17
15
|
__publicField(this, "type");
|
|
@@ -37,12 +35,9 @@ var SapphireBitField = (function (exports) {
|
|
|
37
35
|
this.zero = 0;
|
|
38
36
|
let mask = 0;
|
|
39
37
|
for (const [key, value] of entries) {
|
|
40
|
-
if (typeof value !== "number")
|
|
41
|
-
|
|
42
|
-
if (value
|
|
43
|
-
throw new RangeError(`The property "${key}" does not resolve to a safe bitfield value`);
|
|
44
|
-
if (value <= 0)
|
|
45
|
-
throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
38
|
+
if (typeof value !== "number") throw new TypeError(`The property "${key}" does not resolve to a number`);
|
|
39
|
+
if (value !== (value | 0)) throw new RangeError(`The property "${key}" does not resolve to a safe bitfield value`);
|
|
40
|
+
if (value <= 0) throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
46
41
|
mask |= value;
|
|
47
42
|
}
|
|
48
43
|
this.mask = mask;
|
|
@@ -50,10 +45,8 @@ var SapphireBitField = (function (exports) {
|
|
|
50
45
|
this.zero = 0n;
|
|
51
46
|
let mask = 0n;
|
|
52
47
|
for (const [key, value] of entries) {
|
|
53
|
-
if (typeof value !== "bigint")
|
|
54
|
-
|
|
55
|
-
if (value <= 0n)
|
|
56
|
-
throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
48
|
+
if (typeof value !== "bigint") throw new TypeError(`The property "${key}" does not resolve to a bigint`);
|
|
49
|
+
if (value <= 0n) throw new RangeError(`The property "${key}" resolves to a non-positive value`);
|
|
57
50
|
mask |= value;
|
|
58
51
|
}
|
|
59
52
|
this.mask = mask;
|
|
@@ -71,14 +64,12 @@ var SapphireBitField = (function (exports) {
|
|
|
71
64
|
resolve(resolvable) {
|
|
72
65
|
switch (typeof resolvable) {
|
|
73
66
|
case "string":
|
|
74
|
-
if (resolvable in this.flags)
|
|
75
|
-
return this.flags[resolvable];
|
|
67
|
+
if (resolvable in this.flags) return this.flags[resolvable];
|
|
76
68
|
throw new RangeError("Received a name that could not be resolved to a property of flags");
|
|
77
69
|
case this.type:
|
|
78
70
|
return resolvable & this.mask;
|
|
79
71
|
case "object":
|
|
80
|
-
if (Array.isArray(resolvable))
|
|
81
|
-
return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);
|
|
72
|
+
if (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);
|
|
82
73
|
throw new TypeError("Received an object value that is not an Array");
|
|
83
74
|
default:
|
|
84
75
|
throw new TypeError(`Received a value that is not either type "string", type "${this.type}", or an Array`);
|
|
@@ -249,8 +240,7 @@ var SapphireBitField = (function (exports) {
|
|
|
249
240
|
*toKeys(field) {
|
|
250
241
|
const bits = this.resolve(field);
|
|
251
242
|
for (const [key, bit] of this[FlagEntriesSymbol]) {
|
|
252
|
-
if ((bits & bit) === bit)
|
|
253
|
-
yield key;
|
|
243
|
+
if ((bits & bit) === bit) yield key;
|
|
254
244
|
}
|
|
255
245
|
}
|
|
256
246
|
/**
|
|
@@ -273,8 +263,7 @@ var SapphireBitField = (function (exports) {
|
|
|
273
263
|
*toValues(field) {
|
|
274
264
|
const bits = this.resolve(field);
|
|
275
265
|
for (const [_, bit] of this[FlagEntriesSymbol]) {
|
|
276
|
-
if ((bits & bit) === bit)
|
|
277
|
-
yield bit;
|
|
266
|
+
if ((bits & bit) === bit) yield bit;
|
|
278
267
|
}
|
|
279
268
|
}
|
|
280
269
|
/**
|
|
@@ -297,8 +286,7 @@ var SapphireBitField = (function (exports) {
|
|
|
297
286
|
*toEntries(field) {
|
|
298
287
|
const bits = this.resolve(field);
|
|
299
288
|
for (const [key, bit] of this[FlagEntriesSymbol]) {
|
|
300
|
-
if ((bits & bit) === bit)
|
|
301
|
-
yield [key, bit];
|
|
289
|
+
if ((bits & bit) === bit) yield [key, bit];
|
|
302
290
|
}
|
|
303
291
|
}
|
|
304
292
|
/**
|
|
@@ -329,7 +317,6 @@ var SapphireBitField = (function (exports) {
|
|
|
329
317
|
return Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit]));
|
|
330
318
|
}
|
|
331
319
|
};
|
|
332
|
-
_a = FlagEntriesSymbol;
|
|
333
320
|
__name(_BitField, "BitField");
|
|
334
321
|
var BitField = _BitField;
|
|
335
322
|
|
|
@@ -337,8 +324,7 @@ var SapphireBitField = (function (exports) {
|
|
|
337
324
|
function enumToObject(enumObject) {
|
|
338
325
|
const result = {};
|
|
339
326
|
for (const [key, value] of Object.entries(enumObject)) {
|
|
340
|
-
if (Number.isNaN(Number(key)))
|
|
341
|
-
result[key] = value;
|
|
327
|
+
if (Number.isNaN(Number(key))) result[key] = value;
|
|
342
328
|
}
|
|
343
329
|
return result;
|
|
344
330
|
}
|
|
@@ -350,5 +336,5 @@ var SapphireBitField = (function (exports) {
|
|
|
350
336
|
return exports;
|
|
351
337
|
|
|
352
338
|
})({});
|
|
353
|
-
//# sourceMappingURL=
|
|
339
|
+
//# sourceMappingURL=index.global.js.map
|
|
354
340
|
//# sourceMappingURL=index.global.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/BitField.ts","../../src/lib/utilities.ts"],"names":[],"mappings":"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","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/BitField.ts","../../src/lib/utilities.ts"],"names":[],"mappings":"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","file":"index.global.js","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sapphire/bitfield",
|
|
3
|
-
"version": "1.2.3-next.
|
|
3
|
+
"version": "1.2.3-next.d8c5d05d",
|
|
4
4
|
"description": "A bitfield utility library for JavaScript.",
|
|
5
5
|
"author": "@sapphire",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,12 +25,13 @@
|
|
|
25
25
|
"scripts": {
|
|
26
26
|
"test": "vitest run",
|
|
27
27
|
"lint": "eslint src tests --ext ts --fix -c ../../.eslintrc",
|
|
28
|
-
"build": "tsup && yarn build:rename-cjs-index",
|
|
29
|
-
"build:rename-cjs-index": "tsx
|
|
28
|
+
"build": "yarn gen-index && tsup && yarn build:rename-cjs-index",
|
|
29
|
+
"build:rename-cjs-index": "tsx ../../scripts/rename-cjs-index.cts",
|
|
30
30
|
"docs": "typedoc-json-parser",
|
|
31
31
|
"prepack": "yarn build",
|
|
32
32
|
"bump": "cliff-jumper",
|
|
33
|
-
"check-update": "cliff-jumper --dry-run"
|
|
33
|
+
"check-update": "cliff-jumper --dry-run",
|
|
34
|
+
"gen-index": "tsx ../../scripts/gen-index.cts bitfield --write"
|
|
34
35
|
},
|
|
35
36
|
"repository": {
|
|
36
37
|
"type": "git",
|
|
@@ -62,13 +63,13 @@
|
|
|
62
63
|
"access": "public"
|
|
63
64
|
},
|
|
64
65
|
"devDependencies": {
|
|
65
|
-
"@favware/cliff-jumper": "^
|
|
66
|
-
"@vitest/coverage-v8": "^1.
|
|
67
|
-
"tsup": "^8.0
|
|
68
|
-
"tsx": "^4.
|
|
66
|
+
"@favware/cliff-jumper": "^5.0.0",
|
|
67
|
+
"@vitest/coverage-v8": "^2.1.3",
|
|
68
|
+
"tsup": "^8.3.0",
|
|
69
|
+
"tsx": "^4.19.1",
|
|
69
70
|
"typedoc": "^0.25.13",
|
|
70
71
|
"typedoc-json-parser": "^10.0.0",
|
|
71
|
-
"typescript": "
|
|
72
|
-
"vitest": "^1.
|
|
72
|
+
"typescript": "~5.4.5",
|
|
73
|
+
"vitest": "^2.1.3"
|
|
73
74
|
}
|
|
74
75
|
}
|