genome 1.0.0 → 1.0.3
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/LICENSE +1 -1
- package/README.md +60 -249
- package/genome_rs.d.ts +93 -0
- package/genome_rs.js +9 -0
- package/genome_rs_bg.js +288 -0
- package/genome_rs_bg.wasm +0 -0
- package/package.json +50 -94
- package/dist/hash.d.ts +0 -67
- package/dist/hash.d.ts.map +0 -1
- package/dist/id-indexhash.d.ts +0 -21
- package/dist/id-indexhash.d.ts.map +0 -1
- package/dist/id-multiset.d.ts +0 -6
- package/dist/id-multiset.d.ts.map +0 -1
- package/dist/id-multiset32.d.ts +0 -2
- package/dist/id-multiset32.d.ts.map +0 -1
- package/dist/index.cjs +0 -449
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts +0 -272
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -405
- package/dist/index.js.map +0 -1
- package/dist/largeObj.d.ts +0 -119
- package/dist/largeObj.d.ts.map +0 -1
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hash.ts","../src/index.ts"],"sourcesContent":["/**\n * @fileoverview Fast, non-cryptographic hash functions for structure ID generation\n * @module @synpatico/genome/hash\n */\n\n/**\n * Available hash function implementations\n */\nexport const hashFunction = {\n\tMURMUR: murmurHash3,\n\tXXHASH: xxHash32,\n} as const\n\n/**\n * Type representing available hash functions\n */\nexport type HashFunction = (typeof hashFunction)[keyof typeof hashFunction]\n\n/**\n * Options for hash function selection\n */\ntype HashFunctionProps = {\n\t/** Built-in hash function to use */\n\ttype?: HashFunction\n\t/** Custom hash function implementation */\n\tcustom?: (str: string) => string\n}\n\n/**\n * Generates a hash from a string using the specified algorithm.\n * Defaults to xxHash32 for optimal performance.\n * \n * @param str - The string to hash\n * @param options - Optional hash function configuration\n * @returns A hexadecimal hash string\n * \n * @example\n * ```javascript\n * // Using default xxHash32\n * const h1 = hash(\"hello\"); // \"884863d4\"\n * \n * // Using MurmurHash3\n * const h2 = hash(\"hello\", { type: hashFunction.MURMUR }); // \"613cae7d\"\n * \n * // Using custom function\n * const h3 = hash(\"hello\", { custom: (s) => s.length.toString() }); // \"5\"\n * ```\n */\nexport const hash = (str: string, options?: HashFunctionProps): string => {\n\tif (options) {\n\t\tif (options.custom !== undefined && typeof options.custom === \"function\") {\n\t\t\treturn options.custom(str)\n\t\t}\n\t\tif (options.type) {\n\t\t\treturn options.type(str)\n\t\t}\n\t}\n\treturn hashFunction.XXHASH(str) // default hashing function\n}\n\n/**\n * MurmurHash3 implementation - fast non-cryptographic hash function.\n * Provides good distribution and collision resistance for hash tables.\n * \n * @param str - The string to hash\n * @returns A hexadecimal hash string\n * \n * @example\n * ```javascript\n * const hash = murmurHash3(\"hello world\");\n * console.log(hash); // \"5e928f0f\"\n * ```\n */\nexport function murmurHash3(str: string): string {\n\tconst seed = 0\n\tconst c1 = 0xcc9e2d51\n\tconst c2 = 0x1b873593\n\tconst r1 = 15\n\tconst r2 = 13\n\tconst m = 5\n\tconst n = 0xe6546b64\n\n\tlet hash = seed\n\n\t// Convert string to UTF-8 bytes\n\tconst data = new TextEncoder().encode(str)\n\tconst len = data.length\n\tconst nblocks = Math.floor(len / 4)\n\n\t// Process blocks of 4 bytes\n\tfor (let i = 0; i < nblocks; i++) {\n\t\tlet k = data[i * 4] | (data[i * 4 + 1] << 8) | (data[i * 4 + 2] << 16) | (data[i * 4 + 3] << 24)\n\n\t\tk = Math.imul(k, c1)\n\t\tk = (k << r1) | (k >>> (32 - r1))\n\t\tk = Math.imul(k, c2)\n\n\t\thash ^= k\n\t\thash = (hash << r2) | (hash >>> (32 - r2))\n\t\thash = Math.imul(hash, m) + n\n\t}\n\n\t// Process remaining bytes\n\tlet k = 0\n\tconst remaining = len - nblocks * 4\n\tconst offset = nblocks * 4\n\n\tif (remaining === 3) {\n\t\tk ^= data[offset + 2] << 16\n\t}\n\tif (remaining >= 2) {\n\t\tk ^= data[offset + 1] << 8\n\t}\n\tif (remaining >= 1) {\n\t\tk ^= data[offset]\n\t\tk = Math.imul(k, c1)\n\t\tk = (k << r1) | (k >>> (32 - r1))\n\t\tk = Math.imul(k, c2)\n\t\thash ^= k\n\t}\n\n\t// Finalize\n\thash ^= len\n\thash ^= hash >>> 16\n\thash = Math.imul(hash, 0x85ebca6b)\n\thash ^= hash >>> 13\n\thash = Math.imul(hash, 0xc2b2ae35)\n\thash ^= hash >>> 16\n\n\treturn (hash >>> 0).toString(16)\n}\n\n/**\n * xxHash32 - An extremely fast non-cryptographic hash algorithm\n *\n * This is a rewritten/refactored implementation based on Jason Dent's TypeScript version:\n * https://github.com/Jason3S/xxhash/blob/main/src/xxHash32.ts\n *\n * Original algorithm by Yann Collet: https://github.com/Cyan4973/xxHash\n *\n * Jason Dent's implementation is MIT licensed.\n * Yann Collet's xxHash is BSD-2 licensed.\n */\n\nconst PRIME32_1 = 2654435761\nconst PRIME32_2 = 2246822519\nconst PRIME32_3 = 3266489917\nconst PRIME32_4 = 668265263\nconst PRIME32_5 = 374761393\n\nlet encoder: TextEncoder | undefined\n\n/**\n *\n * @param input - byte array or string\n * @param seed - optional seed (32-bit unsigned);\n */\nexport function xxHash32(input: Uint8Array | string, seed = 0): string {\n\tconst buffer =\n\t\ttypeof input === \"string\"\n\t\t\t? // biome-ignore lint/suspicious/noAssignInExpressions: allow\n\t\t\t\t(encoder ??= new TextEncoder()).encode(input)\n\t\t\t: input\n\tconst b = buffer\n\n\t/*\n Step 1. Initialize internal accumulators\n Each accumulator gets an initial value based on optional seed input. Since the seed is optional, it can be 0.\n\n ```\n u32 acc1 = seed + PRIME32_1 + PRIME32_2;\n u32 acc2 = seed + PRIME32_2;\n u32 acc3 = seed + 0;\n u32 acc4 = seed - PRIME32_1;\n ```\n Special case : input is less than 16 bytes\n When input is too small (< 16 bytes), the algorithm will not process any stripe. Consequently, it will not\n make use of parallel accumulators.\n\n In which case, a simplified initialization is performed, using a single accumulator :\n\n u32 acc = seed + PRIME32_5;\n The algorithm then proceeds directly to step 4.\n */\n\n\tlet acc = (seed + PRIME32_5) & 0xffffffff\n\tlet offset = 0\n\n\tif (b.length >= 16) {\n\t\tconst accN = [\n\t\t\t(seed + PRIME32_1 + PRIME32_2) & 0xffffffff,\n\t\t\t(seed + PRIME32_2) & 0xffffffff,\n\t\t\t(seed + 0) & 0xffffffff,\n\t\t\t(seed - PRIME32_1) & 0xffffffff,\n\t\t]\n\n\t\t/*\n Step 2. Process stripes\n A stripe is a contiguous segment of 16 bytes. It is evenly divided into 4 lanes, of 4 bytes each.\n The first lane is used to update accumulator 1, the second lane is used to update accumulator 2, and so on.\n\n Each lane read its associated 32-bit value using little-endian convention.\n\n For each {lane, accumulator}, the update process is called a round, and applies the following formula :\n\n ```\n accN = accN + (laneN * PRIME32_2);\n accN = accN <<< 13;\n accN = accN * PRIME32_1;\n ```\n\n This shuffles the bits so that any bit from input lane impacts several bits in output accumulator.\n All operations are performed modulo 2^32.\n\n Input is consumed one full stripe at a time. Step 2 is looped as many times as necessary to consume\n the whole input, except the last remaining bytes which cannot form a stripe (< 16 bytes). When that\n happens, move to step 3.\n */\n\n\t\tconst b = buffer\n\t\tconst limit = b.length - 16\n\t\tlet lane = 0\n\t\tfor (offset = 0; (offset & 0xfffffff0) <= limit; offset += 4) {\n\t\t\tconst i = offset\n\t\t\tconst laneN0 = b[i + 0] + (b[i + 1] << 8)\n\t\t\tconst laneN1 = b[i + 2] + (b[i + 3] << 8)\n\t\t\tconst laneNP = laneN0 * PRIME32_2 + ((laneN1 * PRIME32_2) << 16)\n\t\t\tlet acc = (accN[lane] + laneNP) & 0xffffffff\n\t\t\tacc = (acc << 13) | (acc >>> 19)\n\t\t\tconst acc0 = acc & 0xffff\n\t\t\tconst acc1 = acc >>> 16\n\t\t\taccN[lane] = (acc0 * PRIME32_1 + ((acc1 * PRIME32_1) << 16)) & 0xffffffff\n\t\t\tlane = (lane + 1) & 0x3\n\t\t}\n\n\t\t/*\n Step 3. Accumulator convergence\n All 4 lane accumulators from previous steps are merged to produce a single remaining accumulator\n of same width (32-bit). The associated formula is as follows :\n\n ```\n acc = (acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18);\n ```\n */\n\t\tacc =\n\t\t\t(((accN[0] << 1) | (accN[0] >>> 31)) +\n\t\t\t\t((accN[1] << 7) | (accN[1] >>> 25)) +\n\t\t\t\t((accN[2] << 12) | (accN[2] >>> 20)) +\n\t\t\t\t((accN[3] << 18) | (accN[3] >>> 14))) &\n\t\t\t0xffffffff\n\t}\n\n\t/*\n Step 4. Add input length\n The input total length is presumed known at this stage. This step is just about adding the length to\n accumulator, so that it participates to final mixing.\n\n ```\n acc = acc + (u32)inputLength;\n ```\n */\n\tacc = (acc + buffer.length) & 0xffffffff\n\n\t/*\n Step 5. Consume remaining input\n There may be up to 15 bytes remaining to consume from the input. The final stage will digest them according\n to following pseudo-code :\n ```\n while (remainingLength >= 4) {\n lane = read_32bit_little_endian(input_ptr);\n acc = acc + lane * PRIME32_3;\n acc = (acc <<< 17) * PRIME32_4;\n input_ptr += 4; remainingLength -= 4;\n }\n ```\n This process ensures that all input bytes are present in the final mix.\n */\n\n\tconst limit = buffer.length - 4\n\tfor (; offset <= limit; offset += 4) {\n\t\tconst i = offset\n\t\tconst laneN0 = b[i + 0] + (b[i + 1] << 8)\n\t\tconst laneN1 = b[i + 2] + (b[i + 3] << 8)\n\t\tconst laneP = laneN0 * PRIME32_3 + ((laneN1 * PRIME32_3) << 16)\n\t\tacc = (acc + laneP) & 0xffffffff\n\t\tacc = (acc << 17) | (acc >>> 15)\n\t\tacc = ((acc & 0xffff) * PRIME32_4 + (((acc >>> 16) * PRIME32_4) << 16)) & 0xffffffff\n\t}\n\n\t/*\n ```\n while (remainingLength >= 1) {\n lane = read_byte(input_ptr);\n acc = acc + lane * PRIME32_5;\n acc = (acc <<< 11) * PRIME32_1;\n input_ptr += 1; remainingLength -= 1;\n }\n ```\n */\n\n\tfor (; offset < b.length; ++offset) {\n\t\tconst lane = b[offset]\n\t\tacc = acc + lane * PRIME32_5\n\t\tacc = (acc << 11) | (acc >>> 21)\n\t\tacc = ((acc & 0xffff) * PRIME32_1 + (((acc >>> 16) * PRIME32_1) << 16)) & 0xffffffff\n\t}\n\n\t/*\n Step 6. Final mix (avalanche)\n The final mix ensures that all input bits have a chance to impact any bit in the output digest,\n resulting in an unbiased distribution. This is also called avalanche effect.\n ```\n acc = acc xor (acc >> 15);\n acc = acc * PRIME32_2;\n acc = acc xor (acc >> 13);\n acc = acc * PRIME32_3;\n acc = acc xor (acc >> 16);\n ```\n */\n\n\tacc = acc ^ (acc >>> 15)\n\tacc = (((acc & 0xffff) * PRIME32_2) & 0xffffffff) + (((acc >>> 16) * PRIME32_2) << 16)\n\tacc = acc ^ (acc >>> 13)\n\tacc = (((acc & 0xffff) * PRIME32_3) & 0xffffffff) + (((acc >>> 16) * PRIME32_3) << 16)\n\tacc = acc ^ (acc >>> 16)\n\n\t// turn any negatives back into a positive number;\n\treturn acc < 0 ? (acc + 4294967296).toString(16) : acc.toString(16)\n}\n","/**\n * @fileoverview Deterministic structure ID generation for JavaScript objects using hierarchical hashing and collision-resistant algorithms\n * @module @synpatico/genome\n */\n\nimport { hash, xxHash32 } from './hash'\n\n/**\n * Bit flags for different JavaScript types used in structure hashing\n * @private\n */\nconst TYPE_BITS: Record<string, bigint> = {\n\troot: BigInt(0),\n\tnumber: BigInt(1),\n\tstring: BigInt(2),\n\tboolean: BigInt(4),\n\tbigint: BigInt(8),\n\tnull: BigInt(16),\n\tundefined: BigInt(32),\n\tsymbol: BigInt(64),\n\tobject: BigInt(128),\n\tarray: BigInt(256),\n}\n\n/**\n * Global cache of property names to their deterministic hash values.\n * Used to ensure consistent bit generation across different executions.\n */\nexport const GLOBAL_KEY_MAP = new Map<string, bigint>()\n\n/**\n * Tracks collision counts for structure signatures to handle hash conflicts.\n * Maps structure signatures to their collision counter values.\n */\nexport const STRUCTURE_HASH_COUNTER = new Map<string, number>()\n\n/**\n * WeakMap cache for object-to-structure-ID mappings.\n * Automatically garbage collected when objects are no longer referenced.\n */\nexport let OBJECT_ID_CACHE = new WeakMap<object, string>()\n\n/**\n * WeakMap cache for object-to-signature mappings.\n * Stores the signature portion (excluding L0 level) for collision detection.\n */\nexport let OBJECT_SIGNATURE_CACHE = new WeakMap<object, string>()\n\n/**\n * WeakMap cache for complete structure information including metadata.\n * Stores comprehensive structure analysis results for performance optimization.\n */\nexport let STRUCTURE_INFO_CACHE = new WeakMap<\n\tobject,\n\t{\n\t\tid: string\n\t\tlevels: number\n\t\tcollisionCount: number\n\t}\n>()\n\n/**\n * Type guard to check if a value is a plain object (not array, null, or primitive)\n * @param x - The value to check\n * @returns True if the value is a plain object\n * @private\n */\nconst isObject = (x: unknown): x is object =>\n\ttypeof x === 'object' && x !== null && !Array.isArray(x)\n\n/**\n * Gets or creates a deterministic bit value for a given key using xxHash32.\n * Caches results in GLOBAL_KEY_MAP for consistent hashing across calls.\n * @param key - The string key to hash\n * @returns A deterministic bigint hash value\n * @private\n */\nconst getBit = (key: string): bigint => {\n\tif (!GLOBAL_KEY_MAP.has(key)) {\n\t\tconst hashResult = xxHash32(key)\n\t\tconst deterministicBit = BigInt(`0x${hashResult}`)\n\t\tGLOBAL_KEY_MAP.set(key, deterministicBit)\n\t}\n\treturn GLOBAL_KEY_MAP.get(key) as bigint\n}\n\n/**\n * Configuration options for structure ID generation\n */\nexport interface StructureIdConfig {\n\t/** Whether to generate new IDs on collision (default: false) */\n\tnewIdOnCollision?: boolean\n\t/**\n\t * When true, arrays with different lengths but the same element shapes\n\t * will produce the same structure ID. Distinct element shapes within\n\t * an array are still differentiated. (default: false)\n\t *\n\t * @example\n\t * // Same ID:\n\t * generateStructureId({ items: [1, 2, 3] }, { ignoreArrayLength: true })\n\t * generateStructureId({ items: [1, 2] }, { ignoreArrayLength: true })\n\t *\n\t * // Different ID (different element shapes):\n\t * generateStructureId({ items: [1, 'a'] }, { ignoreArrayLength: true })\n\t * generateStructureId({ items: [{ id: 1 }, 'a'] }, { ignoreArrayLength: true })\n\t */\n\tignoreArrayLength?: boolean\n}\n\n/**\n * Global configuration for structure ID generation\n * @private\n */\nlet globalConfig: StructureIdConfig = {\n\tnewIdOnCollision: false,\n\tignoreArrayLength: false,\n}\n\n/**\n * Sets the global configuration for structure ID generation\n * @param config - The configuration options to apply\n * @example\n * ```javascript\n * setStructureIdConfig({ newIdOnCollision: true });\n * ```\n */\nexport function setStructureIdConfig(config: StructureIdConfig): void {\n\tglobalConfig = { ...config }\n}\n\n/**\n * Gets the current global configuration for structure ID generation\n * @returns A copy of the current configuration\n */\nexport function getStructureIdConfig(): StructureIdConfig {\n\treturn { ...globalConfig }\n}\n\n/**\n * Generates a unique, deterministic structure ID for any JavaScript value.\n * The ID captures the complete shape and type information hierarchically.\n *\n * @param obj - The value to generate a structure ID for\n * @param config - Optional configuration to override global settings\n * @returns A hierarchical structure ID in format \"L0:hash-L1:hash-L2:hash...\"\n *\n * @example\n * ```javascript\n * const obj = { users: [{ id: 1, name: \"John\" }] };\n * const id = generateStructureId(obj);\n * // Returns: \"L0:384729-L1:8374629-L2:9283746\"\n * ```\n *\n * @example\n * ```javascript\n * // Empty objects and arrays have special IDs\n * generateStructureId({}); // Returns: \"{}\"\n * generateStructureId([]); // Returns: \"[]\"\n * ```\n */\nexport const generateStructureId = (obj: unknown, config?: StructureIdConfig): string => {\n\tconst emptyObj = isObject(obj) && Object.keys(obj).length === 0\n\tconst emptyArr = Array.isArray(obj) && (obj as unknown[]).length === 0\n\n\tif (emptyObj) return '{}'\n\tif (emptyArr) return '[]'\n\n\tconst effectiveConfig = config ?? globalConfig\n\tconst ignoreArrayLength = effectiveConfig.ignoreArrayLength ?? false\n\n\tif (typeof obj !== 'object' || obj === null) {\n\t\treturn `L0:${TYPE_BITS[typeof obj] || BigInt(0)}-L1:${TYPE_BITS[typeof obj] || BigInt(0)}`\n\t}\n\n\tif (!effectiveConfig?.newIdOnCollision && OBJECT_ID_CACHE.has(obj)) {\n\t\treturn OBJECT_ID_CACHE.get(obj) as string\n\t}\n\n\tconst objectMap = new Map<object, string>()\n\n\tconst levelHashes: Record<number, bigint> = {}\n\n\t/**\n\t * Determines the type of a value for structure analysis\n\t * @param value - The value to check\n\t * @returns Type string: \"null\", \"undefined\", \"array\", or typeof result\n\t * @private\n\t */\n\tconst getType = (value: unknown): string => {\n\t\tif (value === null) return 'null'\n\t\tif (value === undefined) return 'undefined'\n\t\tif (Array.isArray(value)) return 'array'\n\t\treturn typeof value\n\t}\n\n\t/**\n\t * Creates a unique signature for an object based on its path and structure\n\t * @param obj - The object or array to generate a signature for\n\t * @param path - The current path to this object in the structure\n\t * @returns A string signature like \"user.address.{street,city}\" or \"items.[3]\"\n\t * @private\n\t */\n\tconst getObjectSignature = (obj: object, path: string[]): string => {\n\t\tconst type = Array.isArray(obj) ? 'array' : 'object'\n\n\t\tif (type === 'object') {\n\t\t\tconst keys = Object.keys(obj).sort().join(',')\n\t\t\treturn `${path.join('.')}.{${keys}}`\n\t\t}\n\n\t\treturn `${path.join('.')}.[${(obj as unknown[]).length}]`\n\t}\n\n\t/**\n\t * Recursively processes object structure to build hierarchical hash levels\n\t * @param value - The value to process\n\t * @param level - Current depth level in the object hierarchy\n\t * @param path - Current path to this value\n\t * @private\n\t */\n\tconst processStructure = (value: unknown, level = 0, path: string[] = []): void => {\n\t\tif (!levelHashes[level]) {\n\t\t\tlevelHashes[level] = BigInt(1) << BigInt(level)\n\t\t}\n\n\t\tconst type = getType(value)\n\n\t\tlevelHashes[level] += TYPE_BITS[type] || BigInt(0)\n\n\t\tif (type !== 'object' && type !== 'array') {\n\t\t\treturn\n\t\t}\n\n\t\tif (isObject(value) || Array.isArray(value)) {\n\t\t\tconst objValue = value as object\n\t\t\tconst objSig = getObjectSignature(objValue, path)\n\n\t\t\tif (objectMap.has(objValue)) {\n\t\t\t\tconst circularPath = objectMap.get(objValue)\n\t\t\t\tlevelHashes[level] += getBit(`circular:${circularPath}`)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tobjectMap.set(objValue, objSig)\n\n\t\t\tconst objTypeBit = getBit(`type:${type}`)\n\t\t\tlevelHashes[level] += objTypeBit\n\n\t\t\tconst isRootLevel = level === 0\n\t\t\tconst isEmpty =\n\t\t\t\t(isObject(value) && Object.keys(value as object).length === 0) ||\n\t\t\t\t(Array.isArray(value) && (value as unknown[]).length === 0)\n\n\t\t\tif (!isRootLevel || !isEmpty) {\n\t\t\t\tif (type === 'object') {\n\t\t\t\t\tconst objValue = value as Record<string, unknown>\n\n\t\t\t\t\tconst keys = Object.keys(objValue).sort()\n\n\t\t\t\t\tlet multiplier = BigInt(1)\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\tconst propType = getType(objValue[key])\n\t\t\t\t\t\tconst keyBit = getBit(key)\n\t\t\t\t\t\tlevelHashes[level] += keyBit * multiplier\n\n\t\t\t\t\t\tlevelHashes[level] += (TYPE_BITS[propType] || BigInt(0)) * multiplier\n\n\t\t\t\t\t\tmultiplier++\n\n\t\t\t\t\t\tprocessStructure(objValue[key], level + 1, [...path, key])\n\t\t\t\t\t}\n\t\t\t\t} else if (type === 'array') {\n\t\t\t\t\tconst arrayValue = value as unknown[]\n\n\t\t\t\t\tif (!ignoreArrayLength) {\n\t\t\t\t\t\t// Default behavior — length and per-index bits baked in\n\t\t\t\t\t\tconst lengthBit = getBit(`length:${arrayValue.length}`)\n\t\t\t\t\t\tlevelHashes[level] += lengthBit\n\n\t\t\t\t\t\tlet multiplier = BigInt(1)\n\t\t\t\t\t\tfor (let i = 0; i < arrayValue.length; i++) {\n\t\t\t\t\t\t\tconst itemType = getType(arrayValue[i])\n\t\t\t\t\t\t\tconst indexBit = getBit(`[${i}]`)\n\t\t\t\t\t\t\tlevelHashes[level] += indexBit * multiplier\n\n\t\t\t\t\t\t\tlevelHashes[level] += (TYPE_BITS[itemType] || BigInt(0)) * multiplier\n\n\t\t\t\t\t\t\tmultiplier++\n\n\t\t\t\t\t\t\tprocessStructure(arrayValue[i], level + 1, [...path, `[${i}]`])\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Shape-only mode — hash unique element shapes, ignore cardinality.\n\t\t\t\t\t\t// All array positions use the sentinel path \"[*]\" so the hash is\n\t\t\t\t\t\t// position-independent. Distinct shapes within the same array are\n\t\t\t\t\t\t// still differentiated (e.g. [number, string] !== [number]).\n\t\t\t\t\t\tconst seenShapes = new Set<string>()\n\n\t\t\t\t\t\tfor (const item of arrayValue) {\n\t\t\t\t\t\t\tconst itemType = getType(item)\n\t\t\t\t\t\t\tconst shapeKey =\n\t\t\t\t\t\t\t\titemType === 'object' || itemType === 'array'\n\t\t\t\t\t\t\t\t\t? getObjectSignature(item as object, [...path, '[*]'])\n\t\t\t\t\t\t\t\t\t: `scalar:${itemType}`\n\n\t\t\t\t\t\t\tif (!seenShapes.has(shapeKey)) {\n\t\t\t\t\t\t\t\tseenShapes.add(shapeKey)\n\t\t\t\t\t\t\t\tlevelHashes[level] += getBit(shapeKey)\n\t\t\t\t\t\t\t\tprocessStructure(item, level + 1, [...path, '[*]'])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Sentinel so array containers still differ from object containers\n\t\t\t\t\t\t// when no length/index bits are present\n\t\t\t\t\t\tlevelHashes[level] += getBit('array:variadic')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprocessStructure(obj)\n\n\tconst structureLevels = Object.entries(levelHashes)\n\t\t.filter(([level]) => Number(level) > 0)\n\t\t.sort(([a], [b]) => Number(a) - Number(b))\n\t\t.map(([level, hash]) => `L${level}:${hash}`)\n\n\tconst structureSignature = structureLevels.join('-')\n\n\tif (typeof obj === 'object' && obj !== null) {\n\t\tOBJECT_SIGNATURE_CACHE.set(obj, structureSignature)\n\t}\n\n\tconst currentCount = STRUCTURE_HASH_COUNTER.get(structureSignature) ?? 0\n\n\tif (effectiveConfig?.newIdOnCollision) {\n\t\tlevelHashes[0] = BigInt(currentCount)\n\n\t\tSTRUCTURE_HASH_COUNTER.set(structureSignature, currentCount + 1)\n\t}\n\n\tconst idParts = Object.entries(levelHashes)\n\t\t.sort(([a], [b]) => Number(a) - Number(b))\n\t\t.map(([level, hash]) => `L${level}:${hash}`)\n\n\tconst finalId = idParts.join('-')\n\n\tif (!effectiveConfig?.newIdOnCollision && typeof obj === 'object' && obj !== null) {\n\t\tOBJECT_ID_CACHE.set(obj, finalId)\n\t}\n\n\tif (typeof obj === 'object' && obj !== null && STRUCTURE_INFO_CACHE.has(obj)) {\n\t\tSTRUCTURE_INFO_CACHE.delete(obj)\n\t}\n\n\treturn finalId\n}\n\n/**\n * Calculates the number of hierarchy levels in a structure ID\n * @param id - The structure ID to analyze\n * @returns The number of levels (depth) in the ID\n * @private\n */\nfunction calculateIdLevels(id: string): number {\n\treturn id.split('-').length\n}\n\n/**\n * Gets the structure signature (without L0 collision counter) for an object.\n * This signature represents the object's shape and is used for collision detection.\n *\n * @param obj - The object to get a signature for\n * @returns A signature string like \"L1:hash-L2:hash\" or \"type:primitive\" for primitives\n *\n * @example\n * ```javascript\n * const sig1 = getStructureSignature({ id: 1, name: \"John\" });\n * const sig2 = getStructureSignature({ id: 2, name: \"Jane\" });\n * console.log(sig1 === sig2); // true (same structure)\n * ```\n */\nexport function getStructureSignature(obj: unknown): string {\n\tif (typeof obj !== 'object' || obj === null) {\n\t\treturn `type:${typeof obj}`\n\t}\n\n\tif (OBJECT_SIGNATURE_CACHE.has(obj)) {\n\t\treturn OBJECT_SIGNATURE_CACHE.get(obj) as string\n\t}\n\n\tconst tempId = generateStructureId(obj, { newIdOnCollision: false })\n\tconst signature = tempId.split('-').slice(1).join('-')\n\n\tOBJECT_SIGNATURE_CACHE.set(obj, signature)\n\n\treturn signature\n}\n\n/**\n * Registers a structure with a specific collision count.\n * Used to pre-populate collision counters for known structures.\n *\n * @param obj - The object whose structure to register\n * @param collisionCount - The collision count to set for this structure\n *\n * @example\n * ```javascript\n * const template = { id: 0, name: \"\" };\n * registerStructure(template, 5); // Pre-register with collision count 5\n * ```\n */\nexport function registerStructure(obj: unknown, collisionCount: number): void {\n\tconst signature = getStructureSignature(obj)\n\tSTRUCTURE_HASH_COUNTER.set(signature, collisionCount)\n}\n\n/**\n * Batch registers multiple structures with their collision counts.\n * Useful for pre-populating the collision counter from saved state.\n *\n * @param registrations - Array of structure-count pairs to register\n *\n * @example\n * ```javascript\n * registerStructures([\n * { structure: { id: 0 }, count: 3 },\n * { structure: { name: \"\" }, count: 1 }\n * ]);\n * ```\n */\nexport function registerStructures(\n\tregistrations: Array<{\n\t\tstructure: unknown\n\t\tcount: number\n\t}>,\n): void {\n\tfor (const { structure, count } of registrations) {\n\t\tregisterStructure(structure, count)\n\t}\n}\n\n/**\n * Structure registration data for importing/exporting collision state\n */\nexport interface StructureRegistration {\n\t/** The structure signature (without L0) */\n\tsignature: string\n\t/** The collision counter value */\n\tcount: number\n}\n\n/**\n * Registers structure signatures directly without needing object instances.\n * Useful for importing collision state from external sources.\n *\n * @param signatures - Array of signature-count pairs to register\n *\n * @example\n * ```javascript\n * registerStructureSignatures([\n * { signature: \"L1:123-L2:456\", count: 2 },\n * { signature: \"L1:789-L2:012\", count: 0 }\n * ]);\n * ```\n */\nexport function registerStructureSignatures(signatures: Array<StructureRegistration>): void {\n\tfor (const { signature, count } of signatures) {\n\t\tSTRUCTURE_HASH_COUNTER.set(signature, count)\n\t}\n}\n\n/**\n * Gets comprehensive structure information including ID, depth levels, and collision count.\n * Caches results for performance optimization.\n *\n * @param obj - The object to analyze\n * @param config - Optional configuration to override global settings\n * @returns Structure information object\n *\n * @example\n * ```javascript\n * const info = getStructureInfo({ users: [{ id: 1, name: \"John\" }] });\n * console.log(info);\n * // {\n * // id: \"L0:384729-L1:8374629-L2:9283746\",\n * // levels: 3,\n * // collisionCount: 0\n * // }\n * ```\n */\nexport function getStructureInfo(\n\tobj: unknown,\n\tconfig?: StructureIdConfig,\n): {\n\tid: string\n\tlevels: number\n\tcollisionCount: number\n} {\n\tconst effectiveConfig = config ?? globalConfig\n\n\tif (typeof obj !== 'object' || obj === null) {\n\t\tconst id = generateStructureId(obj, { newIdOnCollision: false })\n\t\treturn {\n\t\t\tid,\n\t\t\tlevels: calculateIdLevels(id),\n\t\t\tcollisionCount: 0,\n\t\t}\n\t}\n\n\tif (STRUCTURE_INFO_CACHE.has(obj)) {\n\t\treturn STRUCTURE_INFO_CACHE.get(obj) as {\n\t\t\tid: string\n\t\t\tlevels: number\n\t\t\tcollisionCount: number\n\t\t}\n\t}\n\n\tconst structureSignature = OBJECT_SIGNATURE_CACHE.has(obj)\n\t\t? (OBJECT_SIGNATURE_CACHE.get(obj) as string)\n\t\t: generateStructureId(obj, { newIdOnCollision: false }).split('-').slice(1).join('-')\n\n\tconst collisionCount = STRUCTURE_HASH_COUNTER.get(structureSignature) || 0\n\n\tlet id: string\n\tif (effectiveConfig.newIdOnCollision) {\n\t\tconst l0Hash = BigInt(collisionCount)\n\t\tconst l0Part = `L0:${l0Hash}`\n\t\tid = [l0Part, structureSignature].join('-')\n\t} else {\n\t\tid = OBJECT_ID_CACHE.has(obj)\n\t\t\t? (OBJECT_ID_CACHE.get(obj) as string)\n\t\t\t: generateStructureId(obj, { newIdOnCollision: false })\n\t}\n\n\tconst levels = calculateIdLevels(id)\n\n\tconst result = {\n\t\tid,\n\t\tlevels,\n\t\tcollisionCount,\n\t}\n\n\tSTRUCTURE_INFO_CACHE.set(obj, result)\n\n\treturn result\n}\n\n/**\n * Resets all global state including caches and collision counters.\n * Useful for testing or when you need to start fresh.\n *\n * @example\n * ```javascript\n * resetState(); // Clear all caches and counters\n * ```\n */\nexport function resetState(): void {\n\tGLOBAL_KEY_MAP.clear()\n\tSTRUCTURE_HASH_COUNTER.clear()\n\n\tOBJECT_ID_CACHE = new WeakMap<object, string>()\n\tOBJECT_SIGNATURE_CACHE = new WeakMap<object, string>()\n\tSTRUCTURE_INFO_CACHE = new WeakMap<\n\t\tobject,\n\t\t{\n\t\t\tid: string\n\t\t\tlevels: number\n\t\t\tcollisionCount: number\n\t\t}\n\t>()\n}\n\n/**\n * Serializable state of the structure ID system\n */\nexport interface StructureState {\n\t/** Map of keys to their hash values */\n\tkeyMap: Record<string, string>\n\t/** Map of structure signatures to collision counts */\n\tcollisionCounters: Record<string, number>\n}\n\n/**\n * Exports the current state of the structure ID system.\n * Useful for persisting state across sessions or sharing between environments.\n *\n * @returns The current state including key mappings and collision counters\n *\n * @example\n * ```javascript\n * const state = exportStructureState();\n * localStorage.setItem('genomeState', JSON.stringify(state));\n * ```\n */\nexport function exportStructureState(): StructureState {\n\tconst keyMap: Record<string, string> = {}\n\tfor (const [key, value] of GLOBAL_KEY_MAP.entries()) {\n\t\tkeyMap[key] = value.toString()\n\t}\n\n\tconst collisionCounters: Record<string, number> = {}\n\tfor (const [signature, count] of STRUCTURE_HASH_COUNTER.entries()) {\n\t\tcollisionCounters[signature] = count\n\t}\n\n\treturn {\n\t\tkeyMap,\n\t\tcollisionCounters,\n\t}\n}\n\n/**\n * Imports a previously exported structure state.\n * Resets current state before importing to ensure clean slate.\n *\n * @param state - The state to import\n *\n * @example\n * ```javascript\n * const savedState = JSON.parse(localStorage.getItem('genomeState'));\n * importStructureState(savedState);\n * ```\n */\nexport function importStructureState(state: StructureState): void {\n\tresetState()\n\n\tfor (const [key, valueStr] of Object.entries(state.keyMap)) {\n\t\tGLOBAL_KEY_MAP.set(key, BigInt(valueStr))\n\t}\n\n\tfor (const [signature, count] of Object.entries(state.collisionCounters)) {\n\t\tSTRUCTURE_HASH_COUNTER.set(signature, count)\n\t}\n\n\tlet maxBit = BigInt(0)\n\tfor (const bitStr of Object.values(state.keyMap)) {\n\t\tconst bit = BigInt(bitStr)\n\t\tif (bit > maxBit) {\n\t\t\tmaxBit = bit\n\t\t}\n\t}\n}\n\n/**\n * Generates a compact, fixed-length structure ID using SHA-256 hashing.\n * Useful when you need consistent-length IDs regardless of object depth.\n *\n * @param obj - The object to generate a compact ID for\n * @param config - Optional configuration to override global settings\n * @returns A 64-character hexadecimal hash string\n *\n * @example\n * ```javascript\n * const compactId = getCompactId({ users: [{ id: 1, name: \"John\" }] });\n * console.log(compactId); // \"a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5...\"\n * ```\n */\nexport const getCompactId = (obj: unknown, config?: StructureIdConfig): string => {\n\tconst fullId = generateStructureId(obj, config)\n\n\treturn hash(fullId)\n}\n\n/**\n * Gets structure information with a compact ID format.\n * Combines the comprehensive analysis of getStructureInfo with compact ID generation.\n *\n * @param obj - The object to analyze\n * @param config - Optional configuration to override global settings\n * @returns Structure info with compact hash ID\n *\n * @example\n * ```javascript\n * const info = getCompactInfo({ users: [] });\n * console.log(info);\n * // {\n * // id: \"a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5...\",\n * // levels: 2,\n * // collisionCount: 0\n * // }\n * ```\n */\nexport const getCompactInfo = (\n\tobj: unknown,\n\tconfig?: StructureIdConfig,\n): {\n\tid: string\n\tlevels: number\n\tcollisionCount: number\n} => {\n\tconst info = getStructureInfo(obj, config)\n\n\tinfo.id = hash(info.id)\n\n\treturn info\n}\n"],"mappings":"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","names":["hash","k","b","limit","acc","obj","objValue","hash","id"]}
|
package/dist/largeObj.d.ts
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
interface Level10 {
|
|
2
|
-
finalValue: string;
|
|
3
|
-
metadata: {
|
|
4
|
-
createdAt: Date;
|
|
5
|
-
importance: number;
|
|
6
|
-
};
|
|
7
|
-
}
|
|
8
|
-
interface Level9 {
|
|
9
|
-
description: string;
|
|
10
|
-
active: boolean;
|
|
11
|
-
configuration: Level10;
|
|
12
|
-
metrics: Array<{
|
|
13
|
-
name: string;
|
|
14
|
-
value: number;
|
|
15
|
-
}>;
|
|
16
|
-
}
|
|
17
|
-
interface Level8 {
|
|
18
|
-
id: string;
|
|
19
|
-
settings: {
|
|
20
|
-
enabled: boolean;
|
|
21
|
-
threshold: number;
|
|
22
|
-
};
|
|
23
|
-
subComponent: Level9;
|
|
24
|
-
tags: string[];
|
|
25
|
-
}
|
|
26
|
-
interface Level7 {
|
|
27
|
-
name: string;
|
|
28
|
-
version: string;
|
|
29
|
-
features: {
|
|
30
|
-
advanced: boolean;
|
|
31
|
-
experimental: boolean;
|
|
32
|
-
};
|
|
33
|
-
component: Level8;
|
|
34
|
-
supportedPlatforms: string[];
|
|
35
|
-
}
|
|
36
|
-
interface Level6 {
|
|
37
|
-
category: string;
|
|
38
|
-
priority: number;
|
|
39
|
-
details: {
|
|
40
|
-
created: Date;
|
|
41
|
-
lastModified: Date;
|
|
42
|
-
};
|
|
43
|
-
module: Level7;
|
|
44
|
-
dependencies: string[];
|
|
45
|
-
}
|
|
46
|
-
interface Level5 {
|
|
47
|
-
title: string;
|
|
48
|
-
status: 'active' | 'inactive' | 'deprecated';
|
|
49
|
-
metrics: {
|
|
50
|
-
performance: number;
|
|
51
|
-
reliability: number;
|
|
52
|
-
usability: number;
|
|
53
|
-
};
|
|
54
|
-
service: Level6;
|
|
55
|
-
relatedItems: Array<{
|
|
56
|
-
id: string;
|
|
57
|
-
relevance: number;
|
|
58
|
-
}>;
|
|
59
|
-
}
|
|
60
|
-
interface Level4 {
|
|
61
|
-
code: string;
|
|
62
|
-
isPublic: boolean;
|
|
63
|
-
configuration: {
|
|
64
|
-
timeout: number;
|
|
65
|
-
retries: number;
|
|
66
|
-
caching: boolean;
|
|
67
|
-
};
|
|
68
|
-
api: Level5;
|
|
69
|
-
permissions: Array<{
|
|
70
|
-
role: string;
|
|
71
|
-
access: 'read' | 'write' | 'admin';
|
|
72
|
-
}>;
|
|
73
|
-
}
|
|
74
|
-
interface Level3 {
|
|
75
|
-
id: string;
|
|
76
|
-
type: string;
|
|
77
|
-
metadata: {
|
|
78
|
-
owner: string;
|
|
79
|
-
createdDate: Date;
|
|
80
|
-
version: string;
|
|
81
|
-
};
|
|
82
|
-
resource: Level4;
|
|
83
|
-
tags: Record<string, string>;
|
|
84
|
-
}
|
|
85
|
-
interface Level2 {
|
|
86
|
-
name: string;
|
|
87
|
-
enabled: boolean;
|
|
88
|
-
settings: {
|
|
89
|
-
mode: 'development' | 'production' | 'testing';
|
|
90
|
-
debug: boolean;
|
|
91
|
-
logLevel: 'info' | 'warn' | 'error' | 'debug';
|
|
92
|
-
};
|
|
93
|
-
component: Level3;
|
|
94
|
-
statistics: {
|
|
95
|
-
requestCount: number;
|
|
96
|
-
errorRate: number;
|
|
97
|
-
averageResponseTime: number;
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
interface Level1 {
|
|
101
|
-
id: string;
|
|
102
|
-
name: string;
|
|
103
|
-
description: string;
|
|
104
|
-
configuration: {
|
|
105
|
-
version: string;
|
|
106
|
-
environment: string;
|
|
107
|
-
features: string[];
|
|
108
|
-
};
|
|
109
|
-
system: Level2;
|
|
110
|
-
users: Array<{
|
|
111
|
-
id: string;
|
|
112
|
-
username: string;
|
|
113
|
-
role: string;
|
|
114
|
-
active: boolean;
|
|
115
|
-
}>;
|
|
116
|
-
}
|
|
117
|
-
declare const complexNestedObject: Level1;
|
|
118
|
-
export default complexNestedObject;
|
|
119
|
-
//# sourceMappingURL=largeObj.d.ts.map
|
package/dist/largeObj.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"largeObj.d.ts","sourceRoot":"","sources":["../src/largeObj.ts"],"names":[],"mappings":"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"}
|