npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

ext-opera-upload

v1.0.1

Published

Package for uploading opera extensions.

Downloads

9

Readme

ext-opera-upload

Package for uploading Opera extensions programmatically by automating the Opera Addons Developer Dashboard using Puppeteer.

This library exposes a single async function, extOperaUpload, which can:

  • upload a new package version (upload action)
  • verify access to a package (verify action)
  • submit a package for moderation/publishing (publish action)

It navigates the developer UI, performs email/password authentication, uploads the .zip/.crx package, and, on demand, clicks the “Submit for moderation” action.

Note: If Google account-based SSO or reCAPTCHA appears, the function will reject with a descriptive error so your pipeline can handle it.

IMPORTANT

Before you create an issue, please check a list of the known limitations below.

Stack

  • Language: JavaScript (CommonJS)
  • Types: TypeScript declaration file provided (index.d.ts)
  • Runtime: Node.js
  • Automation: Puppeteer (bundled Chromium)
  • Package manager: npm (package-lock.json present)

Requirements

  • Node.js 18 or newer
    • Puppeteer v24.x requires Node 18+.
  • Network access to https://addons.opera.com/ and related auth endpoints.
  • An Opera Addons developer account with password authentication enabled (not only Google SSO). If Google SSO is required, the library will abort with an error.

OS support: Puppeteer supports Windows/macOS/Linux. Ensure any OS-level dependencies for headless Chromium are present (mostly relevant on Linux CI images).

Installation

npm install ext-opera-upload

Usage

JavaScript (CommonJS)

const { extOperaUpload, OperaUploadAction } = require('ext-opera-upload');

(async () => {
  try {
    await extOperaUpload({
      packageId: 'YOUR_PACKAGE_ID',
      email: process.env.OPERA_EMAIL,
      password: process.env.OPERA_PASSWORD,
      packagePath: 'path/to/your-extension.zip',
      action: OperaUploadAction.UPLOAD, // or VERIFY, PUBLISH
    });

    console.log('Success');
  } catch (err) {
    console.error('Failed:', err.message);
    process.exitCode = 1;
  }
})();

TypeScript

Types are included via index.d.ts.

import { extOperaUpload, OperaUploadAction, OperaUploadOptions } from 'ext-opera-upload';

async function run() {
  const options: OperaUploadOptions = {
    packageId: 'YOUR_PACKAGE_ID',
    email: process.env.OPERA_EMAIL!,
    password: process.env.OPERA_PASSWORD!,
    packagePath: 'path/to/your-extension.zip',
    action: OperaUploadAction.UPLOAD, // or VERIFY, PUBLISH
  };

  await extOperaUpload(options);
}

run().catch((e) => {
  console.error(e);
  process.exit(1);
});

Options

  • packageId (string) – The Opera Addons package ID.
  • email (string) – Developer account email.
  • password (string) – Developer account password.
  • packagePath (string) – Path to the extension archive (zip or crx) to upload.
  • debug (boolean) – Enable headful debugging. Defaults to false.
  • action ("verify" | "upload" | "publish") – Behavior:
    • verify: Only verifies access by loading the package page and then exits (requires only email and password params).
    • upload: Uploads a new extension package. Does not auto-submit for moderation.
    • publish: Uploads a new extension package and then clicks “Submit for moderation”.

How to get the packageId?

  1. Go to https://addons.opera.com/developer/
  2. Click on your extension
  3. Copy the package ID from the URL: https://addons.opera.com/developer/package/ PACKAGE_ID /

Behavior and Errors to Expect

  • If Google SSO is required, the library rejects with: Account needs to have a password authentication enabled!.
  • If reCAPTCHA Enterprise is detected in headless mode, the library rejects with: Recaptcha test detected!.
  • On upload failures (e.g., server flashes an error), the library tries to surface the visible error message from the page.

Scripts (package.json)

  • npm run format – prettier reformat.
  • npm run format:check – check if code matches prettier formatting.
  • npm run test – placeholder (exits with error). No test suite is provided yet. See Tests section below.

Dev tools:

  • Prettier is configured via prettier.config.cjs (no npm script currently wired).

Project Structure

./ext-opera-upload
├─ README.md                # This file
├─ index.js                 # Library implementation (CommonJS)
├─ index.d.ts               # TypeScript types (actions & options)
├─ package.json             # Package metadata and dependencies
├─ package-lock.json        # npm lockfile
├─ prettier.config.cjs      # Prettier configuration
└─ node_modules/            # Installed dependencies (Puppeteer, etc.)

Entry points

  • Main: index.js
  • Types: index.d.ts

Tests

There are currently no automated tests in this repository.

  • Current npm test is a placeholder.

Known Limitations

  • reCAPTCHA Enterprise challenges cannot be solved automatically, the function aborts to avoid hanging pipelines.
  • Accounts that rely solely on Google SSO are not supported; a password-based login must be enabled for the Opera account.
  • Headful debugging is not configurable via API at the moment, but can be enabled by setting the DEBUG variable to true in the index.js file - only for development purposes.

Support me

If you like this project, please consider buying me a coffee: https://buymeacoffee.com/fatidian1

License

MIT License

Copyright (c) 2025 Tymoteusz Abramek

Related docs

  • Puppeteer docs: https://pptr.dev/
  • Opera Addons developer dashboard: https://addons.opera.com/developer/