nx/packages/eslint-plugin/src/resolve-workspace-rules.ts

39 lines
1.3 KiB
TypeScript

import type { TSESLint } from '@typescript-eslint/utils';
import { existsSync } from 'fs';
import { registerTsProject } from '@nx/js/src/internal';
import { WORKSPACE_PLUGIN_DIR, WORKSPACE_RULE_NAMESPACE } from './constants';
import { join } from 'path';
type ESLintRules = Record<string, TSESLint.RuleModule<string, unknown[]>>;
export const workspaceRules = ((): ESLintRules => {
// If `tools/eslint-rules` folder doesn't exist, there is no point trying to register and load it
if (!existsSync(WORKSPACE_PLUGIN_DIR)) {
return {};
}
// Register `tools/eslint-rules` for TS transpilation
const registrationCleanup = registerTsProject(
join(WORKSPACE_PLUGIN_DIR, 'tsconfig.json')
);
try {
/**
* Currently we only support applying the rules from the user's workspace plugin object
* (i.e. not other things that plugings can expose like configs, processors etc)
*/
const { rules } = require(WORKSPACE_PLUGIN_DIR);
// Apply the namespace to the resolved rules
const namespacedRules: ESLintRules = {};
for (const [ruleName, ruleConfig] of Object.entries(rules as ESLintRules)) {
namespacedRules[`${WORKSPACE_RULE_NAMESPACE}/${ruleName}`] = ruleConfig;
}
return namespacedRules;
} catch (err) {
return {};
} finally {
if (registrationCleanup) {
registrationCleanup();
}
}
})();