JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 1586
  • Score
    100M100P100Q121040F
  • License MIT

A more usable typed storage API for Web Extensions

Package Exports

  • webext-storage

Readme

webext-storage

A more usable typed storage API for Web Extensions

Sponsored by PixieBrix 🎉

chrome.storage.local.get() is very inconvenient to use and it's not type-safe. This module provides a better API:

Comparison 💥
const options = new StorageItem<Record<string, string>>('user-options');
const value = await options.get(); // The type is `Record<string, string> | undefined`
await options.set({color: 'red'}) // Type-checked
options.onChanged(newValue => {
    console.log('New options', newValue)
});
  • The storage item is defined in a single place, including its storageArea, its types and default value
  • item.get() returns the raw value instead of an object
  • Every get and set operation is type-safe
  • If you provide a defaultValue, the return type will not be | undefined
  • Calling .set(undefined) will unset the value instead of the call being ignored
  • The onChanged example speaks for itself

Now compare it to the native API:

const storage = await chrome.storage.local.get('user-options');
const value = storage['user-options']; // The type is `any`
await chrome.storage.local.set({['user-options']: {color: 'red'}}); // Not type-checked
chrome.storage.onChanged.addListener((storageArea, change) => {
    if (storageArea === 'local' && change['user-options']) { // Repetitive
        console.log('New options', change['user-options'].newValue)
    }
});

Install

npm install webext-storage

Or download the standalone bundle to include in your manifest.json.

Usage

The package exports two classes:

  • StorageItem - Store a single value in storage
  • StorageItemMap - Store multiple related values in storage with the same type, similar to new Map()

Support:

  • Browsers: Chrome, Firefox, and Safari
  • Manifest: v2 and v3
  • Permissions: storage or unlimitedStorage
  • Context: They can be called from any context

License

MIT © Federico Brigante