UNPKG

@qntm-code/utils

Version:

A collection of useful utility functions with associated TypeScript types. All functions have been unit tested.

105 lines (104 loc) 4.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ const freeze_1 = require("./freeze"); describe('freeze', () => { it('should deeply freeze an object', () => { const childArray = ['a', 10, new Date()]; const childObject = { a: 'a', b: 10, c: new Date(), }; const value = { childArray, childObject, }; const frozenValue = (0, freeze_1.freeze)(value); expect(Object.isFrozen(frozenValue)).toBe(true); expect(Object.isFrozen(frozenValue.childArray)).toBe(true); expect(Object.isFrozen(frozenValue.childObject)).toBe(true); }); it('should deeply freeze symbol-keyed properties', () => { const sym = Symbol('child'); const value = { [sym]: { a: { b: 1 } }, }; const frozenValue = (0, freeze_1.freeze)(value); expect(Object.isFrozen(frozenValue)).toBe(true); expect(Object.isFrozen(frozenValue[sym])).toBe(true); expect(Object.isFrozen(frozenValue[sym].a)).toBe(true); }); it('should handle circular references', () => { const value = { a: 1 }; value.self = value; const frozenValue = (0, freeze_1.freeze)(value); expect(Object.isFrozen(frozenValue)).toBe(true); expect(frozenValue.self).toBe(frozenValue); }); it('should deeply freeze an array', () => { const childArray = ['a', 10, new Date()]; const childObject = { a: 'a', b: 10, c: new Date(), }; const value = [childArray, childObject]; const frozenValue = (0, freeze_1.freeze)(value); expect(Object.isFrozen(frozenValue)).toBe(true); expect(Object.isFrozen(frozenValue[0])).toBe(true); expect(Object.isFrozen(frozenValue[1])).toBe(true); }); it('should deeply freeze a map', () => { const keyObject = { a: 'a' }; const valueObject = { b: 'b' }; const value = new Map([ ['key1', 'value1'], [keyObject, valueObject], ]); const frozenValue = (0, freeze_1.freeze)(value); expect(() => frozenValue.set('x', 'y')).toThrow(); expect(() => frozenValue.delete('key1')).toThrow(); expect(() => frozenValue.clear()).toThrow(); frozenValue.forEach((v, k) => { expect(Object.isFrozen(k)).toBe(true); expect(Object.isFrozen(v)).toBe(true); }); }); it('should prevent mutation of map values like Date', () => { const value = new Map([['d', new Date(0)]]); const frozenValue = (0, freeze_1.freeze)(value); const date = frozenValue.get('d'); expect(() => date.setTime(123)).toThrow(); }); it('should deeply freeze a set', () => { const valueObject1 = { a: 'a' }; const valueObject2 = { b: 'b' }; const value = new Set(['value1', valueObject1, valueObject2]); const frozenValue = (0, freeze_1.freeze)(value); expect(() => frozenValue.add('x')).toThrow(); expect(() => frozenValue.delete('value1')).toThrow(); expect(() => frozenValue.clear()).toThrow(); frozenValue.forEach(v => { expect(Object.isFrozen(v)).toBe(true); }); }); it('should prevent mutation of Date', () => { const value = new Date(0); const frozenValue = (0, freeze_1.freeze)(value); expect(() => frozenValue.setTime(123)).toThrow(); }); it('should prevent mutation of typed arrays', () => { const value = new Uint8Array([1, 2, 3]); const frozenValue = (0, freeze_1.freeze)(value); expect(frozenValue[0]).toBe(1); expect(() => { frozenValue[0] = 9; }).toThrow(); expect(() => frozenValue.set([4], 0)).toThrow(); expect(() => frozenValue.fill(0)).toThrow(); }); });