| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- import { s as serialize } from '../shared/ohash.D__AXeF1.mjs';
- export { i as isEqual } from '../shared/ohash.D__AXeF1.mjs';
- function diff(obj1, obj2) {
- const h1 = _toHashedObject(obj1);
- const h2 = _toHashedObject(obj2);
- return _diff(h1, h2);
- }
- function _diff(h1, h2) {
- const diffs = [];
- const allProps = /* @__PURE__ */ new Set([
- ...Object.keys(h1.props || {}),
- ...Object.keys(h2.props || {})
- ]);
- if (h1.props && h2.props) {
- for (const prop of allProps) {
- const p1 = h1.props[prop];
- const p2 = h2.props[prop];
- if (p1 && p2) {
- diffs.push(..._diff(h1.props?.[prop], h2.props?.[prop]));
- } else if (p1 || p2) {
- diffs.push(
- new DiffEntry((p2 || p1).key, p1 ? "removed" : "added", p2, p1)
- );
- }
- }
- }
- if (allProps.size === 0 && h1.hash !== h2.hash) {
- diffs.push(new DiffEntry((h2 || h1).key, "changed", h2, h1));
- }
- return diffs;
- }
- function _toHashedObject(obj, key = "") {
- if (obj && typeof obj !== "object") {
- return new DiffHashedObject(key, obj, serialize(obj));
- }
- const props = {};
- const hashes = [];
- for (const _key in obj) {
- props[_key] = _toHashedObject(obj[_key], key ? `${key}.${_key}` : _key);
- hashes.push(props[_key].hash);
- }
- return new DiffHashedObject(key, obj, `{${hashes.join(":")}}`, props);
- }
- class DiffEntry {
- constructor(key, type, newValue, oldValue) {
- this.key = key;
- this.type = type;
- this.newValue = newValue;
- this.oldValue = oldValue;
- }
- toString() {
- return this.toJSON();
- }
- toJSON() {
- switch (this.type) {
- case "added": {
- return `Added \`${this.key}\``;
- }
- case "removed": {
- return `Removed \`${this.key}\``;
- }
- case "changed": {
- return `Changed \`${this.key}\` from \`${this.oldValue?.toString() || "-"}\` to \`${this.newValue.toString()}\``;
- }
- }
- }
- }
- class DiffHashedObject {
- constructor(key, value, hash, props) {
- this.key = key;
- this.value = value;
- this.hash = hash;
- this.props = props;
- }
- toString() {
- if (this.props) {
- return `{${Object.keys(this.props).join(",")}}`;
- } else {
- return JSON.stringify(this.value);
- }
- }
- toJSON() {
- const k = this.key || ".";
- if (this.props) {
- return `${k}({${Object.keys(this.props).join(",")}})`;
- }
- return `${k}(${this.value})`;
- }
- }
- export { diff };
|