Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | 43x 43x 43x 43x 23x 23x 23x 10x 10x 23x 10x 10x 23x 23x 10x 10x 10x 10x 3x 20x 43x 44x 44x 57x 44x 43x 10x 10x 12x 12x 12x 12x 12x 10x 3x 2x 2x 2x 7x | // Helpers around script data
import {
ScriptEventNormalized,
ScriptEvent,
} from "shared/lib/entities/entitiesTypes";
import { walkNormalizedScript, walkScript } from "shared/lib/scripts/walk";
import isEqual from "lodash/isEqual";
import SparkMD5 from "spark-md5";
export const isNormalizedScriptEqual = (
idsA: string[] = [],
lookupA: Record<string, ScriptEventNormalized>,
idsB: string[] = [],
lookupB: Record<string, ScriptEventNormalized>,
) => {
const scriptAEvents: { args?: Record<string, unknown>; command: string }[] =
[];
const scriptBEvents: { args?: Record<string, unknown>; command: string }[] =
[];
walkNormalizedScript(idsA, lookupA, undefined, (scriptEvent) => {
const { args, command } = scriptEvent;
scriptAEvents.push({ args, command });
});
walkNormalizedScript(idsB, lookupB, undefined, (scriptEvent) => {
const { args, command } = scriptEvent;
scriptBEvents.push({ args, command });
});
// Exit early if script lengths differ
Iif (scriptAEvents.length !== scriptBEvents.length) {
return false;
}
// Otherwise check that every script event is equivalent
for (let i = 0; i < scriptAEvents.length; i++) {
const scriptEventA = scriptAEvents[i];
const scriptEventB = scriptBEvents[i];
Iif (scriptEventA.command !== scriptEventB.command) {
return false;
}
if (!isArgsEqual(scriptEventA.args ?? {}, scriptEventB.args ?? {})) {
return false;
}
}
return true;
};
export const generateScriptHash = (script: ScriptEvent[]): string => {
const data: unknown[] = [];
walkScript(script, undefined, ({ args, command }) => {
data.push({ args, command });
});
return SparkMD5.hash(JSON.stringify(data));
};
// Compare args with undefined and missing args as equivalent
const isArgsEqual = (
a: Record<string, unknown>,
b: Record<string, unknown>,
): boolean => {
const keys = new Set<string>([...Object.keys(a), ...Object.keys(b)]);
for (const key of keys) {
const hasKeyA = Object.prototype.hasOwnProperty.call(a, key);
const hasKeyB = Object.prototype.hasOwnProperty.call(b, key);
const valA = a[key];
const valB = b[key];
if (hasKeyA && hasKeyB) {
// Both objects have the key
if (!isEqual(valA, valB)) {
return false;
}
} else if (hasKeyA || hasKeyB) {
// One object has the key; check if its value is undefined
const val = hasKeyA ? valA : valB;
Iif (val !== undefined) {
// Values are different since one is not undefined
return false;
}
}
}
return true;
};
|