Files
gitlab-foss/scripts/frontend/postinstall.js
2025-02-12 18:07:32 +00:00

89 lines
2.7 KiB
JavaScript

/* eslint-disable global-require, import/no-dynamic-require */
const { spawnSync } = require('child_process');
const { join, resolve } = require('path');
const { existsSync } = require('fs');
const chalk = require('chalk');
const semver = require('semver');
const ROOT_PATH = resolve(__dirname, '../../');
// Check duo-ui peer dependency
function checkDuoUiPeerDependency() {
try {
const duoUiPkgPath = join(ROOT_PATH, 'node_modules', '@gitlab', 'duo-ui', 'package.json');
const gitlabUiPkgPath = join(ROOT_PATH, 'node_modules', '@gitlab', 'ui', 'package.json');
if (!existsSync(duoUiPkgPath)) {
console.error(`${chalk.red('error')} Could not find @gitlab/duo-ui package.json`);
return false;
}
const packageJson = require(gitlabUiPkgPath);
const duoUiPkgJson = require(duoUiPkgPath);
const installedUiVersion = packageJson.version;
const requiredUiVersion = duoUiPkgJson.peerDependencies?.['@gitlab/ui'];
if (!installedUiVersion) {
console.error(`${chalk.red('error')} @gitlab/ui is not installed`);
return false;
}
if (!requiredUiVersion) {
console.error(
`${chalk.red('error')} @gitlab/duo-ui does not specify @gitlab/ui peer dependency`,
);
return false;
}
if (!semver.satisfies(installedUiVersion, requiredUiVersion)) {
console.error(`${chalk.red('error')} Peer dependency violation:`);
console.error(
chalk.red(
`@gitlab/duo-ui requires @gitlab/ui@${requiredUiVersion} but ${installedUiVersion} is installed`,
),
);
return false;
}
return true;
} catch (error) {
console.error(`${chalk.red('error')} Failed to check duo-ui peer dependency:`, error.message);
return false;
}
}
// check that fsevents is available if we're on macOS
if (process.platform === 'darwin') {
try {
require.resolve('fsevents');
} catch (e) {
console.error(`${chalk.red('error')} Dependency postinstall check failed.`);
console.error(
chalk.red(
`The fsevents driver is not installed properly.
If you are running a new version of Node, please
ensure that it is supported by the fsevents library.
You can try installing again with \`${chalk.cyan('yarn install --force')}\`
`,
),
);
process.exit(1);
}
}
// Check duo-ui peer dependency
if (!checkDuoUiPeerDependency()) {
process.exit(1);
}
console.log(`${chalk.green('success')} Dependency postinstall check passed.`);
// Apply any patches to our packages
// See https://gitlab.com/gitlab-org/gitlab/-/issues/336138
process.exitCode =
spawnSync('node_modules/.bin/patch-package', ['--error-on-fail', '--error-on-warn'], {
stdio: ['ignore', 'inherit', 'inherit'],
}).status ?? 1;