Webpack Loader for Webextension manifest
๐โโ๏ธ Made by @abhijithvijayan
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.
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|
| โ | โ | โ | โ |
This loader will take a definition input for the manifest, and return you content for the specified browser.
Checkout web-extension-starter that uses this package
Ensure you have Node.js 10 or later installed. Then run the following:
# via npm
npm install --save-dev wext-manifest-loader wext-manifest-webpack-plugin
# or yarn
yarn add wext-manifest-loader wext-manifest-webpack-plugin --devYou can easily use this module together with the wext-manifest-webpack-plugin to output the manifest.json as part of your build process without any additional js bundle and with auto rebundling on file change.
Note: Make sure you pass a TARGET_BROWSER env variable with one of chrome/firefox/edge/opera value
https://github.com/abhijithvijayan/web-extension-starter/blob/react-typescript/source/manifest.json
webpack.config.js
// ... other plugins
const WextManifestWebpackPlugin = require("wext-manifest-webpack-plugin");
const targetBrowser = process.env.TARGET_BROWSER;
const destPath = path.join(__dirname, 'extension');
module.exports = {
entry: {
manifest: './src/manifest.json',
// ...
},
output: {
path: path.join(destPath, targetBrowser),
filename: 'js/[name].bundle.js',
},
module: {
rules: [
{
type: 'javascript/auto', // prevent webpack handling json with its own loaders,
test: /manifest\.json$/,
use: 'wext-manifest-loader',
exclude: /node_modules/,
},
]
},
plugins: [
new WextManifestWebpackPlugin(),
// ...
],
};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.
webpack.config.js
module.exports = {
module: {
rules: [
{
type: 'javascript/auto', // prevent webpack handling json with its own loaders,
test: /manifest\.json$/,
use: {
loader: 'wext-manifest-loader',
options: {
usePackageJSONVersion: true,
},
},
exclude: /node_modules/,
},
],
},
};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"
}
{
"__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"
}Looking to contribute? Look for the Good First Issue label.
Please file an issue here for bugs, missing documentation, or unexpected behavior.
- Shared Eslint & Prettier Configuration -
@abhijithvijayan/eslint-config - Shared TypeScript Configuration -
@abhijithvijayan/tsconfig
Thanks to @fregante for suggesting to convert initial (wext-manifest) module to webpack loader(wext-manifest-loader)
MIT ยฉ Abhijith Vijayan



