@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.
Files changed (260) hide show
  1. package/README.md +17 -0
  2. package/package.json +49 -0
  3. package/src/array/chunk.spec.ts +29 -0
  4. package/src/array/chunk.ts +35 -0
  5. package/src/array/filter.spec.ts +20 -0
  6. package/src/array/filter.ts +24 -0
  7. package/src/array/flatten.spec.ts +33 -0
  8. package/src/array/flatten.ts +51 -0
  9. package/src/array/index.ts +14 -0
  10. package/src/array/range.spec.ts +29 -0
  11. package/src/array/range.ts +31 -0
  12. package/src/array/shuffle.spec.ts +39 -0
  13. package/src/array/shuffle.ts +27 -0
  14. package/src/array/unzip.spec.ts +14 -0
  15. package/src/array/unzip.ts +18 -0
  16. package/src/array/zip.spec.ts +26 -0
  17. package/src/array/zip.ts +17 -0
  18. package/src/assert.spec.ts +40 -0
  19. package/src/assert.ts +50 -0
  20. package/src/bi/consts.ts +112 -0
  21. package/src/bi/helpers.ts +23 -0
  22. package/src/bi/index.ts +16 -0
  23. package/src/bi/max.spec.ts +32 -0
  24. package/src/bi/min.spec.ts +26 -0
  25. package/src/bi/min.ts +16 -0
  26. package/src/bi/sqrt.spec.ts +59 -0
  27. package/src/bi/sqrt.ts +43 -0
  28. package/src/bi/toBigInt.spec.ts +69 -0
  29. package/src/bi/toBigInt.ts +33 -0
  30. package/src/bi/toHex.spec.ts +56 -0
  31. package/src/bi/toHex.ts +16 -0
  32. package/src/bi/toU8a.spec.ts +99 -0
  33. package/src/bi/toU8a.ts +72 -0
  34. package/src/bn/bn.ts +6 -0
  35. package/src/bn/consts.spec.ts +38 -0
  36. package/src/bn/consts.ts +112 -0
  37. package/src/bn/fromHex.spec.ts +15 -0
  38. package/src/bn/fromHex.ts +4 -0
  39. package/src/bn/index.ts +18 -0
  40. package/src/bn/max.spec.ts +32 -0
  41. package/src/bn/min.spec.ts +26 -0
  42. package/src/bn/min.ts +36 -0
  43. package/src/bn/sqrt.spec.ts +37 -0
  44. package/src/bn/sqrt.ts +50 -0
  45. package/src/bn/toBn.spec.ts +53 -0
  46. package/src/bn/toBn.ts +43 -0
  47. package/src/bn/toHex.spec.ts +50 -0
  48. package/src/bn/toHex.ts +27 -0
  49. package/src/bn/toU8a.spec.ts +60 -0
  50. package/src/bn/toU8a.ts +45 -0
  51. package/src/buffer/index.ts +8 -0
  52. package/src/buffer/toU8a.spec.ts +20 -0
  53. package/src/buffer/toU8a.ts +20 -0
  54. package/src/bundle.ts +35 -0
  55. package/src/compact/addLength.spec.ts +14 -0
  56. package/src/compact/addLength.ts +24 -0
  57. package/src/compact/defaults.ts +7 -0
  58. package/src/compact/fromU8a.spec.ts +84 -0
  59. package/src/compact/fromU8a.ts +109 -0
  60. package/src/compact/index.ts +28 -0
  61. package/src/compact/stripLength.spec.ts +17 -0
  62. package/src/compact/stripLength.ts +26 -0
  63. package/src/compact/toU8a.spec.ts +59 -0
  64. package/src/compact/toU8a.ts +53 -0
  65. package/src/compact/types.ts +4 -0
  66. package/src/detectPackage.spec.ts +110 -0
  67. package/src/detectPackage.ts +138 -0
  68. package/src/extractTime.spec.ts +21 -0
  69. package/src/extractTime.ts +71 -0
  70. package/src/float/index.ts +4 -0
  71. package/src/float/toU8a.spec.ts +52 -0
  72. package/src/float/toU8a.ts +30 -0
  73. package/src/format/formatBalance.spec.ts +296 -0
  74. package/src/format/formatBalance.ts +177 -0
  75. package/src/format/formatDate.spec.ts +17 -0
  76. package/src/format/formatDate.ts +22 -0
  77. package/src/format/formatDecimal.spec.ts +28 -0
  78. package/src/format/formatDecimal.ts +22 -0
  79. package/src/format/formatElapsed.spec.ts +44 -0
  80. package/src/format/formatElapsed.ts +35 -0
  81. package/src/format/formatNumber.spec.ts +60 -0
  82. package/src/format/formatNumber.ts +29 -0
  83. package/src/format/getSeparator.spec.ts +53 -0
  84. package/src/format/getSeparator.ts +15 -0
  85. package/src/format/index.ts +9 -0
  86. package/src/format/si.ts +52 -0
  87. package/src/has.spec.ts +12 -0
  88. package/src/has.ts +38 -0
  89. package/src/hex/addPrefix.spec.ts +32 -0
  90. package/src/hex/addPrefix.ts +26 -0
  91. package/src/hex/fixLength.spec.ts +38 -0
  92. package/src/hex/fixLength.ts +36 -0
  93. package/src/hex/hasPrefix.spec.ts +32 -0
  94. package/src/hex/hasPrefix.ts +24 -0
  95. package/src/hex/index.ts +16 -0
  96. package/src/hex/stripPrefix.spec.ts +44 -0
  97. package/src/hex/stripPrefix.ts +30 -0
  98. package/src/hex/toBigInt.spec.ts +74 -0
  99. package/src/hex/toBigInt.ts +19 -0
  100. package/src/hex/toBn.spec.ts +74 -0
  101. package/src/hex/toBn.ts +40 -0
  102. package/src/hex/toNumber.spec.ts +20 -0
  103. package/src/hex/toNumber.ts +24 -0
  104. package/src/hex/toString.spec.ts +20 -0
  105. package/src/hex/toString.ts +25 -0
  106. package/src/hex/toU8a.spec.ts +76 -0
  107. package/src/hex/toU8a.ts +68 -0
  108. package/src/hex/toU8aBuffer.spec.ts +38 -0
  109. package/src/hex/toU8aBuffer.ts +52 -0
  110. package/src/index.spec.ts +12 -0
  111. package/src/index.ts +6 -0
  112. package/src/is/array.spec.ts +20 -0
  113. package/src/is/array.ts +10 -0
  114. package/src/is/ascii.spec.ts +49 -0
  115. package/src/is/ascii.ts +52 -0
  116. package/src/is/bigInt.spec.ts +26 -0
  117. package/src/is/bigInt.ts +20 -0
  118. package/src/is/bn.spec.ts +21 -0
  119. package/src/is/bn.ts +23 -0
  120. package/src/is/boolean.spec.ts +26 -0
  121. package/src/is/boolean.ts +20 -0
  122. package/src/is/buffer.spec.ts +26 -0
  123. package/src/is/buffer.ts +28 -0
  124. package/src/is/childClass.spec.ts +36 -0
  125. package/src/is/childClass.ts +29 -0
  126. package/src/is/class.spec.ts +37 -0
  127. package/src/is/class.ts +12 -0
  128. package/src/is/codec.spec.ts +52 -0
  129. package/src/is/codec.ts +26 -0
  130. package/src/is/compact.spec.ts +27 -0
  131. package/src/is/compact.ts +19 -0
  132. package/src/is/error.spec.ts +20 -0
  133. package/src/is/error.ts +23 -0
  134. package/src/is/function.spec.ts +20 -0
  135. package/src/is/function.ts +23 -0
  136. package/src/is/helpers.ts +23 -0
  137. package/src/is/hex.spec.ts +77 -0
  138. package/src/is/hex.ts +36 -0
  139. package/src/is/index.ts +36 -0
  140. package/src/is/instanceOf.spec.ts +48 -0
  141. package/src/is/instanceOf.ts +24 -0
  142. package/src/is/ip.spec.ts +50 -0
  143. package/src/is/ip.ts +56 -0
  144. package/src/is/jsonObject.spec.ts +51 -0
  145. package/src/is/jsonObject.ts +45 -0
  146. package/src/is/null.spec.ts +20 -0
  147. package/src/is/null.ts +20 -0
  148. package/src/is/number.spec.ts +20 -0
  149. package/src/is/number.ts +20 -0
  150. package/src/is/object.spec.ts +32 -0
  151. package/src/is/object.ts +24 -0
  152. package/src/is/observable.spec.ts +26 -0
  153. package/src/is/observable.ts +22 -0
  154. package/src/is/promise.spec.ts +32 -0
  155. package/src/is/promise.ts +6 -0
  156. package/src/is/riscv.spec.ts +36 -0
  157. package/src/is/riscv.ts +27 -0
  158. package/src/is/string.spec.ts +32 -0
  159. package/src/is/string.ts +22 -0
  160. package/src/is/testChain.spec.ts +25 -0
  161. package/src/is/testChain.ts +12 -0
  162. package/src/is/toBigInt.spec.ts +22 -0
  163. package/src/is/toBigInt.ts +8 -0
  164. package/src/is/toBn.spec.ts +25 -0
  165. package/src/is/toBn.ts +8 -0
  166. package/src/is/u8a.spec.ts +42 -0
  167. package/src/is/u8a.ts +25 -0
  168. package/src/is/undefined.spec.ts +23 -0
  169. package/src/is/undefined.ts +21 -0
  170. package/src/is/utf8.spec.ts +42 -0
  171. package/src/is/utf8.ts +207 -0
  172. package/src/is/wasm.spec.ts +20 -0
  173. package/src/is/wasm.ts +17 -0
  174. package/src/lazy.spec.ts +71 -0
  175. package/src/lazy.ts +63 -0
  176. package/src/logger.spec.ts +188 -0
  177. package/src/logger.ts +160 -0
  178. package/src/memoize.spec.ts +79 -0
  179. package/src/memoize.ts +49 -0
  180. package/src/mod.ts +4 -0
  181. package/src/nextTick.ts +26 -0
  182. package/src/noop.ts +16 -0
  183. package/src/number/index.ts +9 -0
  184. package/src/number/toHex.spec.ts +44 -0
  185. package/src/number/toHex.ts +27 -0
  186. package/src/number/toU8a.spec.ts +50 -0
  187. package/src/number/toU8a.ts +25 -0
  188. package/src/object/clear.spec.ts +14 -0
  189. package/src/object/clear.ts +16 -0
  190. package/src/object/copy.spec.ts +17 -0
  191. package/src/object/copy.ts +12 -0
  192. package/src/object/entries.spec.ts +20 -0
  193. package/src/object/entries.ts +12 -0
  194. package/src/object/index.ts +10 -0
  195. package/src/object/keys.spec.ts +19 -0
  196. package/src/object/keys.ts +10 -0
  197. package/src/object/property.spec.ts +149 -0
  198. package/src/object/property.ts +39 -0
  199. package/src/object/spread.spec.ts +36 -0
  200. package/src/object/spread.ts +38 -0
  201. package/src/object/values.spec.ts +19 -0
  202. package/src/object/values.ts +10 -0
  203. package/src/packageDetect.ts +13 -0
  204. package/src/packageInfo.ts +6 -0
  205. package/src/promisify.spec.ts +50 -0
  206. package/src/promisify.ts +30 -0
  207. package/src/string/camelCase.spec.ts +119 -0
  208. package/src/string/camelCase.ts +79 -0
  209. package/src/string/index.ts +12 -0
  210. package/src/string/lowerFirst.spec.ts +41 -0
  211. package/src/string/lowerFirst.ts +46 -0
  212. package/src/string/pascalCase.spec.ts +26 -0
  213. package/src/string/shorten.spec.ts +38 -0
  214. package/src/string/shorten.ts +24 -0
  215. package/src/string/toHex.spec.ts +26 -0
  216. package/src/string/toHex.ts +27 -0
  217. package/src/string/toU8a.spec.ts +31 -0
  218. package/src/string/toU8a.ts +28 -0
  219. package/src/string/upperFirst.spec.ts +41 -0
  220. package/src/stringify.spec.ts +33 -0
  221. package/src/stringify.ts +20 -0
  222. package/src/test/index.ts +4 -0
  223. package/src/test/performance.ts +92 -0
  224. package/src/types.ts +100 -0
  225. package/src/u8a/cmp.spec.ts +62 -0
  226. package/src/u8a/cmp.ts +50 -0
  227. package/src/u8a/concat.spec.ts +42 -0
  228. package/src/u8a/concat.ts +60 -0
  229. package/src/u8a/concatBuffer.ts +34 -0
  230. package/src/u8a/empty.spec.ts +46 -0
  231. package/src/u8a/empty.ts +22 -0
  232. package/src/u8a/eq.spec.ts +113 -0
  233. package/src/u8a/eq.ts +46 -0
  234. package/src/u8a/fixLength.spec.ts +34 -0
  235. package/src/u8a/fixLength.ts +34 -0
  236. package/src/u8a/index.ts +22 -0
  237. package/src/u8a/sorted.spec.ts +20 -0
  238. package/src/u8a/sorted.ts +22 -0
  239. package/src/u8a/toBigInt.spec.ts +106 -0
  240. package/src/u8a/toBigInt.ts +100 -0
  241. package/src/u8a/toBn.spec.ts +106 -0
  242. package/src/u8a/toBn.ts +101 -0
  243. package/src/u8a/toBuffer.spec.ts +20 -0
  244. package/src/u8a/toBuffer.ts +28 -0
  245. package/src/u8a/toFloat.spec.ts +86 -0
  246. package/src/u8a/toFloat.ts +26 -0
  247. package/src/u8a/toHex.spec.ts +94 -0
  248. package/src/u8a/toHex.ts +68 -0
  249. package/src/u8a/toHexBuffer.spec.ts +63 -0
  250. package/src/u8a/toHexBuffer.ts +30 -0
  251. package/src/u8a/toNumber.spec.ts +47 -0
  252. package/src/u8a/toNumber.ts +80 -0
  253. package/src/u8a/toString.spec.ts +36 -0
  254. package/src/u8a/toString.ts +26 -0
  255. package/src/u8a/toU8a.spec.ts +63 -0
  256. package/src/u8a/toU8a.ts +46 -0
  257. package/src/u8a/wrap.spec.ts +139 -0
  258. package/src/u8a/wrap.ts +65 -0
  259. package/tsconfig.build.json +19 -0
  260. 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
+ });
@@ -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
+ }
@@ -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
+ });