//#region src/index.ts const table = /* @__PURE__ */ new WeakMap(); let counter = 0; const { toString } = Object.prototype; const isType = (arg, type) => toString.call(arg) === `[object ${type}]`; const isPlainObject = (val) => { const prototype = Object.getPrototypeOf(val); return prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null; }; function stableHash(arg, crossRealm) { const type = typeof arg; const constructor = arg === null || arg === void 0 ? void 0 : arg.constructor; const isDate = crossRealm ? isType(arg, "Date") : constructor === Date; if (Object(arg) === arg && !isDate && !(crossRealm ? isType(arg, "RegExp") : constructor === RegExp)) { const arg_ = arg; let result = table.get(arg_); if (result) return result; result = ++counter + "~"; table.set(arg_, result); let index; if (crossRealm ? Array.isArray(arg) : constructor === Array) { const arg_$1 = arg; result = "@"; for (index = 0; index < arg_$1.length; index++) result += stableHash(arg_$1[index], crossRealm) + ","; table.set(arg_$1, result); } else if (crossRealm ? isPlainObject(arg_) : constructor === null || constructor === Object) { result = "#"; const keys = Object.keys(arg_).sort(); while ((index = keys.pop()) !== void 0) { const index_ = index; if (arg_[index_] !== void 0) result += index + ":" + stableHash(arg_[index_], crossRealm) + ","; } table.set(arg_, result); } return result; } if (isDate) return arg.toJSON(); if (type === "symbol") return arg.toString(); return type === "string" ? JSON.stringify(arg) : "" + arg; } //#endregion export { stableHash as hash, stableHash };