Skip to content

Repository files navigation

@addon-core/browser

A TypeScript promise-based wrapper for Chrome Extension APIs, supporting both Manifest V2 and V3 across Chrome, Opera, Edge, and other Chromium-based browsers.

npm versionnpm downloadsCILicense: MIT

Installation

npm

npm i @addon-core/browser

yarn

yarn add @addon-core/browser

pnpm

pnpm add @addon-core/browser

Supported browsers

  • Google Chrome (MV2 & MV3)
  • Microsoft Edge (Chromium)
  • Opera (Chromium) — plus sidebar helpers
  • Other Chromium-based browsers (e.g., Brave, Vivaldi, Arc, Yandex, Chromium) — expected to work; behavior aligns with Chrome.
  • Firefox — partial support via compatible helpers (e.g., sidebarAction, runtime.getBrowserInfo)
  • Apple Safari — limited WebExtensions support; many Chromium-specific APIs are not available, so some helpers won’t work.

Supported Chrome APIs

Why this package

  • Promise-based wrappers for callback-style Chrome APIs.
  • All event helpers return an unsubscribe function () => void.
  • Concise, consistent function names (easier to read and auto-complete).
  • Strong TypeScript types (based on @types/chrome) with explicit event parameter types.
  • Tree-shakable build (sideEffects: false) and small, focused utilities.
  • MV2/MV3 compatibility handled internally where applicable (e.g., Action, Tabs MV2 helpers, Sidebar cross-browser helpers).

Usage examples

Action API across MV2 and MV3

import{setActionPopup,setBadgeText}from"@addon-core/browser";awaitsetActionPopup("popup.html");awaitsetBadgeText("ON");

setActionPopup() works with chrome.action in Manifest V3 and chrome.browserAction in Manifest V2.

Tabs and events

import{getActiveTab,onTabUpdated}from"@addon-core/browser";consttab=awaitgetActiveTab();constoff=onTabUpdated((tabId,changeInfo)=>{if(tabId===tab.id&&changeInfo.status==="complete"){off();}});

Event helpers return an unsubscribe function, making listener lifecycles easy to control.

Context menus and tab messaging

import{createOrUpdateContextMenu,onContextMenusClicked,sendTabMessage}from"@addon-core/browser";awaitcreateOrUpdateContextMenu("save-selection",{title: "Save selection",contexts: ["selection"],});constoff=onContextMenusClicked(async(info,tab)=>{if(info.menuItemId!=="save-selection"||!tab?.id){return;}awaitsendTabMessage(tab.id,{type: "save-selection",text: info.selectionText,});});

createOrUpdateContextMenu() avoids duplicate-menu errors during extension reloads, and sendTabMessage() keeps the background-to-content-script path promise-based.

Helpers

  • browserDetection — Best-effort browser detection with BrowserName, BrowserFamily, guessBrowser(), isBrowser(), and isBrowserFamily().

Utilities

In addition to Chrome API wrappers, this package provides a set of low-level utilities for error handling, promise management, and listener safety. While these are primarily used internally, they are also exported via the @addon-core/browser/utils subpath for advanced usage.

For a complete list of utility functions and examples, see the Utilities Documentation.

Not yet covered

These commonly used WebExtensions/Chrome Extension APIs are not wrapped here yet (Chrome OS–only APIs are intentionally omitted). If you’d like to contribute, please see CONTRIBUTING.md and open an issue/PR.

  • bookmarks
  • contentSettings
  • declarativeContent
  • declarativeNetRequest (and declarativeNetRequestFeedback)
  • desktopCapture
  • devtools.* (inspectedWindow, network, panels)
  • dns
  • fontSettings
  • omnibox
  • pageCapture
  • platformKeys
  • power
  • privacy
  • proxy
  • search
  • sessions
  • system.cpu
  • system.memory
  • system.storage
  • tabGroups
  • topSites
  • tts
  • ttsEngine

About

A TypeScript promise-based wrapper for Web Extension APIs, supporting both Manifest V2 and V3 across Chrome, Opera, Edge, and other Chromium-based browsers.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages