@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,52 @@
|
|
|
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 { isCodec } from './index.js';
|
|
8
|
+
|
|
9
|
+
const VALID = {
|
|
10
|
+
registry: {
|
|
11
|
+
get: () => null
|
|
12
|
+
},
|
|
13
|
+
toHex: () => '0x',
|
|
14
|
+
toHuman: () => '0x',
|
|
15
|
+
toU8a: () => new Uint8Array()
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
describe('isCodec', (): void => {
|
|
19
|
+
it('is false on no value', (): void => {
|
|
20
|
+
expect(isCodec()).toEqual(false);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('is true when codec-like signature is found', (): void => {
|
|
24
|
+
expect(
|
|
25
|
+
isCodec(VALID)
|
|
26
|
+
).toEqual(true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('is true when invalid codec-like signature is found', (): void => {
|
|
30
|
+
expect(
|
|
31
|
+
isCodec({
|
|
32
|
+
toHex: () => '0x',
|
|
33
|
+
toU8a: () => new Uint8Array()
|
|
34
|
+
})
|
|
35
|
+
).toEqual(false);
|
|
36
|
+
expect(
|
|
37
|
+
isCodec({
|
|
38
|
+
registry: {
|
|
39
|
+
get: () => null
|
|
40
|
+
},
|
|
41
|
+
toHex: 1,
|
|
42
|
+
toU8a: () => new Uint8Array()
|
|
43
|
+
})
|
|
44
|
+
).toEqual(false);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
perfCmp('isCodec', ['isCodec', 'instanceof'], 500_000, [[VALID]], (v: unknown, isSecond) =>
|
|
48
|
+
isSecond
|
|
49
|
+
? !(v instanceof String)
|
|
50
|
+
: isCodec(v)
|
|
51
|
+
);
|
|
52
|
+
});
|
package/src/is/codec.ts
ADDED
|
@@ -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 { isOnObject } from './helpers.js';
|
|
7
|
+
|
|
8
|
+
interface Registry {
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
get: (...params: never[]) => any;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface Codec {
|
|
14
|
+
readonly registry: Registry;
|
|
15
|
+
|
|
16
|
+
toHex (...params: never[]): HexString;
|
|
17
|
+
toHuman (...params: never[]): unknown;
|
|
18
|
+
toU8a: (...params: never[]) => Uint8Array;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const checkCodec = /*#__PURE__*/ isOnObject<Codec>('toHex', 'toHuman', 'toU8a');
|
|
22
|
+
const checkRegistry = /*#__PURE__*/ isOnObject<Registry>('get');
|
|
23
|
+
|
|
24
|
+
export function isCodec <T extends Codec = Codec> (value?: unknown): value is T {
|
|
25
|
+
return checkCodec(value) && checkRegistry(value.registry);
|
|
26
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
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 BN from 'bn.js';
|
|
7
|
+
|
|
8
|
+
import { isCompact } from './index.js';
|
|
9
|
+
|
|
10
|
+
describe('isCompact', (): void => {
|
|
11
|
+
it('is false on no value', (): void => {
|
|
12
|
+
expect(isCompact()).toEqual(false);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('is false on non-compact value', (): void => {
|
|
16
|
+
expect(isCompact(123)).toEqual(false);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('is true when compact-like signature is found', (): void => {
|
|
20
|
+
expect(isCompact({
|
|
21
|
+
toBigInt: () => BigInt(1),
|
|
22
|
+
toBn: () => new BN(1),
|
|
23
|
+
toNumber: () => 1,
|
|
24
|
+
unwrap: () => new BN(1)
|
|
25
|
+
})).toEqual(true);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { BN } from '../bn/bn.js';
|
|
5
|
+
|
|
6
|
+
import { isOnObject } from './helpers.js';
|
|
7
|
+
|
|
8
|
+
interface Compact<T> {
|
|
9
|
+
toBigInt (): bigint;
|
|
10
|
+
toBn (): BN;
|
|
11
|
+
toNumber (): number;
|
|
12
|
+
unwrap (): T;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @name isCompact
|
|
17
|
+
* @summary Tests for SCALE-Compact-like object instance.
|
|
18
|
+
*/
|
|
19
|
+
export const isCompact: <T> (value?: unknown) => value is Compact<T> = /*#__PURE__*/ isOnObject('toBigInt', 'toBn', 'toNumber', 'unwrap');
|
|
@@ -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 { isError } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('isError', (): void => {
|
|
9
|
+
it('returns true when an Error value', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
isError(new Error('testing'))
|
|
12
|
+
).toEqual(true);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('returns false on non-Error values', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
isError(0)
|
|
18
|
+
).toEqual(false);
|
|
19
|
+
});
|
|
20
|
+
});
|
package/src/is/error.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @name isError
|
|
6
|
+
* @summary Tests for a `Error` object instance.
|
|
7
|
+
* @description
|
|
8
|
+
* Checks to see if the input object is an instance of `Error`.
|
|
9
|
+
* @example
|
|
10
|
+
* <BR>
|
|
11
|
+
*
|
|
12
|
+
* ```javascript
|
|
13
|
+
* import { isError } from '@pezkuwi/util';
|
|
14
|
+
*
|
|
15
|
+
* console.log('isError', isError(new Error('message'))); // => true
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function isError (value: unknown): value is Error {
|
|
19
|
+
return (
|
|
20
|
+
((value && (value as Error).constructor) === Error) ||
|
|
21
|
+
value instanceof Error
|
|
22
|
+
);
|
|
23
|
+
}
|
|
@@ -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 { isFunction } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('isFunction', (): void => {
|
|
9
|
+
it('returns true on valid functions', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
isFunction(isFunction)
|
|
12
|
+
).toEqual(true);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('returns false on invalid functions', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
isFunction('notAFunction')
|
|
18
|
+
).toEqual(false);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
5
|
+
type FnType = Function;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @name isFunction
|
|
9
|
+
* @summary Tests for a `function`.
|
|
10
|
+
* @description
|
|
11
|
+
* Checks to see if the input value is a JavaScript function.
|
|
12
|
+
* @example
|
|
13
|
+
* <BR>
|
|
14
|
+
*
|
|
15
|
+
* ```javascript
|
|
16
|
+
* import { isFunction } from '@pezkuwi/util';
|
|
17
|
+
*
|
|
18
|
+
* isFunction(() => false); // => true
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function isFunction (value: unknown): value is FnType {
|
|
22
|
+
return typeof value === 'function';
|
|
23
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { isFunction } from './function.js';
|
|
5
|
+
import { isObject } from './object.js';
|
|
6
|
+
|
|
7
|
+
export function isOn <T> (...fns: (keyof T)[]): (value?: unknown) => value is T {
|
|
8
|
+
return (value?: unknown): value is T =>
|
|
9
|
+
(isObject(value) || isFunction(value)) &&
|
|
10
|
+
fns.every((f) => isFunction((value as T)[f]));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function isOnFunction <T> (...fns: (keyof T)[]): (value?: unknown) => value is T {
|
|
14
|
+
return (value?: unknown): value is T =>
|
|
15
|
+
isFunction(value) &&
|
|
16
|
+
fns.every((f) => isFunction((value as T)[f]));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function isOnObject <T> (...fns: (keyof T)[]): (value?: unknown) => value is T {
|
|
20
|
+
return (value?: unknown): value is T =>
|
|
21
|
+
isObject(value) &&
|
|
22
|
+
fns.every((f) => isFunction((value as T)[f]));
|
|
23
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
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 { isHex } from './index.js';
|
|
8
|
+
|
|
9
|
+
describe('isHex', (): void => {
|
|
10
|
+
const test = '1234abcd';
|
|
11
|
+
const ptest = `0x${'1234567890abcdef'.repeat(8192)}`;
|
|
12
|
+
|
|
13
|
+
it('returns true on 0x hex values', (): void => {
|
|
14
|
+
expect(
|
|
15
|
+
isHex('0x')
|
|
16
|
+
).toEqual(true);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('returns true on hex values', (): void => {
|
|
20
|
+
expect(
|
|
21
|
+
isHex(`0x${test}`)
|
|
22
|
+
).toEqual(true);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('returns true on hex values with String', (): void => {
|
|
26
|
+
expect(
|
|
27
|
+
isHex(String(`0x${test}`))
|
|
28
|
+
).toEqual(true);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('returns false on hex values (non % 2)', (): void => {
|
|
32
|
+
expect(
|
|
33
|
+
isHex(`0x${test}0`)
|
|
34
|
+
).toEqual(false);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('returns true on uppercase values', (): void => {
|
|
38
|
+
expect(
|
|
39
|
+
isHex(`0x${test.toUpperCase()}`)
|
|
40
|
+
).toEqual(true);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('return false on hex values unprefixed', (): void => {
|
|
44
|
+
expect(
|
|
45
|
+
isHex(test)
|
|
46
|
+
).toEqual(false);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('returns false on non-string values', (): void => {
|
|
50
|
+
expect(
|
|
51
|
+
isHex(false)
|
|
52
|
+
).toEqual(false);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('returns true when valid hex and bitLength matches', (): void => {
|
|
56
|
+
expect(
|
|
57
|
+
isHex('0x1234', 16)
|
|
58
|
+
).toEqual(true);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('returns true when valid hex and bitLength does not match', (): void => {
|
|
62
|
+
expect(
|
|
63
|
+
isHex('0x1234', 8)
|
|
64
|
+
).toEqual(false);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('does ignore lengths as required', (): void => {
|
|
68
|
+
expect(
|
|
69
|
+
isHex('0x123')
|
|
70
|
+
).toEqual(false);
|
|
71
|
+
expect(
|
|
72
|
+
isHex('0x123', -1, true)
|
|
73
|
+
).toEqual(true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
perf(`isHex (${(ptest.length - 2) / 2} bytes)`, 1000, [[ptest]], isHex);
|
|
77
|
+
});
|
package/src/is/hex.ts
ADDED
|
@@ -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
|
+
export const REGEX_HEX_PREFIXED = /^0x[\da-fA-F]+$/;
|
|
7
|
+
|
|
8
|
+
export const REGEX_HEX_NOPREFIX = /^[\da-fA-F]+$/;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @name isHex
|
|
12
|
+
* @summary Tests for a hex string.
|
|
13
|
+
* @description
|
|
14
|
+
* Checks to see if the input value is a `0x` prefixed hex string. Optionally (`bitLength` !== -1) checks to see if the bitLength is correct.
|
|
15
|
+
* @example
|
|
16
|
+
* <BR>
|
|
17
|
+
*
|
|
18
|
+
* ```javascript
|
|
19
|
+
* import { isHex } from '@pezkuwi/util';
|
|
20
|
+
*
|
|
21
|
+
* isHex('0x1234'); // => true
|
|
22
|
+
* isHex('0x1234', 8); // => false
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function isHex (value: unknown, bitLength = -1, ignoreLength?: boolean): value is HexString {
|
|
26
|
+
return (
|
|
27
|
+
typeof value === 'string' && (
|
|
28
|
+
value === '0x' ||
|
|
29
|
+
REGEX_HEX_PREFIXED.test(value)
|
|
30
|
+
)
|
|
31
|
+
) && (
|
|
32
|
+
bitLength === -1
|
|
33
|
+
? (ignoreLength || (value.length % 2 === 0))
|
|
34
|
+
: (value.length === (2 + Math.ceil(bitLength / 4)))
|
|
35
|
+
);
|
|
36
|
+
}
|
package/src/is/index.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @summary Type checking utilities
|
|
6
|
+
*/
|
|
7
|
+
export { isArray } from './array.js';
|
|
8
|
+
export { isAscii } from './ascii.js';
|
|
9
|
+
export { isBigInt } from './bigInt.js';
|
|
10
|
+
export { isBn } from './bn.js';
|
|
11
|
+
export { isBoolean } from './boolean.js';
|
|
12
|
+
export { isBuffer } from './buffer.js';
|
|
13
|
+
export { isChildClass } from './childClass.js';
|
|
14
|
+
export { isClass } from './class.js';
|
|
15
|
+
export { isCodec } from './codec.js';
|
|
16
|
+
export { isCompact } from './compact.js';
|
|
17
|
+
export { isError } from './error.js';
|
|
18
|
+
export { isFunction } from './function.js';
|
|
19
|
+
export { isHex } from './hex.js';
|
|
20
|
+
export { isInstanceOf } from './instanceOf.js';
|
|
21
|
+
export { isIp } from './ip.js';
|
|
22
|
+
export { isJsonObject } from './jsonObject.js';
|
|
23
|
+
export { isNull } from './null.js';
|
|
24
|
+
export { isNumber } from './number.js';
|
|
25
|
+
export { isObject } from './object.js';
|
|
26
|
+
export { isObservable } from './observable.js';
|
|
27
|
+
export { isPromise } from './promise.js';
|
|
28
|
+
export { isRiscV } from './riscv.js';
|
|
29
|
+
export { isString } from './string.js';
|
|
30
|
+
export { isTestChain } from './testChain.js';
|
|
31
|
+
export { isToBigInt } from './toBigInt.js';
|
|
32
|
+
export { isToBn } from './toBn.js';
|
|
33
|
+
export { isU8a } from './u8a.js';
|
|
34
|
+
export { isUndefined } from './undefined.js';
|
|
35
|
+
export { isUtf8 } from './utf8.js';
|
|
36
|
+
export { isWasm } from './wasm.js';
|
|
@@ -0,0 +1,48 @@
|
|
|
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 { isInstanceOf } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('isInstanceOf', (): void => {
|
|
9
|
+
it('returns true on real instances', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
isInstanceOf(new Array(2), Array)
|
|
12
|
+
).toEqual(true);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('returns true on real instances (inherited)', (): void => {
|
|
16
|
+
class Test extends Array {
|
|
17
|
+
// default
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
expect(
|
|
21
|
+
isInstanceOf(new Test(2), Array)
|
|
22
|
+
).toEqual(true);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('returns false on non-allocated instances', (): void => {
|
|
26
|
+
expect(
|
|
27
|
+
isInstanceOf([], Array)
|
|
28
|
+
).toEqual(true);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('returns false on non-instances', (): void => {
|
|
32
|
+
expect(
|
|
33
|
+
isInstanceOf('array', Array)
|
|
34
|
+
).toEqual(false);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('returns false when class not specified', (): void => {
|
|
38
|
+
expect(
|
|
39
|
+
isInstanceOf('array', Array)
|
|
40
|
+
).toEqual(false);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('returns false on wrong class type', (): void => {
|
|
44
|
+
expect(
|
|
45
|
+
isInstanceOf(new Array(2), String)
|
|
46
|
+
).toEqual(false);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @name isInstanceOf
|
|
6
|
+
* @summary Tests for a instance of a class.
|
|
7
|
+
* @description
|
|
8
|
+
* Checks to see if the input value is an instance of the test class.
|
|
9
|
+
* @example
|
|
10
|
+
* <BR>
|
|
11
|
+
*
|
|
12
|
+
* ```javascript
|
|
13
|
+
* import { isInstanceOf } from '@pezkuwi/util';
|
|
14
|
+
*
|
|
15
|
+
* console.log('isInstanceOf', isInstanceOf(new Array(0), Array)); // => true
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
19
|
+
export function isInstanceOf (value: unknown, Clazz: Function): boolean {
|
|
20
|
+
return (
|
|
21
|
+
((value && (value as Record<string, unknown>).constructor) === Clazz) ||
|
|
22
|
+
value instanceof Clazz
|
|
23
|
+
);
|
|
24
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
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 { isIp } from './index.js';
|
|
7
|
+
|
|
8
|
+
describe('isIp', (): void => {
|
|
9
|
+
it('returns false when non-ip found', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
isIp('not.an.ip.1')
|
|
12
|
+
).toEqual(false);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('returns true on IPv4 addresses', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
isIp('192.168.0.1')
|
|
18
|
+
).toEqual(true);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('returns true on IPv4 addresses (IPV4 type)', (): void => {
|
|
22
|
+
expect(
|
|
23
|
+
isIp('192.168.0.1', 'v4')
|
|
24
|
+
).toEqual(true);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('returns false on IPv4 addresses (IPv6 type)', (): void => {
|
|
28
|
+
expect(
|
|
29
|
+
isIp('192.168.0.1', 'v6')
|
|
30
|
+
).toEqual(false);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('returns true on IPv6 addresses', (): void => {
|
|
34
|
+
expect(
|
|
35
|
+
isIp('1:2:3:4:5:6:7:8')
|
|
36
|
+
).toEqual(true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('returns true on IPv6 addresses (IPv6 type)', (): void => {
|
|
40
|
+
expect(
|
|
41
|
+
isIp('1:2:3:4:5:6:7:8', 'v6')
|
|
42
|
+
).toEqual(true);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('returns false on IPv6 addresses (IPv4 type)', (): void => {
|
|
46
|
+
expect(
|
|
47
|
+
isIp('1:2:3:4:5:6:7:8', 'v4')
|
|
48
|
+
).toEqual(false);
|
|
49
|
+
});
|
|
50
|
+
});
|
package/src/is/ip.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// The regex patterns below were copied as-is from the ip-regex package 5.0.0,
|
|
5
|
+
// https://github.com/sindresorhus/ip-regex/blob/a2a44dfa7f776528158c2a5ff9d8a1be435ec1b9/index.js#L1
|
|
6
|
+
//
|
|
7
|
+
// MIT License
|
|
8
|
+
// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
|
|
9
|
+
//
|
|
10
|
+
// Changes made:
|
|
11
|
+
// - boundary support option has been dropped
|
|
12
|
+
// - only exact matching is used (isIp always passed exact: true)
|
|
13
|
+
// - the newest ip-regex is ESM-only, we compile to all platforms
|
|
14
|
+
const v4 = '(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}';
|
|
15
|
+
const v6s = '[a-fA-F\\d]{1,4}';
|
|
16
|
+
const v6 = `
|
|
17
|
+
(?:
|
|
18
|
+
(?:${v6s}:){7}(?:${v6s}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8
|
|
19
|
+
(?:${v6s}:){6}(?:${v4}|:${v6s}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4
|
|
20
|
+
(?:${v6s}:){5}(?::${v4}|(?::${v6s}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4
|
|
21
|
+
(?:${v6s}:){4}(?:(?::${v6s}){0,1}:${v4}|(?::${v6s}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4
|
|
22
|
+
(?:${v6s}:){3}(?:(?::${v6s}){0,2}:${v4}|(?::${v6s}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4
|
|
23
|
+
(?:${v6s}:){2}(?:(?::${v6s}){0,3}:${v4}|(?::${v6s}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4
|
|
24
|
+
(?:${v6s}:){1}(?:(?::${v6s}){0,4}:${v4}|(?::${v6s}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4
|
|
25
|
+
(?::(?:(?::${v6s}){0,5}:${v4}|(?::${v6s}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4
|
|
26
|
+
)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1
|
|
27
|
+
`.replace(/\s*\/\/.*$/gm, '').replace(/\n/g, '').trim();
|
|
28
|
+
|
|
29
|
+
const v46Exact = new RegExp(`(?:^${v4}$)|(?:^${v6}$)`);
|
|
30
|
+
const v4exact = new RegExp(`^${v4}$`);
|
|
31
|
+
const v6exact = new RegExp(`^${v6}$`);
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @name isIp
|
|
35
|
+
* @summary Tests if the value is a valid IP address
|
|
36
|
+
* @description
|
|
37
|
+
* Checks to see if the value is a valid IP address. Optionally check for either v4/v6
|
|
38
|
+
* @example
|
|
39
|
+
* <BR>
|
|
40
|
+
*
|
|
41
|
+
* ```javascript
|
|
42
|
+
* import { isIp } from '@pezkuwi/util';
|
|
43
|
+
*
|
|
44
|
+
* isIp('192.168.0.1')); // => true
|
|
45
|
+
* isIp('1:2:3:4:5:6:7:8'); // => true
|
|
46
|
+
* isIp('192.168.0.1', 'v6')); // => false
|
|
47
|
+
* isIp('1:2:3:4:5:6:7:8', 'v4'); // => false
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export function isIp (value: string, type?: 'v4' | 'v6'): boolean {
|
|
51
|
+
switch (type) {
|
|
52
|
+
case 'v4': return v4exact.test(value);
|
|
53
|
+
case 'v6': return v6exact.test(value);
|
|
54
|
+
default: return v46Exact.test(value);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
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 { isJsonObject } from './index.js';
|
|
7
|
+
|
|
8
|
+
const jsonObject = `{
|
|
9
|
+
"Test": "1234",
|
|
10
|
+
"NestedTest": {
|
|
11
|
+
"Test": "5678"
|
|
12
|
+
}
|
|
13
|
+
}`;
|
|
14
|
+
|
|
15
|
+
describe('isJsonObject', (): void => {
|
|
16
|
+
it('returns true on empty objects', (): void => {
|
|
17
|
+
expect(
|
|
18
|
+
isJsonObject({})
|
|
19
|
+
).toEqual(true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('returns true on JSON objects', (): void => {
|
|
23
|
+
expect(
|
|
24
|
+
isJsonObject(jsonObject)
|
|
25
|
+
).toEqual(true);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('returns false on JSON parsable value typeof number', (): void => {
|
|
29
|
+
expect(
|
|
30
|
+
isJsonObject(1234)
|
|
31
|
+
).toEqual(false);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('returns false on JSON parsable value null', (): void => {
|
|
35
|
+
expect(
|
|
36
|
+
isJsonObject(null)
|
|
37
|
+
).toEqual(false);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('returns false on invalid objects', (): void => {
|
|
41
|
+
expect(
|
|
42
|
+
isJsonObject('notAnObject')
|
|
43
|
+
).toEqual(false);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('returns false on invalid JSON', (): void => {
|
|
47
|
+
expect(
|
|
48
|
+
isJsonObject('{"abc", "def"}')
|
|
49
|
+
).toEqual(false);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/util authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { stringify } from '../stringify.js';
|
|
5
|
+
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
|
+
type ObjectIndexed = Record<string, any>;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @name isJsonObject
|
|
11
|
+
* @summary Tests for a valid JSON `object`.
|
|
12
|
+
* @description
|
|
13
|
+
* Checks to see if the input value is a valid JSON object.
|
|
14
|
+
* It returns false if the input is JSON parsable, but not an Javascript object.
|
|
15
|
+
* @example
|
|
16
|
+
* <BR>
|
|
17
|
+
*
|
|
18
|
+
* ```javascript
|
|
19
|
+
* import { isJsonObject } from '@pezkuwi/util';
|
|
20
|
+
*
|
|
21
|
+
* isJsonObject({}); // => true
|
|
22
|
+
* isJsonObject({
|
|
23
|
+
* "Test": "1234",
|
|
24
|
+
* "NestedTest": {
|
|
25
|
+
* "Test": "5678"
|
|
26
|
+
* }
|
|
27
|
+
* }); // => true
|
|
28
|
+
* isJsonObject(1234); // JSON parsable, but not an object => false
|
|
29
|
+
* isJsonObject(null); // JSON parsable, but not an object => false
|
|
30
|
+
* isJsonObject('not an object'); // => false
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function isJsonObject (value: unknown): value is ObjectIndexed {
|
|
34
|
+
const str = typeof value !== 'string'
|
|
35
|
+
? stringify(value)
|
|
36
|
+
: value;
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
const obj = JSON.parse(str) as unknown;
|
|
40
|
+
|
|
41
|
+
return typeof obj === 'object' && obj !== null;
|
|
42
|
+
} catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|