@storm-software/linting-tools
Version:
⚡ A package containing various linting tools used to validate syntax, enforce design standards, and format code in a Storm workspace.
102 lines (93 loc) • 3.43 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
var _chunkEFLFSEBJcjs = require('./chunk-EFLFSEBJ.cjs');
var _chunkUB72K2YDcjs = require('./chunk-UB72K2YD.cjs');
// ../../node_modules/.pnpm/ohash@2.0.11/node_modules/ohash/dist/utils/index.mjs
_chunkUB72K2YDcjs.init_cjs_shims.call(void 0, );
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(_optionalChain([h1, 'access', _ => _.props, 'optionalAccess', _2 => _2[prop]]), _optionalChain([h2, 'access', _3 => _3.props, 'optionalAccess', _4 => _4[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, _chunkEFLFSEBJcjs.serialize.call(void 0, 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);
}
var DiffEntry = class {
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 \`${_optionalChain([this, 'access', _5 => _5.oldValue, 'optionalAccess', _6 => _6.toString, 'call', _7 => _7()]) || "-"}\` to \`${this.newValue.toString()}\``;
}
}
}
};
var DiffHashedObject = class {
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})`;
}
};
exports.diff = diff; exports.isEqual = _chunkEFLFSEBJcjs.isEqual;