@plasmo-corp/web-ext-deploy v1.3.1
WebExt Deploy
This is a fork of the library part of WebExt Deploy by avi12, to be used with bpp
Supported stores:
Core packages used
- Puppeteer - for updating extensions on Firefox Add-ons / Edge Add-ons / Opera Add-ons store.
- Chrome Web Store Publish API
Installing
npm i -D @plasmo-corp/web-ext-deploy
# or
pnpm i -D @plasmo-corp/web-ext-deploy
# or
yarn add -D @plasmo-corp/web-ext-deployDeployment to Chrome Web Store: follow this guide.
Usage
1. Obtain the relevant cookie(s) of the publisher's account:
Disclaimer: It is your responsibility for leaked cookies or credentials.
- Firefox:
sessionid - Opera:
sessionid,csrftoken - Edge:
.AspNet.Cookies
To obtain the cookie(s), you can run:
npx web-ext-deploy --get-cookies=firefox edge operaNote that for the Chrome Web Store, you'll use the Chrome Web Store Publish API.
API method
ESM / TypeScript
import { deployChrome, deployFirefox, deployEdge, deployOpera } from "web-ext-deploy";Node.js API
Chrome Web Store API
deployChrome object
Options:
extIdstring
Get it fromhttps://chrome.google.com/webstore/detail/EXT_ID, e.g.https://chrome.google.com/webstore/detail/fcphghnknhkimeagdglkljinmpbagonerefreshTokenstring
The refresh token.clientIdstring
The client ID.targetstring The target to deploy to, either "default" or "trustedTesters". Defaults to "default".zipstring
The relative path from the root to the ZIP.
You can use{version}to use theversionentry from yourpackage.jsonverboseboolean?
Iftrue, it will be logged to the console when the uploading has begun.
To get your refreshToken, clientId, and clientSecret, follow this guide.
Returns Promise<true> or throws an exception.
Firefox Add-ons API
deployFirefox object
Options:
extIdstring
Get it fromhttps://addons.mozilla.org/addon/EXT_IDsessionidstring
The value of the cookiesessionid, which will be used to log in to the publisher's account.
If you have a hard time obtaining it, you can run:
web-ext-deploy --get-cookies=firefoxzipstring
The relative path from the root to the ZIP.
You can use{version}in the ZIP filename, which will be replaced by theversionentry from yourpackage.jsonzipSourcestring?
The relative path from the root to the ZIP that contains the source code of your extension, if applicable.
You can use{version}as well.
Note that if your extension's source code is required to be seen by the review team, you do not want to store the deployment script with the package.changelogstring?
The changes made in this version, compared to the previous one, which will be seen by the Firefox users.
I recommend providing the changelog via--firefox-changelog, so it stays dynamic.devChangelogstring?
The technical changes made in this version, compared to the previous one, which will be visible only to the Firefox Add-ons reviewers.
I recommend providing the changelog via--firefox-dev-changelog, so it stays up to date.verboseboolean?
Iftrue, every step of uploading to the Firefox Add-ons will be logged to the console.
Returns Promise<true> or throws an exception.
Edge Add-ons API
deployEdge object
Options:
extIdstring
Get it fromhttps://partner.microsoft.com/en-us/dashboard/microsoftedge/EXT_IDcookiestring
The value of the cookie.AspNet.Cookies, which will be used to log in to the publisher's account.
If you have a hard time obtaining it, you can run:
web-ext-deploy --get-cookies=edgezipstring
The relative path from the root to the ZIP.
You can use{version}in the ZIP filename, which will be replaced by theversionentry from yourpackage.jsondevChangelogstring?
The technical changes made in this version, compared to the previous one, which will be visible only to the Edge Add-ons reviewers.
I recommend providing the changelog via--edge-dev-changelog, so it stays up to date.verboseboolean?
Iftrue, every step of uploading to the Edge Add-ons will be logged to the console.
Returns Promise<true> or throws an exception.
Note:
Due to the way the Edge dashboard works, when an extension is being reviewed or its review has just been canceled, it will take about a minute until a cancellation will cause its state to change from "In review" to "In draft", after which the new version can be submitted.
Therefore, expect for longer wait times if you run the tool on an extension you had just published/canceled.
Opera Add-ons API
deployOpera object
Options:
packageIdnumber
The package ID of the extension from the store dashboard, e.g.https://addons.opera.com/developer/package/PACKAGE_IDsessionidstring
The value of the cookiesessionid, which will be used to log in to the publisher's account.csrftokenstring
The value of the cookiecsrftoken, which will be used to upload the ZIP.zipstring
The relative path from the root to the ZIP.
You can use{version}in the ZIP filename, which will be replaced by theversionentry from yourpackage.jsonchangelogstring?
The changes made in this version, compared to the previous one, which will be seen by the Opera users.
I recommend providing the changelog via--opera-changelog, so it stays up to date.verboseboolean?
Iftrue, every step of uploading to the Opera Add-ons will be logged to the console.
If you have a hard time obtaining the values of the cookies sessionid and csrftoken, you can run:
web-ext-deploy --get-cookies=operaReturns Promise<true> or throws an exception.
Notes:
Source code inspection:
The Opera Add-ons reviewers require inspecting your extension's source code.
This can be done by doing one of the following:- Uploading the ZIP that contains the source code to a public folder on a storage service (e.g. Google Drive)
- Making the extension's code open source on a platform like GitHub, with clear instructions on the
README.md, and then linking to its repository.
Note that you do not want to store the deployment script with your extension package, as the review team will have access to your precious cookies.
If you'll open-source the extension on GitHub, you can exclude the deployment script by listing it in
.gitignore
Examples:
import { deployChrome, deployFirefox, deployEdge, deployOpera } from "web-ext-deploy";
deployChrome({
extId: "EXT_ID",
refreshToken: "refreshToken",
clientId: "clientId",
zip: "dist/some-zip-v{version}.zip",
verbose: false
}).catch(console.error);
deployFirefox({
extId: "EXT_ID",
sessionid: "sessionid_value",
zip: "dist/some-zip-v{version}.zip",
zipSource: "dist/zip-source-v{version}.zip",
changelog: "Some changes",
devChangelog: "Changes for reviewers",
verbose: false
}).catch(console.error);
deployEdge({
extId: "EXT_ID",
cookie: ".AspNet.Cookies value",
zip: "dist/some-zip-v{version}.zip",
devChangelog: "Changes for reviewers",
verbose: false
}).catch(console.error);
deployOpera({
packageId: 123456,
sessionid: "sessionid_value",
csrftoken: "csrftoken_value",
zip: "dist/some-zip-v{version}.zip",
changelog: "Some changes",
verbose: false
}).catch(console.error);