Files
scriptc/tests/corpus/object-from-checked-entries.js
Chris Tate bf21f47827 Compile collection metadata and heterogeneous JavaScript tables natively
- Preserve async factory results and mixed table layouts through inference and destructuring.
- Support checked Map and Object.fromEntries construction with native weak collections.
- Keep native weak-key lifetimes and engine-backed collection identities intact.
2026-09-28 22:20:24 -05:00

46 lines
2.4 KiB
JavaScript

function from(entries) { return Object.fromEntries(entries); }
const payload = JSON.parse('{"count":3}');
const entries = JSON.parse('[[4,null],["a",2],["a",3],["__proto__",null],[],["missing"]]');
entries[0][1] = payload;
entries[3][1] = payload;
const object = from(entries);
console.log(Object.keys(object).join(","), object[4] === payload, object.a);
console.log(object.__proto__ === payload, Object.hasOwn(object, "__proto__"));
console.log(Object.hasOwn(object, "missing"), object.missing === undefined, Object.hasOwn(object, "undefined"));
const reverse = Object.fromEntries(Object.entries({ first: 1, second: 2 }).map(([k, v]) => [v, k]));
console.log(reverse[1], reverse[2]);
const order = [];
const live = [];
const key = { toString() { order.push("key"); return "first"; } };
const entry = {};
Object.defineProperty(entry, "0", { get() { order.push("0"); live.push(["second", 2]); return key; } });
Object.defineProperty(entry, "1", { get() { order.push("1"); return payload; } });
live.push(entry);
const grown = from(live);
console.log(order.join(","), grown.first === payload, grown.second);
const badKey = {};
Object.defineProperty(badKey, "0", { get() { throw new Error("read 0"); } });
const badValue = {};
Object.defineProperty(badValue, "1", { get() { throw new Error("read 1"); } });
for (const throwing of [badKey, badValue]) {
try { from([throwing]); } catch (error) { console.log(error.name, error.message); }
}
for (const invalid of [null, undefined, 7, {}, [1], [null], [undefined], [false], ["abc"], "abc"]) {
try { from(invalid); } catch (error) { console.log(error.name, error.message); }
}
function reverseMapping(mapping) {
return Object.fromEntries(Object.entries(mapping).map(([key, value]) => [value, key]));
}
console.log(reverseMapping({ unicode: 0, "unicode-wide": 1, wcwidth: 2 })[1]);
console.log(reverseMapping({ first: "a", second: "b" }).b);
function defineEnum(mapping, base = "u32") {
const reverse = Object.fromEntries(Object.entries(mapping).map(([key, value]) => [value, key]));
return { base, to(value) { return mapping[value]; }, from(value) { return reverse[value]; } };
}
const numeric = defineEnum({ unicode: 0, "unicode-wide": 1, wcwidth: 2 });
const stringy = defineEnum({ yes: "Y", no: "N" }, "string");
console.log(numeric.base, numeric.to("unicode-wide"), numeric.from(1));
console.log(stringy.base, stringy.to("yes"), stringy.from("N"));