A command line tool to help build, run, and test web extensions
npx @tessl/cli install tessl/npm-web-ext@8.9.0web-ext is a command line tool to help build, run, and test web extensions. It provides a comprehensive development workflow for WebExtensions across different browsers, with primary focus on Firefox extensions. The tool offers essential development commands, cross-browser support, automatic reloading during development, and streamlined publishing workflows.
npm install web-extimport webExt from "web-ext";
import { main, cmd } from "web-ext";For CommonJS (legacy, not recommended):
const webExt = require("web-ext");
const { main, cmd } = webExt;import { ADBUtils, listADBDevices } from "web-ext/util/adb";
import { createLogger, consoleStream } from "web-ext/util/logger";
import { signAddon, Client } from "web-ext/util/submit-addon";# Build an extension
web-ext build --source-dir=./my-extension
# Run extension in Firefox
web-ext run --source-dir=./my-extension
# Lint extension
web-ext lint --source-dir=./my-extension
# Sign extension for Firefox
web-ext sign --source-dir=./my-extension --api-key=... --api-secret=...import webExt from "web-ext";
// Run the CLI programmatically
await webExt.main('/path/to/package');
// Access individual commands
await webExt.cmd.build({
sourceDir: './my-extension',
artifactsDir: './web-ext-artifacts'
});
await webExt.cmd.run({
sourceDir: './my-extension',
target: ['firefox-desktop']
});web-ext is structured around several key components:
Core programmatic interface providing access to CLI functionality and individual commands.
interface WebExt {
main: (absolutePackageDir: string, options?: MainOptions) => Promise<void>;
cmd: {
build: (params: BuildParams, options?: BuildOptions) => Promise<BuildResult>;
run: (params: RunParams, options?: RunOptions) => Promise<void>;
lint: (params: LintParams, options?: LintOptions) => Promise<void>;
sign: (params: SignParams, options?: SignOptions) => Promise<SignResult>;
docs: (params: DocsParams, options?: DocsOptions) => Promise<void>;
dumpConfig: (params: DumpConfigParams, options?: DumpConfigOptions) => Promise<void>;
};
}Extension packaging functionality for creating distributable .zip files with customizable file filtering and watch mode support.
function build(params: BuildParams, options?: BuildOptions): Promise<BuildResult>;
interface BuildParams {
sourceDir: string;
artifactsDir: string;
asNeeded?: boolean;
filename?: string;
overwriteDest?: boolean;
ignoreFiles?: string[];
}Browser automation for running extensions in development mode with support for Firefox desktop, Firefox Android, and Chromium browsers.
function run(params: RunParams, options?: RunOptions): Promise<void>;
interface RunParams {
sourceDir: string;
artifactsDir: string;
target?: string[];
firefox?: string;
firefoxProfile?: string;
chromiumBinary?: string;
reload?: boolean;
startUrl?: string[];
// ... many more options
}Extension validation using Mozilla's addons-linter with configurable output formats and validation rules.
function lint(params: LintParams, options?: LintOptions): Promise<void>;
interface LintParams {
sourceDir: string;
artifactsDir: string;
output?: 'text' | 'json';
metadata?: boolean;
warningsAsErrors?: boolean;
privileged?: boolean;
selfHosted?: boolean;
}AMO (addons.mozilla.org) integration for automated extension signing and publishing with JWT authentication.
function sign(params: SignParams, options?: SignOptions): Promise<SignResult>;
interface SignParams {
sourceDir: string;
artifactsDir: string;
apiKey: string;
apiSecret: string;
channel: 'listed' | 'unlisted';
amoBaseUrl?: string;
timeout?: number;
approvalTimeout?: number;
}ADB integration for developing and testing extensions on Firefox for Android devices.
class ADBUtils {
constructor(params: ADBParams);
discoverDevices(): Promise<string[]>;
runShellCommand(deviceId: string, cmd: string): Promise<string>;
pushFile(deviceId: string, localPath: string, devicePath: string): Promise<void>;
startFirefoxAPK(deviceId: string, apk: string, apkComponent?: string, deviceProfileDir?: string): Promise<void>;
}
function listADBDevices(adbBin?: string): Promise<string[]>;
function listADBFirefoxAPKs(deviceId: string, adbBin?: string): Promise<string[]>;Configurable logging infrastructure with console output, verbose modes, and log capture capabilities.
function createLogger(moduleURL: string, options?: LoggerOptions): Logger;
class ConsoleStream {
constructor(options: { verbose?: boolean });
makeVerbose(): void;
write(jsonString: string, options?: WriteOptions): void;
startCapturing(): void;
stopCapturing(): void;
flushCapturedLogs(options?: FlushOptions): void;
}interface MainOptions {
getVersion?: (absolutePackageDir: string) => Promise<string>;
commands?: CommandsObject;
argv?: string[];
runOptions?: RunOptions;
}
interface CommandsObject {
build: (params: BuildParams, options?: BuildOptions) => Promise<BuildResult>;
run: (params: RunParams, options?: RunOptions) => Promise<void>;
lint: (params: LintParams, options?: LintOptions) => Promise<void>;
sign: (params: SignParams, options?: SignOptions) => Promise<SignResult>;
docs: (params: DocsParams, options?: DocsOptions) => Promise<void>;
dumpConfig: (params: DumpConfigParams, options?: DumpConfigOptions) => Promise<void>;
}
interface BuildResult {
extensionPath: string;
}
interface SignResult {
success: boolean;
id?: string;
downloadedFiles?: string[];
}