UNPKG

@httpx/stable-hash

Version:

Create keys or hashes from javascript values, useful for memoization or cache key generation.

2 lines 1.7 kB
import {isPlainObject}from'@httpx/plain-object';var f=new Set(["string","number","bigint"]),m=new Intl.Collator("en",{numeric:false,sensitivity:"base"}),c=r=>{if(r.length<=1)return r;let s=[...r],e=null;try{s.sort((n,t)=>{let o=typeof n;if(o!==typeof t||!f.has(o)||e!==null&&e!==o)throw 0;if(e=o==="bigint"?"number":o,o==="string")return m.compare(n,t);if(o==="number"||o==="bigint")return n<t?-1:n>t?1:0;throw 0});}catch{return r}return s};var u=r=>{let s=Object.keys(r).sort(),e={};for(let n of s)e[n]=r[n];return e};var T=new Set(["string","number","boolean"]),a=(r,s)=>{let{sortArrayValues:e=true}=s??{};return JSON.stringify(r,(n,t)=>{if(t===void 0)return "[undefined]";if(t===null)return null;let o=typeof t;if(T.has(o))return t;if(o==="bigint")return `[${t}n]`;if(Array.isArray(t))return e?c(t):t;if(isPlainObject(t))return u(t);if(t instanceof Date)return t.toJSON();throw new TypeError(`Unsupported data type: ${o}`)})};var y=async(r,s)=>{let{algorithm:e="SHA-265",encoding:n="hexa"}=s,o=new TextEncoder().encode(r),i=await globalThis.crypto.subtle.digest(e,o),h=Array.from(new Uint8Array(i));if(n!=="hexa")throw new Error(`Unsupported encoding: ${n}`);return h.map(l=>l.toString(16).padStart(2,"0")).join("")};var p=async(r,s)=>{let{encoding:e="hexa",algorithm:n="SHA-256"}=s??{};return y(a(r,s),{encoding:e,algorithm:n})};var b=async(r,s)=>{try{return {success:!0,hash:await p(r,s)}}catch(e){return {success:false,error:e}}};var d=(r,s)=>{try{return {success:!0,key:a(r,s)}}catch(e){return {success:false,error:e}}};export{b as createStableHash,p as createStableHashOrThrow,d as createStableKey,a as createStableKeyOrThrow};//# sourceMappingURL=index.mjs.map //# sourceMappingURL=index.mjs.map