Skip to content

Vite plugin that lets you specify `manifest.json` properties to appear only in specific browsers.

License

Notifications You must be signed in to change notification settings

abhijithvijayan/vite-plugin-wext-manifest

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

16 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

vite-plugin-wext-manifest

Vite Plugin for Webextension manifest

πŸ™‹β€β™‚οΈ Made by @abhijithvijayan

Donate: PayPal, Patreon

Buy Me a Coffee


Generate browser tailored manifest.json for Web Extensions that you specify properties to appear only in specific browsers.

❀️ it? ⭐️ it on GitHub or Tweet about it.

Table of Contents

Browser Support

Chrome Firefox Opera Edge
βœ” βœ” βœ” βœ”

This loader will take a definition input for the manifest, and return you content for the specified browser.

Looking for Web Extension starter

Checkout web-extension-starter that uses this package

Installation

Ensure you have Node.js 18 or later installed. Then run the following:

# via npm
npm install --save-dev vite-plugin-wext-manifest

# or yarn
yarn add vite-plugin-wext-manifest --dev

Usage

You can easily use this module to output the manifest.json as part of your build process with auto rebundling on file change.

Note: Make sure you pass a TARGET_BROWSER env variable with one of chrome/firefox/edge/brave/opera/vivaldi/arc/yandex value

Sample manifest with vendor prefixed keys

https://github.com/abhijithvijayan/web-extension-starter/blob/react-typescript/source/manifest.json

vite.config.ts

// ... other plugins
import vitePluginWextManifest from "./vite-plugin-wext-manifest";

export default defineConfig(({ mode }) => {
	const sourcePath = path.resolve(__dirname, "source");

	return {
		root: sourcePath,

		plugins: [
			vitePluginWextManifest({
				manifestPath: "manifest.json",
				usePackageJSONVersion: true,
			}),
			// ...
		],
	}
});

Options

manifestPath

Type: String

Path to the manifest.json to transform.

usePackageJSONVersion

Type: Boolean Default: false

If true, updates manifest.json version field with package.json version. It is often useful for easy release of web-extension.


FAQs

1.What are vendor prefixed manifest keys

Vendor prefixed manifest keys allow you to write one manifest.json for multiple vendors.

{
  "__chrome__name": "AwesomeChrome",
  "__firefox__name": "AwesomeFirefox",
  "__edge__name": "AwesomeEdge",
  "__opera__name": "AwesomeOpera"
}

if the TARGET_BROWSER is chrome this compiles to:

{
  "name": "AwesomeChrome",
}

Add keys to multiple vendors by seperating them with | in the prefix

{
  __chrome|opera__name: "AwesomeExtension"
}

if the vendor is chrome or opera, this compiles to:

{
  "name": "AwesomeExtension"
}

2. How can I conditionally set keys based on environment

{
  "__dev__name": "NameInDevelopment",
  "__prod__name": "NameInProduction",
  "__chrome|firefox|dev__description": "DescriptionInDevelopmentForSetOfBrowsers",
  "__chrome|firefox|prod__description": "DescriptionInProductionForSetOfBrowsers"
}

if the NODE_ENV is production and the TARGET_BROWSER is chrome this compiles to:

{
  "name": "NameInProduction",
  "description": "DescriptionInProductionForSetOfBrowsers"
}

else

{
  "name": "NameInDevelopment",
  "description": "DescriptionInDevelopmentForSetOfBrowsers"
}

Issues

Looking to contribute? Look for the Good First Issue label.

πŸ› Bugs

Please file an issue here for bugs, missing documentation, or unexpected behavior.

See Bugs

Linting & TypeScript Config

License

MIT Β© Abhijith Vijayan