@xylabs/hex 2.13.15 → 2.13.16

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 (152) hide show
  1. package/dist/browser/address.d.cts +2 -2
  2. package/dist/browser/address.d.cts.map +1 -1
  3. package/dist/browser/address.d.mts +2 -2
  4. package/dist/browser/address.d.mts.map +1 -1
  5. package/dist/browser/address.d.ts +2 -2
  6. package/dist/browser/address.d.ts.map +1 -1
  7. package/dist/browser/hash.d.cts +0 -2
  8. package/dist/browser/hash.d.cts.map +1 -1
  9. package/dist/browser/hash.d.mts +0 -2
  10. package/dist/browser/hash.d.mts.map +1 -1
  11. package/dist/browser/hash.d.ts +0 -2
  12. package/dist/browser/hash.d.ts.map +1 -1
  13. package/dist/browser/hex/as.d.cts +5 -0
  14. package/dist/browser/hex/as.d.cts.map +1 -0
  15. package/dist/browser/hex/as.d.mts +5 -0
  16. package/dist/browser/hex/as.d.mts.map +1 -0
  17. package/dist/browser/hex/as.d.ts +5 -0
  18. package/dist/browser/hex/as.d.ts.map +1 -0
  19. package/dist/browser/hex/from.d.cts +7 -0
  20. package/dist/browser/hex/from.d.cts.map +1 -0
  21. package/dist/browser/hex/from.d.mts +7 -0
  22. package/dist/browser/hex/from.d.mts.map +1 -0
  23. package/dist/browser/hex/from.d.ts +7 -0
  24. package/dist/browser/hex/from.d.ts.map +1 -0
  25. package/dist/browser/hex/index.d.cts +8 -0
  26. package/dist/browser/hex/index.d.cts.map +1 -0
  27. package/dist/browser/hex/index.d.mts +8 -0
  28. package/dist/browser/hex/index.d.mts.map +1 -0
  29. package/dist/browser/hex/index.d.ts +8 -0
  30. package/dist/browser/hex/index.d.ts.map +1 -0
  31. package/dist/browser/hex/is.d.cts +3 -0
  32. package/dist/browser/hex/is.d.cts.map +1 -0
  33. package/dist/browser/hex/is.d.mts +3 -0
  34. package/dist/browser/hex/is.d.mts.map +1 -0
  35. package/dist/browser/hex/is.d.ts +3 -0
  36. package/dist/browser/hex/is.d.ts.map +1 -0
  37. package/dist/browser/hex/legacy.d.cts +4 -0
  38. package/dist/browser/hex/legacy.d.cts.map +1 -0
  39. package/dist/browser/hex/legacy.d.mts +4 -0
  40. package/dist/browser/hex/legacy.d.mts.map +1 -0
  41. package/dist/browser/hex/legacy.d.ts +4 -0
  42. package/dist/browser/hex/legacy.d.ts.map +1 -0
  43. package/dist/browser/hex/model.d.cts +7 -0
  44. package/dist/browser/hex/model.d.cts.map +1 -0
  45. package/dist/browser/hex/model.d.mts +7 -0
  46. package/dist/browser/hex/model.d.mts.map +1 -0
  47. package/dist/browser/hex/model.d.ts +7 -0
  48. package/dist/browser/hex/model.d.ts.map +1 -0
  49. package/dist/browser/hex/nibble.d.cts +3 -0
  50. package/dist/browser/hex/nibble.d.cts.map +1 -0
  51. package/dist/browser/hex/nibble.d.mts +3 -0
  52. package/dist/browser/hex/nibble.d.mts.map +1 -0
  53. package/dist/browser/hex/nibble.d.ts +3 -0
  54. package/dist/browser/hex/nibble.d.ts.map +1 -0
  55. package/dist/browser/hex/regex.d.cts +3 -0
  56. package/dist/browser/hex/regex.d.cts.map +1 -0
  57. package/dist/browser/hex/regex.d.mts +3 -0
  58. package/dist/browser/hex/regex.d.mts.map +1 -0
  59. package/dist/browser/hex/regex.d.ts +3 -0
  60. package/dist/browser/hex/regex.d.ts.map +1 -0
  61. package/dist/browser/index.cjs +97 -51
  62. package/dist/browser/index.cjs.map +1 -1
  63. package/dist/browser/index.js +97 -51
  64. package/dist/browser/index.js.map +1 -1
  65. package/dist/node/address.d.cts +2 -2
  66. package/dist/node/address.d.cts.map +1 -1
  67. package/dist/node/address.d.mts +2 -2
  68. package/dist/node/address.d.mts.map +1 -1
  69. package/dist/node/address.d.ts +2 -2
  70. package/dist/node/address.d.ts.map +1 -1
  71. package/dist/node/hash.d.cts +0 -2
  72. package/dist/node/hash.d.cts.map +1 -1
  73. package/dist/node/hash.d.mts +0 -2
  74. package/dist/node/hash.d.mts.map +1 -1
  75. package/dist/node/hash.d.ts +0 -2
  76. package/dist/node/hash.d.ts.map +1 -1
  77. package/dist/node/hex/as.d.cts +5 -0
  78. package/dist/node/hex/as.d.cts.map +1 -0
  79. package/dist/node/hex/as.d.mts +5 -0
  80. package/dist/node/hex/as.d.mts.map +1 -0
  81. package/dist/node/hex/as.d.ts +5 -0
  82. package/dist/node/hex/as.d.ts.map +1 -0
  83. package/dist/node/hex/from.d.cts +7 -0
  84. package/dist/node/hex/from.d.cts.map +1 -0
  85. package/dist/node/hex/from.d.mts +7 -0
  86. package/dist/node/hex/from.d.mts.map +1 -0
  87. package/dist/node/hex/from.d.ts +7 -0
  88. package/dist/node/hex/from.d.ts.map +1 -0
  89. package/dist/node/hex/index.d.cts +8 -0
  90. package/dist/node/hex/index.d.cts.map +1 -0
  91. package/dist/node/hex/index.d.mts +8 -0
  92. package/dist/node/hex/index.d.mts.map +1 -0
  93. package/dist/node/hex/index.d.ts +8 -0
  94. package/dist/node/hex/index.d.ts.map +1 -0
  95. package/dist/node/hex/is.d.cts +3 -0
  96. package/dist/node/hex/is.d.cts.map +1 -0
  97. package/dist/node/hex/is.d.mts +3 -0
  98. package/dist/node/hex/is.d.mts.map +1 -0
  99. package/dist/node/hex/is.d.ts +3 -0
  100. package/dist/node/hex/is.d.ts.map +1 -0
  101. package/dist/node/hex/legacy.d.cts +4 -0
  102. package/dist/node/hex/legacy.d.cts.map +1 -0
  103. package/dist/node/hex/legacy.d.mts +4 -0
  104. package/dist/node/hex/legacy.d.mts.map +1 -0
  105. package/dist/node/hex/legacy.d.ts +4 -0
  106. package/dist/node/hex/legacy.d.ts.map +1 -0
  107. package/dist/node/hex/model.d.cts +7 -0
  108. package/dist/node/hex/model.d.cts.map +1 -0
  109. package/dist/node/hex/model.d.mts +7 -0
  110. package/dist/node/hex/model.d.mts.map +1 -0
  111. package/dist/node/hex/model.d.ts +7 -0
  112. package/dist/node/hex/model.d.ts.map +1 -0
  113. package/dist/node/hex/nibble.d.cts +3 -0
  114. package/dist/node/hex/nibble.d.cts.map +1 -0
  115. package/dist/node/hex/nibble.d.mts +3 -0
  116. package/dist/node/hex/nibble.d.mts.map +1 -0
  117. package/dist/node/hex/nibble.d.ts +3 -0
  118. package/dist/node/hex/nibble.d.ts.map +1 -0
  119. package/dist/node/hex/regex.d.cts +3 -0
  120. package/dist/node/hex/regex.d.cts.map +1 -0
  121. package/dist/node/hex/regex.d.mts +3 -0
  122. package/dist/node/hex/regex.d.mts.map +1 -0
  123. package/dist/node/hex/regex.d.ts +3 -0
  124. package/dist/node/hex/regex.d.ts.map +1 -0
  125. package/dist/node/index.cjs +105 -53
  126. package/dist/node/index.cjs.map +1 -1
  127. package/dist/node/index.js +97 -51
  128. package/dist/node/index.js.map +1 -1
  129. package/package.json +2 -2
  130. package/src/address.ts +17 -9
  131. package/src/hash.ts +13 -17
  132. package/src/hex/as.ts +20 -0
  133. package/src/hex/from.ts +52 -0
  134. package/src/hex/index.ts +7 -0
  135. package/src/hex/is.ts +21 -0
  136. package/src/hex/legacy.ts +8 -0
  137. package/src/hex/model.ts +7 -0
  138. package/src/hex/nibble.ts +11 -0
  139. package/src/hex/regex.ts +2 -0
  140. package/dist/browser/hex.d.cts +0 -15
  141. package/dist/browser/hex.d.cts.map +0 -1
  142. package/dist/browser/hex.d.mts +0 -15
  143. package/dist/browser/hex.d.mts.map +0 -1
  144. package/dist/browser/hex.d.ts +0 -15
  145. package/dist/browser/hex.d.ts.map +0 -1
  146. package/dist/node/hex.d.cts +0 -15
  147. package/dist/node/hex.d.cts.map +0 -1
  148. package/dist/node/hex.d.mts +0 -15
  149. package/dist/node/hex.d.mts.map +0 -1
  150. package/dist/node/hex.d.ts +0 -15
  151. package/dist/node/hex.d.ts.map +0 -1
  152. package/src/hex.ts +0 -88
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/hex/model.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,GAAG,MAAM,CAAA;AAExB,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB"}
@@ -0,0 +1,7 @@
1
+ export type Hex = string;
2
+ export interface HexConfig {
3
+ bitLength?: number;
4
+ byteSize?: number;
5
+ prefix?: boolean;
6
+ }
7
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/hex/model.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,GAAG,MAAM,CAAA;AAExB,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB"}
@@ -0,0 +1,7 @@
1
+ export type Hex = string;
2
+ export interface HexConfig {
3
+ bitLength?: number;
4
+ byteSize?: number;
5
+ prefix?: boolean;
6
+ }
7
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/hex/model.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,GAAG,MAAM,CAAA;AAExB,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB"}
@@ -0,0 +1,3 @@
1
+ export declare const bitsToNibbles: (value: number) => number;
2
+ export declare const nibblesToBits: (value: number) => number;
3
+ //# sourceMappingURL=nibble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nibble.d.ts","sourceRoot":"","sources":["../../../src/hex/nibble.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAI7C,CAAA;AAGD,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAE7C,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const bitsToNibbles: (value: number) => number;
2
+ export declare const nibblesToBits: (value: number) => number;
3
+ //# sourceMappingURL=nibble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nibble.d.ts","sourceRoot":"","sources":["../../../src/hex/nibble.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAI7C,CAAA;AAGD,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAE7C,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const bitsToNibbles: (value: number) => number;
2
+ export declare const nibblesToBits: (value: number) => number;
3
+ //# sourceMappingURL=nibble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nibble.d.ts","sourceRoot":"","sources":["../../../src/hex/nibble.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAI7C,CAAA;AAGD,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAE7C,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const hexRegex: RegExp;
2
+ export declare const hexRegexWithPrefix: RegExp;
3
+ //# sourceMappingURL=regex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex.d.ts","sourceRoot":"","sources":["../../../src/hex/regex.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,QAAiB,CAAA;AACtC,eAAO,MAAM,kBAAkB,QAAkB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const hexRegex: RegExp;
2
+ export declare const hexRegexWithPrefix: RegExp;
3
+ //# sourceMappingURL=regex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex.d.ts","sourceRoot":"","sources":["../../../src/hex/regex.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,QAAiB,CAAA;AACtC,eAAO,MAAM,kBAAkB,QAAkB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const hexRegex: RegExp;
2
+ export declare const hexRegexWithPrefix: RegExp;
3
+ //# sourceMappingURL=regex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex.d.ts","sourceRoot":"","sources":["../../../src/hex/regex.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,QAAiB,CAAA;AACtC,eAAO,MAAM,kBAAkB,QAAkB,CAAA"}
@@ -27,15 +27,21 @@ __export(src_exports, {
27
27
  asHex: () => asHex,
28
28
  bitsToNibbles: () => bitsToNibbles,
29
29
  hexFrom: () => hexFrom,
30
+ hexFromArrayBuffer: () => hexFromArrayBuffer,
31
+ hexFromBigInt: () => hexFromBigInt,
32
+ hexFromHexString: () => hexFromHexString,
33
+ hexFromNumber: () => hexFromNumber,
30
34
  hexRegex: () => hexRegex,
31
35
  hexRegexWithPrefix: () => hexRegexWithPrefix,
32
36
  isAddress: () => isAddress,
33
37
  isHash: () => isHash,
34
38
  isHashBitLength: () => isHashBitLength,
35
39
  isHex: () => isHex,
36
- isRoundNibble: () => isRoundNibble,
40
+ isHexZero: () => isHexZero,
37
41
  nibblesToBits: () => nibblesToBits,
38
- toHex: () => toHex
42
+ toAddress: () => toAddress,
43
+ toHex: () => toHex,
44
+ toHexLegacy: () => toHexLegacy
39
45
  });
