installed eslint
This commit is contained in:
14
node/eslint.config.js
Normal file
14
node/eslint.config.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import js from '@eslint/js'
|
||||||
|
import globals from 'globals'
|
||||||
|
import tseslint from 'typescript-eslint'
|
||||||
|
import { defineConfig } from 'eslint/config'
|
||||||
|
|
||||||
|
export default defineConfig([
|
||||||
|
{
|
||||||
|
files: ['**/*.ts'],
|
||||||
|
plugins: { js },
|
||||||
|
extends: ['js/recommended'],
|
||||||
|
languageOptions: { globals: { ...globals.browser, ...globals.node } },
|
||||||
|
},
|
||||||
|
tseslint.configs.recommended,
|
||||||
|
])
|
||||||
6520
node/package-lock.json
generated
6520
node/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,7 @@
|
|||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"description": "flag/bitflag helper",
|
"description": "flag/bitflag helper",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
"type": "module",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/louisdevie/multiflag.git"
|
"url": "git+https://github.com/louisdevie/multiflag.git"
|
||||||
@@ -21,9 +22,10 @@
|
|||||||
"build": "tsup",
|
"build": "tsup",
|
||||||
"postbuild": "cp package.json README.md ../LICENSE dist",
|
"postbuild": "cp package.json README.md ../LICENSE dist",
|
||||||
"test": "vitest --ui",
|
"test": "vitest --ui",
|
||||||
|
"lint": "eslint",
|
||||||
"coverage": "vitest run --coverage",
|
"coverage": "vitest run --coverage",
|
||||||
"type-check": "tsc --noEmit",
|
"type-check": "tsc --noEmit",
|
||||||
"format": "prettier --write src/ tests/"
|
"format": "prettier --write src/ tests/ *.js *.ts"
|
||||||
},
|
},
|
||||||
"tsup": {
|
"tsup": {
|
||||||
"entry": [
|
"entry": [
|
||||||
@@ -36,12 +38,17 @@
|
|||||||
"clean": true
|
"clean": true
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@eslint/js": "^10.0.1",
|
||||||
"@vitest/coverage-v8": "^4.0.18",
|
"@vitest/coverage-v8": "^4.0.18",
|
||||||
"@vitest/ui": "^4.0.18",
|
"@vitest/ui": "^4.0.18",
|
||||||
|
"eslint": "^10.0.2",
|
||||||
|
"eslint-plugin-simple-import-sort": "^12.1.1",
|
||||||
|
"globals": "^17.4.0",
|
||||||
"prettier": "^3.8.1",
|
"prettier": "^3.8.1",
|
||||||
"ts-node": "^10.9.2",
|
"ts-node": "^10.9.2",
|
||||||
"tsup": "^8.5.1",
|
"tsup": "^8.5.1",
|
||||||
"typescript": "^5.9.3",
|
"typescript": "^5.9.3",
|
||||||
|
"typescript-eslint": "^8.56.1",
|
||||||
"vitest": "^4.0.18"
|
"vitest": "^4.0.18"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,4 +135,4 @@ export { ArrayFlagSet } from './array'
|
|||||||
export { Base64BitFlagSet } from './base64'
|
export { Base64BitFlagSet } from './base64'
|
||||||
export { BigBitFlagSet } from './bigint'
|
export { BigBitFlagSet } from './bigint'
|
||||||
export { CollectionFlagSet } from './collection'
|
export { CollectionFlagSet } from './collection'
|
||||||
export { BitFlagSet } from './number'
|
export { BitFlagSet, BitFlags } from './number'
|
||||||
|
|||||||
@@ -2,6 +2,47 @@ import type { FlagSet } from '.'
|
|||||||
import { BitFlagsIterator, EnumerateFlags, useIterator } from '~/enumeration'
|
import { BitFlagsIterator, EnumerateFlags, useIterator } from '~/enumeration'
|
||||||
import { FlagDefinition, FlagsDictionary } from '~/definitions'
|
import { FlagDefinition, FlagsDictionary } from '~/definitions'
|
||||||
|
|
||||||
|
export const BitFlags = {
|
||||||
|
/**
|
||||||
|
* Computes the union of two sets of bitflags.
|
||||||
|
* Any bits that are set in either of the inputs will be set in the result.
|
||||||
|
*/
|
||||||
|
union(first: number, second: number): number {
|
||||||
|
return first | second
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes the intersection of two sets of bitflags.
|
||||||
|
* Only bits that are set in both of the inputs will be set in the result.
|
||||||
|
*/
|
||||||
|
intersection(first: number, second: number): number {
|
||||||
|
return first & second
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes the difference between two sets of bitflags.
|
||||||
|
* Only bits that are set in the first input and not set in the second will be set in the result.
|
||||||
|
*/
|
||||||
|
difference(first: number, second: number): number {
|
||||||
|
return first & ~second
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests if a set of bitflags is a superset of the other.
|
||||||
|
* Return `true` if every bit that is set in the second input is also set in the first.
|
||||||
|
*/
|
||||||
|
isSuperset(first: number, second: number): boolean {
|
||||||
|
return (first & second) === second
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an iterable over the individual bits that are set.
|
||||||
|
*/
|
||||||
|
enumerate(flags: number): EnumerateFlags<number> {
|
||||||
|
return useIterator(flags, BitFlagsIterator)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
export class BitFlagSet implements FlagSet<number, number> {
|
export class BitFlagSet implements FlagSet<number, number> {
|
||||||
private readonly _dictionary: FlagsDictionary<number, number>
|
private readonly _dictionary: FlagsDictionary<number, number>
|
||||||
|
|
||||||
@@ -22,19 +63,19 @@ export class BitFlagSet implements FlagSet<number, number> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public union(first: number, second: number): number {
|
public union(first: number, second: number): number {
|
||||||
return first | second
|
return BitFlags.union(first, second)
|
||||||
}
|
}
|
||||||
|
|
||||||
public intersection(first: number, second: number): number {
|
public intersection(first: number, second: number): number {
|
||||||
return first & second
|
return BitFlags.intersection(first, second)
|
||||||
}
|
}
|
||||||
|
|
||||||
public difference(first: number, second: number): number {
|
public difference(first: number, second: number): number {
|
||||||
return first & ~second
|
return BitFlags.difference(first, second)
|
||||||
}
|
}
|
||||||
|
|
||||||
public isSuperset(first: number, second: number): boolean {
|
public isSuperset(first: number, second: number): boolean {
|
||||||
return (first & second) === second
|
return BitFlags.isSuperset(first, second)
|
||||||
}
|
}
|
||||||
|
|
||||||
public hasAny(flags: number, required: number): boolean {
|
public hasAny(flags: number, required: number): boolean {
|
||||||
@@ -46,7 +87,7 @@ export class BitFlagSet implements FlagSet<number, number> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public enumerate(flags: number): EnumerateFlags<number> {
|
public enumerate(flags: number): EnumerateFlags<number> {
|
||||||
return useIterator(flags, BitFlagsIterator)
|
return BitFlags.enumerate(flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
public maximum(flags: number): number {
|
public maximum(flags: number): number {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ export {
|
|||||||
Base64BitFlagSet,
|
Base64BitFlagSet,
|
||||||
BigBitFlagSet,
|
BigBitFlagSet,
|
||||||
BitFlagSet,
|
BitFlagSet,
|
||||||
|
BitFlags,
|
||||||
CollectionFlagSet,
|
CollectionFlagSet,
|
||||||
FlagSet,
|
FlagSet,
|
||||||
} from './flagsets'
|
} from './flagsets'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { BitFlagSet, createBitFlagSet } from '~'
|
import { BitFlags, BitFlagSet, createBitFlagSet } from '~'
|
||||||
import { describe, expect, test } from 'vitest'
|
import { describe, expect, test } from 'vitest'
|
||||||
|
|
||||||
describe(BitFlagSet, () => {
|
describe(BitFlagSet, () => {
|
||||||
@@ -34,45 +34,37 @@ describe(BitFlagSet, () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
test('union', () => {
|
test('union', () => {
|
||||||
const flags = createBitFlagSet([])
|
expect(BitFlags.union(0, 0)).toEqual(0)
|
||||||
|
expect(BitFlags.union(1, 0)).toEqual(1)
|
||||||
expect(flags.union(0, 0)).toEqual(0)
|
expect(BitFlags.union(0, 2)).toEqual(2)
|
||||||
expect(flags.union(1, 0)).toEqual(1)
|
expect(BitFlags.union(1, 2)).toEqual(3)
|
||||||
expect(flags.union(0, 2)).toEqual(2)
|
expect(BitFlags.union(3, 6)).toEqual(7)
|
||||||
expect(flags.union(1, 2)).toEqual(3)
|
|
||||||
expect(flags.union(3, 6)).toEqual(7)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('difference', () => {
|
test('difference', () => {
|
||||||
const flags = createBitFlagSet([])
|
expect(BitFlags.difference(0, 0)).toEqual(0)
|
||||||
|
expect(BitFlags.difference(1, 0)).toEqual(1)
|
||||||
expect(flags.difference(0, 0)).toEqual(0)
|
expect(BitFlags.difference(3, 6)).toEqual(1)
|
||||||
expect(flags.difference(1, 0)).toEqual(1)
|
expect(BitFlags.difference(6, 3)).toEqual(4)
|
||||||
expect(flags.difference(3, 6)).toEqual(1)
|
expect(BitFlags.difference(8, 17)).toEqual(8)
|
||||||
expect(flags.difference(6, 3)).toEqual(4)
|
|
||||||
expect(flags.difference(8, 17)).toEqual(8)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('intersection', () => {
|
test('intersection', () => {
|
||||||
const flags = createBitFlagSet([])
|
expect(BitFlags.intersection(0, 0)).toEqual(0)
|
||||||
|
expect(BitFlags.intersection(1, 0)).toEqual(0)
|
||||||
expect(flags.intersection(0, 0)).toEqual(0)
|
expect(BitFlags.intersection(1, 2)).toEqual(0)
|
||||||
expect(flags.intersection(1, 0)).toEqual(0)
|
expect(BitFlags.intersection(1, 3)).toEqual(1)
|
||||||
expect(flags.intersection(1, 2)).toEqual(0)
|
expect(BitFlags.intersection(11, 5)).toEqual(1)
|
||||||
expect(flags.intersection(1, 3)).toEqual(1)
|
expect(BitFlags.intersection(11, 7)).toEqual(3)
|
||||||
expect(flags.intersection(11, 5)).toEqual(1)
|
|
||||||
expect(flags.intersection(11, 7)).toEqual(3)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('isSuperset', () => {
|
test('isSuperset', () => {
|
||||||
const flags = createBitFlagSet([])
|
expect(BitFlags.isSuperset(0, 0)).toBe(true)
|
||||||
|
expect(BitFlags.isSuperset(3, 0)).toBe(true)
|
||||||
expect(flags.isSuperset(0, 0)).toBe(true)
|
expect(BitFlags.isSuperset(3, 1)).toBe(true)
|
||||||
expect(flags.isSuperset(3, 0)).toBe(true)
|
expect(BitFlags.isSuperset(3, 3)).toBe(true)
|
||||||
expect(flags.isSuperset(3, 1)).toBe(true)
|
expect(BitFlags.isSuperset(0, 3)).toBe(false)
|
||||||
expect(flags.isSuperset(3, 3)).toBe(true)
|
expect(BitFlags.isSuperset(8, 4)).toBe(false)
|
||||||
expect(flags.isSuperset(0, 3)).toBe(false)
|
|
||||||
expect(flags.isSuperset(8, 4)).toBe(false)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('hasAny', () => {
|
test('hasAny', () => {
|
||||||
@@ -108,14 +100,12 @@ describe(BitFlagSet, () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
test('enumerate', () => {
|
test('enumerate', () => {
|
||||||
const flags = createBitFlagSet([])
|
expect([...BitFlags.enumerate(0)]).toEqual([])
|
||||||
|
expect([...BitFlags.enumerate(1)]).toEqual([1])
|
||||||
expect([...flags.enumerate(0)]).toEqual([])
|
expect([...BitFlags.enumerate(2)]).toEqual([2])
|
||||||
expect([...flags.enumerate(1)]).toEqual([1])
|
expect([...BitFlags.enumerate(3)]).toEqual([1, 2])
|
||||||
expect([...flags.enumerate(2)]).toEqual([2])
|
expect([...BitFlags.enumerate(11)]).toEqual([1, 2, 8])
|
||||||
expect([...flags.enumerate(3)]).toEqual([1, 2])
|
expect([...BitFlags.enumerate(100)]).toEqual([4, 32, 64])
|
||||||
expect([...flags.enumerate(11)]).toEqual([1, 2, 8])
|
|
||||||
expect([...flags.enumerate(100)]).toEqual([4, 32, 64])
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('maximum', () => {
|
test('maximum', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user