@xylabs/hex 5.0.80 → 5.0.81

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.
@@ -57,7 +57,7 @@ var hexFromHexString = (value, config = {}) => {
57
57
  const nibbleBoundary = bitsToNibbles(byteSize);
58
58
  const unEvened = (value.startsWith("0x") ? value.slice(2) : value).toLowerCase();
59
59
  if (isHex(unEvened)) {
60
- const evenCharacters = unEvened.padStart(unEvened.length + unEvened.length % nibbleBoundary, "0");
60
+ const evenCharacters = unEvened.padStart(Math.ceil(unEvened.length / nibbleBoundary) * nibbleBoundary, "0");
61
61
  const padded = isNumber(bitLength) ? evenCharacters.padStart(bitLength / 4, "0") : evenCharacters;
62
62
  return (prefix ? `0x${padded}` : padded).toLowerCase();
63
63
  } else {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/address/address.ts","../../src/HexRegEx.ts","../../src/address/AddressTransformZod.ts","../../src/address/AddressValidationZod.ts","../../src/hex/as.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/hex.ts","../../src/hex/isHexZero.ts","../../src/hex/legacy.ts","../../src/hex/to.ts","../../src/address/as.ts","../../src/address/is.ts","../../src/address/to.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 * as 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\ntype BrandedAddress = Brand<Hex, { readonly __address: true }>\n\nexport const AddressZod = z.string().regex(AddressRegEx).transform<BrandedAddress>(v => v as BrandedAddress)\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 * as 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 * as 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 { AssertConfig } from '@xylabs/error'\nimport { assertError } from '@xylabs/error'\n\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 { 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 { Brand } from '@xylabs/typeof'\nimport * as z from 'zod'\n\nimport { HexRegEx } from '../HexRegEx.ts'\n\nexport type BrandedHex = Brand<Lowercase<string>, { readonly __hex: true }>\n\nexport const HexZod = z.string().regex(HexRegEx, { message: 'Invalid hex format' }).transform(val => val as BrandedHex)\n\n/** Configuration of validation and output format */\nexport interface HexConfig {\n bitLength?: number\n byteSize?: number\n prefix?: boolean\n}\n\nexport type Hex = z.infer<typeof HexZod>\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 type { AssertConfig } from '@xylabs/error'\nimport { assertError } from '@xylabs/error'\nimport { isObject } from '@xylabs/typeof'\n\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 { 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 type { AssertConfig } from '@xylabs/error'\nimport { assertError } from '@xylabs/error'\nimport type { Brand } from '@xylabs/typeof'\nimport * as z from 'zod'\n\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 const loweredValue = typeof value === 'string' ? value.toLowerCase() : value\n return isHex(loweredValue, { 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, byteSize: 4 })\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 { AssertConfig } from '@xylabs/error'\nimport { assertError } from '@xylabs/error'\nimport { isUndefined } from '@xylabs/typeof'\n\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 * as 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 type BrandedHash = Brand<Hex, { readonly __hash: true }>\n\nexport const HashZod = z.string()\n .regex(HashRegEx, { message: 'Invalid hex format' }).transform(val => val as BrandedHash)\n\nexport type Hash = z.infer<typeof HashZod>\n","import * as 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 * as 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","assertError","assertError","assertError","z","assertError","assertError","assertError","z","z","z"]}
1
+ {"version":3,"sources":["../../src/address/address.ts","../../src/HexRegEx.ts","../../src/address/AddressTransformZod.ts","../../src/address/AddressValidationZod.ts","../../src/hex/as.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/hex.ts","../../src/hex/isHexZero.ts","../../src/hex/legacy.ts","../../src/hex/to.ts","../../src/address/as.ts","../../src/address/is.ts","../../src/address/to.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 * as 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\ntype BrandedAddress = Brand<Hex, { readonly __address: true }>\n\nexport const AddressZod = z.string().regex(AddressRegEx).transform<BrandedAddress>(v => v as BrandedAddress)\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 * as 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 * as 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 { AssertConfig } from '@xylabs/error'\nimport { assertError } from '@xylabs/error'\n\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 { 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(Math.ceil(unEvened.length / nibbleBoundary) * 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 { Brand } from '@xylabs/typeof'\nimport * as z from 'zod'\n\nimport { HexRegEx } from '../HexRegEx.ts'\n\nexport type BrandedHex = Brand<Lowercase<string>, { readonly __hex: true }>\n\nexport const HexZod = z.string().regex(HexRegEx, { message: 'Invalid hex format' }).transform(val => val as BrandedHex)\n\n/** Configuration of validation and output format */\nexport interface HexConfig {\n bitLength?: number\n byteSize?: number\n prefix?: boolean\n}\n\nexport type Hex = z.infer<typeof HexZod>\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 type { AssertConfig } from '@xylabs/error'\nimport { assertError } from '@xylabs/error'\nimport { isObject } from '@xylabs/typeof'\n\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 { 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 type { AssertConfig } from '@xylabs/error'\nimport { assertError } from '@xylabs/error'\nimport type { Brand } from '@xylabs/typeof'\nimport * as z from 'zod'\n\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 const loweredValue = typeof value === 'string' ? value.toLowerCase() : value\n return isHex(loweredValue, { 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, byteSize: 4 })\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 { AssertConfig } from '@xylabs/error'\nimport { assertError } from '@xylabs/error'\nimport { isUndefined } from '@xylabs/typeof'\n\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 * as 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 type BrandedHash = Brand<Hex, { readonly __hash: true }>\n\nexport const HashZod = z.string()\n .regex(HashRegEx, { message: 'Invalid hex format' }).transform(val => val as BrandedHash)\n\nexport type Hash = z.infer<typeof HashZod>\n","import * as 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 * as 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","assertError","assertError","assertError","z","assertError","assertError","assertError","z","z","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xylabs/hex",
3
- "version": "5.0.80",
3
+ "version": "5.0.81",
4
4
  "description": "Base functionality used throughout XY Labs TypeScript/JavaScript libraries",
5
5
  "keywords": [
6
6
  "hex",
@@ -29,29 +29,26 @@
29
29
  "exports": {
30
30
  ".": {
31
31
  "types": "./dist/neutral/index.d.ts",
32
- "source": "./src/index.ts",
33
32
  "default": "./dist/neutral/index.mjs"
34
33
  },
35
34
  "./package.json": "./package.json"
36
35
  },
37
36
  "module": "./dist/neutral/index.mjs",
38
- "source": "./src/index.ts",
39
37
  "types": "./dist/neutral/index.d.ts",
40
38
  "files": [
41
39
  "dist",
42
- "src",
43
40
  "!**/*.bench.*",
44
41
  "!**/*.spec.*",
45
42
  "!**/*.test.*"
46
43
  ],
47
44
  "dependencies": {
48
- "@xylabs/error": "~5.0.80",
49
- "@xylabs/typeof": "~5.0.80"
45
+ "@xylabs/error": "~5.0.81",
46
+ "@xylabs/typeof": "~5.0.81",
47
+ "@xylabs/vitest-extended": "~5.0.81"
50
48
  },
51
49
  "devDependencies": {
52
- "@xylabs/ts-scripts-yarn3": "~7.3.2",
53
- "@xylabs/tsconfig": "~7.3.2",
54
- "@xylabs/vitest-extended": "~5.0.80",
50
+ "@xylabs/ts-scripts-yarn3": "~7.4.11",
51
+ "@xylabs/tsconfig": "~7.4.11",
55
52
  "typescript": "~5.9.3",
56
53
  "vitest": "~4.0.18",
57
54
  "zod": "^4.3.6"
package/src/HexRegEx.ts DELETED
@@ -1,10 +0,0 @@
1
- export const HexRegExMinMax = (minBytes = 0, maxBytes: number = (Number.MAX_SAFE_INTEGER / 2)) => {
2
- return new RegExp(`^[a-f0-9]{${minBytes * 2},${maxBytes * 2}}$`)
3
- }
4
-
5
- export const HexRegExMinMaxMixedCaseWithPrefix = (minBytes = 0, maxBytes: number = (Number.MAX_SAFE_INTEGER / 2)) => {
6
- return new RegExp(`^0x[a-fA-F0-9]{${minBytes * 2},${maxBytes * 2}}$`)
7
- }
8
-
9
- export const HexRegEx = /^[0-9a-f]+$/
10
- export const HexRegExWithPrefix = /^0x[0-9a-f]+$/
@@ -1,26 +0,0 @@
1
- import * as 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 +0,0 @@
1
- import * as z from 'zod'
2
-
3
- import { HexZod } from '../hex/index.ts'
4
- import type { Address } from './address.ts'
5
- import { ADDRESS_LENGTH } from './address.ts'
6
-
7
- export const AddressValidationZod = z.string()
8
- .refine(x => HexZod.safeParse(x))
9
- .refine(x => x.length === ADDRESS_LENGTH, { error: e => new Error(`Address must have 40 characters [${e.input}]`) })
10
- .transform(v => v as Address)
11
-
12
- export type AddressValidationZodType = z.infer<typeof AddressValidationZod>
@@ -1,16 +0,0 @@
1
- import type { Brand } from '@xylabs/typeof'
2
- import * as z from 'zod'
3
-
4
- import { type Hex } from '../hex/index.ts'
5
- import { HexRegExMinMax } from '../HexRegEx.ts'
6
-
7
- export const ZERO_ADDRESS = '0000000000000000000000000000000000000000' as Address
8
- export const ADDRESS_LENGTH = 40 as const
9
-
10
- export const AddressRegEx = HexRegExMinMax(ADDRESS_LENGTH / 2, ADDRESS_LENGTH / 2)
11
-
12
- type BrandedAddress = Brand<Hex, { readonly __address: true }>
13
-
14
- export const AddressZod = z.string().regex(AddressRegEx).transform<BrandedAddress>(v => v as BrandedAddress)
15
-
16
- export type Address = z.infer<typeof AddressZod>
package/src/address/as.ts DELETED
@@ -1,37 +0,0 @@
1
- import type { AssertConfig } from '@xylabs/error'
2
- import { assertError } from '@xylabs/error'
3
- import { isObject } from '@xylabs/typeof'
4
-
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
- }
@@ -1,6 +0,0 @@
1
- export * from './address.ts'
2
- export * from './AddressTransformZod.ts'
3
- export * from './AddressValidationZod.ts'
4
- export * from './as.ts'
5
- export * from './is.ts'
6
- export * from './to.ts'
package/src/address/is.ts DELETED
@@ -1,14 +0,0 @@
1
- import type { HexConfig } from '../hex/index.ts'
2
- import { isHex } from '../hex/index.ts'
3
- import type { Address } from './address.ts'
4
- import { AddressValidationZod } from './AddressValidationZod.ts'
5
-
6
- export const isAddress = (value: unknown, config: HexConfig = {}): value is Address => {
7
- const { bitLength = 160, prefix = false } = config
8
- return isHex(value, { bitLength, prefix })
9
- }
10
-
11
- /** @alpha */
12
- export function isAddressV2(value: unknown): value is Address {
13
- return AddressValidationZod.safeParse(value).success
14
- }
package/src/address/to.ts DELETED
@@ -1,18 +0,0 @@
1
- import type { HexConfig } from '../hex/index.ts'
2
- import { hexFrom } from '../hex/index.ts'
3
- import type { Address } from './address.ts'
4
- import { AddressTransformZod } from './AddressTransformZod.ts'
5
-
6
- export const toAddress = (value: string | number | bigint | ArrayBufferLike, config: HexConfig = {}): Address => {
7
- const { bitLength = 160, prefix = false } = config
8
- return hexFrom(value, {
9
- bitLength, prefix, ...config,
10
- }) as unknown as Address
11
- }
12
-
13
- /** @alpha */
14
- export function toAddressV2(value: unknown, assert: boolean = false): Address | undefined {
15
- return assert
16
- ? AddressTransformZod.parse(value)
17
- : AddressTransformZod.safeParse(value).data
18
- }
package/src/ethAddress.ts DELETED
@@ -1,70 +0,0 @@
1
- import type { AssertConfig } from '@xylabs/error'
2
- import { assertError } from '@xylabs/error'
3
- import type { Brand } from '@xylabs/typeof'
4
- import * as z from 'zod'
5
-
6
- import type { HexConfig } from './hex/index.ts'
7
- import {
8
- hexFrom, hexFromHexString, isHex,
9
- } from './hex/index.ts'
10
- import { HexRegExMinMaxMixedCaseWithPrefix } from './HexRegEx.ts'
11
-
12
- export const EthAddressRegEx = HexRegExMinMaxMixedCaseWithPrefix(20, 20)
13
-
14
- export const EthAddressToStringZod = z.string().regex(EthAddressRegEx)
15
-
16
- /** @deprecated use EthAddressToStringZod */
17
- export const EthAddressToStringSchema = EthAddressToStringZod
18
-
19
- export const EthAddressFromStringZod = z.string().regex(EthAddressRegEx).transform(v => toEthAddress(v))
20
-
21
- /** @deprecated use EthAddressFromStringZod */
22
- export const EthAddressFromStringSchema = EthAddressFromStringZod
23
-
24
- // using true instead of unique symbol to avoid conflicts with other versions of library
25
- export type EthAddress = Brand<string, { readonly __eth_address: true }>
26
-
27
- export const ETH_ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as EthAddress
28
-
29
- export const toEthAddress = (value: string | number | bigint | ArrayBufferLike, config: HexConfig = {}): EthAddress => {
30
- const { bitLength = 160, prefix = false } = config
31
- return `0x${hexFrom(value, {
32
- bitLength, prefix, ...config,
33
- })}` as EthAddress
34
- }
35
-
36
- export const isEthAddress = (value: unknown, config: HexConfig = {}): value is EthAddress => {
37
- const { bitLength = 160, prefix = true } = config
38
- const loweredValue = typeof value === 'string' ? value.toLowerCase() : value
39
- return isHex(loweredValue, { bitLength, prefix })
40
- }
41
-
42
- export const EthAddressZod = z.string()
43
- .regex(EthAddressRegEx, { message: 'Invalid address format' })
44
- .refine(
45
- isEthAddress,
46
- )
47
-
48
- export function asEthAddress(value: unknown): EthAddress | undefined
49
- export function asEthAddress(value: unknown, assert: AssertConfig): EthAddress
50
- export function asEthAddress(value: unknown, assert?: AssertConfig): EthAddress | undefined {
51
- try {
52
- let stringValue: string | undefined = undefined
53
-
54
- switch (typeof value) {
55
- case 'string': {
56
- stringValue = hexFromHexString(value, { prefix: true, byteSize: 4 })
57
- break
58
- }
59
- default: {
60
- if (value !== undefined) {
61
- return assertError(value, assert, `Unsupported type [${typeof value}]`)
62
- }
63
- }
64
- }
65
- return isEthAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an EthAddress [${value}]`)
66
- } catch (ex) {
67
- const error = ex as Error
68
- return assertError(undefined, assert, error.message)
69
- }
70
- }
package/src/hash/as.ts DELETED
@@ -1,24 +0,0 @@
1
- import type { AssertConfig } from '@xylabs/error'
2
- import { assertError } from '@xylabs/error'
3
- import { isUndefined } from '@xylabs/typeof'
4
-
5
- import { hexFromHexString } from '../hex/index.ts'
6
- import { type Hash } from './hash.ts'
7
- import { isHash } from './is.ts'
8
-
9
- export function asHash(value: unknown): Hash | undefined
10
- export function asHash(value: unknown, assert: AssertConfig): Hash
11
- export function asHash(value: unknown, assert?: AssertConfig): Hash | undefined {
12
- let stringValue: string | undefined = undefined
13
-
14
- switch (typeof value) {
15
- case 'string': {
16
- stringValue = hexFromHexString(value)
17
- break
18
- }
19
- default: {
20
- return isUndefined(assert) ? undefined : assertError(value, assert, `Unsupported type [${typeof value}]`)
21
- }
22
- }
23
- return isHash(stringValue) ? stringValue : assertError(value, assert, `Value is not a Hash [${value}]`)
24
- }
package/src/hash/hash.ts DELETED
@@ -1,25 +0,0 @@
1
- import type { Brand } from '@xylabs/typeof'
2
- import * as z from 'zod'
3
-
4
- import type { Hex } from '../hex/index.ts'
5
- import { HexRegExMinMax } from '../HexRegEx.ts'
6
-
7
- export const HASH_LENGTH = 32 as const
8
-
9
- export const HashRegEx = HexRegExMinMax(HASH_LENGTH, HASH_LENGTH)
10
-
11
- export const ZERO_HASH = '0000000000000000000000000000000000000000000000000000000000000000' as Hash
12
-
13
- export type HashBitLength = 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096
14
- export const HashBitLength: HashBitLength[] = [32, 64, 128, 256, 512, 1024, 2048, 4096]
15
-
16
- export const isHashBitLength = (value: unknown): value is HashBitLength => {
17
- return typeof value === 'number' && HashBitLength.includes(value as HashBitLength)
18
- }
19
-
20
- export type BrandedHash = Brand<Hex, { readonly __hash: true }>
21
-
22
- export const HashZod = z.string()
23
- .regex(HashRegEx, { message: 'Invalid hex format' }).transform(val => val as BrandedHash)
24
-
25
- export type Hash = z.infer<typeof HashZod>
package/src/hash/index.ts DELETED
@@ -1,4 +0,0 @@
1
- export * from './as.ts'
2
- export * from './hash.ts'
3
- export * from './is.ts'
4
- export * from './zod.ts'
package/src/hash/is.ts DELETED
@@ -1,6 +0,0 @@
1
- import { isHex } from '../hex/index.ts'
2
- import type { Hash, HashBitLength } from './hash.ts'
3
-
4
- export const isHash = (value: unknown, bitLength: HashBitLength = 256): value is Hash => {
5
- return isHex(value, { bitLength })
6
- }
package/src/hash/zod.ts DELETED
@@ -1,8 +0,0 @@
1
- import * as z from 'zod'
2
-
3
- import { asHash } from './as.ts'
4
- import type { Hash } from './hash.ts'
5
- import { HashZod } from './hash.ts'
6
-
7
- export const HashToJsonZod = HashZod.transform<string>(v => v)
8
- export const JsonToHashZod = z.string().transform<Hash>(v => asHash(v, true))
package/src/hex/as.ts DELETED
@@ -1,24 +0,0 @@
1
- import type { AssertConfig } from '@xylabs/error'
2
- import { assertError } from '@xylabs/error'
3
-
4
- import { hexFromHexString } from './from/index.ts'
5
- import type { Hex } from './hex.ts'
6
- import { isHex } from './is.ts'
7
-
8
- export function asHex(value: unknown): Hex | undefined
9
- export function asHex(value: unknown, assert: AssertConfig): Hex
10
- export function asHex(value: unknown, assert?: AssertConfig): Hex | undefined {
11
- let stringValue: string | undefined = undefined
12
-
13
- switch (typeof value) {
14
- case 'string': {
15
- stringValue = hexFromHexString(value)
16
- break
17
- }
18
- default: {
19
- return assertError(value, assert, `Unsupported type [${typeof value}]`)
20
- }
21
- }
22
-
23
- return isHex(stringValue) ? stringValue : assertError(value, assert, `Value is not Hex [${value}]`)
24
- }
@@ -1,31 +0,0 @@
1
- import type { Hex, HexConfig } from '../hex.ts'
2
- import { hexFromArrayBuffer } from './fromArrayBuffer.ts'
3
- import { hexFromBigInt } from './fromBigInt.ts'
4
- import { hexFromHexString } from './fromHexString.ts'
5
- import { hexFromNumber } from './fromNumber.ts'
6
-
7
- /** Takes unknown value and tries our best to convert it to a hex string */
8
- export const hexFrom = (
9
- /** Supported types are string, number, bigint, and ArrayBuffer */
10
- value: string | number | bigint | ArrayBufferLike,
11
- /** Configuration of output format and validation */
12
- config?: HexConfig,
13
- ): Hex => {
14
- switch (typeof value) {
15
- case 'string': {
16
- return hexFromHexString(value, config)
17
- }
18
- case 'bigint': {
19
- return hexFromBigInt(value, config)
20
- }
21
- case 'number': {
22
- return hexFromNumber(value, config)
23
- }
24
- case 'object': {
25
- return hexFromArrayBuffer(value, config)
26
- }
27
- default: {
28
- throw new Error(`Invalid type: ${typeof value}`)
29
- }
30
- }
31
- }
@@ -1,13 +0,0 @@
1
- import type { Hex, HexConfig } from '../hex.ts'
2
- import { hexFromHexString } from './fromHexString.ts'
3
-
4
- /** Convert an ArrayBuffer to a hex string */
5
- export const hexFromArrayBuffer = (
6
- /** The buffer to be converted */
7
- buffer: ArrayBufferLike,
8
- /** Configuration of output format and validation */
9
- config?: HexConfig,
10
- ): Hex => {
11
- const unPadded = [...new Uint8Array(buffer)].map(x => x.toString(16).padStart(2, '0')).join('')
12
- return hexFromHexString(unPadded, config)
13
- }
@@ -1,13 +0,0 @@
1
- import type { Hex, HexConfig } from '../hex.ts'
2
- import { hexFromHexString } from './fromHexString.ts'
3
-
4
- /** Convert a bigint to a hex string */
5
- export const hexFromBigInt = (
6
- /** The bigint to be converted */
7
- value: bigint,
8
- /** Configuration of output format and validation */
9
- config: HexConfig = {},
10
- ): Hex => {
11
- const unPadded = value.toString(16)
12
- return hexFromHexString(unPadded, config)
13
- }
@@ -1,20 +0,0 @@
1
- import { isNumber } from '@xylabs/typeof'
2
-
3
- import type { Hex, HexConfig } from '../hex.ts'
4
- import { isHex } from '../is.ts'
5
- import { bitsToNibbles } from '../nibble.ts'
6
-
7
- export const hexFromHexString = (value: string, config: HexConfig = {}): Hex => {
8
- const {
9
- prefix = false, byteSize = 8, bitLength,
10
- } = config
11
- const nibbleBoundary = bitsToNibbles(byteSize)
12
- const unEvened = (value.startsWith('0x') ? value.slice(2) : value).toLowerCase()
13
- if (isHex(unEvened)) {
14
- const evenCharacters = unEvened.padStart(unEvened.length + (unEvened.length % nibbleBoundary), '0')
15
- const padded = isNumber(bitLength) ? evenCharacters.padStart(bitLength / 4, '0') : evenCharacters
16
- return (prefix ? `0x${padded}` : padded).toLowerCase() as Hex
17
- } else {
18
- throw new Error('Received string is not a value hex')
19
- }
20
- }
@@ -1,6 +0,0 @@
1
- import type { Hex, HexConfig } from '../hex.ts'
2
- import { hexFromBigInt } from './fromBigInt.ts'
3
-
4
- export const hexFromNumber = (value: number, config?: HexConfig): Hex => {
5
- return hexFromBigInt(BigInt(value), config)
6
- }
@@ -1,5 +0,0 @@
1
- export * from './from.ts'
2
- export * from './fromArrayBuffer.ts'
3
- export * from './fromBigInt.ts'
4
- export * from './fromHexString.ts'
5
- export * from './fromNumber.ts'
package/src/hex/hex.ts DELETED
@@ -1,17 +0,0 @@
1
- import type { Brand } from '@xylabs/typeof'
2
- import * as z from 'zod'
3
-
4
- import { HexRegEx } from '../HexRegEx.ts'
5
-
6
- export type BrandedHex = Brand<Lowercase<string>, { readonly __hex: true }>
7
-
8
- export const HexZod = z.string().regex(HexRegEx, { message: 'Invalid hex format' }).transform(val => val as BrandedHex)
9
-
10
- /** Configuration of validation and output format */
11
- export interface HexConfig {
12
- bitLength?: number
13
- byteSize?: number
14
- prefix?: boolean
15
- }
16
-
17
- export type Hex = z.infer<typeof HexZod>
package/src/hex/index.ts DELETED
@@ -1,8 +0,0 @@
1
- export * from './as.ts'
2
- export * from './from/index.ts'
3
- export * from './hex.ts'
4
- export * from './is.ts'
5
- export * from './isHexZero.ts'
6
- export * from './legacy.ts'
7
- export * from './nibble.ts'
8
- export * from './to.ts'