blob: 53167ae1869b8963435e81c94e73ce209299103e [file]
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
// Bazel-specific ESLint wrapper.
//
// This file is intentionally thin:
// - `eslint.config.js` remains the source of truth for rules
// - this file only adapts module resolution for Bazel runfiles
//
// In Bazel test mode, npm dependencies are located under runfiles
// directories such as ui_dev_npm/node_modules. Extend the Node resolver
// so that ESLint can locate those packages.
const {defineConfig, globalIgnores} = require('eslint/config');
const js = require('@eslint/js');
const {FlatCompat} = require('@eslint/eslintrc');
const path = require('path');
const fs = require('fs');
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all,
});
function pathExists(p) {
try {
return fs.existsSync(p);
// eslint-disable-next-line no-unused-vars
} catch (unusedError) {
return false;
}
}
function getRunfilesRoot() {
return process.env.RUNFILES_DIR || process.env.TEST_SRCDIR || '';
}
function getNodeModulesPaths() {
const runfilesRoot = getRunfilesRoot();
if (runfilesRoot) {
// Bazel test mode: collect node_modules from runfiles
return [
path.join(runfilesRoot, 'ui_dev_npm/node_modules'),
path.join(runfilesRoot, 'ui_npm/node_modules'),
path.join(runfilesRoot, '_main/external/ui_dev_npm/node_modules'),
path.join(runfilesRoot, '_main/external/ui_npm/node_modules'),
path.join(runfilesRoot, '_main/polygerrit-ui/app/node_modules'),
].filter(pathExists);
}
// Workspace mode
return [
path.join(__dirname, 'node_modules'),
path.join(__dirname, '../../node_modules'),
path.join(process.cwd(), 'node_modules'),
path.join(process.cwd(), '../../node_modules'),
].filter(pathExists);
}
function getBazelSettings() {
const paths = getNodeModulesPaths();
if (paths.length === 0) return {};
return {
'import/resolver': {
node: {
paths,
},
},
};
}
module.exports = defineConfig([
{
linterOptions: {
reportUnusedDisableDirectives: 'error',
},
},
globalIgnores([
'**/node_modules',
'**/rollup.config.js',
'**/node_modules_licenses/',
'**/.prettierrc.js',
'**/.eslint-ts-resolver.config.js',
]),
...compat.config({
extends: './eslint.config.js',
settings: getBazelSettings(),
}),
]);