{"id":15046987,"url":"https://github.com/avi12/web-ext-deploy","last_synced_at":"2025-09-04T04:11:36.533Z","repository":{"id":39284190,"uuid":"335581759","full_name":"avi12/web-ext-deploy","owner":"avi12","description":"A tool for deploying WebExtensions to multiple stores.","archived":false,"fork":false,"pushed_at":"2025-03-13T06:24:38.000Z","size":717,"stargazers_count":56,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-02T09:09:34.310Z","etag":null,"topics":["automation","chrome-extension","chrome-webstore","cli-app","cookies","deployment","edge","edge-extension","firefox-addons","firefox-extension","firefox-submisison-api-v5","firefox-submission-api","nodejs","nodejs-modules","opera-addon","playwright","playwright-typescript","web-extensions"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/avi12.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"avi12","custom":["https://paypal.me/avi12"]}},"created_at":"2021-02-03T10:07:21.000Z","updated_at":"2025-03-29T18:56:35.000Z","dependencies_parsed_at":"2024-12-04T16:23:40.035Z","dependency_job_id":"7d1f4597-6c2a-457c-9272-da72fc1811a9","html_url":"https://github.com/avi12/web-ext-deploy","commit_stats":{"total_commits":294,"total_committers":2,"mean_commits":147.0,"dds":"0.010204081632653073","last_synced_commit":"dc3071784bd872087c78d8b111196e2e33541a1e"},"previous_names":[],"tags_count":47,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avi12%2Fweb-ext-deploy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avi12%2Fweb-ext-deploy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avi12%2Fweb-ext-deploy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avi12%2Fweb-ext-deploy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/avi12","download_url":"https://codeload.github.com/avi12/web-ext-deploy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248018060,"owners_count":21034048,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","chrome-extension","chrome-webstore","cli-app","cookies","deployment","edge","edge-extension","firefox-addons","firefox-extension","firefox-submisison-api-v5","firefox-submission-api","nodejs","nodejs-modules","opera-addon","playwright","playwright-typescript","web-extensions"],"created_at":"2024-09-24T20:53:50.616Z","updated_at":"2025-04-09T10:05:30.750Z","avatar_url":"https://github.com/avi12.png","language":"TypeScript","funding_links":["https://github.com/sponsors/avi12","https://paypal.me/avi12"],"categories":[],"sub_categories":[],"readme":"# WebExt Deploy\n\nThe ultimate automation tool for deploying to multiple extension stores simultaneously!\n\nMade by [Avi](https://avi12.com)\n\nSupported stores:\n\n- [Chrome Web Store](https://chrome.google.com/webstore/category/extensions)\n  - [`.env` snippet](#chromeenv)\n  - [CLI API](#chrome-web-store-cli)\n  - [Node.js API](#chrome-web-store-api)\n- [Firefox Add-ons](https://addons.mozilla.org/en-US/firefox/extensions)\n  - [`.env` snippet](#firefoxenv)\n  - [CLI API](#firefox-add-ons-cli)\n  - [Node.js API](#firefox-submission-api)\n- [Edge Add-ons](https://microsoftedge.microsoft.com/addons)\n  - [`.env` snippet](#edgeenv)\n  - [CLI API](#edge-add-ons-cli)\n  - [Node.js API](#edge-publish-api)\n- [Opera Add-ons](https://addons.opera.com/en/extensions)\n  - [`.env` snippet](#operaenv)\n  - [CLI API](#opera-add-ons-cli)\n  - [Node.js API](#opera-api)\n\n# Core packages/APIs used\n\n- [Playwright](https://github.com/microsoft/playwright) - for fetching the Opera cookies\n- [Chrome Web Store Publish API](https://developer.chrome.com/docs/webstore/using_webstore_api)\n- [Microsoft Edge Publish API v1.1](https://docs.microsoft.com/en-us/microsoft-edge/extensions-chromium/publish/api/using-addons-api)\n- [Firefox Add-ons Store Submission API](https://blog.mozilla.org/addons/2022/03/17/new-api-for-submitting-and-updating-add-ons/)\n- Opera Store API\n\n# Installing\n\n```shell\nnpm i -D web-ext-deploy\n# or\npnpm i -D web-ext-deploy\n# or\nyarn add -D web-ext-deploy\n```\n\nor install globally\n\n```shell\nnpm i -g web-ext-deploy\n# or\npnpm i -g web-ext-deploy\n# or\nyarn global add web-ext-deploy\n```\n\nDeployment to Chrome Web Store: [follow this guide](https://github.com/fregante/chrome-webstore-upload-keys)  \nDeployment to Edge Add-ons Store: [follow this guide](https://github.com/avi12/web-ext-deploy/blob/main/EDGE_PUBLISH_API.md)\n\n# Usage\n\n## 1. Obtain the relevant cookie(s) of the publisher's account:\n\n### Disclaimer: I do NOT take any responsibility for leaked cookies or credentials.\n\n- Opera: `sessionid`, `csrftoken`\n\nIf you have a hard time obtaining the cookie(s), you can run:\n\n```shell\nweb-ext-deploy --get-cookies=opera\n```\n\nNote that for the Chrome Web Store, you'll use the Chrome Web Store Publish API  \nAs for the Edge Add-ons Store, you'll use the Microsoft Edge Publish API\n\n## 2. Decide how to access the data \u0026 credentials\n\n- [`.env` files method](#env-files-method)\n- [CLI arguments method](#cli-arguments-method)\n- [Node.js API method](#nodejs-api-method)\n\n## `.env` files method\n\nUse the `.env` [snippet(s)](#possible-env-files) relevant to your extension  \nInclude each one in your root directory  \nMake sure to have `*.env` or `chrome.env`, `firefox.env`, `edge.env`, `opera.env` in your `.gitignore`  \nNote that by using the aforementioned `--get-cookies`, it automatically added the `.env` items to it\n\nNext, in the CLI:\n\n```shell\nweb-ext-deploy --env\n```\n\n### Additional arguments for the `.env` mode:\n\n- `--verbose` boolean?  \n  If specified, the steps of every store will be logged to the console.\n  \n- `--publish-only` `Array\u003c\"chrome\" | \"firefox\" | \"edge\" | \"opera\"\u003e`?  \n  If specified, for each specified store that has an `.env` file, it will be deployed  \n  E.g. if you have `chrome.env`, `firefox.env`, `opera.env`, and you run:\n\n  ```shell\n  web-ext-deploy --env --publish-only=chrome firefox\n  ```\n\n  It will only deploy to Chrome Web Store and Firefox Add-ons Store\n\n- `--zip` string?  \n  If specified, it will be used for every `.env` that the `ZIP` is not specified\n\n- `--firefox-changelog` string?  \n  If specified and `firefox.env` exists, it will be used to provide changelog for the Firefox users  \n  New lines (`\\n`) are supported\n\n- `--firefox-changelog-lang` string?  \n  If specified and `firefox.env` exists, it will be used to dictate the language of the release notes.  \n  Fallbacks to the Manifest's `default_locale` field, if applicable, or `en-US`\n\n- `--firefox-dev-changelog` string?  \n  If specified and `firefox.env` exists, it will be used to provide changelog for the Firefox Add-ons reviewers  \n  New lines (`\\n`) are supported\n\n- `--edge-dev-changelog` string?  \n  If specified and `edge.env` exists, it will be used to provide changelog for the Edge Add-ons reviewers  \n  New lines (`\\n`) are supported\n\n- `--opera-changelog` string?  \n  If specified and `opera.env` exists, it will be used to provide changelog for the Opera users  \n  New lines (`\\n`) are supported\n\n### Notes:\n\n- Chrome Web Store:\n\n  - `REFRESH_TOKEN`, `CLIENT_ID`, `CLIENT_SECRET` - follow [this guide](https://github.com/fregante/chrome-webstore-upload-keys)\n  - `EXT_ID` - Get it from `https://chrome.google.com/webstore/detail/EXT_ID`, e.g. `https://chrome.google.com/webstore/detail/fcphghnknhkimeagdglkljinmpbagone`\n\n- Firefox Add-ons store:\n\n  - `EXT_ID` - Get it from `https://addons.mozilla.org/addon/EXT_ID`\n  - `ZIP` - The relative path to the ZIP. You can use `{version}`, which will be replaced by the `version` entry from your `package.json`\n  - `ZIP_SOURCE` - Optional. The relative path to the ZIP that contains the [source code](https://www.npmjs.com/package/zip-self) of your extension, if applicable\n  - `JWT_ISSUER`, `JWT_SECRET` - obtain from the [Developer Hub](https://addons.mozilla.org/developers/addon/api/key/)\n\n- Edge Add-ons store:\n\n  - `CLIENT_ID`, `API_KEY` - follow [this guide](https://github.com/avi12/web-ext-deploy/blob/main/EDGE_PUBLISH_API.md)\n  - `PRODUCT_ID` - Get it from `https://partner.microsoft.com/en-us/dashboard/microsoftedge/PRODUCT_ID`\n  - `ZIP` - You can use `{version}`\n\n- Opera Add-ons store:\n  - `PACKAGE_ID` - Get it from `https://addons.opera.com/developer/package/PACKAGE_ID`\n  - `ZIP` - You can use `{version}`\n  - **Source code inspection**:\n    The Opera Add-ons reviewers require inspecting your extension's source code  \n    This can be done by doing **one** of the following:\n    - Uploading the ZIP that contains the [source code](https://www.npmjs.com/package/zip-self) to a public folder on a storage service (e.g. [Google Drive](https://drive.google.com))\n    - 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\n- The keys are case-insensitive, as they will be [camel-cased](https://www.npmjs.com/package/change-case) anyway\n\n### Possible `.env` files\n\n#### `chrome.env`\n\n```dotenv\nREFRESH_TOKEN=\"RefreshToken\"\nCLIENT_ID=\"ClientID\"\nCLIENT_SECRET=\"ClientSecret\"\nZIP=\"dist/some-zip-v{version}.zip\"\nEXT_ID=\"ExtensionID\"\n```\n\n#### `firefox.env`\n\n```dotenv\nJWT_ISSUER=\"JwtIssuer\"\nJWT_SECRET=\"JwtSecret\"\nZIP=\"dist/some-zip-v{version}.zip\"\nZIP_SOURCE=\"dist/some-zip-source-v{version}.zip\"\nEXT_ID=\"ExtensionID\"\n```\n\n#### `edge.env`\n\n```dotenv\nCLIENT_ID=\"ClientID\"\nAPI_KEY=\"ApiKey\"\nZIP=\"dist/some-zip-v{version}.zip\"\nPRODUCT_ID=\"ProductID\"\n```\n\n#### `opera.env`\n\n```dotenv\nSESSIONID=\"sessionid_value\"\nCSRFTOKEN=\"csrftoken_value\"\nZIP=\"dist/some-zip-v{version}.zip\"\nPACKAGE_ID=123456\n```\n\n## CLI arguments method\n\nUse it only if your extension's code will not be publicly available\n\n```shell\nweb-ext-deploy --chrome-zip=\"some-zip-v{version}.zip\" --chrome-ext-id=\"ExtensionID\" --firefox-zip=\"some-zip-v{version}.zip\" --firefox-ext-id=\"ExtensionID\"\n```\n\n### CLI API\n\nStores:\n\n- [Chrome Web Store](#chrome-web-store-cli)\n- [Firefox Add-ons](#firefox-add-ons-cli)\n- [Edge Add-ons](#edge-add-ons-cli)\n- [Opera Add-ons](#opera-add-ons-cli)\n\nOptions:\n\n- `--verbose` boolean?  \n  If specified, the steps of every store will be logged to the console\n\n- `--zip` string?  \n  If specified, it will be used for every store that the `zip` is not specified  \n  For example, in\n\n  ```shell\n  web-ext-deploy --zip=\"zip-v{version}.zip\" --chrome-refresh-token=\"refreshToken\" --chrome-client-id=\"clientId\" --chrome-client-secret=\"clientSecret\" --firefox-jwt-issuer=\"jwtIssuer\" --firefox-jwt-secret=\"jwtSecret\" --edge-client-id=\"clientId\" --edge-api-key=\"apiKey\" --edge-zip=\"some-zip-v{version}.zip\"\n  ```\n  the `zip-v{version}.zip` will be used for the Chrome Web Store _and_ the Firefox Add-ons\n\n#### Chrome Web Store CLI\n\n```yaml\n# Get it from https://chrome.google.com/webstore/detail/EXT_ID, e.g. https://chrome.google.com/webstore/detail/fcphghnknhkimeagdglkljinmpbagone\n--chrome-ext-id: string\n\n# Get them by following https://github.com/fregante/chrome-webstore-upload-keys\n--chrome-refresh-token: string\n--chrome-client-id: string\n--chrome-client-secret: string\n\n# The relative path from the root to the ZIP\n# You can use {version}, which will be replaced by the `version` entry in your `package.json`\n--chrome-zip: string\n```\n\nGet your `--chrome-refresh-token`, `--chrome-client-id` and `--chrome-client-secret` by following [this guide](https://github.com/fregante/chrome-webstore-upload-keys)  \nExample:\n\n```shell\nweb-ext-deploy --chrome-ext-id=\"ExtensionID\" --chrome-refresh-token=\"RefreshToken\" --chrome-client-id=\"ClientID\" --chrome-client-secret=\"ClientSecret\" --chrome-zip=\"some-zip-v{version}.zip\"\n```\n\n#### Firefox Add-ons CLI\n\n```yaml\n# The extension ID from the store URL, e.g. https://addons.mozilla.org/addon/EXT_ID\n--firefox-ext-id: string\n  \n# Get them from https://addons.mozilla.org/developers/addon/api/key\n--firefox-jwt-issuer: string\n--firefox-jwt-secret: string\n  \n# The relative path from the root to the ZIP\n# You can use {version}, which will be replaced by the `version` entry from your `package.json`\n--firefox-zip: string\n  \n# If applicable, the relative path from the root to the ZIP source\n# You can use {version}, which will be replaced by the `version` entry from your `package.json`\n--firefox-zip-source?: string\n  \n# A description of the changes in this version, compared to the previous one\n# It's recommended to use instead --firefox-changelog , so it stays up to date\n--firefox-changelog?: string\n\n# The language of the changelog\n# Fallbacks to the Manifest's `default_locale` field, if applicable, or `en-US`\n--firefox-changelog-lang?: string\n  \n# A description of the technical changes made in this version, compared to the previous one\n# This will only be seen by the Firefox Addons reviewers\n# It's recommended to use instead --firefox-dev-changelog , so it stays up to date\n--firefox-dev-changelog?: string\n```\n\nExample:\n\n```shell\nweb-ext-deploy --firefox-ext-id=\"ExtensionID\" --firefox-jwt-issuer=\"JwtIssuer\" --firefox-jwt-secret=\"JwtSecret\" --firefox-zip=\"dist/some-zip-v{version}.zip\" --firefox-changelog=\"Changelog\\nWith line breaks\" --firefox-dev-changelog=\"Changelog for reviewers\\nWith line breaks\"\n```\n\n#### Edge Add-ons CLI\n\n```yaml\n# The product ID from the Edge Add-ons Dashboard, e.g.\n# https://partner.microsoft.com/en-us/dashboard/microsoftedge/PRODUCT_ID\n--edge-product-id: string\n\n# Get them by following https://github.com/avi12/web-ext-deploy/blob/main/EDGE_PUBLISH_API.md\n--edge-client-id: string\n--edge-api-key: string\n\n# The relative path from the root to the ZIP\n# You can use {version}, which will be replaced by the `version` entry in `package.json`\n--edge-zip: string\n\n# A description of the technical changes made in this version, compared to the previous one\n# This will only be seen by the Edge Add-ons reviewers\n# You can use \\n for new lines\n--edge-dev-changelog?: string\n```\n\nExample:\n\n```shell\nweb-ext-deploy --edge-product-id=\"ProductID\" --edge-client-id=\"clientId\" --edge-api-key=\"apiKey\" --edge-zip=\"dist/some-zip-v{version}.zip\" --edge-dev-changelog=\"Changelog for reviewers\\nWith line breaks\"\n```\n\n**Note:**  \nDue 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  \nTherefore, if you publish after you had just published/canceled, expect to wait a little longer\n\n#### Opera Add-ons CLI\n\n```yaml\n# The extension ID from the Opera Add-ons Dashboard, e.g.\n# https://addons.opera.com/developer/package/PACKAGE_ID\n--opera-package-id: number\n\n# If you have a hard time obtaining them, run: web-ext-deploy --get-cookies=opera\n--opera-sessionid: string\n--opera-csrftoken: string\n\n# The relative path from the root to the ZIP\n# You can use {version}, which will be replaced by the `version` entry from your `package.json`\n--opera-zip: string\n  \n# A description of the changes in this version, compared to the previous one\n# You can use \\n for new lines\n--opera-changelog?: string\n```\n\nExample:\n\n```shell\nweb-ext-deploy --opera-package-id=123456 --opera-sessionid=\"sessionid_value\" --opera-csrftoken=\"csrftoken_value\" --opera-zip=\"dist/some-zip-v{version}.zip\" --opera-changelog=\"Changelog\\nWith line breaks\"\n```\n\n**Notes:**\n\n- Source code inspection:  \n  The Opera Add-ons reviewers require inspecting your extension's source code.  \n  This can be done by doing **one** of the following:\n\n  - Uploading the ZIP that contains the [source code](https://www.npmjs.com/package/zip-self) to a public folder on a storage service like [Google Drive](https://drive.google.com)\n  - 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.\n\n  Note that you **do not** want to store the command with your extension package, as the review team will have access to your precious cookies.\n\n## Node.js API method\n\n### ESM\n\n```ts\nimport { deployChrome, deployFirefoxSubmissionApi, deployEdgePublishApi, deployOpera } from \"web-ext-deploy\";\n```\n\n### Node.js API\n\n- [Chrome Web Store](#chrome-web-store-api)\n- [Firefox Add-ons](#firefox-submission-api)\n- [Edge Add-ons](#edge-publish-api)\n- [Opera Add-ons](#opera-api)\n\n#### Chrome Web Store API\n\n`deployChrome` object\n```yaml\n# Get it from https://chrome.google.com/webstore/detail/EXT_ID, e.g. https://chrome.google.com/webstore/detail/fcphghnknhkimeagdglkljinmpbagone\nextId: string;\n\n# Get them by following https://github.com/fregante/chrome-webstore-upload-keys\nrefreshToken: string;\nclientId: string;\nclientSecret: string;\n\n# The relative path from the root to the ZIP\n# You can use {version} in the ZIP filename, which will be replaced by the `version` entry from your `package.json`\nzip: string;\n\n# Setting to `true` will result in every step of the upload process be logged to the console\nverbose?: boolean;\n```\n\nReturns `Promise\u003ctrue\u003e` or throws an exception.\n\n#### Firefox Submission API\n\n`deployFirefoxSubmissionApi` object\n```yaml\n# Get it from https://addons.mozilla.org/addon/EXT_ID\nextId: string;\n\n# Get them from https://addons.mozilla.org/developers/addon/api/key\njwtIssuer: string;\njwtSecret: string;\n\n# The relative path from the root to the ZIP\n# You can use {version} in the ZIP filename, which will be replaced by the `version` entry from your package.json\nzip: string;\n\n# If applicable, the relative path from the root to the ZIP source\n# You can use {version} in the ZIP filename, which will be replaced by the `version` entry from your `package.json`\nzipSource?: string;\n\n# A description of the changes in this version, compared to the previous one\n# It's recommended to use instead --firefox-changelog , so it stays up to date\nchangelog?: string;\n\n# The language of the changelog\n# Fallbacks to the Manifest's `default_locale` field, if applicable, or `en-US`\nchangelogLang?: string;\n\n# A description of the technical changes made in this version, compared to the previous one\n# This will only be seen by the Firefox Addons reviewers\n# It's recommended to use instead --firefox-dev-changelog , so it stays up to date\ndevChangelog?: string;\n\n# Setting to `true` will result in every step of the upload process be logged to the console\nverbose?: boolean;\n```\n\nReturns `Promise\u003ctrue\u003e` or throws an exception\n\n#### Edge Publish API\n\n`deployEdgePublishApi` object\n```yaml\n# Get it from https://partner.microsoft.com/en-us/dashboard/microsoftedge/PRODUCT_ID\nproductId: string;\n\n# Get them by following https://github.com/avi12/web-ext-deploy/blob/main/EDGE_PUBLISH_API.md\nclientId: string;\napiKey: string;\n\n# The relative path from the root to the zip\n# You can use {version}, which will be replaced by the version in package.json\nzip: string;\n\n# The technical changes made in this version, compared to the previous one\ndevChangelog?: string;\n\n# Setting to `true` will result in every step of the upload process be logged to the console\nverbose?: boolean;\n```\nReturns `Promise\u003ctrue\u003e` or throws an exception\n\n**Note:**  \nDue 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  \nTherefore, expect for longer wait times if you run the tool on an extension you had just published/canceled\n\n#### Opera API\n\n`deployOpera` object\n```yaml\n# The package ID of the extension from the store dashboard, e.g. https://addons.opera.com/developer/package/PACKAGE_ID\npackageId: number;\n\n# If you have a hard time obtaining them, run: web-ext-deploy --get-cookies=opera\nsessionid: string;\ncsrftoken: string;\n\n# The relative path from the root to the ZIP.  \n# You can use {version} in the ZIP filename, which will be replaced by the `version` entry from your package.json\nzip: string;\n\n# A description of the changes in this version, compared to the previous one.\n# It's recommended to use instead --opera-changelog , so it stays up to date.\nchangelog?: string;\n\n# Setting to `true` will result in every step of the upload process be logged to the console\nverbose?: boolean;\n````\nReturns `Promise\u003ctrue\u003e` or throws an exception.\n\n**Notes:**\n\n- Source code inspection:  \n  The Opera Add-ons reviewers require inspecting your extension's source code  \n  This can be done by doing **one** of the following:\n\n  - Uploading the ZIP that contains the [source code](https://www.npmjs.com/package/zip-self) to a public folder on a storage service such as [Google Drive](https://drive.google.com)\n  - 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\n\n  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  \n  If you'll open-source the extension on GitHub, you can exclude the deployment script by listing it in `.gitignore`\n\nExamples:\n\n```ts\nimport { deployChrome, deployFirefoxSubmissionApi, deployEdgePublishApi, deployOpera } from \"web-ext-deploy\";\n\ndeployChrome({\n  extId: \"ExtensionID\",\n  refreshToken: \"refreshToken\",\n  clientId: \"clientId\",\n  clientSecret: \"clientSecret\",\n  zip: \"dist/some-zip-v{version}.zip\",\n  verbose: false\n}).catch(console.error);\n\ndeployFirefoxSubmissionApi({\n  extId: \"EXT_ID\",\n  jwtIssuer: \"jwtIssuer\",\n  jwtSecret: \"jwtSecret\",\n  zip: \"dist/some-zip-v{version}.zip\",\n  zipSource: \"dist/zip-source-v{version}.zip\",\n  changelog: \"Some changes\",\n  changelogLang: \"en-US\",\n  devChangelog: \"Changes for reviewers\",\n  verbose: false\n}).catch(console.error);\n\ndeployEdgePublishApi({\n  productId: \"PRODUCT_ID\",\n  clientId: \"clientId\",\n  apiKey: \"apiKey\",\n  zip: \"dist/some-zip-v{version}.zip\",\n  devChangelog: \"Changes for reviewers\",\n  verbose: false\n}).catch(console.error);\n\ndeployOpera({\n  packageId: 123456,\n  sessionid: \"sessionid_value\",\n  csrftoken: \"csrftoken_value\",\n  zip: \"dist/some-zip-v{version}.zip\",\n  changelog: \"Some changes\",\n  verbose: false\n}).catch(console.error);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Favi12%2Fweb-ext-deploy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Favi12%2Fweb-ext-deploy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Favi12%2Fweb-ext-deploy/lists"}