UNPKG

@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
"use strict";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;