{"id":49441,"library":"storage-mock","title":"storage-mock","description":"A cross-browser mock of the Web Storage API (localStorage and sessionStorage) that includes full support for the storage event, enabling testing of event listeners in environments like Node.js or headless browsers. The current version is 2.1.0, released with stable maintenance. It differentiates from simpler mocks by providing a complete window-like mock object that dispatches storage events on changes, making it suitable for testing event-driven code. The package is lightweight, has no dependencies, and supports Node.js >=4. It is primarily used in unit testing and CI/CD pipelines to simulate browser storage behavior.","status":"active","version":"2.1.0","language":"javascript","source_language":"en","source_url":"https://github.com/princed/storage-mock","tags":["javascript","localStorage","sessionStorage","storage","web storage","mock","events"],"install":[{"cmd":"npm install storage-mock","lang":"bash","label":"npm"},{"cmd":"yarn add storage-mock","lang":"bash","label":"yarn"},{"cmd":"pnpm add storage-mock","lang":"bash","label":"pnpm"}],"dependencies":[],"imports":[{"note":"This package does not ship ES module support; use CommonJS require. The default export is a mocked window object.","wrong":"import mockedWindow from 'storage-mock';","symbol":"mockedWindow","correct":"const mockedWindow = require('storage-mock');"},{"note":"Both work, but destructuring is cleaner. The localStorage property exists directly on the exported object.","wrong":"const localStorage = require('storage-mock').localStorage;","symbol":"localStorage","correct":"const { localStorage } = require('storage-mock');"},{"note":"sessionStorage is also available as a property of the mocked window object.","wrong":null,"symbol":"sessionStorage","correct":"const { sessionStorage } = require('storage-mock');"}],"quickstart":{"code":"const mockedWindow = require('storage-mock');\n\n// Listen for storage events\nconst listener = (e) => {\n  console.log(`Key: ${e.key}, Old: ${e.oldValue}, New: ${e.newValue}`);\n};\nmockedWindow.addEventListener('storage', listener);\n\n// Set an item (triggers event)\nmockedWindow.localStorage.setItem('test-key', 'test-value');\n\n// Get item\nconsole.log(mockedWindow.localStorage.getItem('test-key'));\n\n// Remove item (triggers event)\nmockedWindow.localStorage.removeItem('test-key');\n\n// Clear all (triggers event)\nmockedWindow.localStorage.clear();\n\n// Cleanup\nmockedWindow.removeEventListener('storage', listener);","lang":"javascript","description":"Demonstrates creating a mocked window, adding a storage event listener, setting/getting/removing/clearing items, and removing the listener."},"warnings":[{"fix":"const mock = require('storage-mock'); beforeEach(() => { mock.localStorage.clear(); mock.sessionStorage.clear(); });","message":"The mock does not persist data between test suites; each require returns a fresh mock. Use beforeEach to reinitialize if needed.","severity":"gotcha","affected_versions":">=0.0.0"},{"fix":"Use Object.keys(mock.localStorage).length instead of setting length.","message":"The `length` property of localStorage/sessionStorage is writable but may be deprecated in future updates.","severity":"deprecated","affected_versions":">=1.0.0"},{"fix":"When testing, ensure event listeners do not assume same-origin/tab restrictions.","message":"Storage events are not dispatched for same-document changes in real browsers, but the mock dispatches events on all changes. Code relying on this spec behavior may break.","severity":"gotcha","affected_versions":">=0.0.0"},{"fix":"Wrap usage with the new window-like object: const mock = require('storage-mock'); mock.localStorage.setItem(...);","message":"In version 2.0.0, the exported object changed from a pure storage mock to a full window mock with event listeners attached. Existing code directly using the previous structure will fail.","severity":"breaking","affected_versions":">=2.0.0 <2.0.0"}],"env_vars":null,"search_vec":"'2.1.0':41 '4':85 'api':13 'behavior':100 'browser':7,36,98 'chang':65 'ci/cd':94 'code':74 'complet':54 'cross':6 'cross-brows':5 'current':38 'depend':81 'differenti':47 'dispatch':61 'driven':73 'enabl':25 'environ':31 'event':24,28,63,72,108 'event-driven':71 'full':19 'headless':35 'includ':18 'javascript':101 'lightweight':78 'like':32,57 'listen':29 'localstorag':14,102 'mainten':45 'make':66 'mock':3,8,50,58,107 'node.js':33,84 'object':59 'packag':76 'pipelin':95 'primarili':88 'provid':52 'releas':42 'sessionstorag':16,103 'simpler':49 'simul':97 'stabl':44 'storag':2,12,23,62,99,104,106 'storage-mock':1 'suitabl':68 'support':20,83 'test':26,70,92 'unit':91 'use':89 'version':39 'web':11,105 'window':56 'window-lik':55","created_at":"2026-06-07T17:01:48.060507+00:00","updated_at":"2026-06-07T17:01:48.060507+00:00","problems":[{"fix":"Upgrade to version >=2.0.0: npm install storage-mock@latest","cause":"Using an older version (<2.0.0) that did not include event system.","error":"TypeError: mockedWindow.addEventListener is not a function"},{"fix":"Use the mock: const mockedWindow = require('storage-mock'); const localStorage = mockedWindow.localStorage;","cause":"Attempting to use window.localStorage in Node.js without mock.","error":"ReferenceError: window is not defined"},{"fix":"Run: npm install storage-mock --save-dev","cause":"Package not installed or typo in package name.","error":"Cannot find module 'storage-mock'"},{"fix":"Upgrade Node.js to version >=4, or polyfill the events module.","cause":"Missing Node.js built-in 'events' module in very old Node versions (<4).","error":"Error: Cannot find module 'events'"}],"ecosystem":"npm","meta_description":null,"install_score":null,"quickstart_score":null,"quickstart_tag":null,"pypi_latest":null,"cli_name":null,"cli_version":null,"type":"library","homepage":"https://github.com/princed/storage-mock#readme","github":"https://github.com/princed/storage-mock","docs":null,"changelog":null,"pypi":null,"npm":"storage-mock","openapi_spec":null,"status_page":null,"smithery":null,"categories":["testing"],"base_url":null,"auth_type":null,"provenance":{"verified_status":null,"verified_at":null,"last_verified":"2026-06-07","next_check":"2026-09-05","install_tag":null}}