UNPKG

deep-freeze-es6

Version:

deep freeze, works with Map and Set

167 lines (149 loc) 3.23 kB
import assert from "node:assert/strict"; import { test } from "node:test"; import { deepFreeze } from "./index.js"; const nullishValues = [null, undefined]; nullishValues.forEach((nullishValue) => { test(`unexpected non object: ${nullishValue}`, () => { assert.throws( () => { deepFreeze(nullishValue); }, { message: "Cannot convert undefined or null to object" }, ); }); test(`can freeze Map with ${nullishValue} key`, () => { deepFreeze({ map: new Map([[nullishValue, 1]]), }); }); test(`can freeze Map with ${nullishValue} value`, () => { deepFreeze({ map: new Map([[1, nullishValue]]), }); }); test(`can freeze Set with ${nullishValue} value`, () => { deepFreeze({ set: new Set([nullishValue]), }); }); }); test("freeze Map", () => { const obj = deepFreeze({ map: new Map([ [1, 1], [2, 2], ]), }); assert.throws( () => { obj.map.clear(); }, { message: "map is read-only" }, ); }); test("freeze Map keys", () => { const key = { a: 1 }; deepFreeze({ map: new Map([[key, 1]]), }); assert.throws( () => { key.y = 2; }, { message: "Cannot add property y, object is not extensible" }, ); }); test("freeze Map values", () => { const value = { a: 1 }; deepFreeze({ map: new Map([[1, value]]), }); assert.throws( () => { value.y = 2; }, { message: "Cannot add property y, object is not extensible" }, ); }); test("freeze nested Map", () => { const nestedValue = { a: 1 }; deepFreeze({ map: new Map([[1, new Map([[2, nestedValue]])]]), }); assert.throws( () => { nestedValue.y = 2; }, { message: "Cannot add property y, object is not extensible" }, ); }); test("freeze Set", () => { const obj = deepFreeze({ set: new Set([1, 2]), }); assert.throws( () => { obj.set.add(3); }, { message: "set is read-only" }, ); }); test("freeze Set values", () => { const value = { a: 1 }; deepFreeze({ set: new Set([value]), }); assert.throws( () => { value.y = 2; }, { message: "Cannot add property y, object is not extensible" }, ); }); test("freeze nested Set", () => { const nestedSetValue = { a: 1 }; deepFreeze({ set: new Set([new Set([nestedSetValue])]), }); assert.throws( () => { nestedSetValue.y = 2; }, { message: "Cannot add property y, object is not extensible" }, ); }); test("freeze WeakSet", () => { const obj = deepFreeze({ weakSet: new WeakSet([{}, {}]), }); assert.throws( () => { obj.weakSet.add({}); }, { message: "WeakSet is read-only" }, ); }); test("freeze WeakMap", () => { const obj = deepFreeze({ weakMap: new WeakMap([[{}, {}]]), }); assert.throws( () => { obj.weakMap.set({}, {}); }, { message: "WeakMap is read-only" }, ); }); test("freeze function", () => { const mockFn = function () {}; const obj = deepFreeze({ fn: mockFn, }); assert.throws( () => { // @ts-ignore obj.fn.something = ""; }, { message: "Cannot add property something, object is not extensible" }, ); });