@xylabs/hex 5.0.5 → 5.0.7
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/dist/neutral/address/AddressTransformZod.d.ts +8 -0
- package/dist/neutral/address/AddressTransformZod.d.ts.map +1 -0
- package/dist/neutral/address/AddressValidationZod.d.ts +8 -0
- package/dist/neutral/address/AddressValidationZod.d.ts.map +1 -0
- package/dist/neutral/address/address.d.ts +8 -23
- package/dist/neutral/address/address.d.ts.map +1 -1
- package/dist/neutral/address/addressDeprecated.d.ts +18 -0
- package/dist/neutral/address/addressDeprecated.d.ts.map +1 -0
- package/dist/neutral/address/as.d.ts +7 -0
- package/dist/neutral/address/as.d.ts.map +1 -0
- package/dist/neutral/address/index.d.ts +6 -2
- package/dist/neutral/address/index.d.ts.map +1 -1
- package/dist/neutral/address/is.d.ts +6 -0
- package/dist/neutral/address/is.d.ts.map +1 -0
- package/dist/neutral/address/to.d.ts +6 -0
- package/dist/neutral/address/to.d.ts.map +1 -0
- package/dist/neutral/ethAddress.d.ts +5 -1
- package/dist/neutral/ethAddress.d.ts.map +1 -1
- package/dist/neutral/hash/as.d.ts +5 -0
- package/dist/neutral/hash/as.d.ts.map +1 -0
- package/dist/neutral/hash/hash.d.ts +14 -0
- package/dist/neutral/hash/hash.d.ts.map +1 -0
- package/dist/neutral/hash/index.d.ts +5 -0
- package/dist/neutral/hash/index.d.ts.map +1 -0
- package/dist/neutral/hash/is.d.ts +3 -0
- package/dist/neutral/hash/is.d.ts.map +1 -0
- package/dist/neutral/hash/zod.d.ts +20 -0
- package/dist/neutral/hash/zod.d.ts.map +1 -0
- package/dist/neutral/hex/as.d.ts +1 -1
- package/dist/neutral/hex/as.d.ts.map +1 -1
- package/dist/neutral/hex/from/from.d.ts +1 -1
- package/dist/neutral/hex/from/from.d.ts.map +1 -1
- package/dist/neutral/hex/from/fromArrayBuffer.d.ts +1 -1
- package/dist/neutral/hex/from/fromArrayBuffer.d.ts.map +1 -1
- package/dist/neutral/hex/from/fromBigInt.d.ts +1 -1
- package/dist/neutral/hex/from/fromBigInt.d.ts.map +1 -1
- package/dist/neutral/hex/from/fromHexString.d.ts +1 -1
- package/dist/neutral/hex/from/fromHexString.d.ts.map +1 -1
- package/dist/neutral/hex/from/fromNumber.d.ts +1 -1
- package/dist/neutral/hex/from/fromNumber.d.ts.map +1 -1
- package/dist/neutral/hex/{model.d.ts → hex.d.ts} +2 -2
- package/dist/neutral/hex/hex.d.ts.map +1 -0
- package/dist/neutral/hex/index.d.ts +1 -1
- package/dist/neutral/hex/index.d.ts.map +1 -1
- package/dist/neutral/hex/is.d.ts +1 -1
- package/dist/neutral/hex/is.d.ts.map +1 -1
- package/dist/neutral/hex/to.d.ts +1 -1
- package/dist/neutral/hex/to.d.ts.map +1 -1
- package/dist/neutral/index-internal.d.ts +1 -1
- package/dist/neutral/index-internal.d.ts.map +1 -1
- package/dist/neutral/index-internal.mjs +101 -62
- package/dist/neutral/index-internal.mjs.map +1 -1
- package/dist/neutral/index.d.ts +1 -0
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +108 -62
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/zod.d.ts +10 -0
- package/dist/neutral/zod.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/address/AddressTransformZod.ts +26 -0
- package/src/address/{AddressZodValidation.ts → AddressValidationZod.ts} +3 -3
- package/src/address/address.ts +7 -77
- package/src/address/addressDeprecated.ts +18 -0
- package/src/address/as.ts +37 -0
- package/src/address/index.ts +6 -2
- package/src/address/is.ts +14 -0
- package/src/address/to.ts +18 -0
- package/src/ethAddress.ts +10 -3
- package/src/hash/as.ts +24 -0
- package/src/hash/hash.ts +23 -0
- package/src/hash/index.ts +4 -0
- package/src/hash/is.ts +6 -0
- package/src/hash/zod.ts +8 -0
- package/src/hex/as.ts +1 -1
- package/src/hex/from/from.ts +1 -1
- package/src/hex/from/fromArrayBuffer.ts +1 -1
- package/src/hex/from/fromBigInt.ts +1 -1
- package/src/hex/from/fromHexString.ts +1 -1
- package/src/hex/from/fromNumber.ts +1 -1
- package/src/hex/{model.ts → hex.ts} +1 -1
- package/src/hex/index.ts +1 -1
- package/src/hex/is.ts +1 -1
- package/src/hex/to.ts +1 -1
- package/src/index-internal.ts +1 -1
- package/src/index.ts +1 -0
- package/src/spec/hash.spec.ts +1 -1
- package/src/zod.ts +7 -0
- package/dist/neutral/address/AddressZodTransform.d.ts +0 -5
- package/dist/neutral/address/AddressZodTransform.d.ts.map +0 -1
- package/dist/neutral/address/AddressZodValidation.d.ts +0 -5
- package/dist/neutral/address/AddressZodValidation.d.ts.map +0 -1
- package/dist/neutral/hash.d.ts +0 -17
- package/dist/neutral/hash.d.ts.map +0 -1
- package/dist/neutral/hex/model.d.ts.map +0 -1
- package/src/address/AddressZodTransform.ts +0 -19
- package/src/hash.ts +0 -51
package/dist/neutral/index.mjs
CHANGED
|
@@ -1,6 +1,24 @@
|
|
|
1
1
|
// src/address/address.ts
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
// src/HexRegEx.ts
|
|
5
|
+
var HexRegExMinMax = (minBytes = 0, maxBytes = Number.MAX_SAFE_INTEGER / 2) => {
|
|
6
|
+
return new RegExp(`^[a-f0-9]{${minBytes * 2},${maxBytes * 2}}$`);
|
|
7
|
+
};
|
|
8
|
+
var HexRegExMinMaxMixedCaseWithPrefix = (minBytes = 0, maxBytes = Number.MAX_SAFE_INTEGER / 2) => {
|
|
9
|
+
return new RegExp(`^0x[a-fA-F0-9]{${minBytes * 2},${maxBytes * 2}}$`);
|
|
10
|
+
};
|
|
11
|
+
var HexRegEx = /^[0-9a-f]+$/;
|
|
12
|
+
var HexRegExWithPrefix = /^0x[0-9a-f]+$/;
|
|
13
|
+
|
|
14
|
+
// src/address/address.ts
|
|
15
|
+
var ZERO_ADDRESS = "0000000000000000000000000000000000000000";
|
|
16
|
+
var ADDRESS_LENGTH = 40;
|
|
17
|
+
var AddressRegEx = HexRegExMinMax(ADDRESS_LENGTH / 2, ADDRESS_LENGTH / 2);
|
|
18
|
+
var AddressZod = z.string().regex(AddressRegEx, { message: "Invalid hex format" });
|
|
19
|
+
|
|
20
|
+
// src/address/addressDeprecated.ts
|
|
21
|
+
import { z as z5 } from "zod";
|
|
4
22
|
|
|
5
23
|
// src/assert.ts
|
|
6
24
|
import { isString, isUndefined } from "@xylabs/typeof";
|
|
@@ -17,16 +35,6 @@ var assertError = (value, assert, defaultMessage) => {
|
|
|
17
35
|
// src/hex/from/fromHexString.ts
|
|
18
36
|
import { isNumber } from "@xylabs/typeof";
|
|
19
37
|
|
|
20
|
-
// src/HexRegEx.ts
|
|
21
|
-
var HexRegExMinMax = (minBytes = 0, maxBytes = Number.MAX_SAFE_INTEGER / 2) => {
|
|
22
|
-
return new RegExp(`^[a-f0-9]{${minBytes * 2},${maxBytes * 2}}$`);
|
|
23
|
-
};
|
|
24
|
-
var HexRegExMinMaxMixedCaseWithPrefix = (minBytes = 0, maxBytes = Number.MAX_SAFE_INTEGER / 2) => {
|
|
25
|
-
return new RegExp(`^0x[a-fA-F0-9]{${minBytes * 2},${maxBytes * 2}}$`);
|
|
26
|
-
};
|
|
27
|
-
var HexRegEx = /^[0-9a-f]+$/;
|
|
28
|
-
var HexRegExWithPrefix = /^0x[0-9a-f]+$/;
|
|
29
|
-
|
|
30
38
|
// src/hex/nibble.ts
|
|
31
39
|
var bitsToNibbles = (value) => {
|
|
32
40
|
const nibbles = value >> 2;
|
|
@@ -116,6 +124,10 @@ function asHex(value, assert) {
|
|
|
116
124
|
return isHex(stringValue) ? stringValue : assertError(value, assert, `Value is not Hex [${value}]`);
|
|
117
125
|
}
|
|
118
126
|
|
|
127
|
+
// src/hex/hex.ts
|
|
128
|
+
import { z as z2 } from "zod";
|
|
129
|
+
var HexZod = z2.string().regex(HexRegEx, { message: "Invalid hex format" });
|
|
130
|
+
|
|
119
131
|
// src/hex/isHexZero.ts
|
|
120
132
|
import { isString as isString2 } from "@xylabs/typeof";
|
|
121
133
|
var isHexZero = (value) => {
|
|
@@ -127,42 +139,38 @@ var toHexLegacy = (buffer) => {
|
|
|
127
139
|
return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join("");
|
|
128
140
|
};
|
|
129
141
|
|
|
130
|
-
// src/hex/model.ts
|
|
131
|
-
import z from "zod";
|
|
132
|
-
var HexZod = z.string().regex(HexRegEx, { message: "Invalid hex format" });
|
|
133
|
-
|
|
134
142
|
// src/hex/to.ts
|
|
135
143
|
var toHex = (value, config = {}) => {
|
|
136
144
|
const { prefix = false } = config;
|
|
137
145
|
return hexFrom(value, { prefix, ...config });
|
|
138
146
|
};
|
|
139
147
|
|
|
140
|
-
// src/address/
|
|
141
|
-
import
|
|
148
|
+
// src/address/AddressTransformZod.ts
|
|
149
|
+
import { z as z4 } from "zod";
|
|
142
150
|
|
|
143
|
-
// src/address/
|
|
144
|
-
import
|
|
145
|
-
var
|
|
151
|
+
// src/address/AddressValidationZod.ts
|
|
152
|
+
import { z as z3 } from "zod";
|
|
153
|
+
var AddressValidationZod = z3.string().refine((x) => HexZod.safeParse(x)).refine((x) => x.length === ADDRESS_LENGTH, { error: (e) => new Error(`Address must have 40 characters [${e.input}]`) }).transform((v) => v);
|
|
146
154
|
|
|
147
|
-
// src/address/
|
|
148
|
-
var
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
155
|
+
// src/address/AddressTransformZod.ts
|
|
156
|
+
var AddressTransformZod = z4.union([z4.string(), z4.bigint(), z4.number()]).transform((value) => {
|
|
157
|
+
switch (typeof value) {
|
|
158
|
+
case "bigint": {
|
|
159
|
+
return value.toString(16).padStart(ADDRESS_LENGTH, "0");
|
|
160
|
+
}
|
|
161
|
+
case "string": {
|
|
162
|
+
if (value.startsWith("0x")) {
|
|
163
|
+
return value.slice(2);
|
|
164
|
+
}
|
|
165
|
+
return value;
|
|
166
|
+
}
|
|
167
|
+
case "number": {
|
|
168
|
+
return BigInt(value).toString(16).padStart(ADDRESS_LENGTH, "0");
|
|
169
|
+
}
|
|
154
170
|
}
|
|
155
|
-
|
|
156
|
-
}).refine((x) => AddressZodValidation.safeParse(x).data).transform((x) => x);
|
|
171
|
+
}).refine((x) => AddressValidationZod.safeParse(x).data).transform((x) => x);
|
|
157
172
|
|
|
158
|
-
// src/address/
|
|
159
|
-
var AddressRegEx = HexRegExMinMax(20, 20);
|
|
160
|
-
var AddressToStringZod = z4.string().regex(AddressRegEx);
|
|
161
|
-
var AddressToStringSchema = AddressToStringZod;
|
|
162
|
-
var AddressFromStringZod = z4.string().toLowerCase().regex(AddressRegEx).transform((v) => toAddress(v));
|
|
163
|
-
var AddressFromStringSchema = AddressFromStringZod;
|
|
164
|
-
var ZERO_ADDRESS = "0000000000000000000000000000000000000000";
|
|
165
|
-
var ADDRESS_LENGTH = 40;
|
|
173
|
+
// src/address/to.ts
|
|
166
174
|
var toAddress = (value, config = {}) => {
|
|
167
175
|
const { bitLength = 160, prefix = false } = config;
|
|
168
176
|
return hexFrom(value, {
|
|
@@ -171,10 +179,29 @@ var toAddress = (value, config = {}) => {
|
|
|
171
179
|
...config
|
|
172
180
|
});
|
|
173
181
|
};
|
|
182
|
+
function toAddressV2(value, assert = false) {
|
|
183
|
+
return assert ? AddressTransformZod.parse(value) : AddressTransformZod.safeParse(value).data;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// src/address/addressDeprecated.ts
|
|
187
|
+
var AddressToStringZod = z5.string().regex(AddressRegEx);
|
|
188
|
+
var AddressToStringSchema = AddressToStringZod;
|
|
189
|
+
var AddressFromStringZod = z5.string().toLowerCase().regex(AddressRegEx).transform((v) => toAddress(v));
|
|
190
|
+
var AddressFromStringSchema = AddressFromStringZod;
|
|
191
|
+
|
|
192
|
+
// src/address/as.ts
|
|
193
|
+
import { isObject } from "@xylabs/typeof";
|
|
194
|
+
|
|
195
|
+
// src/address/is.ts
|
|
174
196
|
var isAddress = (value, config = {}) => {
|
|
175
197
|
const { bitLength = 160, prefix = false } = config;
|
|
176
198
|
return isHex(value, { bitLength, prefix });
|
|
177
199
|
};
|
|
200
|
+
function isAddressV2(value) {
|
|
201
|
+
return AddressValidationZod.safeParse(value).success;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// src/address/as.ts
|
|
178
205
|
function asAddress(value, assert) {
|
|
179
206
|
try {
|
|
180
207
|
let stringValue = void 0;
|
|
@@ -193,21 +220,17 @@ function asAddress(value, assert) {
|
|
|
193
220
|
return assertError(void 0, assert, error.message);
|
|
194
221
|
}
|
|
195
222
|
}
|
|
196
|
-
function isAddressV2(value) {
|
|
197
|
-
return AddressZodValidation.safeParse(value).success;
|
|
198
|
-
}
|
|
199
223
|
function asAddressV2(value, assert = false) {
|
|
200
|
-
return assert ?
|
|
201
|
-
}
|
|
202
|
-
function toAddressV2(value, assert = false) {
|
|
203
|
-
return assert ? AddressZodTransform.parse(value) : AddressZodTransform.safeParse(value).data;
|
|
224
|
+
return assert ? AddressValidationZod.parse(value) : AddressValidationZod.safeParse(value).data;
|
|
204
225
|
}
|
|
205
226
|
|
|
206
227
|
// src/ethAddress.ts
|
|
207
|
-
import
|
|
228
|
+
import { z as z6 } from "zod";
|
|
208
229
|
var EthAddressRegEx = HexRegExMinMaxMixedCaseWithPrefix(20, 20);
|
|
209
|
-
var
|
|
210
|
-
var
|
|
230
|
+
var EthAddressToStringZod = z6.string().regex(EthAddressRegEx);
|
|
231
|
+
var EthAddressToStringSchema = EthAddressToStringZod;
|
|
232
|
+
var EthAddressFromStringZod = z6.string().regex(EthAddressRegEx).transform((v) => toEthAddress(v));
|
|
233
|
+
var EthAddressFromStringSchema = EthAddressFromStringZod;
|
|
211
234
|
var ETH_ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
212
235
|
var toEthAddress = (value, config = {}) => {
|
|
213
236
|
const { bitLength = 160, prefix = false } = config;
|
|
@@ -221,7 +244,7 @@ var isEthAddress = (value, config = {}) => {
|
|
|
221
244
|
const { bitLength = 160, prefix = true } = config;
|
|
222
245
|
return isHex(value, { bitLength, prefix });
|
|
223
246
|
};
|
|
224
|
-
var EthAddressZod =
|
|
247
|
+
var EthAddressZod = z6.string().regex(EthAddressRegEx, { message: "Invalid address format" }).refine(
|
|
225
248
|
isEthAddress
|
|
226
249
|
);
|
|
227
250
|
function asEthAddress(value, assert) {
|
|
@@ -245,21 +268,15 @@ function asEthAddress(value, assert) {
|
|
|
245
268
|
}
|
|
246
269
|
}
|
|
247
270
|
|
|
248
|
-
// src/hash.ts
|
|
271
|
+
// src/hash/as.ts
|
|
249
272
|
import { isUndefined as isUndefined2 } from "@xylabs/typeof";
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
var ZERO_HASH = "0000000000000000000000000000000000000000000000000000000000000000";
|
|
253
|
-
var HashBitLength = [32, 64, 128, 256, 512, 1024, 2048, 4096];
|
|
254
|
-
var isHashBitLength = (value) => {
|
|
255
|
-
return typeof value === "number" && HashBitLength.includes(value);
|
|
256
|
-
};
|
|
273
|
+
|
|
274
|
+
// src/hash/is.ts
|
|
257
275
|
var isHash = (value, bitLength = 256) => {
|
|
258
276
|
return isHex(value, { bitLength });
|
|
259
277
|
};
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
);
|
|
278
|
+
|
|
279
|
+
// src/hash/as.ts
|
|
263
280
|
function asHash(value, assert) {
|
|
264
281
|
let stringValue = void 0;
|
|
265
282
|
switch (typeof value) {
|
|
@@ -274,10 +291,31 @@ function asHash(value, assert) {
|
|
|
274
291
|
return isHash(stringValue) ? stringValue : assertError(value, assert, `Value is not a Hash [${value}]`);
|
|
275
292
|
}
|
|
276
293
|
|
|
294
|
+
// src/hash/hash.ts
|
|
295
|
+
import { z as z7 } from "zod";
|
|
296
|
+
var HASH_LENGTH = 32;
|
|
297
|
+
var HashRegEx = HexRegExMinMax(HASH_LENGTH, HASH_LENGTH);
|
|
298
|
+
var ZERO_HASH = "0000000000000000000000000000000000000000000000000000000000000000";
|
|
299
|
+
var HashBitLength = [32, 64, 128, 256, 512, 1024, 2048, 4096];
|
|
300
|
+
var isHashBitLength = (value) => {
|
|
301
|
+
return typeof value === "number" && HashBitLength.includes(value);
|
|
302
|
+
};
|
|
303
|
+
var HashZod = z7.string().regex(HashRegEx, { message: "Invalid hex format" });
|
|
304
|
+
|
|
305
|
+
// src/hash/zod.ts
|
|
306
|
+
import { z as z8 } from "zod";
|
|
307
|
+
var HashToJsonZod = HashZod.transform((v) => v);
|
|
308
|
+
var JsonToHashZod = z8.string().transform((v) => asHash(v, true));
|
|
309
|
+
|
|
277
310
|
// src/hexToBigInt.ts
|
|
278
311
|
function hexToBigInt(hex) {
|
|
279
312
|
return BigInt(hexFromHexString(hex, { prefix: true }));
|
|
280
313
|
}
|
|
314
|
+
|
|
315
|
+
// src/zod.ts
|
|
316
|
+
import { z as z9 } from "zod";
|
|
317
|
+
var BigIntToJsonZod = z9.bigint().nonnegative().transform((x) => toHex(x));
|
|
318
|
+
var JsonToBigIntZod = z9.string().transform((x) => toHex(x)).transform((x) => hexToBigInt(x));
|
|
281
319
|
export {
|
|
282
320
|
ADDRESS_LENGTH,
|
|
283
321
|
AddressFromStringSchema,
|
|
@@ -285,21 +323,29 @@ export {
|
|
|
285
323
|
AddressRegEx,
|
|
286
324
|
AddressToStringSchema,
|
|
287
325
|
AddressToStringZod,
|
|
288
|
-
|
|
289
|
-
|
|
326
|
+
AddressTransformZod,
|
|
327
|
+
AddressValidationZod,
|
|
328
|
+
AddressZod,
|
|
329
|
+
BigIntToJsonZod,
|
|
290
330
|
ETH_ZERO_ADDRESS,
|
|
291
331
|
EthAddressFromStringSchema,
|
|
332
|
+
EthAddressFromStringZod,
|
|
292
333
|
EthAddressRegEx,
|
|
293
334
|
EthAddressToStringSchema,
|
|
335
|
+
EthAddressToStringZod,
|
|
294
336
|
EthAddressZod,
|
|
337
|
+
HASH_LENGTH,
|
|
295
338
|
HashBitLength,
|
|
296
339
|
HashRegEx,
|
|
340
|
+
HashToJsonZod,
|
|
297
341
|
HashZod,
|
|
298
342
|
HexRegEx,
|
|
299
343
|
HexRegExMinMax,
|
|
300
344
|
HexRegExMinMaxMixedCaseWithPrefix,
|
|
301
345
|
HexRegExWithPrefix,
|
|
302
346
|
HexZod,
|
|
347
|
+
JsonToBigIntZod,
|
|
348
|
+
JsonToHashZod,
|
|
303
349
|
ZERO_ADDRESS,
|
|
304
350
|
ZERO_HASH,
|
|
305
351
|
asAddress,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/address/address.ts","../../src/assert.ts","../../src/hex/from/fromHexString.ts","../../src/HexRegEx.ts","../../src/hex/nibble.ts","../../src/hex/is.ts","../../src/hex/from/fromArrayBuffer.ts","../../src/hex/from/fromBigInt.ts","../../src/hex/from/fromNumber.ts","../../src/hex/from/from.ts","../../src/hex/as.ts","../../src/hex/isHexZero.ts","../../src/hex/legacy.ts","../../src/hex/model.ts","../../src/hex/to.ts","../../src/address/AddressZodTransform.ts","../../src/address/AddressZodValidation.ts","../../src/ethAddress.ts","../../src/hash.ts","../../src/hexToBigInt.ts"],"sourcesContent":["import { isObject } from '@xylabs/typeof'\nimport z from 'zod'\n\nimport type { AssertConfig } from '../assert.ts'\nimport { assertError } from '../assert.ts'\nimport type { Hex, HexConfig } from '../hex/index.ts'\nimport {\n hexFrom, hexFromHexString, isHex,\n} from '../hex/index.ts'\nimport { HexRegExMinMax } from '../HexRegEx.ts'\nimport { AddressZodTransform } from './AddressZodTransform.ts'\nimport { AddressZodValidation } from './AddressZodValidation.ts'\n\n// using true instead of unique symbol to avoid conflicts with other versions of library\nexport type Address = Hex & {\n readonly __address: true\n}\n\nexport const AddressRegEx = HexRegExMinMax(20, 20)\n\nexport const AddressToStringZod = z.string().regex(AddressRegEx)\n\n/** @deprecated use AddressToStringZod */\nexport const AddressToStringSchema = AddressToStringZod\n\nexport const AddressFromStringZod = z.string().toLowerCase().regex(AddressRegEx).transform(v => toAddress(v))\n\n/** @deprecated use AddressFromStringZod */\nexport const AddressFromStringSchema = AddressFromStringZod\n\nexport const ZERO_ADDRESS = '0000000000000000000000000000000000000000' as Address\nexport const ADDRESS_LENGTH = 40 as const\n\nexport const toAddress = (value: string | number | bigint | ArrayBufferLike, config: HexConfig = {}): Address => {\n const { bitLength = 160, prefix = false } = config\n return hexFrom(value, {\n bitLength, prefix, ...config,\n }) as Address\n}\n\nexport const isAddress = (value: unknown, config: HexConfig = {}): value is Address => {\n const { bitLength = 160, prefix = false } = config\n return isHex(value, { bitLength, prefix })\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 try {\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string': {\n stringValue = hexFromHexString(value, { prefix: false })\n break\n }\n default: {\n return isObject(assert) ? assertError(value, assert, `Unsupported type [${typeof value}]`) : undefined\n }\n }\n return isAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an Address [${value}]`)\n } catch (ex) {\n const error = ex as Error\n return assertError(undefined, assert, error.message)\n }\n}\n\n/** @alpha */\nexport function isAddressV2(value: unknown): value is Address {\n return AddressZodValidation.safeParse(value).success\n}\n\n/** @alpha */\nexport function asAddressV2(value: unknown, assert: boolean = false): Address | undefined {\n return assert\n ? AddressZodValidation.parse(value)\n : AddressZodValidation.safeParse(value).data\n}\n\n/** @alpha */\nexport function toAddressV2(value: unknown, assert: boolean = false): Address | undefined {\n return assert\n ? AddressZodTransform.parse(value)\n : AddressZodTransform.safeParse(value).data\n}\n","import { isString, isUndefined } from '@xylabs/typeof'\n\ntype 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 (!isUndefined(assert)) {\n const assertString\n = typeof assert === 'string'\n ? assert\n : typeof assert === 'boolean'\n ? defaultMessage\n : assert(value, defaultMessage)\n if (isString(assertString) || assertString === true) {\n throw new Error(assertString === true ? defaultMessage : assertString)\n }\n }\n // eslint-disable-next-line unicorn/no-useless-undefined\n return undefined\n}\n","import { isNumber } from '@xylabs/typeof'\n\nimport { isHex } from '../is.ts'\nimport type { Hex, HexConfig } from '../model.ts'\nimport { bitsToNibbles } from '../nibble.ts'\n\nexport const hexFromHexString = (value: string, config: HexConfig = {}): Hex => {\n const {\n prefix = false, byteSize = 8, bitLength,\n } = config\n const nibbleBoundary = bitsToNibbles(byteSize)\n const unEvened = (value.startsWith('0x') ? value.slice(2) : value).toLowerCase()\n if (isHex(unEvened)) {\n const evenCharacters = unEvened.padStart(unEvened.length + (unEvened.length % nibbleBoundary), '0')\n const padded = isNumber(bitLength) ? evenCharacters.padStart(bitLength / 4, '0') : evenCharacters\n return (prefix ? `0x${padded}` : padded).toLowerCase() as Hex\n } else {\n throw new Error('Received string is not a value hex')\n }\n}\n","export const HexRegExMinMax = (minBytes = 0, maxBytes: number = (Number.MAX_SAFE_INTEGER / 2)) => {\n return new RegExp(`^[a-f0-9]{${minBytes * 2},${maxBytes * 2}}$`)\n}\n\nexport const HexRegExMinMaxMixedCaseWithPrefix = (minBytes = 0, maxBytes: number = (Number.MAX_SAFE_INTEGER / 2)) => {\n return new RegExp(`^0x[a-fA-F0-9]{${minBytes * 2},${maxBytes * 2}}$`)\n}\n\nexport const HexRegEx = /^[0-9a-f]+$/\nexport const HexRegExWithPrefix = /^0x[0-9a-f]+$/\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 new 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","import { HexRegEx, HexRegExWithPrefix } from '../HexRegEx.ts'\nimport type { Hex, HexConfig } from './model.ts'\nimport { bitsToNibbles } from './nibble.ts'\n\nexport const isHex = (value: unknown, config?: HexConfig): value is Hex => {\n // Is it a string?\n if (typeof value !== 'string') return false\n\n const valueCharLength = config?.prefix ? value.length - 2 : value.length\n\n // If a bitLength specified, does it conform?\n if (config?.bitLength !== undefined && valueCharLength !== bitsToNibbles(config?.bitLength)) return false\n\n // Does it only has hex values?\n return config?.prefix ? HexRegExWithPrefix.test(value) : HexRegEx.test(value)\n}\n","import type { Hex, HexConfig } from '../model.ts'\nimport { hexFromHexString } from './fromHexString.ts'\n\n/** Convert an ArrayBuffer to a hex string */\nexport const hexFromArrayBuffer = (\n /** The buffer to be converted */\n buffer: ArrayBufferLike,\n /** Configuration of output format and validation */\n config?: HexConfig,\n): Hex => {\n const unPadded = [...new Uint8Array(buffer)].map(x => x.toString(16).padStart(2, '0')).join('')\n return hexFromHexString(unPadded, config)\n}\n","import type { Hex, HexConfig } from '../model.ts'\nimport { hexFromHexString } from './fromHexString.ts'\n\n/** Convert a bigint to a hex string */\nexport const hexFromBigInt = (\n /** The bigint to be converted */\n value: bigint,\n /** Configuration of output format and validation */\n config: HexConfig = {},\n): Hex => {\n const unPadded = value.toString(16)\n return hexFromHexString(unPadded, config)\n}\n","import type { Hex, HexConfig } from '../model.ts'\nimport { hexFromBigInt } from './fromBigInt.ts'\n\nexport const hexFromNumber = (value: number, config?: HexConfig): Hex => {\n return hexFromBigInt(BigInt(value), config)\n}\n","import type { Hex, HexConfig } from '../model.ts'\nimport { hexFromArrayBuffer } from './fromArrayBuffer.ts'\nimport { hexFromBigInt } from './fromBigInt.ts'\nimport { hexFromHexString } from './fromHexString.ts'\nimport { hexFromNumber } from './fromNumber.ts'\n\n/** Takes unknown value and tries our best to convert it to a hex string */\nexport const hexFrom = (\n /** Supported types are string, number, bigint, and ArrayBuffer */\n value: string | number | bigint | ArrayBufferLike,\n /** Configuration of output format and validation */\n config?: HexConfig,\n): Hex => {\n switch (typeof value) {\n case 'string': {\n return hexFromHexString(value, config)\n }\n case 'bigint': {\n return hexFromBigInt(value, config)\n }\n case 'number': {\n return hexFromNumber(value, config)\n }\n case 'object': {\n return hexFromArrayBuffer(value, config)\n }\n default: {\n throw new Error(`Invalid type: ${typeof value}`)\n }\n }\n}\n","import type { AssertConfig } from '../assert.ts'\nimport { assertError } from '../assert.ts'\nimport { hexFromHexString } from './from/index.ts'\nimport { isHex } from './is.ts'\nimport type { Hex } from './model.ts'\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 }\n default: {\n return assertError(value, assert, `Unsupported type [${typeof value}]`)\n }\n }\n\n return isHex(stringValue) ? stringValue : assertError(value, assert, `Value is not Hex [${value}]`)\n}\n","import { isString } from '@xylabs/typeof'\n\nimport { hexFromHexString } from './from/index.ts'\n\nexport const isHexZero = (value?: string) => {\n return isString(value) ? BigInt(hexFromHexString(value, { prefix: true })) === 0n : undefined\n}\n","export const toHexLegacy = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map(x => x.toString(16).padStart(2, '0')).join('')\n}\n","import type { Brand } from '@xylabs/typeof'\nimport z from 'zod'\n\nimport { HexRegEx } from '../HexRegEx.ts'\n\nexport const HexZod = z.string()\n .regex(HexRegEx, { message: 'Invalid hex format' }) as unknown as z.ZodType<Brand<Lowercase<string>, { readonly __hex: true }>>\n\nexport type Hex = z.infer<typeof HexZod>\n\n/** Configuration of validation and output format */\nexport interface HexConfig {\n bitLength?: number\n byteSize?: number\n prefix?: boolean\n}\n","import { hexFrom } from './from/index.ts'\nimport type { HexConfig } from './model.ts'\n\n/** takes any value and tries our best to convert it to a hex string */\nexport const toHex = (\n /** Supported types are string, number, bigint, and ArrayBuffer */\n value: string | number | bigint | ArrayBufferLike,\n /** Configuration of output format and validation */\n config: HexConfig = {},\n) => {\n const { prefix = false } = config\n return hexFrom(value, { prefix, ...config })\n}\n","import z from 'zod'\n\nimport type { Address } from './address.ts'\nimport { AddressZodValidation } from './AddressZodValidation.ts'\n\nexport const AddressZodTransform = z.union([z.string(), z.bigint()])\n .transform((value) => {\n if (typeof value === 'bigint') {\n return value.toString(16).padStart(40, '0')\n }\n if (value.startsWith('0x')) {\n return value.slice(2)\n }\n return value\n })\n .refine(x => AddressZodValidation.safeParse(x).data)\n .transform(x => x as Address)\n\nexport type AddressZodTransformType = z.infer<typeof AddressZodTransform>\n","import z from 'zod'\n\nimport { HexZod } from '../hex/index.ts'\nimport type { Address } from './address.ts'\nimport { ADDRESS_LENGTH } from './address.ts'\n\nexport const AddressZodValidation = z.string()\n .refine(x => HexZod.safeParse(x))\n .refine(x => x.length === ADDRESS_LENGTH, { error: e => new Error(`Address must have 40 characters [${e.input}]`) })\n .transform(v => v as Address)\n\nexport type AddressZodValidationType = z.infer<typeof AddressZodValidation>\n","import type { Brand } from '@xylabs/typeof'\nimport z from 'zod'\n\nimport type { AssertConfig } from './assert.ts'\nimport { assertError } from './assert.ts'\nimport type { HexConfig } from './hex/index.ts'\nimport {\n hexFrom, hexFromHexString, isHex,\n} from './hex/index.ts'\nimport { HexRegExMinMaxMixedCaseWithPrefix } from './HexRegEx.ts'\n\nexport const EthAddressRegEx = HexRegExMinMaxMixedCaseWithPrefix(20, 20)\n\nexport const EthAddressToStringSchema = z.string().regex(EthAddressRegEx)\nexport const EthAddressFromStringSchema = z.string().regex(EthAddressRegEx).transform(v => toEthAddress(v))\n\n// using true instead of unique symbol to avoid conflicts with other versions of library\nexport type EthAddress = Brand<string, { readonly __eth_address: true }>\n\nexport const ETH_ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as EthAddress\n\nexport const toEthAddress = (value: string | number | bigint | ArrayBufferLike, config: HexConfig = {}): EthAddress => {\n const { bitLength = 160, prefix = false } = config\n return `0x${hexFrom(value, {\n bitLength, prefix, ...config,\n })}` as EthAddress\n}\n\nexport const isEthAddress = (value: unknown, config: HexConfig = {}): value is EthAddress => {\n const { bitLength = 160, prefix = true } = config\n return isHex(value, { bitLength, prefix })\n}\n\nexport const EthAddressZod = z.string()\n .regex(EthAddressRegEx, { message: 'Invalid address format' })\n .refine(\n isEthAddress,\n )\n\nexport function asEthAddress(value: unknown): EthAddress | undefined\nexport function asEthAddress(value: unknown, assert: AssertConfig): EthAddress\nexport function asEthAddress(value: unknown, assert?: AssertConfig): EthAddress | undefined {\n try {\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string': {\n stringValue = hexFromHexString(value, { prefix: true })\n break\n }\n default: {\n if (value !== undefined) {\n return assertError(value, assert, `Unsupported type [${typeof value}]`)\n }\n }\n }\n return isEthAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an EthAddress [${value}]`)\n } catch (ex) {\n const error = ex as Error\n return assertError(undefined, assert, error.message)\n }\n}\n","import type { Brand } from '@xylabs/typeof'\nimport { isUndefined } from '@xylabs/typeof'\nimport z from 'zod'\n\nimport type { AssertConfig } from './assert.ts'\nimport { assertError } from './assert.ts'\nimport type { Hex } from './hex/index.ts'\nimport { hexFromHexString, isHex } from './hex/index.ts'\nimport { HexRegExMinMax } from './HexRegEx.ts'\n\nexport const HashRegEx = HexRegExMinMax(32, 32)\n\nexport const ZERO_HASH = '0000000000000000000000000000000000000000000000000000000000000000' as Hash\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\n// using true instead of unique symbol to avoid conflicts with other versions of library\nexport type Hash = Brand<Hex, { readonly __hash: true }>\n\nexport const isHash = (value: unknown, bitLength: HashBitLength = 256): value is Hash => {\n return isHex(value, { bitLength })\n}\n\nexport const HashZod = z.string()\n .toLowerCase()\n .regex(HashRegEx, { message: 'Invalid hash format' })\n .refine(\n isHash,\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 }\n default: {\n return isUndefined(assert) ? undefined : assertError(value, assert, `Unsupported type [${typeof value}]`)\n }\n }\n return isHash(stringValue) ? stringValue : assertError(value, assert, `Value is not a Hash [${value}]`)\n}\n","import { type Hex, hexFromHexString } from './hex/index.ts'\n\nexport function hexToBigInt(hex: Hex): bigint {\n return BigInt(hexFromHexString(hex, { prefix: true }))\n}\n"],"mappings":"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","names":["z","isString","isString","z","z","z","z","z","z","z","isUndefined","z","z","isUndefined"]}
|
|
1
|
+
{"version":3,"sources":["../../src/address/address.ts","../../src/HexRegEx.ts","../../src/address/addressDeprecated.ts","../../src/assert.ts","../../src/hex/from/fromHexString.ts","../../src/hex/nibble.ts","../../src/hex/is.ts","../../src/hex/from/fromArrayBuffer.ts","../../src/hex/from/fromBigInt.ts","../../src/hex/from/fromNumber.ts","../../src/hex/from/from.ts","../../src/hex/as.ts","../../src/hex/hex.ts","../../src/hex/isHexZero.ts","../../src/hex/legacy.ts","../../src/hex/to.ts","../../src/address/AddressTransformZod.ts","../../src/address/AddressValidationZod.ts","../../src/address/to.ts","../../src/address/as.ts","../../src/address/is.ts","../../src/ethAddress.ts","../../src/hash/as.ts","../../src/hash/is.ts","../../src/hash/hash.ts","../../src/hash/zod.ts","../../src/hexToBigInt.ts","../../src/zod.ts"],"sourcesContent":["import type { Brand } from '@xylabs/typeof'\nimport { z } from 'zod'\n\nimport type { Hex } from '../hex/index.ts'\nimport { HexRegExMinMax } from '../HexRegEx.ts'\n\nexport const ZERO_ADDRESS = '0000000000000000000000000000000000000000' as Address\nexport const ADDRESS_LENGTH = 40 as const\n\nexport const AddressRegEx = HexRegExMinMax(ADDRESS_LENGTH / 2, ADDRESS_LENGTH / 2)\n\nexport const AddressZod = z.string()\n .regex(AddressRegEx, { message: 'Invalid hex format' }) as unknown as z.ZodType<Brand<Hex, { readonly __address: true }>>\n\nexport type Address = z.infer<typeof AddressZod>\n","export const HexRegExMinMax = (minBytes = 0, maxBytes: number = (Number.MAX_SAFE_INTEGER / 2)) => {\n return new RegExp(`^[a-f0-9]{${minBytes * 2},${maxBytes * 2}}$`)\n}\n\nexport const HexRegExMinMaxMixedCaseWithPrefix = (minBytes = 0, maxBytes: number = (Number.MAX_SAFE_INTEGER / 2)) => {\n return new RegExp(`^0x[a-fA-F0-9]{${minBytes * 2},${maxBytes * 2}}$`)\n}\n\nexport const HexRegEx = /^[0-9a-f]+$/\nexport const HexRegExWithPrefix = /^0x[0-9a-f]+$/\n","import { z } from 'zod'\n\nimport { AddressRegEx } from './address.ts'\nimport { toAddress } from './to.ts'\n\n/** @deprecated use AddressZod */\nexport const AddressToStringZod = z.string().regex(AddressRegEx)\n\n/** @deprecated use AddressZod */\n// eslint-disable-next-line sonarjs/deprecation\nexport const AddressToStringSchema = AddressToStringZod\n\n/** @deprecated use AddressZod */\nexport const AddressFromStringZod = z.string().toLowerCase().regex(AddressRegEx).transform(v => toAddress(v))\n\n/** @deprecated use AddressZod */\n// eslint-disable-next-line sonarjs/deprecation\nexport const AddressFromStringSchema = AddressFromStringZod\n","import { isString, isUndefined } from '@xylabs/typeof'\n\ntype 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 (!isUndefined(assert)) {\n const assertString\n = typeof assert === 'string'\n ? assert\n : typeof assert === 'boolean'\n ? defaultMessage\n : assert(value, defaultMessage)\n if (isString(assertString) || assertString === true) {\n throw new Error(assertString === true ? defaultMessage : assertString)\n }\n }\n // eslint-disable-next-line unicorn/no-useless-undefined\n return undefined\n}\n","import { isNumber } from '@xylabs/typeof'\n\nimport type { Hex, HexConfig } from '../hex.ts'\nimport { isHex } from '../is.ts'\nimport { bitsToNibbles } from '../nibble.ts'\n\nexport const hexFromHexString = (value: string, config: HexConfig = {}): Hex => {\n const {\n prefix = false, byteSize = 8, bitLength,\n } = config\n const nibbleBoundary = bitsToNibbles(byteSize)\n const unEvened = (value.startsWith('0x') ? value.slice(2) : value).toLowerCase()\n if (isHex(unEvened)) {\n const evenCharacters = unEvened.padStart(unEvened.length + (unEvened.length % nibbleBoundary), '0')\n const padded = isNumber(bitLength) ? evenCharacters.padStart(bitLength / 4, '0') : evenCharacters\n return (prefix ? `0x${padded}` : padded).toLowerCase() as Hex\n } else {\n throw new Error('Received string is not a value hex')\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 new 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","import { HexRegEx, HexRegExWithPrefix } from '../HexRegEx.ts'\nimport type { Hex, HexConfig } from './hex.ts'\nimport { bitsToNibbles } from './nibble.ts'\n\nexport const isHex = (value: unknown, config?: HexConfig): value is Hex => {\n // Is it a string?\n if (typeof value !== 'string') return false\n\n const valueCharLength = config?.prefix ? value.length - 2 : value.length\n\n // If a bitLength specified, does it conform?\n if (config?.bitLength !== undefined && valueCharLength !== bitsToNibbles(config?.bitLength)) return false\n\n // Does it only has hex values?\n return config?.prefix ? HexRegExWithPrefix.test(value) : HexRegEx.test(value)\n}\n","import type { Hex, HexConfig } from '../hex.ts'\nimport { hexFromHexString } from './fromHexString.ts'\n\n/** Convert an ArrayBuffer to a hex string */\nexport const hexFromArrayBuffer = (\n /** The buffer to be converted */\n buffer: ArrayBufferLike,\n /** Configuration of output format and validation */\n config?: HexConfig,\n): Hex => {\n const unPadded = [...new Uint8Array(buffer)].map(x => x.toString(16).padStart(2, '0')).join('')\n return hexFromHexString(unPadded, config)\n}\n","import type { Hex, HexConfig } from '../hex.ts'\nimport { hexFromHexString } from './fromHexString.ts'\n\n/** Convert a bigint to a hex string */\nexport const hexFromBigInt = (\n /** The bigint to be converted */\n value: bigint,\n /** Configuration of output format and validation */\n config: HexConfig = {},\n): Hex => {\n const unPadded = value.toString(16)\n return hexFromHexString(unPadded, config)\n}\n","import type { Hex, HexConfig } from '../hex.ts'\nimport { hexFromBigInt } from './fromBigInt.ts'\n\nexport const hexFromNumber = (value: number, config?: HexConfig): Hex => {\n return hexFromBigInt(BigInt(value), config)\n}\n","import type { Hex, HexConfig } from '../hex.ts'\nimport { hexFromArrayBuffer } from './fromArrayBuffer.ts'\nimport { hexFromBigInt } from './fromBigInt.ts'\nimport { hexFromHexString } from './fromHexString.ts'\nimport { hexFromNumber } from './fromNumber.ts'\n\n/** Takes unknown value and tries our best to convert it to a hex string */\nexport const hexFrom = (\n /** Supported types are string, number, bigint, and ArrayBuffer */\n value: string | number | bigint | ArrayBufferLike,\n /** Configuration of output format and validation */\n config?: HexConfig,\n): Hex => {\n switch (typeof value) {\n case 'string': {\n return hexFromHexString(value, config)\n }\n case 'bigint': {\n return hexFromBigInt(value, config)\n }\n case 'number': {\n return hexFromNumber(value, config)\n }\n case 'object': {\n return hexFromArrayBuffer(value, config)\n }\n default: {\n throw new Error(`Invalid type: ${typeof value}`)\n }\n }\n}\n","import type { AssertConfig } from '../assert.ts'\nimport { assertError } from '../assert.ts'\nimport { hexFromHexString } from './from/index.ts'\nimport type { Hex } from './hex.ts'\nimport { isHex } from './is.ts'\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 }\n default: {\n return assertError(value, assert, `Unsupported type [${typeof value}]`)\n }\n }\n\n return isHex(stringValue) ? stringValue : assertError(value, assert, `Value is not Hex [${value}]`)\n}\n","import type { Brand } from '@xylabs/typeof'\nimport { z } from 'zod'\n\nimport { HexRegEx } from '../HexRegEx.ts'\n\nexport const HexZod = z.string()\n .regex(HexRegEx, { message: 'Invalid hex format' }) as unknown as z.ZodType<Brand<Lowercase<string>, { readonly __hex: true }>>\n\nexport type Hex = z.infer<typeof HexZod>\n\n/** Configuration of validation and output format */\nexport interface HexConfig {\n bitLength?: number\n byteSize?: number\n prefix?: boolean\n}\n","import { isString } from '@xylabs/typeof'\n\nimport { hexFromHexString } from './from/index.ts'\n\nexport const isHexZero = (value?: string) => {\n return isString(value) ? BigInt(hexFromHexString(value, { prefix: true })) === 0n : undefined\n}\n","export const toHexLegacy = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map(x => x.toString(16).padStart(2, '0')).join('')\n}\n","import { hexFrom } from './from/index.ts'\nimport type { HexConfig } from './hex.ts'\n\n/** takes any value and tries our best to convert it to a hex string */\nexport const toHex = (\n /** Supported types are string, number, bigint, and ArrayBuffer */\n value: string | number | bigint | ArrayBufferLike,\n /** Configuration of output format and validation */\n config: HexConfig = {},\n) => {\n const { prefix = false } = config\n return hexFrom(value, { prefix, ...config })\n}\n","import { z } from 'zod'\n\nimport { type Address, ADDRESS_LENGTH } from './address.ts'\nimport { AddressValidationZod } from './AddressValidationZod.ts'\n\nexport const AddressTransformZod = z.union([z.string(), z.bigint(), z.number()])\n .transform((value) => {\n switch (typeof value) {\n case 'bigint': {\n return value.toString(16).padStart(ADDRESS_LENGTH, '0')\n }\n case 'string': {\n if (value.startsWith('0x')) {\n return value.slice(2)\n }\n return value\n }\n case 'number': {\n return BigInt(value).toString(16).padStart(ADDRESS_LENGTH, '0')\n }\n }\n })\n .refine(x => AddressValidationZod.safeParse(x).data)\n .transform(x => x as Address)\n\nexport type AddressTransformZodType = z.infer<typeof AddressTransformZod>\n","import { z } from 'zod'\n\nimport { HexZod } from '../hex/index.ts'\nimport type { Address } from './address.ts'\nimport { ADDRESS_LENGTH } from './address.ts'\n\nexport const AddressValidationZod = z.string()\n .refine(x => HexZod.safeParse(x))\n .refine(x => x.length === ADDRESS_LENGTH, { error: e => new Error(`Address must have 40 characters [${e.input}]`) })\n .transform(v => v as Address)\n\nexport type AddressValidationZodType = z.infer<typeof AddressValidationZod>\n","import type { HexConfig } from '../hex/index.ts'\nimport { hexFrom } from '../hex/index.ts'\nimport type { Address } from './address.ts'\nimport { AddressTransformZod } from './AddressTransformZod.ts'\n\nexport const toAddress = (value: string | number | bigint | ArrayBufferLike, config: HexConfig = {}): Address => {\n const { bitLength = 160, prefix = false } = config\n return hexFrom(value, {\n bitLength, prefix, ...config,\n }) as unknown as Address\n}\n\n/** @alpha */\nexport function toAddressV2(value: unknown, assert: boolean = false): Address | undefined {\n return assert\n ? AddressTransformZod.parse(value)\n : AddressTransformZod.safeParse(value).data\n}\n","import { isObject } from '@xylabs/typeof'\n\nimport type { AssertConfig } from '../assert.ts'\nimport { assertError } from '../assert.ts'\nimport { hexFromHexString } from '../hex/index.ts'\nimport type { Address } from './address.ts'\nimport { AddressValidationZod } from './AddressValidationZod.ts'\nimport { isAddress } from './is.ts'\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 try {\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string': {\n stringValue = hexFromHexString(value, { prefix: false })\n break\n }\n default: {\n return isObject(assert) ? assertError(value, assert, `Unsupported type [${typeof value}]`) : undefined\n }\n }\n return isAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an Address [${value}]`)\n } catch (ex) {\n const error = ex as Error\n return assertError(undefined, assert, error.message)\n }\n}\n\n/** @alpha */\nexport function asAddressV2(value: unknown, assert: boolean = false): Address | undefined {\n return assert\n ? AddressValidationZod.parse(value)\n : AddressValidationZod.safeParse(value).data\n}\n","import type { HexConfig } from '../hex/index.ts'\nimport { isHex } from '../hex/index.ts'\nimport type { Address } from './address.ts'\nimport { AddressValidationZod } from './AddressValidationZod.ts'\n\nexport const isAddress = (value: unknown, config: HexConfig = {}): value is Address => {\n const { bitLength = 160, prefix = false } = config\n return isHex(value, { bitLength, prefix })\n}\n\n/** @alpha */\nexport function isAddressV2(value: unknown): value is Address {\n return AddressValidationZod.safeParse(value).success\n}\n","import type { Brand } from '@xylabs/typeof'\nimport { z } from 'zod'\n\nimport type { AssertConfig } from './assert.ts'\nimport { assertError } from './assert.ts'\nimport type { HexConfig } from './hex/index.ts'\nimport {\n hexFrom, hexFromHexString, isHex,\n} from './hex/index.ts'\nimport { HexRegExMinMaxMixedCaseWithPrefix } from './HexRegEx.ts'\n\nexport const EthAddressRegEx = HexRegExMinMaxMixedCaseWithPrefix(20, 20)\n\nexport const EthAddressToStringZod = z.string().regex(EthAddressRegEx)\n\n/** @deprecated use EthAddressToStringZod */\nexport const EthAddressToStringSchema = EthAddressToStringZod\n\nexport const EthAddressFromStringZod = z.string().regex(EthAddressRegEx).transform(v => toEthAddress(v))\n\n/** @deprecated use EthAddressFromStringZod */\nexport const EthAddressFromStringSchema = EthAddressFromStringZod\n\n// using true instead of unique symbol to avoid conflicts with other versions of library\nexport type EthAddress = Brand<string, { readonly __eth_address: true }>\n\nexport const ETH_ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as EthAddress\n\nexport const toEthAddress = (value: string | number | bigint | ArrayBufferLike, config: HexConfig = {}): EthAddress => {\n const { bitLength = 160, prefix = false } = config\n return `0x${hexFrom(value, {\n bitLength, prefix, ...config,\n })}` as EthAddress\n}\n\nexport const isEthAddress = (value: unknown, config: HexConfig = {}): value is EthAddress => {\n const { bitLength = 160, prefix = true } = config\n return isHex(value, { bitLength, prefix })\n}\n\nexport const EthAddressZod = z.string()\n .regex(EthAddressRegEx, { message: 'Invalid address format' })\n .refine(\n isEthAddress,\n )\n\nexport function asEthAddress(value: unknown): EthAddress | undefined\nexport function asEthAddress(value: unknown, assert: AssertConfig): EthAddress\nexport function asEthAddress(value: unknown, assert?: AssertConfig): EthAddress | undefined {\n try {\n let stringValue: string | undefined = undefined\n\n switch (typeof value) {\n case 'string': {\n stringValue = hexFromHexString(value, { prefix: true })\n break\n }\n default: {\n if (value !== undefined) {\n return assertError(value, assert, `Unsupported type [${typeof value}]`)\n }\n }\n }\n return isEthAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an EthAddress [${value}]`)\n } catch (ex) {\n const error = ex as Error\n return assertError(undefined, assert, error.message)\n }\n}\n","import { isUndefined } from '@xylabs/typeof'\n\nimport type { AssertConfig } from '../assert.ts'\nimport { assertError } from '../assert.ts'\nimport { hexFromHexString } from '../hex/index.ts'\nimport { type Hash } from './hash.ts'\nimport { isHash } from './is.ts'\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 }\n default: {\n return isUndefined(assert) ? undefined : assertError(value, assert, `Unsupported type [${typeof value}]`)\n }\n }\n return isHash(stringValue) ? stringValue : assertError(value, assert, `Value is not a Hash [${value}]`)\n}\n","import { isHex } from '../hex/index.ts'\nimport type { Hash, HashBitLength } from './hash.ts'\n\nexport const isHash = (value: unknown, bitLength: HashBitLength = 256): value is Hash => {\n return isHex(value, { bitLength })\n}\n","import type { Brand } from '@xylabs/typeof'\nimport { z } from 'zod'\n\nimport type { Hex } from '../hex/index.ts'\nimport { HexRegExMinMax } from '../HexRegEx.ts'\n\nexport const HASH_LENGTH = 32 as const\n\nexport const HashRegEx = HexRegExMinMax(HASH_LENGTH, HASH_LENGTH)\n\nexport const ZERO_HASH = '0000000000000000000000000000000000000000000000000000000000000000' as Hash\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 const HashZod = z.string()\n .regex(HashRegEx, { message: 'Invalid hex format' }) as unknown as z.ZodType<Brand<Hex, { readonly __hash: true }>>\n\nexport type Hash = z.infer<typeof HashZod>\n","import { z } from 'zod'\n\nimport { asHash } from './as.ts'\nimport type { Hash } from './hash.ts'\nimport { HashZod } from './hash.ts'\n\nexport const HashToJsonZod = HashZod.transform<string>(v => v)\nexport const JsonToHashZod = z.string().transform<Hash>(v => asHash(v, true))\n","import { type Hex, hexFromHexString } from './hex/index.ts'\n\nexport function hexToBigInt(hex: Hex): bigint {\n return BigInt(hexFromHexString(hex, { prefix: true }))\n}\n","import { z } from 'zod'\n\nimport { toHex } from './hex/index.ts'\nimport { hexToBigInt } from './hexToBigInt.ts'\n\nexport const BigIntToJsonZod = z.bigint().nonnegative().transform(x => toHex(x))\nexport const JsonToBigIntZod = z.string().transform(x => toHex(x)).transform(x => hexToBigInt(x))\n"],"mappings":"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","names":["z","z","z","isString","isString","z","z","z","z","z","z","z","isUndefined","isUndefined","z","z","z","z","z","z"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const BigIntToJsonZod: z.ZodPipe<z.ZodBigInt, z.ZodTransform<import("@xylabs/typeof").Brand<Lowercase<string>, {
|
|
3
|
+
readonly __hex: true;
|
|
4
|
+
}>, bigint>>;
|
|
5
|
+
export declare const JsonToBigIntZod: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<import("@xylabs/typeof").Brand<Lowercase<string>, {
|
|
6
|
+
readonly __hex: true;
|
|
7
|
+
}>, string>>, z.ZodTransform<bigint, import("@xylabs/typeof").Brand<Lowercase<string>, {
|
|
8
|
+
readonly __hex: true;
|
|
9
|
+
}>>>;
|
|
10
|
+
//# sourceMappingURL=zod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,eAAe;;YAAoD,CAAA;AAChF,eAAO,MAAM,eAAe;;;;IAAqE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xylabs/hex",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.7",
|
|
4
4
|
"description": "Base functionality used throughout XY Labs TypeScript/JavaScript libraries",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"hex",
|
|
@@ -47,13 +47,13 @@
|
|
|
47
47
|
"src"
|
|
48
48
|
],
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@xylabs/typeof": "~5.0.
|
|
50
|
+
"@xylabs/typeof": "~5.0.7",
|
|
51
51
|
"zod": "~4.0.17"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@xylabs/ts-scripts-yarn3": "~7.1.0",
|
|
55
55
|
"@xylabs/tsconfig": "~7.1.0",
|
|
56
|
-
"@xylabs/vitest-extended": "~5.0.
|
|
56
|
+
"@xylabs/vitest-extended": "~5.0.7",
|
|
57
57
|
"typescript": "~5.9.2",
|
|
58
58
|
"vitest": "~3.2.4"
|
|
59
59
|
},
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
import { type Address, ADDRESS_LENGTH } from './address.ts'
|
|
4
|
+
import { AddressValidationZod } from './AddressValidationZod.ts'
|
|
5
|
+
|
|
6
|
+
export const AddressTransformZod = z.union([z.string(), z.bigint(), z.number()])
|
|
7
|
+
.transform((value) => {
|
|
8
|
+
switch (typeof value) {
|
|
9
|
+
case 'bigint': {
|
|
10
|
+
return value.toString(16).padStart(ADDRESS_LENGTH, '0')
|
|
11
|
+
}
|
|
12
|
+
case 'string': {
|
|
13
|
+
if (value.startsWith('0x')) {
|
|
14
|
+
return value.slice(2)
|
|
15
|
+
}
|
|
16
|
+
return value
|
|
17
|
+
}
|
|
18
|
+
case 'number': {
|
|
19
|
+
return BigInt(value).toString(16).padStart(ADDRESS_LENGTH, '0')
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
.refine(x => AddressValidationZod.safeParse(x).data)
|
|
24
|
+
.transform(x => x as Address)
|
|
25
|
+
|
|
26
|
+
export type AddressTransformZodType = z.infer<typeof AddressTransformZod>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import z from 'zod'
|
|
1
|
+
import { z } from 'zod'
|
|
2
2
|
|
|
3
3
|
import { HexZod } from '../hex/index.ts'
|
|
4
4
|
import type { Address } from './address.ts'
|
|
5
5
|
import { ADDRESS_LENGTH } from './address.ts'
|
|
6
6
|
|
|
7
|
-
export const
|
|
7
|
+
export const AddressValidationZod = z.string()
|
|
8
8
|
.refine(x => HexZod.safeParse(x))
|
|
9
9
|
.refine(x => x.length === ADDRESS_LENGTH, { error: e => new Error(`Address must have 40 characters [${e.input}]`) })
|
|
10
10
|
.transform(v => v as Address)
|
|
11
11
|
|
|
12
|
-
export type
|
|
12
|
+
export type AddressValidationZodType = z.infer<typeof AddressValidationZod>
|
package/src/address/address.ts
CHANGED
|
@@ -1,85 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import z from 'zod'
|
|
1
|
+
import type { Brand } from '@xylabs/typeof'
|
|
2
|
+
import { z } from 'zod'
|
|
3
3
|
|
|
4
|
-
import type {
|
|
5
|
-
import { assertError } from '../assert.ts'
|
|
6
|
-
import type { Hex, HexConfig } from '../hex/index.ts'
|
|
7
|
-
import {
|
|
8
|
-
hexFrom, hexFromHexString, isHex,
|
|
9
|
-
} from '../hex/index.ts'
|
|
4
|
+
import type { Hex } from '../hex/index.ts'
|
|
10
5
|
import { HexRegExMinMax } from '../HexRegEx.ts'
|
|
11
|
-
import { AddressZodTransform } from './AddressZodTransform.ts'
|
|
12
|
-
import { AddressZodValidation } from './AddressZodValidation.ts'
|
|
13
|
-
|
|
14
|
-
// using true instead of unique symbol to avoid conflicts with other versions of library
|
|
15
|
-
export type Address = Hex & {
|
|
16
|
-
readonly __address: true
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const AddressRegEx = HexRegExMinMax(20, 20)
|
|
20
|
-
|
|
21
|
-
export const AddressToStringZod = z.string().regex(AddressRegEx)
|
|
22
|
-
|
|
23
|
-
/** @deprecated use AddressToStringZod */
|
|
24
|
-
export const AddressToStringSchema = AddressToStringZod
|
|
25
|
-
|
|
26
|
-
export const AddressFromStringZod = z.string().toLowerCase().regex(AddressRegEx).transform(v => toAddress(v))
|
|
27
|
-
|
|
28
|
-
/** @deprecated use AddressFromStringZod */
|
|
29
|
-
export const AddressFromStringSchema = AddressFromStringZod
|
|
30
6
|
|
|
31
7
|
export const ZERO_ADDRESS = '0000000000000000000000000000000000000000' as Address
|
|
32
8
|
export const ADDRESS_LENGTH = 40 as const
|
|
33
9
|
|
|
34
|
-
export const
|
|
35
|
-
const { bitLength = 160, prefix = false } = config
|
|
36
|
-
return hexFrom(value, {
|
|
37
|
-
bitLength, prefix, ...config,
|
|
38
|
-
}) as Address
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export const isAddress = (value: unknown, config: HexConfig = {}): value is Address => {
|
|
42
|
-
const { bitLength = 160, prefix = false } = config
|
|
43
|
-
return isHex(value, { bitLength, prefix })
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function asAddress(value: unknown): Address | undefined
|
|
47
|
-
export function asAddress(value: unknown, assert: AssertConfig): Address
|
|
48
|
-
export function asAddress(value: unknown, assert?: AssertConfig): Address | undefined {
|
|
49
|
-
try {
|
|
50
|
-
let stringValue: string | undefined = undefined
|
|
51
|
-
|
|
52
|
-
switch (typeof value) {
|
|
53
|
-
case 'string': {
|
|
54
|
-
stringValue = hexFromHexString(value, { prefix: false })
|
|
55
|
-
break
|
|
56
|
-
}
|
|
57
|
-
default: {
|
|
58
|
-
return isObject(assert) ? assertError(value, assert, `Unsupported type [${typeof value}]`) : undefined
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return isAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an Address [${value}]`)
|
|
62
|
-
} catch (ex) {
|
|
63
|
-
const error = ex as Error
|
|
64
|
-
return assertError(undefined, assert, error.message)
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/** @alpha */
|
|
69
|
-
export function isAddressV2(value: unknown): value is Address {
|
|
70
|
-
return AddressZodValidation.safeParse(value).success
|
|
71
|
-
}
|
|
10
|
+
export const AddressRegEx = HexRegExMinMax(ADDRESS_LENGTH / 2, ADDRESS_LENGTH / 2)
|
|
72
11
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
return assert
|
|
76
|
-
? AddressZodValidation.parse(value)
|
|
77
|
-
: AddressZodValidation.safeParse(value).data
|
|
78
|
-
}
|
|
12
|
+
export const AddressZod = z.string()
|
|
13
|
+
.regex(AddressRegEx, { message: 'Invalid hex format' }) as unknown as z.ZodType<Brand<Hex, { readonly __address: true }>>
|
|
79
14
|
|
|
80
|
-
|
|
81
|
-
export function toAddressV2(value: unknown, assert: boolean = false): Address | undefined {
|
|
82
|
-
return assert
|
|
83
|
-
? AddressZodTransform.parse(value)
|
|
84
|
-
: AddressZodTransform.safeParse(value).data
|
|
85
|
-
}
|
|
15
|
+
export type Address = z.infer<typeof AddressZod>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
import { AddressRegEx } from './address.ts'
|
|
4
|
+
import { toAddress } from './to.ts'
|
|
5
|
+
|
|
6
|
+
/** @deprecated use AddressZod */
|
|
7
|
+
export const AddressToStringZod = z.string().regex(AddressRegEx)
|
|
8
|
+
|
|
9
|
+
/** @deprecated use AddressZod */
|
|
10
|
+
// eslint-disable-next-line sonarjs/deprecation
|
|
11
|
+
export const AddressToStringSchema = AddressToStringZod
|
|
12
|
+
|
|
13
|
+
/** @deprecated use AddressZod */
|
|
14
|
+
export const AddressFromStringZod = z.string().toLowerCase().regex(AddressRegEx).transform(v => toAddress(v))
|
|
15
|
+
|
|
16
|
+
/** @deprecated use AddressZod */
|
|
17
|
+
// eslint-disable-next-line sonarjs/deprecation
|
|
18
|
+
export const AddressFromStringSchema = AddressFromStringZod
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { isObject } from '@xylabs/typeof'
|
|
2
|
+
|
|
3
|
+
import type { AssertConfig } from '../assert.ts'
|
|
4
|
+
import { assertError } from '../assert.ts'
|
|
5
|
+
import { hexFromHexString } from '../hex/index.ts'
|
|
6
|
+
import type { Address } from './address.ts'
|
|
7
|
+
import { AddressValidationZod } from './AddressValidationZod.ts'
|
|
8
|
+
import { isAddress } from './is.ts'
|
|
9
|
+
|
|
10
|
+
export function asAddress(value: unknown): Address | undefined
|
|
11
|
+
export function asAddress(value: unknown, assert: AssertConfig): Address
|
|
12
|
+
export function asAddress(value: unknown, assert?: AssertConfig): Address | undefined {
|
|
13
|
+
try {
|
|
14
|
+
let stringValue: string | undefined = undefined
|
|
15
|
+
|
|
16
|
+
switch (typeof value) {
|
|
17
|
+
case 'string': {
|
|
18
|
+
stringValue = hexFromHexString(value, { prefix: false })
|
|
19
|
+
break
|
|
20
|
+
}
|
|
21
|
+
default: {
|
|
22
|
+
return isObject(assert) ? assertError(value, assert, `Unsupported type [${typeof value}]`) : undefined
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return isAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an Address [${value}]`)
|
|
26
|
+
} catch (ex) {
|
|
27
|
+
const error = ex as Error
|
|
28
|
+
return assertError(undefined, assert, error.message)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** @alpha */
|
|
33
|
+
export function asAddressV2(value: unknown, assert: boolean = false): Address | undefined {
|
|
34
|
+
return assert
|
|
35
|
+
? AddressValidationZod.parse(value)
|
|
36
|
+
: AddressValidationZod.safeParse(value).data
|
|
37
|
+
}
|
package/src/address/index.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
export * from './address.ts'
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
2
|
+
export * from './addressDeprecated.ts'
|
|
3
|
+
export * from './AddressTransformZod.ts'
|
|
4
|
+
export * from './AddressValidationZod.ts'
|
|
5
|
+
export * from './as.ts'
|
|
6
|
+
export * from './is.ts'
|
|
7
|
+
export * from './to.ts'
|