@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,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
+ });
@@ -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
+ });
@@ -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
+ }
@@ -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
+ }