@pezkuwi/util 14.0.1
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 +17 -0
- package/package.json +49 -0
- package/src/array/chunk.spec.ts +29 -0
- package/src/array/chunk.ts +35 -0
- package/src/array/filter.spec.ts +20 -0
- package/src/array/filter.ts +24 -0
- package/src/array/flatten.spec.ts +33 -0
- package/src/array/flatten.ts +51 -0
- package/src/array/index.ts +14 -0
- package/src/array/range.spec.ts +29 -0
- package/src/array/range.ts +31 -0
- package/src/array/shuffle.spec.ts +39 -0
- package/src/array/shuffle.ts +27 -0
- package/src/array/unzip.spec.ts +14 -0
- package/src/array/unzip.ts +18 -0
- package/src/array/zip.spec.ts +26 -0
- package/src/array/zip.ts +17 -0
- package/src/assert.spec.ts +40 -0
- package/src/assert.ts +50 -0
- package/src/bi/consts.ts +112 -0
- package/src/bi/helpers.ts +23 -0
- package/src/bi/index.ts +16 -0
- package/src/bi/max.spec.ts +32 -0
- package/src/bi/min.spec.ts +26 -0
- package/src/bi/min.ts +16 -0
- package/src/bi/sqrt.spec.ts +59 -0
- package/src/bi/sqrt.ts +43 -0
- package/src/bi/toBigInt.spec.ts +69 -0
- package/src/bi/toBigInt.ts +33 -0
- package/src/bi/toHex.spec.ts +56 -0
- package/src/bi/toHex.ts +16 -0
- package/src/bi/toU8a.spec.ts +99 -0
- package/src/bi/toU8a.ts +72 -0
- package/src/bn/bn.ts +6 -0
- package/src/bn/consts.spec.ts +38 -0
- package/src/bn/consts.ts +112 -0
- package/src/bn/fromHex.spec.ts +15 -0
- package/src/bn/fromHex.ts +4 -0
- package/src/bn/index.ts +18 -0
- package/src/bn/max.spec.ts +32 -0
- package/src/bn/min.spec.ts +26 -0
- package/src/bn/min.ts +36 -0
- package/src/bn/sqrt.spec.ts +37 -0
- package/src/bn/sqrt.ts +50 -0
- package/src/bn/toBn.spec.ts +53 -0
- package/src/bn/toBn.ts +43 -0
- package/src/bn/toHex.spec.ts +50 -0
- package/src/bn/toHex.ts +27 -0
- package/src/bn/toU8a.spec.ts +60 -0
- package/src/bn/toU8a.ts +45 -0
- package/src/buffer/index.ts +8 -0
- package/src/buffer/toU8a.spec.ts +20 -0
- package/src/buffer/toU8a.ts +20 -0
- package/src/bundle.ts +35 -0
- package/src/compact/addLength.spec.ts +14 -0
- package/src/compact/addLength.ts +24 -0
- package/src/compact/defaults.ts +7 -0
- package/src/compact/fromU8a.spec.ts +84 -0
- package/src/compact/fromU8a.ts +109 -0
- package/src/compact/index.ts +28 -0
- package/src/compact/stripLength.spec.ts +17 -0
- package/src/compact/stripLength.ts +26 -0
- package/src/compact/toU8a.spec.ts +59 -0
- package/src/compact/toU8a.ts +53 -0
- package/src/compact/types.ts +4 -0
- package/src/detectPackage.spec.ts +110 -0
- package/src/detectPackage.ts +138 -0
- package/src/extractTime.spec.ts +21 -0
- package/src/extractTime.ts +71 -0
- package/src/float/index.ts +4 -0
- package/src/float/toU8a.spec.ts +52 -0
- package/src/float/toU8a.ts +30 -0
- package/src/format/formatBalance.spec.ts +296 -0
- package/src/format/formatBalance.ts +177 -0
- package/src/format/formatDate.spec.ts +17 -0
- package/src/format/formatDate.ts +22 -0
- package/src/format/formatDecimal.spec.ts +28 -0
- package/src/format/formatDecimal.ts +22 -0
- package/src/format/formatElapsed.spec.ts +44 -0
- package/src/format/formatElapsed.ts +35 -0
- package/src/format/formatNumber.spec.ts +60 -0
- package/src/format/formatNumber.ts +29 -0
- package/src/format/getSeparator.spec.ts +53 -0
- package/src/format/getSeparator.ts +15 -0
- package/src/format/index.ts +9 -0
- package/src/format/si.ts +52 -0
- package/src/has.spec.ts +12 -0
- package/src/has.ts +38 -0
- package/src/hex/addPrefix.spec.ts +32 -0
- package/src/hex/addPrefix.ts +26 -0
- package/src/hex/fixLength.spec.ts +38 -0
- package/src/hex/fixLength.ts +36 -0
- package/src/hex/hasPrefix.spec.ts +32 -0
- package/src/hex/hasPrefix.ts +24 -0
- package/src/hex/index.ts +16 -0
- package/src/hex/stripPrefix.spec.ts +44 -0
- package/src/hex/stripPrefix.ts +30 -0
- package/src/hex/toBigInt.spec.ts +74 -0
- package/src/hex/toBigInt.ts +19 -0
- package/src/hex/toBn.spec.ts +74 -0
- package/src/hex/toBn.ts +40 -0
- package/src/hex/toNumber.spec.ts +20 -0
- package/src/hex/toNumber.ts +24 -0
- package/src/hex/toString.spec.ts +20 -0
- package/src/hex/toString.ts +25 -0
- package/src/hex/toU8a.spec.ts +76 -0
- package/src/hex/toU8a.ts +68 -0
- package/src/hex/toU8aBuffer.spec.ts +38 -0
- package/src/hex/toU8aBuffer.ts +52 -0
- package/src/index.spec.ts +12 -0
- package/src/index.ts +6 -0
- package/src/is/array.spec.ts +20 -0
- package/src/is/array.ts +10 -0
- package/src/is/ascii.spec.ts +49 -0
- package/src/is/ascii.ts +52 -0
- package/src/is/bigInt.spec.ts +26 -0
- package/src/is/bigInt.ts +20 -0
- package/src/is/bn.spec.ts +21 -0
- package/src/is/bn.ts +23 -0
- package/src/is/boolean.spec.ts +26 -0
- package/src/is/boolean.ts +20 -0
- package/src/is/buffer.spec.ts +26 -0
- package/src/is/buffer.ts +28 -0
- package/src/is/childClass.spec.ts +36 -0
- package/src/is/childClass.ts +29 -0
- package/src/is/class.spec.ts +37 -0
- package/src/is/class.ts +12 -0
- package/src/is/codec.spec.ts +52 -0
- package/src/is/codec.ts +26 -0
- package/src/is/compact.spec.ts +27 -0
- package/src/is/compact.ts +19 -0
- package/src/is/error.spec.ts +20 -0
- package/src/is/error.ts +23 -0
- package/src/is/function.spec.ts +20 -0
- package/src/is/function.ts +23 -0
- package/src/is/helpers.ts +23 -0
- package/src/is/hex.spec.ts +77 -0
- package/src/is/hex.ts +36 -0
- package/src/is/index.ts +36 -0
- package/src/is/instanceOf.spec.ts +48 -0
- package/src/is/instanceOf.ts +24 -0
- package/src/is/ip.spec.ts +50 -0
- package/src/is/ip.ts +56 -0
- package/src/is/jsonObject.spec.ts +51 -0
- package/src/is/jsonObject.ts +45 -0
- package/src/is/null.spec.ts +20 -0
- package/src/is/null.ts +20 -0
- package/src/is/number.spec.ts +20 -0
- package/src/is/number.ts +20 -0
- package/src/is/object.spec.ts +32 -0
- package/src/is/object.ts +24 -0
- package/src/is/observable.spec.ts +26 -0
- package/src/is/observable.ts +22 -0
- package/src/is/promise.spec.ts +32 -0
- package/src/is/promise.ts +6 -0
- package/src/is/riscv.spec.ts +36 -0
- package/src/is/riscv.ts +27 -0
- package/src/is/string.spec.ts +32 -0
- package/src/is/string.ts +22 -0
- package/src/is/testChain.spec.ts +25 -0
- package/src/is/testChain.ts +12 -0
- package/src/is/toBigInt.spec.ts +22 -0
- package/src/is/toBigInt.ts +8 -0
- package/src/is/toBn.spec.ts +25 -0
- package/src/is/toBn.ts +8 -0
- package/src/is/u8a.spec.ts +42 -0
- package/src/is/u8a.ts +25 -0
- package/src/is/undefined.spec.ts +23 -0
- package/src/is/undefined.ts +21 -0
- package/src/is/utf8.spec.ts +42 -0
- package/src/is/utf8.ts +207 -0
- package/src/is/wasm.spec.ts +20 -0
- package/src/is/wasm.ts +17 -0
- package/src/lazy.spec.ts +71 -0
- package/src/lazy.ts +63 -0
- package/src/logger.spec.ts +188 -0
- package/src/logger.ts +160 -0
- package/src/memoize.spec.ts +79 -0
- package/src/memoize.ts +49 -0
- package/src/mod.ts +4 -0
- package/src/nextTick.ts +26 -0
- package/src/noop.ts +16 -0
- package/src/number/index.ts +9 -0
- package/src/number/toHex.spec.ts +44 -0
- package/src/number/toHex.ts +27 -0
- package/src/number/toU8a.spec.ts +50 -0
- package/src/number/toU8a.ts +25 -0
- package/src/object/clear.spec.ts +14 -0
- package/src/object/clear.ts +16 -0
- package/src/object/copy.spec.ts +17 -0
- package/src/object/copy.ts +12 -0
- package/src/object/entries.spec.ts +20 -0
- package/src/object/entries.ts +12 -0
- package/src/object/index.ts +10 -0
- package/src/object/keys.spec.ts +19 -0
- package/src/object/keys.ts +10 -0
- package/src/object/property.spec.ts +149 -0
- package/src/object/property.ts +39 -0
- package/src/object/spread.spec.ts +36 -0
- package/src/object/spread.ts +38 -0
- package/src/object/values.spec.ts +19 -0
- package/src/object/values.ts +10 -0
- package/src/packageDetect.ts +13 -0
- package/src/packageInfo.ts +6 -0
- package/src/promisify.spec.ts +50 -0
- package/src/promisify.ts +30 -0
- package/src/string/camelCase.spec.ts +119 -0
- package/src/string/camelCase.ts +79 -0
- package/src/string/index.ts +12 -0
- package/src/string/lowerFirst.spec.ts +41 -0
- package/src/string/lowerFirst.ts +46 -0
- package/src/string/pascalCase.spec.ts +26 -0
- package/src/string/shorten.spec.ts +38 -0
- package/src/string/shorten.ts +24 -0
- package/src/string/toHex.spec.ts +26 -0
- package/src/string/toHex.ts +27 -0
- package/src/string/toU8a.spec.ts +31 -0
- package/src/string/toU8a.ts +28 -0
- package/src/string/upperFirst.spec.ts +41 -0
- package/src/stringify.spec.ts +33 -0
- package/src/stringify.ts +20 -0
- package/src/test/index.ts +4 -0
- package/src/test/performance.ts +92 -0
- package/src/types.ts +100 -0
- package/src/u8a/cmp.spec.ts +62 -0
- package/src/u8a/cmp.ts +50 -0
- package/src/u8a/concat.spec.ts +42 -0
- package/src/u8a/concat.ts +60 -0
- package/src/u8a/concatBuffer.ts +34 -0
- package/src/u8a/empty.spec.ts +46 -0
- package/src/u8a/empty.ts +22 -0
- package/src/u8a/eq.spec.ts +113 -0
- package/src/u8a/eq.ts +46 -0
- package/src/u8a/fixLength.spec.ts +34 -0
- package/src/u8a/fixLength.ts +34 -0
- package/src/u8a/index.ts +22 -0
- package/src/u8a/sorted.spec.ts +20 -0
- package/src/u8a/sorted.ts +22 -0
- package/src/u8a/toBigInt.spec.ts +106 -0
- package/src/u8a/toBigInt.ts +100 -0
- package/src/u8a/toBn.spec.ts +106 -0
- package/src/u8a/toBn.ts +101 -0
- package/src/u8a/toBuffer.spec.ts +20 -0
- package/src/u8a/toBuffer.ts +28 -0
- package/src/u8a/toFloat.spec.ts +86 -0
- package/src/u8a/toFloat.ts +26 -0
- package/src/u8a/toHex.spec.ts +94 -0
- package/src/u8a/toHex.ts +68 -0
- package/src/u8a/toHexBuffer.spec.ts +63 -0
- package/src/u8a/toHexBuffer.ts +30 -0
- package/src/u8a/toNumber.spec.ts +47 -0
- package/src/u8a/toNumber.ts +80 -0
- package/src/u8a/toString.spec.ts +36 -0
- package/src/u8a/toString.ts +26 -0
- package/src/u8a/toU8a.spec.ts +63 -0
- package/src/u8a/toU8a.ts +46 -0
- package/src/u8a/wrap.spec.ts +139 -0
- package/src/u8a/wrap.ts +65 -0
- package/tsconfig.build.json +19 -0
- package/tsconfig.spec.json +17 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
|
5
|
+
|
|
6
|
+
import { getRandomValues } from '@pezkuwi/x-randomvalues';
|
|
7
|
+
|
|
8
|
+
import { arrayRange } from '../array/index.js';
|
|
9
|
+
import { perf } from '../test/index.js';
|
|
10
|
+
import { u8aConcat, u8aConcatStrict } from './index.js';
|
|
11
|
+
|
|
12
|
+
const ptest = arrayRange(10).map(() => getRandomValues(new Uint8Array(32)));
|
|
13
|
+
|
|
14
|
+
describe('u8aConcat', (): void => {
|
|
15
|
+
it('concatenates arrays', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
u8aConcat(
|
|
18
|
+
new Uint8Array([1, 2, 3, 4]),
|
|
19
|
+
new Uint8Array([5, 6]),
|
|
20
|
+
new Uint8Array([7, 8, 9])
|
|
21
|
+
)
|
|
22
|
+
).toEqual(
|
|
23
|
+
new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9])
|
|
24
|
+
);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('concatenates arrays & hex values', (): void => {
|
|
28
|
+
expect(
|
|
29
|
+
u8aConcat(
|
|
30
|
+
new Uint8Array([1, 2, 3, 4]),
|
|
31
|
+
'0x0506',
|
|
32
|
+
'0x070809'
|
|
33
|
+
)
|
|
34
|
+
).toEqual(
|
|
35
|
+
new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9])
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
perf('u8aConcat', 10000, [[ptest]], u8aConcat);
|
|
40
|
+
perf('u8aConcatStrict', 10000, [[[ptest]]], u8aConcatStrict);
|
|
41
|
+
perf('u8aConcatStrict (len)', 10000, [[[ptest], 320]], u8aConcatStrict);
|
|
42
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { U8aLike } from '../types.js';
|
|
5
|
+
|
|
6
|
+
import { u8aToU8a } from './toU8a.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @name u8aConcat
|
|
10
|
+
* @summary Creates a concatenated Uint8Array from the inputs.
|
|
11
|
+
* @description
|
|
12
|
+
* Concatenates the input arrays into a single `UInt8Array`.
|
|
13
|
+
* @example
|
|
14
|
+
* <BR>
|
|
15
|
+
*
|
|
16
|
+
* ```javascript
|
|
17
|
+
* import { { u8aConcat } from '@pezkuwi/util';
|
|
18
|
+
*
|
|
19
|
+
* u8aConcat(
|
|
20
|
+
* new Uint8Array([1, 2, 3]),
|
|
21
|
+
* new Uint8Array([4, 5, 6])
|
|
22
|
+
* ); // [1, 2, 3, 4, 5, 6]
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function u8aConcat (...list: readonly U8aLike[]): Uint8Array {
|
|
26
|
+
const count = list.length;
|
|
27
|
+
const u8as = new Array<Uint8Array>(count);
|
|
28
|
+
let length = 0;
|
|
29
|
+
|
|
30
|
+
for (let i = 0; i < count; i++) {
|
|
31
|
+
u8as[i] = u8aToU8a(list[i]);
|
|
32
|
+
length += u8as[i].length;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return u8aConcatStrict(u8as, length);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @name u8aConcatStrict
|
|
40
|
+
* @description A strict version of [[u8aConcat]], accepting only Uint8Array inputs
|
|
41
|
+
*/
|
|
42
|
+
export function u8aConcatStrict (u8as: readonly Uint8Array[], length = 0): Uint8Array {
|
|
43
|
+
const count = u8as.length;
|
|
44
|
+
let offset = 0;
|
|
45
|
+
|
|
46
|
+
if (!length) {
|
|
47
|
+
for (let i = 0; i < count; i++) {
|
|
48
|
+
length += u8as[i].length;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const result = new Uint8Array(length);
|
|
53
|
+
|
|
54
|
+
for (let i = 0; i < count; i++) {
|
|
55
|
+
result.set(u8as[i], offset);
|
|
56
|
+
offset += u8as[i].length;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { U8aLike } from '../types.js';
|
|
5
|
+
|
|
6
|
+
import { u8aToU8a } from './toU8a.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @name u8aConcat
|
|
10
|
+
* @summary Creates a concatenated Uint8Array from the inputs.
|
|
11
|
+
* @description
|
|
12
|
+
* Concatenates the input arrays into a single `UInt8Array`.
|
|
13
|
+
* @example
|
|
14
|
+
* <BR>
|
|
15
|
+
*
|
|
16
|
+
* ```javascript
|
|
17
|
+
* import { { u8aConcat } from '@pezkuwi/util';
|
|
18
|
+
*
|
|
19
|
+
* u8aConcat(
|
|
20
|
+
* new Uint8Array([1, 2, 3]),
|
|
21
|
+
* new Uint8Array([4, 5, 6])
|
|
22
|
+
* ); // [1, 2, 3, 4, 5, 6]
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function u8aConcat (...list: readonly U8aLike[]): Uint8Array {
|
|
26
|
+
const count = list.length;
|
|
27
|
+
const u8as = new Array<Uint8Array>(count);
|
|
28
|
+
|
|
29
|
+
for (let i = 0; i < count; i++) {
|
|
30
|
+
u8as[i] = u8aToU8a(list[i]);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return Uint8Array.from(Buffer.concat(u8as));
|
|
34
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
|
5
|
+
|
|
6
|
+
import { perf } from '../test/index.js';
|
|
7
|
+
import { u8aEmpty } from './index.js';
|
|
8
|
+
|
|
9
|
+
describe('u8aEmpty', (): void => {
|
|
10
|
+
it('returns true on zero length', (): void => {
|
|
11
|
+
expect(
|
|
12
|
+
u8aEmpty(new Uint8Array())
|
|
13
|
+
).toEqual(true);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('returns true on all zero values', (): void => {
|
|
17
|
+
expect(
|
|
18
|
+
u8aEmpty(new Uint8Array([0, 0, 0, 0, 0, 0]))
|
|
19
|
+
).toEqual(true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('returns false when value is found', (): void => {
|
|
23
|
+
expect(
|
|
24
|
+
u8aEmpty(new Uint8Array([0, 0, 0, 0, 0, 1]))
|
|
25
|
+
).toEqual(false);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('returns false when value is found (256)', (): void => {
|
|
29
|
+
const test = new Uint8Array(256);
|
|
30
|
+
|
|
31
|
+
expect(
|
|
32
|
+
u8aEmpty(test)
|
|
33
|
+
).toEqual(true);
|
|
34
|
+
|
|
35
|
+
test[128] = 1;
|
|
36
|
+
|
|
37
|
+
expect(
|
|
38
|
+
u8aEmpty(test)
|
|
39
|
+
).toEqual(false);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
perf('u8aEmpty (32 cmp)', 1_000_000, [[new Uint8Array(32)]], u8aEmpty);
|
|
43
|
+
perf('u8aEmpty (64 cmp)', 500_000, [[new Uint8Array(64)]], u8aEmpty);
|
|
44
|
+
perf('u8aEmpty (128 cmp)', 250_000, [[new Uint8Array(128)]], u8aEmpty);
|
|
45
|
+
perf('u8aEmpty (256 cmp)', 125_000, [[new Uint8Array(256)]], u8aEmpty);
|
|
46
|
+
});
|
package/src/u8a/empty.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @name u8aEmpty
|
|
6
|
+
* @summary Tests for a `Uint8Array` for emptyness
|
|
7
|
+
* @description
|
|
8
|
+
* Checks to see if the input `Uint8Array` has zero length or contains all 0 values.
|
|
9
|
+
*/
|
|
10
|
+
export function u8aEmpty (value: Uint8Array): boolean {
|
|
11
|
+
const len = value.length | 0;
|
|
12
|
+
|
|
13
|
+
// on smaller sizes, the byte-by-byte compare is faster than allocating
|
|
14
|
+
// another object for DataView (on very large arrays the DataView is faster)
|
|
15
|
+
for (let i = 0; i < len; i++) {
|
|
16
|
+
if (value[i] | 0) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
|
5
|
+
|
|
6
|
+
import { perf } from '../test/index.js';
|
|
7
|
+
import { u8aEq } from './index.js';
|
|
8
|
+
|
|
9
|
+
const ltest = new Uint8Array(32768);
|
|
10
|
+
const stest = new Uint8Array(256);
|
|
11
|
+
const ztest = new Uint8Array(64);
|
|
12
|
+
|
|
13
|
+
for (let i = 0, count = ltest.length; i < count; i++) {
|
|
14
|
+
if (i < ztest.length) {
|
|
15
|
+
ztest[i] = i % 256;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (i < stest.length) {
|
|
19
|
+
stest[i] = i % 256;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
ltest[i] = i % 256;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
describe('u8aEq', (): void => {
|
|
26
|
+
it('returns false when the lengths do not match', (): void => {
|
|
27
|
+
expect(
|
|
28
|
+
u8aEq(
|
|
29
|
+
new Uint8Array([1, 2, 3]),
|
|
30
|
+
new Uint8Array([1, 2])
|
|
31
|
+
)
|
|
32
|
+
).toEqual(false);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('returns false when the contents do not match', (): void => {
|
|
36
|
+
expect(
|
|
37
|
+
u8aEq(
|
|
38
|
+
new Uint8Array([1, 2, 3]),
|
|
39
|
+
new Uint8Array([1, 2, 4])
|
|
40
|
+
)
|
|
41
|
+
).toEqual(false);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('returns true when the contents do match', (): void => {
|
|
45
|
+
expect(
|
|
46
|
+
u8aEq(
|
|
47
|
+
new Uint8Array([1, 2, 3]),
|
|
48
|
+
new Uint8Array([1, 2, 3])
|
|
49
|
+
)
|
|
50
|
+
).toEqual(true);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('returns false when the contents do not match (with u32 start)', (): void => {
|
|
54
|
+
expect(
|
|
55
|
+
u8aEq(
|
|
56
|
+
new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3]),
|
|
57
|
+
new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 4])
|
|
58
|
+
)
|
|
59
|
+
).toEqual(false);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('returns true when the contents do match (with u32 start)', (): void => {
|
|
63
|
+
expect(
|
|
64
|
+
u8aEq(
|
|
65
|
+
new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3]),
|
|
66
|
+
new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3])
|
|
67
|
+
)
|
|
68
|
+
).toEqual(true);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('returns false when the contents do not match (u32 only)', (): void => {
|
|
72
|
+
expect(
|
|
73
|
+
u8aEq(
|
|
74
|
+
new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]),
|
|
75
|
+
new Uint8Array([1, 2, 3, 4, 5, 6, 7, 9])
|
|
76
|
+
)
|
|
77
|
+
).toEqual(false);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('returns true when the contents do match (u32 only)', (): void => {
|
|
81
|
+
expect(
|
|
82
|
+
u8aEq(
|
|
83
|
+
new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]),
|
|
84
|
+
new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8])
|
|
85
|
+
)
|
|
86
|
+
).toEqual(true);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('returns true with equalvalent hex & Uint8array', (): void => {
|
|
90
|
+
expect(
|
|
91
|
+
u8aEq(
|
|
92
|
+
'0x010203',
|
|
93
|
+
new Uint8Array([1, 2, 3])
|
|
94
|
+
)
|
|
95
|
+
).toEqual(true);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('works on aubarray values', (): void => {
|
|
99
|
+
const a = new Uint8Array(16);
|
|
100
|
+
|
|
101
|
+
for (let i = 0, count = a.length; i < count; i++) {
|
|
102
|
+
a[i] = i;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
expect(
|
|
106
|
+
u8aEq(a.subarray(0, 5), a.subarray(0, 5))
|
|
107
|
+
).toEqual(true);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
perf('u8aEq (64 cmp)', 200_000, [[ztest, ztest]], u8aEq);
|
|
111
|
+
perf('u8aEq (256 cmp)', 200_000, [[stest, stest]], u8aEq);
|
|
112
|
+
perf('u8aEq (32k cmp)', 10_000, [[ltest, ltest]], u8aEq);
|
|
113
|
+
});
|
package/src/u8a/eq.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { u8aToU8a } from './toU8a.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @name u8aEq
|
|
8
|
+
* @summary Compares two Uint8Arrays for equality.
|
|
9
|
+
* @description
|
|
10
|
+
* For `UInt8Array` (or hex string) input values true if there is a match.
|
|
11
|
+
* @example
|
|
12
|
+
* <BR>
|
|
13
|
+
*
|
|
14
|
+
* ```javascript
|
|
15
|
+
* import { u8aEq } from '@pezkuwi/util';
|
|
16
|
+
*
|
|
17
|
+
* u8aEq(new Uint8Array([0x68, 0x65]), new Uint8Array([0x68, 0x65])); // true
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function u8aEq (a: string | Uint8Array, b: string | Uint8Array): boolean {
|
|
21
|
+
const u8aa = u8aToU8a(a);
|
|
22
|
+
const u8ab = u8aToU8a(b);
|
|
23
|
+
|
|
24
|
+
if (u8aa.length === u8ab.length) {
|
|
25
|
+
const dvA = new DataView(u8aa.buffer, u8aa.byteOffset);
|
|
26
|
+
const dvB = new DataView(u8ab.buffer, u8ab.byteOffset);
|
|
27
|
+
const mod = (u8aa.length % 4) | 0;
|
|
28
|
+
const length = (u8aa.length - mod) | 0;
|
|
29
|
+
|
|
30
|
+
for (let i = 0; i < length; i += 4) {
|
|
31
|
+
if (dvA.getUint32(i) !== dvB.getUint32(i)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
for (let i = length, count = u8aa.length; i < count; i++) {
|
|
37
|
+
if (u8aa[i] !== u8ab[i]) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
|
5
|
+
|
|
6
|
+
import { u8aFixLength } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('u8aFixLength', (): void => {
|
|
9
|
+
it('returns bitLength === -1 as-is', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
u8aFixLength(
|
|
12
|
+
new Uint8Array([0x12, 0x34, 0x56, 0x78])
|
|
13
|
+
)
|
|
14
|
+
).toEqual(new Uint8Array([0x12, 0x34, 0x56, 0x78]));
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('does not change when bitlength === length', (): void => {
|
|
18
|
+
expect(
|
|
19
|
+
u8aFixLength(new Uint8Array([0x12, 0x34, 0x56, 0x78]), 32)
|
|
20
|
+
).toEqual(new Uint8Array([0x12, 0x34, 0x56, 0x78]));
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('trims values when bitLength > length', (): void => {
|
|
24
|
+
expect(
|
|
25
|
+
u8aFixLength(new Uint8Array([0x12, 0x34, 0x56, 0x78]), 16)
|
|
26
|
+
).toEqual(new Uint8Array([0x12, 0x34]));
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('adds zeros when bitLength < length (withPadded)', (): void => {
|
|
30
|
+
expect(
|
|
31
|
+
u8aFixLength(new Uint8Array([0x12, 0x34]), 32)
|
|
32
|
+
).toEqual(new Uint8Array([0, 0, 0x12, 0x34]));
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @name u8aFixLength
|
|
6
|
+
* @summary Shifts a Uint8Array to a specific bitLength
|
|
7
|
+
* @description
|
|
8
|
+
* Returns a uint8Array with the specified number of bits contained in the return value. (If bitLength is -1, length checking is not done). Values with more bits are trimmed to the specified length.
|
|
9
|
+
* @example
|
|
10
|
+
* <BR>
|
|
11
|
+
*
|
|
12
|
+
* ```javascript
|
|
13
|
+
* import { u8aFixLength } from '@pezkuwi/util';
|
|
14
|
+
*
|
|
15
|
+
* u8aFixLength('0x12') // => 0x12
|
|
16
|
+
* u8aFixLength('0x12', 16) // => 0x0012
|
|
17
|
+
* u8aFixLength('0x1234', 8) // => 0x12
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function u8aFixLength (value: Uint8Array, bitLength = -1, atStart = false): Uint8Array {
|
|
21
|
+
const byteLength = Math.ceil(bitLength / 8);
|
|
22
|
+
|
|
23
|
+
if (bitLength === -1 || value.length === byteLength) {
|
|
24
|
+
return value;
|
|
25
|
+
} else if (value.length > byteLength) {
|
|
26
|
+
return value.subarray(0, byteLength);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const result = new Uint8Array(byteLength);
|
|
30
|
+
|
|
31
|
+
result.set(value, atStart ? 0 : (byteLength - value.length));
|
|
32
|
+
|
|
33
|
+
return result;
|
|
34
|
+
}
|
package/src/u8a/index.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @summary Utility methods to convert to and from `Uint8Array` objects
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { u8aCmp } from './cmp.js';
|
|
9
|
+
export { u8aConcat, u8aConcatStrict } from './concat.js';
|
|
10
|
+
export { u8aEmpty } from './empty.js';
|
|
11
|
+
export { u8aEq } from './eq.js';
|
|
12
|
+
export { u8aFixLength } from './fixLength.js';
|
|
13
|
+
export { u8aSorted } from './sorted.js';
|
|
14
|
+
export { u8aToBigInt } from './toBigInt.js';
|
|
15
|
+
export { u8aToBn } from './toBn.js';
|
|
16
|
+
export { u8aToBuffer } from './toBuffer.js';
|
|
17
|
+
export { u8aToFloat } from './toFloat.js';
|
|
18
|
+
export { u8aToHex } from './toHex.js';
|
|
19
|
+
export { u8aToNumber } from './toNumber.js';
|
|
20
|
+
export { u8aToString } from './toString.js';
|
|
21
|
+
export { u8aToU8a } from './toU8a.js';
|
|
22
|
+
export { U8A_WRAP_ETHEREUM, U8A_WRAP_POSTFIX, U8A_WRAP_PREFIX, u8aIsWrapped, u8aUnwrapBytes, u8aWrapBytes } from './wrap.js';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
|
5
|
+
|
|
6
|
+
import { u8aSorted } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('u8aSorted', (): void => {
|
|
9
|
+
it('sorts a simple set of u8a', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
u8aSorted([new Uint8Array([1, 2, 3]), new Uint8Array([4, 5, 6]), new Uint8Array([2, 3, 4])])
|
|
12
|
+
).toEqual([new Uint8Array([1, 2, 3]), new Uint8Array([2, 3, 4]), new Uint8Array([4, 5, 6])]);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('sorts a simple set of u8a (not the same lengths)', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
u8aSorted([new Uint8Array([1, 2, 3, 4]), new Uint8Array([4, 5, 6]), new Uint8Array([1, 2, 3, 5])])
|
|
18
|
+
).toEqual([new Uint8Array([1, 2, 3, 4]), new Uint8Array([1, 2, 3, 5]), new Uint8Array([4, 5, 6])]);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { u8aCmp } from './cmp.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @name u8aSorted
|
|
8
|
+
* @summary Sorts an array of Uint8Arrays
|
|
9
|
+
* @description
|
|
10
|
+
* For input `UInt8Array[]` return the sorted result
|
|
11
|
+
* @example
|
|
12
|
+
* <BR>
|
|
13
|
+
*
|
|
14
|
+
* ```javascript
|
|
15
|
+
* import { u8aSorted} from '@pezkuwi/util';
|
|
16
|
+
*
|
|
17
|
+
* u8aSorted([new Uint8Array([0x69]), new Uint8Array([0x68])]); // [0x68, 0x69]
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function u8aSorted (u8as: Uint8Array[]): Uint8Array[] {
|
|
21
|
+
return u8as.sort(u8aCmp);
|
|
22
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/// <reference types="@polkadot/dev-test/globals.d.ts" />
|
|
5
|
+
|
|
6
|
+
import { TESTS } from '../bi/toU8a.spec.js';
|
|
7
|
+
import { perf } from '../test/index.js';
|
|
8
|
+
import { u8aToBigInt } from './index.js';
|
|
9
|
+
|
|
10
|
+
// test-cases are the same as in u8aToBn
|
|
11
|
+
describe('u8aToBigInt', (): void => {
|
|
12
|
+
it('converts little-endian by default', (): void => {
|
|
13
|
+
expect(
|
|
14
|
+
u8aToBigInt(
|
|
15
|
+
new Uint8Array([0x12, 0x34])
|
|
16
|
+
).toString(16)
|
|
17
|
+
).toBe('3412');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
describe('empty creation', (): void => {
|
|
21
|
+
it('handles unsigned (le)', (): void => {
|
|
22
|
+
expect(
|
|
23
|
+
u8aToBigInt(
|
|
24
|
+
new Uint8Array(),
|
|
25
|
+
{ isLe: true }
|
|
26
|
+
).toString(16)
|
|
27
|
+
).toBe('0');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('handles signed (le)', (): void => {
|
|
31
|
+
expect(
|
|
32
|
+
u8aToBigInt(
|
|
33
|
+
new Uint8Array(),
|
|
34
|
+
{ isLe: true, isNegative: true }
|
|
35
|
+
).toString(16)
|
|
36
|
+
).toBe('0');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('handles unsigned (be)', (): void => {
|
|
40
|
+
expect(
|
|
41
|
+
u8aToBigInt(
|
|
42
|
+
new Uint8Array(),
|
|
43
|
+
{ isLe: false }
|
|
44
|
+
).toString(16)
|
|
45
|
+
).toBe('0');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('handles signed (be)', (): void => {
|
|
49
|
+
expect(
|
|
50
|
+
u8aToBigInt(
|
|
51
|
+
new Uint8Array(),
|
|
52
|
+
{ isLe: false, isNegative: true }
|
|
53
|
+
).toString(16)
|
|
54
|
+
).toBe('0');
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('handles overflows correctly (little-endian)', (): void => {
|
|
59
|
+
expect(
|
|
60
|
+
u8aToBigInt(
|
|
61
|
+
new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0]),
|
|
62
|
+
{ isLe: true }
|
|
63
|
+
)
|
|
64
|
+
).toBe(256n);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe('length tests', (): void => {
|
|
68
|
+
[true, false].forEach((isLe) => {
|
|
69
|
+
for (let i = 1; i < 32; i++) {
|
|
70
|
+
const tu8a = [0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78];
|
|
71
|
+
const tstr = tu8a.map((n) => n.toString(16));
|
|
72
|
+
|
|
73
|
+
it(`converts values with bitLength=${i * 8}, isLe=${isLe}`, (): void => {
|
|
74
|
+
expect(
|
|
75
|
+
u8aToBigInt(
|
|
76
|
+
new Uint8Array(tu8a.slice(0, i)),
|
|
77
|
+
{ isLe }
|
|
78
|
+
).toString(16)
|
|
79
|
+
).toBe(
|
|
80
|
+
isLe
|
|
81
|
+
? tstr.slice(0, i).reverse().join('')
|
|
82
|
+
: tstr.slice(0, i).join('')
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe('conversion tests', (): void => {
|
|
90
|
+
TESTS.forEach(([isLe, isNegative, numarr, strval], i): void => {
|
|
91
|
+
it(`#${i}: creates ${strval} (bitLength=${numarr.length * 8}, isLe=${isLe}, isNegative=${isNegative})`, (): void => {
|
|
92
|
+
expect(
|
|
93
|
+
u8aToBigInt(
|
|
94
|
+
new Uint8Array(numarr),
|
|
95
|
+
{ isLe, isNegative }
|
|
96
|
+
).toString()
|
|
97
|
+
).toBe(strval);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
perf('u8aToBigInt (i32)', 750_000, [[new Uint8Array([0x9c, 0x9c, 0x9c, 0x9c])]], (v: Uint8Array) => u8aToBigInt(v, { isNegative: true }));
|
|
103
|
+
perf('u8aToBigInt (u32)', 750_000, [[new Uint8Array([0x68, 0x65, 0x6c, 0x6c])]], u8aToBigInt);
|
|
104
|
+
perf('u8aToBigInt (u64)', 750_000, [[new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x68, 0x65, 0x6c, 0x6c])]], u8aToBigInt);
|
|
105
|
+
perf('u8aToBigInt (u128)', 750_000, [[new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x68, 0x65, 0x6c, 0x6c, 0x68, 0x65, 0x6c, 0x6c, 0x68, 0x65, 0x6c, 0x6c])]], u8aToBigInt);
|
|
106
|
+
});
|