mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
This reverts commit f09ab8889148c406551dea1643966e3331fde4aa, reversing changes made to effc761e0ee4ea7ffb77f275b5ed650a7098d6f8. This is being temporarily reverted to make it easier to release an urgent fix for v10.15.1.
173 lines
4.7 KiB
JavaScript
173 lines
4.7 KiB
JavaScript
const { promises: fs } = require('fs');
|
|
const path = require('path');
|
|
const { mergeWith, cloneDeep } = require('lodash');
|
|
|
|
const baseManifest = require('../../app/manifest/_base.json');
|
|
const { BuildType } = require('../lib/build-type');
|
|
|
|
const { createTask, composeSeries } = require('./task');
|
|
|
|
module.exports = createManifestTasks;
|
|
|
|
function createManifestTasks({
|
|
browserPlatforms,
|
|
browserVersionMap,
|
|
buildType,
|
|
}) {
|
|
// merge base manifest with per-platform manifests
|
|
const prepPlatforms = async () => {
|
|
return Promise.all(
|
|
browserPlatforms.map(async (platform) => {
|
|
const platformModifications = await readJson(
|
|
path.join(
|
|
__dirname,
|
|
'..',
|
|
'..',
|
|
'app',
|
|
'manifest',
|
|
`${platform}.json`,
|
|
),
|
|
);
|
|
const result = mergeWith(
|
|
cloneDeep(baseManifest),
|
|
platformModifications,
|
|
browserVersionMap[platform],
|
|
await getBuildModifications(buildType, platform),
|
|
customArrayMerge,
|
|
);
|
|
const dir = path.join('.', 'dist', platform);
|
|
await fs.mkdir(dir, { recursive: true });
|
|
await writeJson(result, path.join(dir, 'manifest.json'));
|
|
}),
|
|
);
|
|
};
|
|
|
|
// dev: add perms
|
|
const envDev = createTaskForModifyManifestForEnvironment((manifest) => {
|
|
manifest.permissions = [...manifest.permissions, 'webRequestBlocking'];
|
|
});
|
|
|
|
// testDev: add perms
|
|
const envTestDev = createTaskForModifyManifestForEnvironment((manifest) => {
|
|
manifest.permissions = [
|
|
...manifest.permissions,
|
|
'webRequestBlocking',
|
|
'http://localhost/*',
|
|
];
|
|
});
|
|
|
|
// test: add permissions
|
|
const envTest = createTaskForModifyManifestForEnvironment((manifest) => {
|
|
manifest.permissions = [
|
|
...manifest.permissions,
|
|
'webRequestBlocking',
|
|
'http://localhost/*',
|
|
];
|
|
});
|
|
|
|
// high level manifest tasks
|
|
const dev = createTask('manifest:dev', composeSeries(prepPlatforms, envDev));
|
|
|
|
const testDev = createTask(
|
|
'manifest:testDev',
|
|
composeSeries(prepPlatforms, envTestDev),
|
|
);
|
|
|
|
const test = createTask(
|
|
'manifest:test',
|
|
composeSeries(prepPlatforms, envTest),
|
|
);
|
|
|
|
const prod = createTask('manifest:prod', prepPlatforms);
|
|
|
|
return { prod, dev, testDev, test };
|
|
|
|
// helper for modifying each platform's manifest.json in place
|
|
function createTaskForModifyManifestForEnvironment(transformFn) {
|
|
return () => {
|
|
return Promise.all(
|
|
browserPlatforms.map(async (platform) => {
|
|
const manifestPath = path.join(
|
|
'.',
|
|
'dist',
|
|
platform,
|
|
'manifest.json',
|
|
);
|
|
const manifest = await readJson(manifestPath);
|
|
transformFn(manifest);
|
|
await writeJson(manifest, manifestPath);
|
|
}),
|
|
);
|
|
};
|
|
}
|
|
|
|
// helper for merging obj value
|
|
function customArrayMerge(objValue, srcValue) {
|
|
if (Array.isArray(objValue)) {
|
|
return [...new Set([...objValue, ...srcValue])];
|
|
}
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
// helper for reading and deserializing json from fs
|
|
async function readJson(file) {
|
|
return JSON.parse(await fs.readFile(file, 'utf8'));
|
|
}
|
|
|
|
// helper for serializing and writing json to fs
|
|
async function writeJson(obj, file) {
|
|
return fs.writeFile(file, JSON.stringify(obj, null, 2));
|
|
}
|
|
|
|
/**
|
|
* Get manifest modifications for the given build type, including modifications specific to the
|
|
* given platform.
|
|
*
|
|
* @param {BuildType} buildType - The build type.
|
|
* @param {string} platform - The platform (i.e. the browser).
|
|
* @returns {Object} The build modificantions for the given build type and platform.
|
|
*/
|
|
async function getBuildModifications(buildType, platform) {
|
|
if (!Object.values(BuildType).includes(buildType)) {
|
|
throw new Error(`Invalid build type: ${buildType}`);
|
|
} else if (buildType === BuildType.main) {
|
|
return {};
|
|
}
|
|
|
|
const builtTypeManifestDirectoryPath = path.resolve(
|
|
__dirname,
|
|
'..',
|
|
'..',
|
|
'app',
|
|
'build-types',
|
|
buildType,
|
|
'manifest',
|
|
);
|
|
|
|
const baseBuildTypeModificationsPath = path.join(
|
|
builtTypeManifestDirectoryPath,
|
|
'_base.json',
|
|
);
|
|
const buildModifications = await readJson(baseBuildTypeModificationsPath);
|
|
|
|
const platformBuildTypeModificationsPath = path.join(
|
|
builtTypeManifestDirectoryPath,
|
|
`${platform}.json`,
|
|
);
|
|
try {
|
|
const platformBuildTypeModifications = await readJson(
|
|
platformBuildTypeModificationsPath,
|
|
);
|
|
Object.assign(buildModifications, platformBuildTypeModifications);
|
|
} catch (error) {
|
|
// Suppress 'ENOENT' error because it indicates there are no platform-specific manifest
|
|
// modifications for this build type.
|
|
if (error.code !== 'ENOENT') {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
return buildModifications;
|
|
}
|