40
46
  module.exports = __toCommonJS(src_exports);
41
47
 
@@ -50,13 +56,10 @@ var assertError = (value, assert, defaultMessage) => {
50
56
  return void 0;
51
57
  };
52
58
 
53
- // src/hex.ts
59
+ // src/hex/from.ts
54
60
  var import_arraybuffer = require("@xylabs/arraybuffer");
55
- var hexRegex = /^[0-9a-f]+$/i;
56
- var hexRegexWithPrefix = /0x[0-9a-f]+$/i;
57
- var hexFrom = (buffer) => {
58
- return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join("");
59
- };
61
+
62
+ // src/hex/nibble.ts
60
63
  var bitsToNibbles = (value) => {
61
64
  const nibbles = value >> 2;
62
65
  if (value !== nibbles << 2)
@@ -66,55 +69,95 @@ var bitsToNibbles = (value) => {
66
69
  var nibblesToBits = (value) => {
67
70
  return value << 2;
68
71
  };
69
- var isRoundNibble = (value) => {
70
- return value >> 2 << 2 === value;
72
+
73
+ // src/hex/regex.ts
74
+ var hexRegex = /^[0-9a-f]+$/i;
75
+ var hexRegexWithPrefix = /0x[0-9a-f]+$/i;
76
+
77
+ // src/hex/is.ts
78
+ var isHexZero = (value) => {
79
+ return BigInt(hexFromHexString(value, { prefix: true })) === 0n;
71
80
  };
72
81
  var isHex = (value, bitLength) => {
73
82
  if (typeof value !== "string")
74
83
  return false;
84
+ console.log(`BitLength: ${value.length << 2}|${bitLength}`);
75
85
  if (bitLength !== void 0 && value.length !== bitsToNibbles(bitLength))
76
86
  return false;
77
87
  return hexRegex.test(value);
78
88
  };
79
- var toHex = (buffer) => {
80
- return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join("");
89
+
90
+ // src/hex/from.ts
91
+ var hexFromArrayBuffer = (buffer, config) => {
92
+ const unPadded = [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join("");
93
+ return hexFromHexString(unPadded, config);
81
94
  };
82
- function asHex(value, assertOrBitLength, assertOnly) {
83
- const bitLength = typeof assertOrBitLength === "number" ? assertOrBitLength : void 0;
84
- const assert = typeof assertOrBitLength !== "number" ? assertOrBitLength : assertOnly;
85
- let stringValue = void 0;
95
+ var hexFromBigInt = (value, config = {}) => {
96
+ const { bitLength } = config;
97
+ const unPadded = value.toString(16);
98
+ const padded = bitLength === void 0 ? unPadded : unPadded.padStart(bitsToNibbles(bitLength), "0");
99
+ return hexFromHexString(padded, config);
100
+ };
101
+ var hexFromNumber = (value, config) => {
102
+ return hexFromBigInt(BigInt(value), config);
103
+ };
104
+ var hexFromHexString = (value, config = {}) => {
105
+ const { prefix = false, byteSize = 8 } = config;
106
+ const nibbleBoundary = bitsToNibbles(byteSize);
107
+ const unPadded = (value.startsWith("0x") ? value.substring(2) : value).toLowerCase();
108
+ if (isHex(unPadded)) {
109
+ const padded = unPadded.padStart(unPadded.length + unPadded.length % nibbleBoundary, "0");
110
+ return prefix ? `0x${padded}` : padded;
111
+ } else {
112
+ throw Error("Received string is not a value hex");
113
+ }
114
+ };
115
+ var hexFrom = (value, config) => {
86
116
  switch (typeof value) {
87
117
  case "string":
88
- stringValue = hexRegexWithPrefix.test(value) ? value.substring(2) : value;
89
- break;
90
- case "number":
91
- if (value === Math.floor(value)) {
92
- stringValue = value.toString(16);
93
- } else {
94
- return assertError(value, assert, "Numbers must be whole");
95
- }
96
- break;
118
+ return hexFromHexString(value, config);
97
119
  case "bigint":
98
- stringValue = value.toString(16);
99
- break;
120
+ return hexFromBigInt(value, config);
121
+ case "number":
122
+ return hexFromNumber(value, config);
100
123
  case "object":
101
124
  if ((0, import_arraybuffer.isArrayBuffer)(value)) {
102
- stringValue = hexFrom(value);
125
+ return hexFromArrayBuffer(value, config);
103
126
  } else {
104
- return assertError(value, assert, "Unsupported object");
127
+ throw Error("Invalid type: object !== ArrayBuffer");
105
128
  }
129
+ default:
130
+ throw Error(`Invalid type: ${typeof value}`);
131
+ }
132
+ };
133
+
134
+ // src/hex/as.ts
135
+ function asHex(value, assert) {
136
+ let stringValue = void 0;
137
+ switch (typeof value) {
138
+ case "string":
139
+ stringValue = hexFromHexString(value);
106
140
  break;
107
141
  default:
108
142
  return assertError(value, assert, `Unsupported type [${typeof value}]`);
109
143
  }
110
- if (stringValue && bitLength) {
111
- stringValue = stringValue.padStart(bitsToNibbles(bitLength), "0");
112
- }
113
- return isHex(stringValue, bitLength) ? stringValue.toLowerCase() : assertError(value, assert, "Unable to convert to Hash");
144
+ return isHex(stringValue) ? stringValue : assertError(value, assert, `Value is not Hex [${value}]`);
114
145
  }
115
146
 
147
+ // src/hex/legacy.ts
148
+ var toHexLegacy = (buffer) => {
149
+ return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join("");
150
+ };
151
+ var toHex = (buffer) => {
152
+ return toHexLegacy(buffer);
153
+ };
154
+
116
155
  // src/address.ts
117
156
  var addressRegex = /0x[0-9a-f]+/i;
157
+ var toAddress = (value, config = {}) => {
158
+ const { bitLength = 160, prefix = true } = config;
159
+ return hexFrom(value, { bitLength, prefix, ...config });
160
+ };
118
161
  var isAddress = (value, bitLength = 160) => {
119
162
  if (typeof value !== "string")
120
163
  return false;
@@ -125,11 +168,16 @@ var isAddress = (value, bitLength = 160) => {
125
168
  return false;
126
169
  return isHex(valueHex, bitLength);
127
170
  };
128
- function asAddress(value, assertOrBitLength, assertOnly) {
129
- const bitLength = typeof assertOrBitLength === "number" ? assertOrBitLength : 160;
130
- const assert = typeof assertOrBitLength !== "number" ? assertOrBitLength : assertOnly;
131
- const result = `0x${asHex(value, bitLength, assert)}`;
132
- return isAddress(result, bitLength) ? result : assertError(value, assert, "Resulting value is not an Address");
171
+ function asAddress(value, assert) {
172
+ let stringValue = void 0;
173
+ switch (typeof value) {
174
+ case "string":
175
+ stringValue = hexFromHexString(value, { prefix: true });
176
+ break;
177
+ default:
178
+ return assert ? assertError(value, assert, `Unsupported type [${typeof value}]`) : void 0;
179
+ }
180
+ return isAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an Address [${value}]`);
133
181
  }
134
182
 
135
183
  // src/hash.ts
@@ -138,20 +186,18 @@ var isHashBitLength = (value) => {
138
186
  return typeof value === "number" && HashBitLength.includes(value);
139
187
  };
140
188
  var isHash = (value, bitLength = 256) => {
141
- if (!isHex(value, bitLength))
142
- return false;
143
- const hex = asHex(value, bitLength);
144
- if (!hex)
145
- return false;
146
- if (!isHashBitLength(nibblesToBits(hex.length)))
147
- return false;
148
- return true;
189
+ return isHex(value, bitLength);
149
190
  };
150
- function asHash(value, assertOrBitLength, assertOnly) {
151
- const bitLength = typeof assertOrBitLength === "number" ? assertOrBitLength : 256;
152
- const assert = typeof assertOrBitLength !== "number" ? assertOrBitLength : assertOnly;
153
- const result = asHex(value, bitLength, assert);
154
- return isHash(result, bitLength) ? result : assertError(value, assert, "Resulting value is not a Hash");
191
+ function asHash(value, assert) {
192
+ let stringValue = void 0;
193
+ switch (typeof value) {
194
+ case "string":
195
+ stringValue = hexFromHexString(value);
196
+ break;
197
+ default:
198
+ return assert ? assertError(value, assert, `Unsupported type [${typeof value}]`) : void 0;
199
+ }
200
+ return isHash(stringValue) ? stringValue : assertError(value, assert, `Value is not a Hash [${value}]`);
155
201
  }
156
202
  // Annotate the CommonJS export names for ESM import in node:
157
203
  0 && (module.exports = {
@@ -162,14 +208,20 @@ function asHash(value, assertOrBitLength, assertOnly) {
162
208
  asHex,
163
209
  bitsToNibbles,
164
210
  hexFrom,
211
+ hexFromArrayBuffer,
212
+ hexFromBigInt,
213
+ hexFromHexString,
214
+ hexFromNumber,
165
215
  hexRegex,
166
216
  hexRegexWithPrefix,
167
217
  isAddress,
168
218
  isHash,
169
219
  isHashBitLength,
170
220
  isHex,
171
- isRoundNibble,
221
+ isHexZero,
172
222
  nibblesToBits,
173
- toHex
223
+ toAddress,
224
+ toHex,
225
+ toHexLegacy
174
226
  });
175
227
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/assert.ts","../../src/hex.ts","../../src/address.ts","../../src/hash.ts"],"sourcesContent":["export * from './address'\nexport * from './hash'\nexport * from './hex'\n","export type AssertCallback = (value: unknown, message: string) => string | boolean\n\nexport type AssertConfig = string | AssertCallback | boolean\n\nexport const assertError = (value: unknown, assert: AssertConfig | undefined, defaultMessage: string) => {\n if (assert) {\n const assertString = typeof assert === 'string' ? assert : typeof assert === 'boolean' ? defaultMessage : assert(value, defaultMessage)\n if (assertString) {\n throw Error(assertString === true ? defaultMessage : assertString)\n }\n }\n return undefined\n}\n","import { isArrayBuffer } from '@xylabs/arraybuffer'\n\nimport { AssertConfig, assertError } from './assert'\n\nexport const hexRegex = /^[0-9a-f]+$/i\nexport const hexRegexWithPrefix = /0x[0-9a-f]+$/i\n\nexport type Hex = string\n\nexport const hexFrom = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, '0')).join('')\n}\n\n//determine the number of nibbles for a given number of bits\nexport const bitsToNibbles = (value: number): number => {\n const nibbles = value >> 2\n if (value !== nibbles << 2) throw Error('Bits for nibbles must multiple of 4')\n return nibbles\n}\n\n//determine the number of nibbles for a given number of bits\nexport const nibblesToBits = (value: number): number => {\n return value << 2\n}\n\n//are the number of bit a round nibble (factor of 4)?\nexport const isRoundNibble = (value: number) => {\n return (value >> 2) << 2 === value\n}\n\nexport const isHex = (value: unknown, bitLength?: number): value is Hex => {\n //Is it a string?\n if (typeof value !== 'string') return false\n\n //If a bitLength specified, does it conform?\n if (bitLength !== undefined && value.length !== bitsToNibbles(bitLength)) return false\n\n //Does it only has hex values?\n return hexRegex.test(value)\n}\n\nexport const toHex = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, '0')).join('')\n}\n\nexport function asHex(value: unknown): Hex | undefined\nexport function asHex(value: unknown, bitLength?: number): Hex | undefined\nexport function asHex(value: unknown, assert: AssertConfig): Hex\nexport function asHex(value: unknown, bitLength: number | undefined, assert?: AssertConfig): Hex\nexport function asHex(value: unknown, assertOrBitLength?: AssertConfig | number, assertOnly?: AssertConfig): Hex | undefined {\n const bitLength = typeof assertOrBitLength === 'number' ? assertOrBitLength : undefined\n const assert = typeof assertOrBitLength !== 'number' ? assertOrBitLength : assertOnly\n\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string':\n //remove the leading 0x if it is there\n stringValue = hexRegexWithPrefix.test(value) ? value.substring(2) : value\n break\n case 'number':\n if (value === Math.floor(value)) {\n stringValue = value.toString(16)\n } else {\n return assertError(value, assert, 'Numbers must be whole')\n }\n break\n case 'bigint':\n stringValue = value.toString(16)\n break\n case 'object':\n if (isArrayBuffer(value)) {\n stringValue = hexFrom(value)\n } else {\n return assertError(value, assert, 'Unsupported object')\n }\n break\n default:\n return assertError(value, assert, `Unsupported type [${typeof value}]`)\n }\n\n //make it conform to the bit length if shorter\n if (stringValue && bitLength) {\n stringValue = stringValue.padStart(bitsToNibbles(bitLength), '0')\n }\n\n return isHex(stringValue, bitLength) ? stringValue.toLowerCase() : assertError(value, assert, 'Unable to convert to Hash')\n}\n","import { AssertConfig, assertError } from './assert'\nimport { asHex, bitsToNibbles, isHex } from './hex'\n\nexport const addressRegex = /0x[0-9a-f]+/i\n\nexport type Address = string\n\nexport const isAddress = (value: unknown, bitLength = 160): value is Address => {\n //Is it a string?\n if (typeof value !== 'string') return false\n\n //Does it only has hex values and leading 0x?\n if (!addressRegex.test(value)) return false\n\n const valueHex = value.substring(2)\n\n //If a bitLength specified, does it conform?\n if (bitLength !== undefined && valueHex.length !== bitsToNibbles(bitLength)) return false\n\n return isHex(valueHex, bitLength)\n}\n\nexport function asAddress(value: unknown): Address | undefined\nexport function asAddress(value: unknown, assert: AssertConfig): Address\nexport function asAddress(value: unknown, bitLength: number): Address | undefined\nexport function asAddress(value: unknown, bitLength: number, assert: AssertConfig): Address\nexport function asAddress(value: unknown, assertOrBitLength?: AssertConfig | number, assertOnly?: AssertConfig): Address | undefined {\n const bitLength = typeof assertOrBitLength === 'number' ? assertOrBitLength : 160\n const assert = typeof assertOrBitLength !== 'number' ? assertOrBitLength : assertOnly\n\n const result = `0x${asHex(value, bitLength, assert)}`\n return isAddress(result, bitLength) ? result : assertError(value, assert, 'Resulting value is not an Address')\n}\n","import { AssertConfig, assertError } from './assert'\nimport { asHex, Hex, isHex, nibblesToBits } from './hex'\n\nexport type HashBitLength = 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096\nexport const HashBitLength: HashBitLength[] = [32, 64, 128, 256, 512, 1024, 2048, 4096]\n\nexport const isHashBitLength = (value: unknown): value is HashBitLength => {\n return typeof value === 'number' && HashBitLength.includes(value as HashBitLength)\n}\n\nexport type Hash = Hex\nexport const isHash = (value: unknown, bitLength: HashBitLength = 256): value is Hash => {\n if (!isHex(value, bitLength)) return false\n\n const hex = asHex(value, bitLength)\n if (!hex) return false\n\n if (!isHashBitLength(nibblesToBits(hex.length))) return false\n\n return true\n}\n\nexport function asHash(value: unknown): Hash | undefined\nexport function asHash(value: unknown, assert: AssertConfig): Hash\nexport function asHash(value: unknown, bitLength?: HashBitLength): Hash | undefined\nexport function asHash(value: unknown, bitLength: HashBitLength | undefined, assert: AssertConfig): Hash\nexport function asHash(value: unknown, assertOrBitLength?: AssertConfig | HashBitLength, assertOnly?: AssertConfig): Hash | undefined {\n const bitLength: HashBitLength = typeof assertOrBitLength === 'number' ? assertOrBitLength : 256\n const assert = typeof assertOrBitLength !== 'number' ? assertOrBitLength : assertOnly\n\n const result = asHex(value, bitLength, assert)\n return isHash(result, bitLength) ? result : assertError(value, assert, 'Resulting value is not a Hash')\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/assert.ts","../../src/hex/from.ts","../../src/hex/nibble.ts","../../src/hex/regex.ts","../../src/hex/is.ts","../../src/hex/as.ts","../../src/hex/legacy.ts","../../src/address.ts","../../src/hash.ts"],"sourcesContent":["export * from './address'\nexport * from './hash'\nexport * from './hex'\n","export type AssertCallback = (value: unknown, message: string) => string | boolean\n\nexport type AssertConfig = string | AssertCallback | boolean\n\nexport const assertError = (value: unknown, assert: AssertConfig | undefined, defaultMessage: string) => {\n if (assert) {\n const assertString = typeof assert === 'string' ? assert : typeof assert === 'boolean' ? defaultMessage : assert(value, defaultMessage)\n if (assertString) {\n throw Error(assertString === true ? defaultMessage : assertString)\n }\n }\n return undefined\n}\n","import { isArrayBuffer } from '@xylabs/arraybuffer'\n\nimport { isHex } from './is'\nimport { HexConfig } from './model'\nimport { bitsToNibbles } from './nibble'\n\nexport const hexFromArrayBuffer = (buffer: ArrayBuffer, config?: HexConfig): string => {\n const unPadded = [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, '0')).join('')\n return hexFromHexString(unPadded, config)\n}\n\nexport const hexFromBigInt = (value: bigint, config: HexConfig = {}): string => {\n const { bitLength } = config\n const unPadded = value.toString(16)\n const padded = bitLength === undefined ? unPadded : unPadded.padStart(bitsToNibbles(bitLength), '0')\n return hexFromHexString(padded, config)\n}\n\nexport const hexFromNumber = (value: number, config?: HexConfig): string => {\n return hexFromBigInt(BigInt(value), config)\n}\n\nexport const hexFromHexString = (value: string, config: HexConfig = {}): string => {\n const { prefix = false, byteSize = 8 } = config\n const nibbleBoundary = bitsToNibbles(byteSize)\n const unPadded = (value.startsWith('0x') ? value.substring(2) : value).toLowerCase()\n if (isHex(unPadded)) {\n const padded = unPadded.padStart(unPadded.length + (unPadded.length % nibbleBoundary), '0')\n return prefix ? `0x${padded}` : padded\n } else {\n throw Error('Received string is not a value hex')\n }\n}\n\nexport const hexFrom = (value: unknown, config?: HexConfig): string => {\n switch (typeof value) {\n case 'string':\n return hexFromHexString(value, config)\n case 'bigint':\n return hexFromBigInt(value, config)\n case 'number':\n return hexFromNumber(value, config)\n case 'object':\n if (isArrayBuffer(value)) {\n return hexFromArrayBuffer(value, config)\n } else {\n throw Error('Invalid type: object !== ArrayBuffer')\n }\n default:\n throw Error(`Invalid type: ${typeof value}`)\n }\n}\n","//determine the number of nibbles for a given number of bits\nexport const bitsToNibbles = (value: number): number => {\n const nibbles = value >> 2\n if (value !== nibbles << 2) throw Error('Bits for nibbles must multiple of 4')\n return nibbles\n}\n\n//determine the number of nibbles for a given number of bits\nexport const nibblesToBits = (value: number): number => {\n return value << 2\n}\n","export const hexRegex = /^[0-9a-f]+$/i\nexport const hexRegexWithPrefix = /0x[0-9a-f]+$/i\n","import { hexFromHexString } from './from'\nimport { Hex } from './model'\nimport { bitsToNibbles } from './nibble'\nimport { hexRegex } from './regex'\n\nexport const isHexZero = (value: string) => {\n return BigInt(hexFromHexString(value, { prefix: true })) === 0n\n}\n\nexport const isHex = (value: unknown, bitLength?: number): value is Hex => {\n //Is it a string?\n if (typeof value !== 'string') return false\n\n console.log(`BitLength: ${value.length << 2}|${bitLength}`)\n\n //If a bitLength specified, does it conform?\n if (bitLength !== undefined && value.length !== bitsToNibbles(bitLength)) return false\n\n //Does it only has hex values?\n return hexRegex.test(value)\n}\n","import { AssertConfig, assertError } from '../assert'\nimport { hexFromHexString } from './from'\nimport { isHex } from './is'\nimport { Hex } from './model'\n\nexport function asHex(value: unknown): Hex | undefined\nexport function asHex(value: unknown, assert: AssertConfig): Hex\nexport function asHex(value: unknown, assert?: AssertConfig): Hex | undefined {\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string':\n stringValue = hexFromHexString(value)\n break\n default:\n return assertError(value, assert, `Unsupported type [${typeof value}]`)\n }\n\n return isHex(stringValue) ? stringValue : assertError(value, assert, `Value is not Hex [${value}]`)\n}\n","export const toHexLegacy = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, '0')).join('')\n}\n\n/** @deprecated use toHexLegacy instead */\nexport const toHex = (buffer: ArrayBuffer) => {\n return toHexLegacy(buffer)\n}\n","import { AssertConfig, assertError } from './assert'\nimport { bitsToNibbles, HexConfig, hexFrom, hexFromHexString, isHex } from './hex'\n\nexport const addressRegex = /0x[0-9a-f]+/i\n\nexport type Address = string\n\nexport const toAddress = (value: unknown, config: HexConfig = {}) => {\n const { bitLength = 160, prefix = true } = config\n return hexFrom(value, { bitLength, prefix, ...config })\n}\n\nexport const isAddress = (value: unknown, bitLength = 160): value is Address => {\n //Is it a string?\n if (typeof value !== 'string') return false\n\n //Does it only has hex values and leading 0x?\n if (!addressRegex.test(value)) return false\n\n const valueHex = value.substring(2)\n\n //If a bitLength specified, does it conform?\n if (bitLength !== undefined && valueHex.length !== bitsToNibbles(bitLength)) return false\n\n return isHex(valueHex, bitLength)\n}\n\nexport function asAddress(value: unknown): Address | undefined\nexport function asAddress(value: unknown, assert: AssertConfig): Address\nexport function asAddress(value: unknown, assert?: AssertConfig): Address | undefined {\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string':\n stringValue = hexFromHexString(value, { prefix: true })\n break\n default:\n return assert ? assertError(value, assert, `Unsupported type [${typeof value}]`) : undefined\n }\n return isAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an Address [${value}]`)\n}\n","import { AssertConfig, assertError } from './assert'\nimport { Hex, hexFromHexString, isHex } from './hex'\n\nexport type HashBitLength = 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096\nexport const HashBitLength: HashBitLength[] = [32, 64, 128, 256, 512, 1024, 2048, 4096]\n\nexport const isHashBitLength = (value: unknown): value is HashBitLength => {\n return typeof value === 'number' && HashBitLength.includes(value as HashBitLength)\n}\n\nexport type Hash = Hex\nexport const isHash = (value: unknown, bitLength: HashBitLength = 256): value is Hash => {\n return isHex(value, bitLength)\n}\n\nexport function asHash(value: unknown): Hash | undefined\nexport function asHash(value: unknown, assert: AssertConfig): Hash\nexport function asHash(value: unknown, assert?: AssertConfig): Hash | undefined {\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string':\n stringValue = hexFromHexString(value)\n break\n default:\n return assert ? assertError(value, assert, `Unsupported type [${typeof value}]`) : undefined\n }\n return isHash(stringValue) ? stringValue : assertError(value, assert, `Value is not a Hash [${value}]`)\n}\n"],"mappings":"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","names":[]}
@@ -9,13 +9,10 @@ var assertError = (value, assert, defaultMessage) => {
9
9
  return void 0;
10
10
  };
11
11
 
12
- // src/hex.ts
12
+ // src/hex/from.ts
13
13
  import { isArrayBuffer } from "@xylabs/arraybuffer";
14
- var hexRegex = /^[0-9a-f]+$/i;
15
- var hexRegexWithPrefix = /0x[0-9a-f]+$/i;
16
- var hexFrom = (buffer) => {
17
- return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join("");
18
- };
14
+
15
+ // src/hex/nibble.ts
19
16
  var bitsToNibbles = (value) => {
20
17
  const nibbles = value >> 2;
21
18
  if (value !== nibbles << 2)
@@ -25,55 +22,95 @@ var bitsToNibbles = (value) => {
25
22
  var nibblesToBits = (value) => {
26
23
  return value << 2;
27
24
  };
28
- var isRoundNibble = (value) => {
29
- return value >> 2 << 2 === value;
25
+
26
+ // src/hex/regex.ts
27
+ var hexRegex = /^[0-9a-f]+$/i;
28
+ var hexRegexWithPrefix = /0x[0-9a-f]+$/i;
29
+
30
+ // src/hex/is.ts
31
+ var isHexZero = (value) => {
32
+ return BigInt(hexFromHexString(value, { prefix: true })) === 0n;
30
33
  };
31
34
  var isHex = (value, bitLength) => {
32
35
  if (typeof value !== "string")
33
36
  return false;
37
+ console.log(`BitLength: ${value.length << 2}|${bitLength}`);
34
38
  if (bitLength !== void 0 && value.length !== bitsToNibbles(bitLength))
35
39
  return false;
36
40
  return hexRegex.test(value);
37
41
  };
38
- var toHex = (buffer) => {
39
- return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join("");
42
+
43
+ // src/hex/from.ts
44
+ var hexFromArrayBuffer = (buffer, config) => {
45
+ const unPadded = [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join("");
46
+ return hexFromHexString(unPadded, config);
40
47
  };
41
- function asHex(value, assertOrBitLength, assertOnly) {
42
- const bitLength = typeof assertOrBitLength === "number" ? assertOrBitLength : void 0;
43
- const assert = typeof assertOrBitLength !== "number" ? assertOrBitLength : assertOnly;
44
- let stringValue = void 0;
48
+ var hexFromBigInt = (value, config = {}) => {
49
+ const { bitLength } = config;
50
+ const unPadded = value.toString(16);
51
+ const padded = bitLength === void 0 ? unPadded : unPadded.padStart(bitsToNibbles(bitLength), "0");
52
+ return hexFromHexString(padded, config);
53
+ };
54
+ var hexFromNumber = (value, config) => {
55
+ return hexFromBigInt(BigInt(value), config);
56
+ };
57
+ var hexFromHexString = (value, config = {}) => {
58
+ const { prefix = false, byteSize = 8 } = config;
59
+ const nibbleBoundary = bitsToNibbles(byteSize);
60
+ const unPadded = (value.startsWith("0x") ? value.substring(2) : value).toLowerCase();
61
+ if (isHex(unPadded)) {
62
+ const padded = unPadded.padStart(unPadded.length + unPadded.length % nibbleBoundary, "0");
63
+ return prefix ? `0x${padded}` : padded;
64
+ } else {
65
+ throw Error("Received string is not a value hex");
66
+ }
67
+ };
68
+ var hexFrom = (value, config) => {
45
69
  switch (typeof value) {
46
70
  case "string":
47
- stringValue = hexRegexWithPrefix.test(value) ? value.substring(2) : value;
48
- break;
49
- case "number":
50
- if (value === Math.floor(value)) {
51
- stringValue = value.toString(16);
52
- } else {
53
- return assertError(value, assert, "Numbers must be whole");
54
- }
55
- break;
71
+ return hexFromHexString(value, config);
56
72
  case "bigint":
57
- stringValue = value.toString(16);
58
- break;
73
+ return hexFromBigInt(value, config);
74
+ case "number":
75
+ return hexFromNumber(value, config);
59
76
  case "object":
60
77
  if (isArrayBuffer(value)) {
61
- stringValue = hexFrom(value);
78
+ return hexFromArrayBuffer(value, config);
62
79
  } else {
63
- return assertError(value, assert, "Unsupported object");
80
+ throw Error("Invalid type: object !== ArrayBuffer");
64
81
  }
82
+ default:
83
+ throw Error(`Invalid type: ${typeof value}`);
84
+ }
85
+ };
86
+
87
+ // src/hex/as.ts
88
+ function asHex(value, assert) {
89
+ let stringValue = void 0;
90
+ switch (typeof value) {
91
+ case "string":
92
+ stringValue = hexFromHexString(value);
65
93
  break;
66
94
  default:
67
95
  return assertError(value, assert, `Unsupported type [${typeof value}]`);
68
96
  }
69
- if (stringValue && bitLength) {
70
- stringValue = stringValue.padStart(bitsToNibbles(bitLength), "0");
71
- }
72
- return isHex(stringValue, bitLength) ? stringValue.toLowerCase() : assertError(value, assert, "Unable to convert to Hash");
97
+ return isHex(stringValue) ? stringValue : assertError(value, assert, `Value is not Hex [${value}]`);
73
98
  }
74
99
 
100
+ // src/hex/legacy.ts
101
+ var toHexLegacy = (buffer) => {
102
+ return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join("");
103
+ };
104
+ var toHex = (buffer) => {
105
+ return toHexLegacy(buffer);
106
+ };
107
+
75
108
  // src/address.ts
76
109
  var addressRegex = /0x[0-9a-f]+/i;
110
+ var toAddress = (value, config = {}) => {
111
+ const { bitLength = 160, prefix = true } = config;
112
+ return hexFrom(value, { bitLength, prefix, ...config });
113
+ };
77
114
  var isAddress = (value, bitLength = 160) => {
78
115
  if (typeof value !== "string")
79
116
  return false;
@@ -84,11 +121,16 @@ var isAddress = (value, bitLength = 160) => {
84
121
  return false;
85
122
  return isHex(valueHex, bitLength);
86
123
  };
87
- function asAddress(value, assertOrBitLength, assertOnly) {
88
- const bitLength = typeof assertOrBitLength === "number" ? assertOrBitLength : 160;
89
- const assert = typeof assertOrBitLength !== "number" ? assertOrBitLength : assertOnly;
90
- const result = `0x${asHex(value, bitLength, assert)}`;
91
- return isAddress(result, bitLength) ? result : assertError(value, assert, "Resulting value is not an Address");
124
+ function asAddress(value, assert) {
125
+ let stringValue = void 0;
126
+ switch (typeof value) {
127
+ case "string":
128
+ stringValue = hexFromHexString(value, { prefix: true });
129
+ break;
130
+ default:
131
+ return assert ? assertError(value, assert, `Unsupported type [${typeof value}]`) : void 0;
132
+ }
133
+ return isAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an Address [${value}]`);
92
134
  }
93
135
 
94
136
  // src/hash.ts
@@ -97,20 +139,18 @@ var isHashBitLength = (value) => {
97
139
  return typeof value === "number" && HashBitLength.includes(value);
98
140
  };
99
141
  var isHash = (value, bitLength = 256) => {
100
- if (!isHex(value, bitLength))
101
- return false;
102
- const hex = asHex(value, bitLength);
103
- if (!hex)
104
- return false;
105
- if (!isHashBitLength(nibblesToBits(hex.length)))
106
- return false;
107
- return true;
142
+ return isHex(value, bitLength);
108
143
  };
109
- function asHash(value, assertOrBitLength, assertOnly) {
110
- const bitLength = typeof assertOrBitLength === "number" ? assertOrBitLength : 256;
111
- const assert = typeof assertOrBitLength !== "number" ? assertOrBitLength : assertOnly;
112
- const result = asHex(value, bitLength, assert);
113
- return isHash(result, bitLength) ? result : assertError(value, assert, "Resulting value is not a Hash");
144
+ function asHash(value, assert) {
145
+ let stringValue = void 0;
146
+ switch (typeof value) {
147
+ case "string":
148
+ stringValue = hexFromHexString(value);
149
+ break;
150
+ default:
151
+ return assert ? assertError(value, assert, `Unsupported type [${typeof value}]`) : void 0;
152
+ }
153
+ return isHash(stringValue) ? stringValue : assertError(value, assert, `Value is not a Hash [${value}]`);
114
154
  }
115
155
  export {
116
156
  HashBitLength,
@@ -120,14 +160,20 @@ export {
120
160
  asHex,
121
161
  bitsToNibbles,
122
162
  hexFrom,
163
+ hexFromArrayBuffer,
164
+ hexFromBigInt,
165
+ hexFromHexString,
166
+ hexFromNumber,
123
167
  hexRegex,
124
168
  hexRegexWithPrefix,
125
169
  isAddress,
126
170
  isHash,
127
171
  isHashBitLength,
128
172
  isHex,
129
- isRoundNibble,
173
+ isHexZero,
130
174
  nibblesToBits,
131
- toHex
175
+ toAddress,
176
+ toHex,
177
+ toHexLegacy
132
178
  };
133
179
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/assert.ts","../../src/hex.ts","../../src/address.ts","../../src/hash.ts"],"sourcesContent":["export type AssertCallback = (value: unknown, message: string) => string | boolean\n\nexport type AssertConfig = string | AssertCallback | boolean\n\nexport const assertError = (value: unknown, assert: AssertConfig | undefined, defaultMessage: string) => {\n if (assert) {\n const assertString = typeof assert === 'string' ? assert : typeof assert === 'boolean' ? defaultMessage : assert(value, defaultMessage)\n if (assertString) {\n throw Error(assertString === true ? defaultMessage : assertString)\n }\n }\n return undefined\n}\n","import { isArrayBuffer } from '@xylabs/arraybuffer'\n\nimport { AssertConfig, assertError } from './assert'\n\nexport const hexRegex = /^[0-9a-f]+$/i\nexport const hexRegexWithPrefix = /0x[0-9a-f]+$/i\n\nexport type Hex = string\n\nexport const hexFrom = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, '0')).join('')\n}\n\n//determine the number of nibbles for a given number of bits\nexport const bitsToNibbles = (value: number): number => {\n const nibbles = value >> 2\n if (value !== nibbles << 2) throw Error('Bits for nibbles must multiple of 4')\n return nibbles\n}\n\n//determine the number of nibbles for a given number of bits\nexport const nibblesToBits = (value: number): number => {\n return value << 2\n}\n\n//are the number of bit a round nibble (factor of 4)?\nexport const isRoundNibble = (value: number) => {\n return (value >> 2) << 2 === value\n}\n\nexport const isHex = (value: unknown, bitLength?: number): value is Hex => {\n //Is it a string?\n if (typeof value !== 'string') return false\n\n //If a bitLength specified, does it conform?\n if (bitLength !== undefined && value.length !== bitsToNibbles(bitLength)) return false\n\n //Does it only has hex values?\n return hexRegex.test(value)\n}\n\nexport const toHex = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, '0')).join('')\n}\n\nexport function asHex(value: unknown): Hex | undefined\nexport function asHex(value: unknown, bitLength?: number): Hex | undefined\nexport function asHex(value: unknown, assert: AssertConfig): Hex\nexport function asHex(value: unknown, bitLength: number | undefined, assert?: AssertConfig): Hex\nexport function asHex(value: unknown, assertOrBitLength?: AssertConfig | number, assertOnly?: AssertConfig): Hex | undefined {\n const bitLength = typeof assertOrBitLength === 'number' ? assertOrBitLength : undefined\n const assert = typeof assertOrBitLength !== 'number' ? assertOrBitLength : assertOnly\n\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string':\n //remove the leading 0x if it is there\n stringValue = hexRegexWithPrefix.test(value) ? value.substring(2) : value\n break\n case 'number':\n if (value === Math.floor(value)) {\n stringValue = value.toString(16)\n } else {\n return assertError(value, assert, 'Numbers must be whole')\n }\n break\n case 'bigint':\n stringValue = value.toString(16)\n break\n case 'object':\n if (isArrayBuffer(value)) {\n stringValue = hexFrom(value)\n } else {\n return assertError(value, assert, 'Unsupported object')\n }\n break\n default:\n return assertError(value, assert, `Unsupported type [${typeof value}]`)\n }\n\n //make it conform to the bit length if shorter\n if (stringValue && bitLength) {\n stringValue = stringValue.padStart(bitsToNibbles(bitLength), '0')\n }\n\n return isHex(stringValue, bitLength) ? stringValue.toLowerCase() : assertError(value, assert, 'Unable to convert to Hash')\n}\n","import { AssertConfig, assertError } from './assert'\nimport { asHex, bitsToNibbles, isHex } from './hex'\n\nexport const addressRegex = /0x[0-9a-f]+/i\n\nexport type Address = string\n\nexport const isAddress = (value: unknown, bitLength = 160): value is Address => {\n //Is it a string?\n if (typeof value !== 'string') return false\n\n //Does it only has hex values and leading 0x?\n if (!addressRegex.test(value)) return false\n\n const valueHex = value.substring(2)\n\n //If a bitLength specified, does it conform?\n if (bitLength !== undefined && valueHex.length !== bitsToNibbles(bitLength)) return false\n\n return isHex(valueHex, bitLength)\n}\n\nexport function asAddress(value: unknown): Address | undefined\nexport function asAddress(value: unknown, assert: AssertConfig): Address\nexport function asAddress(value: unknown, bitLength: number): Address | undefined\nexport function asAddress(value: unknown, bitLength: number, assert: AssertConfig): Address\nexport function asAddress(value: unknown, assertOrBitLength?: AssertConfig | number, assertOnly?: AssertConfig): Address | undefined {\n const bitLength = typeof assertOrBitLength === 'number' ? assertOrBitLength : 160\n const assert = typeof assertOrBitLength !== 'number' ? assertOrBitLength : assertOnly\n\n const result = `0x${asHex(value, bitLength, assert)}`\n return isAddress(result, bitLength) ? result : assertError(value, assert, 'Resulting value is not an Address')\n}\n","import { AssertConfig, assertError } from './assert'\nimport { asHex, Hex, isHex, nibblesToBits } from './hex'\n\nexport type HashBitLength = 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096\nexport const HashBitLength: HashBitLength[] = [32, 64, 128, 256, 512, 1024, 2048, 4096]\n\nexport const isHashBitLength = (value: unknown): value is HashBitLength => {\n return typeof value === 'number' && HashBitLength.includes(value as HashBitLength)\n}\n\nexport type Hash = Hex\nexport const isHash = (value: unknown, bitLength: HashBitLength = 256): value is Hash => {\n if (!isHex(value, bitLength)) return false\n\n const hex = asHex(value, bitLength)\n if (!hex) return false\n\n if (!isHashBitLength(nibblesToBits(hex.length))) return false\n\n return true\n}\n\nexport function asHash(value: unknown): Hash | undefined\nexport function asHash(value: unknown, assert: AssertConfig): Hash\nexport function asHash(value: unknown, bitLength?: HashBitLength): Hash | undefined\nexport function asHash(value: unknown, bitLength: HashBitLength | undefined, assert: AssertConfig): Hash\nexport function asHash(value: unknown, assertOrBitLength?: AssertConfig | HashBitLength, assertOnly?: AssertConfig): Hash | undefined {\n const bitLength: HashBitLength = typeof assertOrBitLength === 'number' ? assertOrBitLength : 256\n const assert = typeof assertOrBitLength !== 'number' ? assertOrBitLength : assertOnly\n\n const result = asHex(value, bitLength, assert)\n return isHash(result, bitLength) ? result : assertError(value, assert, 'Resulting value is not a Hash')\n}\n"],"mappings":";AAIO,IAAM,cAAc,CAAC,OAAgB,QAAkC,mBAA2B;AACvG,MAAI,QAAQ;AACV,UAAM,eAAe,OAAO,WAAW,WAAW,SAAS,OAAO,WAAW,YAAY,iBAAiB,OAAO,OAAO,cAAc;AACtI,QAAI,cAAc;AAChB,YAAM,MAAM,iBAAiB,OAAO,iBAAiB,YAAY;AAAA,IACnE;AAAA,EACF;AACA,SAAO;AACT;;;ACZA,SAAS,qBAAqB;AAIvB,IAAM,WAAW;AACjB,IAAM,qBAAqB;AAI3B,IAAM,UAAU,CAAC,WAAwB;AAC9C,SAAO,CAAC,GAAG,IAAI,WAAW,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACxF;AAGO,IAAM,gBAAgB,CAAC,UAA0B;AACtD,QAAM,UAAU,SAAS;AACzB,MAAI,UAAU,WAAW;AAAG,UAAM,MAAM,qCAAqC;AAC7E,SAAO;AACT;AAGO,IAAM,gBAAgB,CAAC,UAA0B;AACtD,SAAO,SAAS;AAClB;AAGO,IAAM,gBAAgB,CAAC,UAAkB;AAC9C,SAAQ,SAAS,KAAM,MAAM;AAC/B;AAEO,IAAM,QAAQ,CAAC,OAAgB,cAAqC;AAEzE,MAAI,OAAO,UAAU;AAAU,WAAO;AAGtC,MAAI,cAAc,UAAa,MAAM,WAAW,cAAc,SAAS;AAAG,WAAO;AAGjF,SAAO,SAAS,KAAK,KAAK;AAC5B;AAEO,IAAM,QAAQ,CAAC,WAAwB;AAC5C,SAAO,CAAC,GAAG,IAAI,WAAW,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACxF;AAMO,SAAS,MAAM,OAAgB,mBAA2C,YAA4C;AAC3H,QAAM,YAAY,OAAO,sBAAsB,WAAW,oBAAoB;AAC9E,QAAM,SAAS,OAAO,sBAAsB,WAAW,oBAAoB;AAE3E,MAAI,cAAkC;AAEtC,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AAEH,oBAAc,mBAAmB,KAAK,KAAK,IAAI,MAAM,UAAU,CAAC,IAAI;AACpE;AAAA,IACF,KAAK;AACH,UAAI,UAAU,KAAK,MAAM,KAAK,GAAG;AAC/B,sBAAc,MAAM,SAAS,EAAE;AAAA,MACjC,OAAO;AACL,eAAO,YAAY,OAAO,QAAQ,uBAAuB;AAAA,MAC3D;AACA;AAAA,IACF,KAAK;AACH,oBAAc,MAAM,SAAS,EAAE;AAC/B;AAAA,IACF,KAAK;AACH,UAAI,cAAc,KAAK,GAAG;AACxB,sBAAc,QAAQ,KAAK;AAAA,MAC7B,OAAO;AACL,eAAO,YAAY,OAAO,QAAQ,oBAAoB;AAAA,MACxD;AACA;AAAA,IACF;AACE,aAAO,YAAY,OAAO,QAAQ,qBAAqB,OAAO,KAAK,GAAG;AAAA,EAC1E;AAGA,MAAI,eAAe,WAAW;AAC5B,kBAAc,YAAY,SAAS,cAAc,SAAS,GAAG,GAAG;AAAA,EAClE;AAEA,SAAO,MAAM,aAAa,SAAS,IAAI,YAAY,YAAY,IAAI,YAAY,OAAO,QAAQ,2BAA2B;AAC3H;;;ACpFO,IAAM,eAAe;AAIrB,IAAM,YAAY,CAAC,OAAgB,YAAY,QAA0B;AAE9E,MAAI,OAAO,UAAU;AAAU,WAAO;AAGtC,MAAI,CAAC,aAAa,KAAK,KAAK;AAAG,WAAO;AAEtC,QAAM,WAAW,MAAM,UAAU,CAAC;AAGlC,MAAI,cAAc,UAAa,SAAS,WAAW,cAAc,SAAS;AAAG,WAAO;AAEpF,SAAO,MAAM,UAAU,SAAS;AAClC;AAMO,SAAS,UAAU,OAAgB,mBAA2C,YAAgD;AACnI,QAAM,YAAY,OAAO,sBAAsB,WAAW,oBAAoB;AAC9E,QAAM,SAAS,OAAO,sBAAsB,WAAW,oBAAoB;AAE3E,QAAM,SAAS,KAAK,MAAM,OAAO,WAAW,MAAM,CAAC;AACnD,SAAO,UAAU,QAAQ,SAAS,IAAI,SAAS,YAAY,OAAO,QAAQ,mCAAmC;AAC/G;;;AC5BO,IAAM,gBAAiC,CAAC,IAAI,IAAI,KAAK,KAAK,KAAK,MAAM,MAAM,IAAI;AAE/E,IAAM,kBAAkB,CAAC,UAA2C;AACzE,SAAO,OAAO,UAAU,YAAY,cAAc,SAAS,KAAsB;AACnF;AAGO,IAAM,SAAS,CAAC,OAAgB,YAA2B,QAAuB;AACvF,MAAI,CAAC,MAAM,OAAO,SAAS;AAAG,WAAO;AAErC,QAAM,MAAM,MAAM,OAAO,SAAS;AAClC,MAAI,CAAC;AAAK,WAAO;AAEjB,MAAI,CAAC,gBAAgB,cAAc,IAAI,MAAM,CAAC;AAAG,WAAO;AAExD,SAAO;AACT;AAMO,SAAS,OAAO,OAAgB,mBAAkD,YAA6C;AACpI,QAAM,YAA2B,OAAO,sBAAsB,WAAW,oBAAoB;AAC7F,QAAM,SAAS,OAAO,sBAAsB,WAAW,oBAAoB;AAE3E,QAAM,SAAS,MAAM,OAAO,WAAW,MAAM;AAC7C,SAAO,OAAO,QAAQ,SAAS,IAAI,SAAS,YAAY,OAAO,QAAQ,+BAA+B;AACxG;","names":[]}
1
+ {"version":3,"sources":["../../src/assert.ts","../../src/hex/from.ts","../../src/hex/nibble.ts","../../src/hex/regex.ts","../../src/hex/is.ts","../../src/hex/as.ts","../../src/hex/legacy.ts","../../src/address.ts","../../src/hash.ts"],"sourcesContent":["export type AssertCallback = (value: unknown, message: string) => string | boolean\n\nexport type AssertConfig = string | AssertCallback | boolean\n\nexport const assertError = (value: unknown, assert: AssertConfig | undefined, defaultMessage: string) => {\n if (assert) {\n const assertString = typeof assert === 'string' ? assert : typeof assert === 'boolean' ? defaultMessage : assert(value, defaultMessage)\n if (assertString) {\n throw Error(assertString === true ? defaultMessage : assertString)\n }\n }\n return undefined\n}\n","import { isArrayBuffer } from '@xylabs/arraybuffer'\n\nimport { isHex } from './is'\nimport { HexConfig } from './model'\nimport { bitsToNibbles } from './nibble'\n\nexport const hexFromArrayBuffer = (buffer: ArrayBuffer, config?: HexConfig): string => {\n const unPadded = [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, '0')).join('')\n return hexFromHexString(unPadded, config)\n}\n\nexport const hexFromBigInt = (value: bigint, config: HexConfig = {}): string => {\n const { bitLength } = config\n const unPadded = value.toString(16)\n const padded = bitLength === undefined ? unPadded : unPadded.padStart(bitsToNibbles(bitLength), '0')\n return hexFromHexString(padded, config)\n}\n\nexport const hexFromNumber = (value: number, config?: HexConfig): string => {\n return hexFromBigInt(BigInt(value), config)\n}\n\nexport const hexFromHexString = (value: string, config: HexConfig = {}): string => {\n const { prefix = false, byteSize = 8 } = config\n const nibbleBoundary = bitsToNibbles(byteSize)\n const unPadded = (value.startsWith('0x') ? value.substring(2) : value).toLowerCase()\n if (isHex(unPadded)) {\n const padded = unPadded.padStart(unPadded.length + (unPadded.length % nibbleBoundary), '0')\n return prefix ? `0x${padded}` : padded\n } else {\n throw Error('Received string is not a value hex')\n }\n}\n\nexport const hexFrom = (value: unknown, config?: HexConfig): string => {\n switch (typeof value) {\n case 'string':\n return hexFromHexString(value, config)\n case 'bigint':\n return hexFromBigInt(value, config)\n case 'number':\n return hexFromNumber(value, config)\n case 'object':\n if (isArrayBuffer(value)) {\n return hexFromArrayBuffer(value, config)\n } else {\n throw Error('Invalid type: object !== ArrayBuffer')\n }\n default:\n throw Error(`Invalid type: ${typeof value}`)\n }\n}\n","//determine the number of nibbles for a given number of bits\nexport const bitsToNibbles = (value: number): number => {\n const nibbles = value >> 2\n if (value !== nibbles << 2) throw Error('Bits for nibbles must multiple of 4')\n return nibbles\n}\n\n//determine the number of nibbles for a given number of bits\nexport const nibblesToBits = (value: number): number => {\n return value << 2\n}\n","export const hexRegex = /^[0-9a-f]+$/i\nexport const hexRegexWithPrefix = /0x[0-9a-f]+$/i\n","import { hexFromHexString } from './from'\nimport { Hex } from './model'\nimport { bitsToNibbles } from './nibble'\nimport { hexRegex } from './regex'\n\nexport const isHexZero = (value: string) => {\n return BigInt(hexFromHexString(value, { prefix: true })) === 0n\n}\n\nexport const isHex = (value: unknown, bitLength?: number): value is Hex => {\n //Is it a string?\n if (typeof value !== 'string') return false\n\n console.log(`BitLength: ${value.length << 2}|${bitLength}`)\n\n //If a bitLength specified, does it conform?\n if (bitLength !== undefined && value.length !== bitsToNibbles(bitLength)) return false\n\n //Does it only has hex values?\n return hexRegex.test(value)\n}\n","import { AssertConfig, assertError } from '../assert'\nimport { hexFromHexString } from './from'\nimport { isHex } from './is'\nimport { Hex } from './model'\n\nexport function asHex(value: unknown): Hex | undefined\nexport function asHex(value: unknown, assert: AssertConfig): Hex\nexport function asHex(value: unknown, assert?: AssertConfig): Hex | undefined {\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string':\n stringValue = hexFromHexString(value)\n break\n default:\n return assertError(value, assert, `Unsupported type [${typeof value}]`)\n }\n\n return isHex(stringValue) ? stringValue : assertError(value, assert, `Value is not Hex [${value}]`)\n}\n","export const toHexLegacy = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, '0')).join('')\n}\n\n/** @deprecated use toHexLegacy instead */\nexport const toHex = (buffer: ArrayBuffer) => {\n return toHexLegacy(buffer)\n}\n","import { AssertConfig, assertError } from './assert'\nimport { bitsToNibbles, HexConfig, hexFrom, hexFromHexString, isHex } from './hex'\n\nexport const addressRegex = /0x[0-9a-f]+/i\n\nexport type Address = string\n\nexport const toAddress = (value: unknown, config: HexConfig = {}) => {\n const { bitLength = 160, prefix = true } = config\n return hexFrom(value, { bitLength, prefix, ...config })\n}\n\nexport const isAddress = (value: unknown, bitLength = 160): value is Address => {\n //Is it a string?\n if (typeof value !== 'string') return false\n\n //Does it only has hex values and leading 0x?\n if (!addressRegex.test(value)) return false\n\n const valueHex = value.substring(2)\n\n //If a bitLength specified, does it conform?\n if (bitLength !== undefined && valueHex.length !== bitsToNibbles(bitLength)) return false\n\n return isHex(valueHex, bitLength)\n}\n\nexport function asAddress(value: unknown): Address | undefined\nexport function asAddress(value: unknown, assert: AssertConfig): Address\nexport function asAddress(value: unknown, assert?: AssertConfig): Address | undefined {\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string':\n stringValue = hexFromHexString(value, { prefix: true })\n break\n default:\n return assert ? assertError(value, assert, `Unsupported type [${typeof value}]`) : undefined\n }\n return isAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an Address [${value}]`)\n}\n","import { AssertConfig, assertError } from './assert'\nimport { Hex, hexFromHexString, isHex } from './hex'\n\nexport type HashBitLength = 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096\nexport const HashBitLength: HashBitLength[] = [32, 64, 128, 256, 512, 1024, 2048, 4096]\n\nexport const isHashBitLength = (value: unknown): value is HashBitLength => {\n return typeof value === 'number' && HashBitLength.includes(value as HashBitLength)\n}\n\nexport type Hash = Hex\nexport const isHash = (value: unknown, bitLength: HashBitLength = 256): value is Hash => {\n return isHex(value, bitLength)\n}\n\nexport function asHash(value: unknown): Hash | undefined\nexport function asHash(value: unknown, assert: AssertConfig): Hash\nexport function asHash(value: unknown, assert?: AssertConfig): Hash | undefined {\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string':\n stringValue = hexFromHexString(value)\n break\n default:\n return assert ? assertError(value, assert, `Unsupported type [${typeof value}]`) : undefined\n }\n return isHash(stringValue) ? stringValue : assertError(value, assert, `Value is not a Hash [${value}]`)\n}\n"],"mappings":"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","names":[]}