Provenance Tracking with Linvail
Once you click the play button, the target program (top) is provided as a string to the instrumenter (bottom). The instrumenter is responsible for transforming and then executing it.
This demo shows how precisely Linvail tracks the provenance of primitive values.
// Target //
const { log } = globalThis;
const { is, dir, Map: LinvailMap } = globalThis.Linvail;
const num = 123;
log("\nProvenancial Equality");
log(is(num, num)); // ✅ true
log(is(num, 123)); // ✅ false
log("\nInspection");
log(num); // 👀 123
dir(num); // 👀 { inner: 123, index: ... }
log("\nProvenance Preservation >> Function");
const identity = (/** @type {unknown} */ x) => x;
log(is(identity(num), num)); // ✅ true
log(is(identity(num), 123)); // ✅ false
log("\nProvenance Preservation >> Plain Object");
const object = { num };
log(is(object.num, num)); // ✅ true
log(is(object.num, 123)); // ✅ false
log("\nProvenance Preservation >> Array");
const array = [num];
log(is(array[0], num)); // ✅ true
log(is(array[0], 123)); // ✅ false
log("\nProvenance Preservation >> Builtin");
const copy = array.map(identity);
log(is(copy[0], num)); // ✅ true
log(is(copy[0], 123)); // ✅ false
Promise.resolve(num).then((res) => {
// Instrumentation //
/** @type {import("../../context.d.ts").Context} */
const {
log,
target,
acorn: { parse },
astring: { generate },
aran: { compileIntrinsicRecord, transpile, retropile },
linvail: { weave, createRuntime },
} = /** @type {any} */ (globalThis).__context;
const advice_global_variable = "__LINVAIL_ADVICE__";
const intrinsic_global_variable = "__INTRINSIC_RECORD__";
let counter = 0;
const intrinsics = compileIntrinsicRecord(globalThis);
const { advice, library } = createRuntime(intrinsics, {
dir: (/** @type {unknown} */ value) => log(JSON.stringify(value)),
wrapPrimitive: (inner) => ({ type: "primitive", inner, index: counter++ }),
});
/** @type {any} */ (globalThis)[intrinsic_global_variable] = intrinsics;
/** @type {any} */ (globalThis)[advice_global_variable] = advice;
/** @type {any} */ (globalThis).log = log;
/** @type {any} */ (globalThis).Linvail = library;
const root1 = parse(target, { sourceType: "script", ecmaVersion: 2024 });
const root2 = transpile({ path: "main", kind: "eval", root: root1 });
const root3 = weave(root2, { advice_global_variable });
const root4 = retropile(root3, { intrinsic_global_variable });
globalThis.eval(generate(root4));