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 | 66x 66x 66x 66x 23x 23x 23x 10x 10x 23x 10x 10x 23x 23x 10x 10x 10x 10x 3x 20x 66x 51x 51x 64x 51x 66x 10x 10x 12x 12x 12x 12x 12x 10x 3x 2x 2x 2x 7x | // Helpers around script data
import { ScriptEventNormalized } from "shared/lib/entities/entitiesTypes";
import { walkNormalizedScript, walkScript } from "shared/lib/scripts/walk";
import isEqual from "lodash/isEqual";
import SparkMD5 from "spark-md5";
import { ScriptEvent } from "shared/lib/resources/types";
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;
};
|