vite-plugin-wext-manifest
Version:
Vite plugin that lets you specify `manifest.json` properties to appear only in specific browsers.
63 lines (62 loc) • 2.67 kB
JavaScript
import path from 'node:path';
import { findUp } from 'find-up-simple';
import { readPackage } from 'read-pkg';
import { loadJsonFile } from 'load-json-file';
import transformer, { browserVendors, } from 'wext-manifest-transformer';
import { PLUGIN_NAME } from './constants.js';
export default function plugin(options) {
let config;
if (!options?.manifestPath) {
throw new Error(`${PLUGIN_NAME}: \`manifestPath\` option is required.`);
}
return {
name: PLUGIN_NAME,
configResolved(resolvedConfig) {
config = resolvedConfig;
},
async buildStart() {
const { mode, root } = config;
const targetBrowser = process.env.TARGET_BROWSER;
if (!targetBrowser) {
this.error('`TARGET_BROWSER` environment variable is not set.');
}
if (!browserVendors.includes(targetBrowser)) {
this.error(`Browser "${targetBrowser}" is not supported.`);
}
try {
const sourceManifestPath = path.resolve(root, options.manifestPath);
this.addWatchFile(sourceManifestPath);
const manifestInput = await loadJsonFile(sourceManifestPath);
const transformed = transformer(manifestInput, targetBrowser, mode);
const usePackageJSONVersion = !!options.usePackageJSONVersion;
if (usePackageJSONVersion) {
try {
const packageJsonPath = await findUp('package.json');
if (!packageJsonPath) {
throw new Error("Couldn't find a closest package.json");
}
this.addWatchFile(packageJsonPath);
const packageJson = await readPackage({
...options,
cwd: path.dirname(packageJsonPath),
});
if (transformed.version) {
transformed.version = packageJson.version.replace('-beta.', '.');
}
}
catch (err) {
this.error(`Failed to process package.json: ${err.message}`);
}
}
this.emitFile({
type: 'asset',
fileName: 'manifest.json',
source: JSON.stringify(transformed, null, 2),
});
}
catch (err) {
this.error(`Failed to process manifest.json: ${err.message}`);
}
},
};
}