Move tools/eslint-rules to packages/twenty-eslint-rules (#17203)

## Summary

Moves the custom ESLint rules from `tools/eslint-rules` to
`packages/twenty-eslint-rules` for better organization within the
monorepo packages structure.

## Changes

- Move `eslint-rules` from `tools/` to `packages/twenty-eslint-rules`
- Use `loadWorkspaceRules` from `@nx/eslint-plugin` to load custom rules
- Update all ESLint configs to use the `twenty/` rule prefix instead of
`@nx/workspace-`
- Update `project.json`, `jest.config.mjs` with new paths
- Update `package.json` workspaces and `nx.json` cache inputs
- Update Dockerfile reference

## Technical Details

The custom ESLint rules are now loaded using Nx's `loadWorkspaceRules`
utility which:
- Handles TypeScript transpilation automatically
- Allows loading workspace rules from any directory
- Provides a cleaner approach than the previous `@nx/workspace-`
convention

## Testing

- Verified all 17 custom ESLint rules load correctly from the new
location
- Verified linting works on dependent packages (twenty-front,
twenty-server, etc.)
This commit is contained in:
Félix Malfait
2026-01-17 07:37:17 +01:00
committed by GitHub
parent a429bc922d
commit c737028dd6
225 changed files with 622 additions and 4600 deletions
@@ -68,7 +68,7 @@ import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.
import { PermissionsService } from 'src/engine/metadata-modules/permissions/permissions.service';
@Injectable()
// eslint-disable-next-line @nx/workspace-inject-workspace-repository
// eslint-disable-next-line twenty/inject-workspace-repository
export class AuthService {
constructor(
private readonly accessTokenService: AccessTokenService,
@@ -44,7 +44,7 @@ import { getDomainNameByEmail } from 'src/utils/get-domain-name-by-email';
import { isWorkEmail } from 'src/utils/is-work-email';
@Injectable()
// eslint-disable-next-line @nx/workspace-inject-workspace-repository
// eslint-disable-next-line twenty/inject-workspace-repository
export class SignInUpService {
constructor(
@InjectRepository(UserEntity)
@@ -37,7 +37,7 @@ import { StripeSubscriptionScheduleService } from 'src/engine/core-modules/billi
import { StripeBillingAlertService } from 'src/engine/core-modules/billing/stripe/services/stripe-billing-alert.service';
@Injectable()
// eslint-disable-next-line @nx/workspace-inject-workspace-repository
// eslint-disable-next-line twenty/inject-workspace-repository
export class BillingWebhookSubscriptionService {
protected readonly logger = new Logger(
BillingWebhookSubscriptionService.name,
@@ -29,7 +29,7 @@ import { OTPStatus } from './strategies/otp/otp.constants';
const PENDING_METHOD_REUSE_WINDOW_MS = 60 * 60 * 1000;
@Injectable()
// eslint-disable-next-line @nx/workspace-inject-workspace-repository
// eslint-disable-next-line twenty/inject-workspace-repository
export class TwoFactorAuthenticationService {
constructor(
@InjectRepository(TwoFactorAuthenticationMethodEntity)
@@ -41,7 +41,7 @@ import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspac
import { buildSystemAuthContext } from 'src/engine/twenty-orm/utils/build-system-auth-context.util';
import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';
// eslint-disable-next-line @nx/workspace-inject-workspace-repository
// eslint-disable-next-line twenty/inject-workspace-repository
export class UserService extends TypeOrmQueryService<UserEntity> {
constructor(
@InjectRepository(UserEntity)
@@ -57,7 +57,7 @@ import { DEFAULT_FEATURE_FLAGS } from 'src/engine/workspace-manager/workspace-mi
import { extractVersionMajorMinorPatch } from 'src/utils/version/extract-version-major-minor-patch';
@Injectable()
// eslint-disable-next-line @nx/workspace-inject-workspace-repository
// eslint-disable-next-line twenty/inject-workspace-repository
export class WorkspaceService extends TypeOrmQueryService<WorkspaceEntity> {
protected readonly logger = new Logger(WorkspaceService.name);