@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,26 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { HexString } from '../types.js';
|
|
5
|
+
|
|
6
|
+
import { hexHasPrefix } from './hasPrefix.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @name hexAddPrefix
|
|
10
|
+
* @summary Adds the `0x` prefix to string values.
|
|
11
|
+
* @description
|
|
12
|
+
* Returns a `0x` prefixed string from the input value. If the input is already prefixed, it is returned unchanged.
|
|
13
|
+
* @example
|
|
14
|
+
* <BR>
|
|
15
|
+
*
|
|
16
|
+
* ```javascript
|
|
17
|
+
* import { hexAddPrefix } from '@pezkuwi/util';
|
|
18
|
+
*
|
|
19
|
+
* console.log('With prefix', hexAddPrefix('0a0b12')); // => 0x0a0b12
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function hexAddPrefix (value?: string | null): HexString {
|
|
23
|
+
return value && hexHasPrefix(value)
|
|
24
|
+
? value
|
|
25
|
+
: `0x${value && value.length % 2 === 1 ? '0' : ''}${value || ''}`;
|
|
26
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 { hexFixLength } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('hexFixLength', (): void => {
|
|
9
|
+
it('returns bitLength === -1 as-is', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
hexFixLength('0x12345678')
|
|
12
|
+
).toEqual('0x12345678');
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('does not change when bitlength === length', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
hexFixLength('0x12345678', 32)
|
|
18
|
+
).toEqual('0x12345678');
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('trims values when bitLength > length', (): void => {
|
|
22
|
+
expect(
|
|
23
|
+
hexFixLength('0x12345678', 16)
|
|
24
|
+
).toEqual('0x5678');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('returns as-is when bitLength < length', (): void => {
|
|
28
|
+
expect(
|
|
29
|
+
hexFixLength('0x1234', 32)
|
|
30
|
+
).toEqual('0x1234');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('adds zeros when bitLength < length (withPadded)', (): void => {
|
|
34
|
+
expect(
|
|
35
|
+
hexFixLength('0x1234', 32, true)
|
|
36
|
+
).toEqual('0x00001234');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { HexString } from '../types.js';
|
|
5
|
+
|
|
6
|
+
import { hexAddPrefix } from './addPrefix.js';
|
|
7
|
+
import { hexStripPrefix } from './stripPrefix.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @name hexFixLength
|
|
11
|
+
* @summary Shifts a hex string to a specific bitLength
|
|
12
|
+
* @description
|
|
13
|
+
* Returns a `0x` prefixed string 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. Input values with less bits are returned as-is by default. When `withPadding` is set, shorter values are padded with `0`.
|
|
14
|
+
* @example
|
|
15
|
+
* <BR>
|
|
16
|
+
*
|
|
17
|
+
* ```javascript
|
|
18
|
+
* import { hexFixLength } from '@pezkuwi/util';
|
|
19
|
+
*
|
|
20
|
+
* console.log('fixed', hexFixLength('0x12', 16)); // => 0x12
|
|
21
|
+
* console.log('fixed', hexFixLength('0x12', 16, true)); // => 0x0012
|
|
22
|
+
* console.log('fixed', hexFixLength('0x0012', 8)); // => 0x12
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function hexFixLength (value: string, bitLength = -1, withPadding = false): HexString {
|
|
26
|
+
const strLength = Math.ceil(bitLength / 4);
|
|
27
|
+
const hexLength = strLength + 2;
|
|
28
|
+
|
|
29
|
+
return hexAddPrefix(
|
|
30
|
+
(bitLength === -1 || value.length === hexLength || (!withPadding && value.length < hexLength))
|
|
31
|
+
? hexStripPrefix(value)
|
|
32
|
+
: (value.length > hexLength)
|
|
33
|
+
? hexStripPrefix(value).slice(-1 * strLength)
|
|
34
|
+
: `${'0'.repeat(strLength)}${hexStripPrefix(value)}`.slice(-1 * strLength)
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
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 { hexHasPrefix } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('hexHasPrefix', (): void => {
|
|
9
|
+
it('returns true when hex prefix is found', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
hexHasPrefix('0x1234')
|
|
12
|
+
).toEqual(true);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('returns false when no prefix attached', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
hexHasPrefix('123')
|
|
18
|
+
).toEqual(false);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('returns false when null value supplied', (): void => {
|
|
22
|
+
expect(
|
|
23
|
+
hexHasPrefix(null)
|
|
24
|
+
).toEqual(false);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('returns false when non-string value supplied', (): void => {
|
|
28
|
+
expect(
|
|
29
|
+
hexHasPrefix(false as unknown as string)
|
|
30
|
+
).toEqual(false);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { HexString } from '../types.js';
|
|
5
|
+
|
|
6
|
+
import { isHex } from '../is/hex.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @name hexHasPrefix
|
|
10
|
+
* @summary Tests for the existence of a `0x` prefix.
|
|
11
|
+
* @description
|
|
12
|
+
* Checks for a valid hex input value and if the start matched `0x`
|
|
13
|
+
* @example
|
|
14
|
+
* <BR>
|
|
15
|
+
*
|
|
16
|
+
* ```javascript
|
|
17
|
+
* import { hexHasPrefix } from '@pezkuwi/util';
|
|
18
|
+
*
|
|
19
|
+
* console.log('has prefix', hexHasPrefix('0x1234')); // => true
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function hexHasPrefix (value?: string | null): value is HexString {
|
|
23
|
+
return !!value && isHex(value, -1);
|
|
24
|
+
}
|
package/src/hex/index.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @summary Internal utilities to create and test for hex values
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { hexAddPrefix } from './addPrefix.js';
|
|
9
|
+
export { hexFixLength } from './fixLength.js';
|
|
10
|
+
export { hexHasPrefix } from './hasPrefix.js';
|
|
11
|
+
export { hexStripPrefix } from './stripPrefix.js';
|
|
12
|
+
export { hexToBigInt } from './toBigInt.js';
|
|
13
|
+
export { hexToBn } from './toBn.js';
|
|
14
|
+
export { hexToNumber } from './toNumber.js';
|
|
15
|
+
export { hexToString } from './toString.js';
|
|
16
|
+
export { hexToU8a } from './toU8a.js';
|
|
@@ -0,0 +1,44 @@
|
|
|
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 { hexStripPrefix } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('hexStripPrefix', (): void => {
|
|
9
|
+
it('returns an empty string when null value supplied', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
hexStripPrefix(null)
|
|
12
|
+
).toEqual('');
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('returns an empty string when 0x value supplied', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
hexStripPrefix('0x')
|
|
18
|
+
).toEqual('');
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('strips the prefix from hex strings', (): void => {
|
|
22
|
+
expect(
|
|
23
|
+
hexStripPrefix('0x1223')
|
|
24
|
+
).toEqual('1223');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('strips the prefix from hex strings (non 2 lnegth)', (): void => {
|
|
28
|
+
expect(
|
|
29
|
+
hexStripPrefix('0x123')
|
|
30
|
+
).toEqual('123');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('returns un-prefixed hex as-is', (): void => {
|
|
34
|
+
expect(
|
|
35
|
+
hexStripPrefix('abcd1223')
|
|
36
|
+
).toEqual('abcd1223');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('throws when invalid hex', (): void => {
|
|
40
|
+
expect(
|
|
41
|
+
() => hexStripPrefix('0x0x01ab')
|
|
42
|
+
).toThrow(/Expected hex value to convert/);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { REGEX_HEX_NOPREFIX, REGEX_HEX_PREFIXED } from '../is/hex.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @name hexStripPrefix
|
|
8
|
+
* @summary Strips any leading `0x` prefix.
|
|
9
|
+
* @description
|
|
10
|
+
* Tests for the existence of a `0x` prefix, and returns the value without the prefix. Un-prefixed values are returned as-is.
|
|
11
|
+
* @example
|
|
12
|
+
* <BR>
|
|
13
|
+
*
|
|
14
|
+
* ```javascript
|
|
15
|
+
* import { hexStripPrefix } from '@pezkuwi/util';
|
|
16
|
+
*
|
|
17
|
+
* console.log('stripped', hexStripPrefix('0x1234')); // => 1234
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function hexStripPrefix (value?: string | null): string {
|
|
21
|
+
if (!value || value === '0x') {
|
|
22
|
+
return '';
|
|
23
|
+
} else if (REGEX_HEX_PREFIXED.test(value)) {
|
|
24
|
+
return value.substring(2);
|
|
25
|
+
} else if (REGEX_HEX_NOPREFIX.test(value)) {
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
throw new Error(`Expected hex value to convert, found '${value}'`);
|
|
30
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
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 { hexToBigInt } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('hexToBigInt', (): void => {
|
|
9
|
+
it('converts prefixed hex values to BN', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
hexToBigInt('0x81')
|
|
12
|
+
).toEqual(0x81n);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('converts null values to BN(0)', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
hexToBigInt(null)
|
|
18
|
+
).toEqual(0n);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('converts 0x values to BN(0)', (): void => {
|
|
22
|
+
expect(
|
|
23
|
+
hexToBigInt('0x')
|
|
24
|
+
).toEqual(0n);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('should convert with Big Endian by default', (): void => {
|
|
28
|
+
expect(
|
|
29
|
+
hexToBigInt('0x0100123456')
|
|
30
|
+
).toEqual(0x0100123456n);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('converts 0x values to BN(0) (LE)', (): void => {
|
|
34
|
+
expect(
|
|
35
|
+
hexToBigInt('0x', { isLe: true })
|
|
36
|
+
).toEqual(0n);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('converts little-endian', (): void => {
|
|
40
|
+
expect(
|
|
41
|
+
hexToBigInt('0x4500000000000000', { isLe: true })
|
|
42
|
+
).toEqual(69n);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('handles negative numbers (LE)', (): void => {
|
|
46
|
+
expect(
|
|
47
|
+
hexToBigInt('0x2efb', { isLe: true, isNegative: true })
|
|
48
|
+
).toEqual(-1234n);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('handles negative numbers (BE)', (): void => {
|
|
52
|
+
expect(
|
|
53
|
+
hexToBigInt('0xfb2e', { isLe: false, isNegative: true })
|
|
54
|
+
).toEqual(-1234n);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('handles negative numbers (LE, 128)', (): void => {
|
|
58
|
+
expect(
|
|
59
|
+
hexToBigInt('0x00009c584c491ff2ffffffffffffffff', { isLe: true, isNegative: true })
|
|
60
|
+
).toEqual(-1000000000000000000n);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('handles starting zeros correctly (BE)', (): void => {
|
|
64
|
+
expect(
|
|
65
|
+
hexToBigInt('0x0000000000000100', { isLe: false })
|
|
66
|
+
).toEqual(256n);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('handles starting zeros correctly (LE)', (): void => {
|
|
70
|
+
expect(
|
|
71
|
+
hexToBigInt('0x0001000000000000', { isLe: true })
|
|
72
|
+
).toEqual(256n);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { ToBnOptions } from '../types.js';
|
|
5
|
+
|
|
6
|
+
import { BigInt } from '@pezkuwi/x-bigint';
|
|
7
|
+
|
|
8
|
+
import { u8aToBigInt } from '../u8a/toBigInt.js';
|
|
9
|
+
import { hexToU8a } from './toU8a.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @name hexToBigInt
|
|
13
|
+
* @summary Creates a BigInt instance object from a hex string.
|
|
14
|
+
*/
|
|
15
|
+
export function hexToBigInt (value?: string | null, { isLe = false, isNegative = false }: ToBnOptions = {}): bigint {
|
|
16
|
+
return !value || value === '0x'
|
|
17
|
+
? BigInt(0)
|
|
18
|
+
: u8aToBigInt(hexToU8a(value), { isLe, isNegative });
|
|
19
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
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 { hexToBn } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('hexToBn', (): void => {
|
|
9
|
+
it('converts prefixed hex values to BN', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
hexToBn('0x81').toString(16)
|
|
12
|
+
).toBe('81');
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('converts null values to BN(0)', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
hexToBn(null).toNumber()
|
|
18
|
+
).toBe(0);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('converts 0x values to BN(0)', (): void => {
|
|
22
|
+
expect(
|
|
23
|
+
hexToBn('0x').toNumber()
|
|
24
|
+
).toBe(0);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('should convert with Big Endian by default', (): void => {
|
|
28
|
+
expect(
|
|
29
|
+
hexToBn('0x0100').toNumber()
|
|
30
|
+
).toBe(256);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('converts 0x values to BN(0) (LE)', (): void => {
|
|
34
|
+
expect(
|
|
35
|
+
hexToBn('0x', { isLe: true }).toNumber()
|
|
36
|
+
).toBe(0);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('converts little-endian', (): void => {
|
|
40
|
+
expect(
|
|
41
|
+
hexToBn('0x4500000000000000', { isLe: true }).toNumber()
|
|
42
|
+
).toBe(69);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('handles negative numbers (LE)', (): void => {
|
|
46
|
+
expect(
|
|
47
|
+
hexToBn('0x2efb', { isLe: true, isNegative: true }).toNumber()
|
|
48
|
+
).toBe(-1234);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('handles negative numbers (BE)', (): void => {
|
|
52
|
+
expect(
|
|
53
|
+
hexToBn('0xfb2e', { isLe: false, isNegative: true }).toNumber()
|
|
54
|
+
).toBe(-1234);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('handles negative numbers (LE, 128)', (): void => {
|
|
58
|
+
expect(
|
|
59
|
+
hexToBn('0x00009c584c491ff2ffffffffffffffff', { isLe: true, isNegative: true }).toString()
|
|
60
|
+
).toEqual('-1000000000000000000');
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('handles starting zeros correctly (BE)', (): void => {
|
|
64
|
+
expect(
|
|
65
|
+
hexToBn('0x0000000000000100', { isLe: false }).toNumber()
|
|
66
|
+
).toBe(256);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('handles starting zeros correctly (LE)', (): void => {
|
|
70
|
+
expect(
|
|
71
|
+
hexToBn('0x0001000000000000', { isLe: true }).toNumber()
|
|
72
|
+
).toBe(256);
|
|
73
|
+
});
|
|
74
|
+
});
|
package/src/hex/toBn.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { ToBnOptions } from '../types.js';
|
|
5
|
+
|
|
6
|
+
import { BN } from '../bn/bn.js';
|
|
7
|
+
import { hexStripPrefix } from './stripPrefix.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @name hexToBn
|
|
11
|
+
* @summary Creates a BN.js object from a hex string.
|
|
12
|
+
* @description
|
|
13
|
+
* `null` inputs returns a `BN(0)` result. Hex input values return the actual value converted to a BN. Anything that is not a hex string (including the `0x` prefix) throws an error.
|
|
14
|
+
* @param _value The value to convert
|
|
15
|
+
* @param _options Options to pass while converting
|
|
16
|
+
* @param _options.isLe Convert using Little Endian
|
|
17
|
+
* @param _options.isNegative Convert using two's complement
|
|
18
|
+
* @example
|
|
19
|
+
* <BR>
|
|
20
|
+
*
|
|
21
|
+
* ```javascript
|
|
22
|
+
* import { hexToBn } from '@pezkuwi/util';
|
|
23
|
+
*
|
|
24
|
+
* hexToBn('0x123480001f'); // => BN(0x123480001f)
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function hexToBn (value?: string | null, { isLe = false, isNegative = false }: ToBnOptions = {}): BN {
|
|
28
|
+
if (!value || value === '0x') {
|
|
29
|
+
return new BN(0);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const stripped = hexStripPrefix(value);
|
|
33
|
+
const bn = new BN(stripped, 16, isLe ? 'le' : 'be');
|
|
34
|
+
|
|
35
|
+
// fromTwos takes as parameter the number of bits, which is the hex length
|
|
36
|
+
// multiplied by 4 (2 bytes being 8 bits)
|
|
37
|
+
return isNegative
|
|
38
|
+
? bn.fromTwos(stripped.length * 4)
|
|
39
|
+
: bn;
|
|
40
|
+
}
|
|
@@ -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 { hexToNumber } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('hexToNumber', (): void => {
|
|
9
|
+
it('converts an empty to NaN', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
hexToNumber()
|
|
12
|
+
).toEqual(NaN);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('converts to a number from hex', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
hexToNumber('0x1234')
|
|
18
|
+
).toEqual(0x1234);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { hexToBn } from './toBn.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @name hexToNumber
|
|
8
|
+
* @summary Creates a Number value from a Buffer object.
|
|
9
|
+
* @description
|
|
10
|
+
* `null` inputs returns an NaN result, `hex` values return the actual value as a `Number`.
|
|
11
|
+
* @example
|
|
12
|
+
* <BR>
|
|
13
|
+
*
|
|
14
|
+
* ```javascript
|
|
15
|
+
* import { hexToNumber } from '@pezkuwi/util';
|
|
16
|
+
*
|
|
17
|
+
* hexToNumber('0x1234'); // => 0x1234
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function hexToNumber (value?: string | null): number {
|
|
21
|
+
return value
|
|
22
|
+
? hexToBn(value).toNumber()
|
|
23
|
+
: NaN;
|
|
24
|
+
}
|
|
@@ -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 { hexToString } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('hexToString', (): void => {
|
|
9
|
+
it('converts an empty to ""', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
hexToString()
|
|
12
|
+
).toEqual('');
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('converts to a string from hex', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
hexToString('0x68656c6c6f')
|
|
18
|
+
).toEqual('hello');
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { u8aToString } from '../u8a/toString.js';
|
|
5
|
+
import { hexToU8a } from './toU8a.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @name hexToU8a
|
|
9
|
+
* @summary Creates a Uint8Array object from a hex string.
|
|
10
|
+
* @description
|
|
11
|
+
* Hex input values return the actual bytes value converted to a string. Anything that is not a hex string (including the `0x` prefix) throws an error.
|
|
12
|
+
* @example
|
|
13
|
+
* <BR>
|
|
14
|
+
*
|
|
15
|
+
* ```javascript
|
|
16
|
+
* import { hexToString } from '@pezkuwi/util';
|
|
17
|
+
*
|
|
18
|
+
* hexToU8a('0x68656c6c6f'); // hello
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function hexToString (_value?: string | null): string {
|
|
22
|
+
return u8aToString(
|
|
23
|
+
hexToU8a(_value)
|
|
24
|
+
);
|
|
25
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
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 { perfCmp } from '../test/index.js';
|
|
7
|
+
import { hexToU8a } from './index.js';
|
|
8
|
+
import { hexToU8a as hexToU8aBuffer } from './toU8aBuffer.js';
|
|
9
|
+
|
|
10
|
+
let ptest = '0x';
|
|
11
|
+
|
|
12
|
+
for (let i = 0; i < 1_000_000; i++) {
|
|
13
|
+
ptest += (i % 256).toString(16);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe('hexToU8a', (): void => {
|
|
17
|
+
it('returns an empty Uint8Array when null provided', (): void => {
|
|
18
|
+
expect(
|
|
19
|
+
hexToU8a(null)
|
|
20
|
+
).toHaveLength(0);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('returns an empty Uint8Array when 0x provided', (): void => {
|
|
24
|
+
expect(
|
|
25
|
+
hexToU8a('0x')
|
|
26
|
+
).toHaveLength(0);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('returns a Uint8Array with the correct values', (): void => {
|
|
30
|
+
expect(
|
|
31
|
+
hexToU8a('0x80000a')
|
|
32
|
+
).toEqual(
|
|
33
|
+
new Uint8Array([128, 0, 10])
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('returns a Uint8Array with the correct values (bitLength > provided)', (): void => {
|
|
38
|
+
expect(
|
|
39
|
+
hexToU8a('0x80000A', 64)
|
|
40
|
+
).toEqual(
|
|
41
|
+
new Uint8Array([0, 0, 0, 0, 0, 128, 0, 10])
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('returns a Uint8Array with the correct values (bitLength < provided)', (): void => {
|
|
46
|
+
expect(
|
|
47
|
+
hexToU8a('0x80000a', 16)
|
|
48
|
+
).toEqual(
|
|
49
|
+
new Uint8Array([128, 0])
|
|
50
|
+
);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('converts a non-aligned string', (): void => {
|
|
54
|
+
expect(
|
|
55
|
+
hexToU8a('0x123')
|
|
56
|
+
).toEqual(new Uint8Array([0x12, 0x30]));
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('converts known bytes to their correct values', (): void => {
|
|
60
|
+
expect(
|
|
61
|
+
hexToU8a('0x68656c6c6f20776f726c64') // hello world (11 bytes, non-aligned)
|
|
62
|
+
).toEqual(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64]));
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('converts known bytes to their correct values (upper/lower)', (): void => {
|
|
66
|
+
expect(
|
|
67
|
+
hexToU8a('0x68656C6c6f20776F726c64') // hello world (11 bytes, non-aligned)
|
|
68
|
+
).toEqual(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64]));
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
perfCmp('hexToU8a', ['hexToU8aBuffer', 'hexToU8a'], 40, [[ptest]], (s: string, isSecond) =>
|
|
72
|
+
isSecond
|
|
73
|
+
? hexToU8a(s)
|
|
74
|
+
: hexToU8aBuffer(s)
|
|
75
|
+
);
|
|
76
|
+
});
|