feat: enforce @/ alias for imports and fix all relative parent imports (#16787)

## Summary
This PR enforces the use of `@/` alias for imports instead of relative
parent imports (`../`).

## Changes

### ESLint Configuration
- Added `no-restricted-imports` pattern in `eslint.config.react.mjs` to
block `../*` imports with the message "Relative parent imports are not
allowed. Use @/ alias instead."
- Removed the non-working `import/no-relative-parent-imports` rule
(doesn't work properly in ESLint flat config)

### VS Code Settings
- Added `javascript.preferences.importModuleSpecifier: non-relative` to
`.vscode/settings.json` (TypeScript setting was already there)

### Code Fixes
- Fixed **941 relative parent imports** across **706 files** in
`packages/twenty-front`
- All `../` imports converted to use `@/` alias

## Why
- Consistent import style across the codebase
- Easier to move files without breaking imports
- Better IDE support for auto-imports
- Clearer understanding of where imports come from
This commit is contained in:
Félix Malfait
2025-12-23 22:57:51 +01:00
committed by GitHub
parent 781b96e80b
commit b27a97f2c5
725 changed files with 1114 additions and 1041 deletions
@@ -8,7 +8,7 @@ import {
query,
responseData,
variables,
} from '../__mocks__/useCreateOneObjectMetadataItem';
} from '@/object-metadata/hooks/__mocks__/useCreateOneObjectMetadataItem';
import { jestExpectSuccessfulMetadataRequestResult } from '@/object-metadata/hooks/__tests__/utils/jest-expect-metadata-request-status.util';
import { GET_CURRENT_USER } from '@/users/graphql/queries/getCurrentUser';
@@ -16,7 +16,7 @@ import { mockedUserData } from '~/testing/mock-data/users';
import {
query as findManyObjectMetadataItemsQuery,
responseData as findManyObjectMetadataItemsResponseData,
} from '../__mocks__/useFindManyObjectMetadataItems';
} from '@/object-metadata/hooks/__mocks__/useFindManyObjectMetadataItems';
const mocks = [
{
@@ -6,7 +6,7 @@ import {
query,
responseData,
variables,
} from '../__mocks__/useDeleteOneObjectMetadataItem';
} from '@/object-metadata/hooks/__mocks__/useDeleteOneObjectMetadataItem';
import { jestExpectSuccessfulMetadataRequestResult } from '@/object-metadata/hooks/__tests__/utils/jest-expect-metadata-request-status.util';
import { GET_CURRENT_USER } from '@/users/graphql/queries/getCurrentUser';
@@ -17,7 +17,7 @@ import { mockedCoreViewsData } from '~/testing/mock-data/views';
import {
query as findManyObjectMetadataItemsQuery,
responseData as findManyObjectMetadataItemsResponseData,
} from '../__mocks__/useFindManyObjectMetadataItems';
} from '@/object-metadata/hooks/__mocks__/useFindManyObjectMetadataItems';
const mocks = [
{
@@ -13,7 +13,7 @@ import {
queries,
responseData,
variables,
} from '../__mocks__/useFieldMetadataItem';
} from '@/object-metadata/hooks/__mocks__/useFieldMetadataItem';
import { jestExpectSuccessfulMetadataRequestResult } from '@/object-metadata/hooks/__tests__/utils/jest-expect-metadata-request-status.util';
import { GET_CURRENT_USER } from '@/users/graphql/queries/getCurrentUser';
@@ -21,7 +21,7 @@ import { mockedUserData } from '~/testing/mock-data/users';
import {
query as findManyObjectMetadataItemsQuery,
responseData as findManyObjectMetadataItemsResponseData,
} from '../__mocks__/useFindManyObjectMetadataItems';
} from '@/object-metadata/hooks/__mocks__/useFindManyObjectMetadataItems';
jest.mock('@/object-metadata/hooks/useUpdateOneFieldMetadataItem', () => ({
useUpdateOneFieldMetadataItem: () => ({
@@ -9,7 +9,7 @@ import { SnackBarComponentInstanceContext } from '@/ui/feedback/snack-bar-manage
import {
query,
responseData,
} from '../__mocks__/useFindManyObjectMetadataItems';
} from '@/object-metadata/hooks/__mocks__/useFindManyObjectMetadataItems';
const mocks = [
{
@@ -2,7 +2,7 @@ import { renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil';
import { JestObjectMetadataItemSetter } from '~/testing/jest/JestObjectMetadataItemSetter';
import { useObjectNamePluralFromSingular } from '../useObjectNamePluralFromSingular';
import { useObjectNamePluralFromSingular } from '@/object-metadata/hooks/useObjectNamePluralFromSingular';
describe('useObjectNamePluralFromSingular', () => {
it('should work as expected', async () => {
@@ -2,7 +2,7 @@ import { renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil';
import { JestObjectMetadataItemSetter } from '~/testing/jest/JestObjectMetadataItemSetter';
import { useObjectNameSingularFromPlural } from '../useObjectNameSingularFromPlural';
import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural';
describe('useObjectNameSingularFromPlural', () => {
it('should work as expected', async () => {
@@ -6,7 +6,7 @@ import { filterAvailableTableColumns } from '@/object-record/utils/filterAvailab
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
import { availableFieldMetadataItemsForSortFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForSortFamilySelector';
import { useRecoilValue } from 'recoil';
import { formatFieldMetadataItemAsColumnDefinition } from '../utils/formatFieldMetadataItemAsColumnDefinition';
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
export const useColumnDefinitionsFromObjectMetadata = (
objectMetadataItem: ObjectMetadataItem,
@@ -1,6 +1,6 @@
import { type Field } from '~/generated-metadata/graphql';
import { formatFieldMetadataItemInput } from '../utils/formatFieldMetadataItemInput';
import { formatFieldMetadataItemInput } from '@/object-metadata/utils/formatFieldMetadataItemInput';
import { type RelationCreationPayload } from 'twenty-shared/types';
import { useCreateOneFieldMetadataItem } from './useCreateOneFieldMetadataItem';
@@ -10,8 +10,8 @@ import { logError } from '~/utils/logError';
import { enrichObjectMetadataItemsWithPermissions } from '@/object-metadata/utils/enrichObjectMetadataItemsWithPermissions';
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
import { FIND_MANY_OBJECT_METADATA_ITEMS } from '../graphql/queries';
import { mapPaginatedObjectMetadataItemsToObjectMetadataItems } from '../utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems';
import { FIND_MANY_OBJECT_METADATA_ITEMS } from '@/object-metadata/graphql/queries';
import { mapPaginatedObjectMetadataItemsToObjectMetadataItems } from '@/object-metadata/utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems';
export const useFindManyObjectMetadataItems = ({
skip,
@@ -3,7 +3,7 @@ import { useRecoilCallback } from 'recoil';
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql';
import { type FieldMetadataItem } from '../types/FieldMetadataItem';
import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
export const useGetRelationMetadata = () =>
useRecoilCallback(
@@ -5,7 +5,7 @@ import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objec
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { isDefined } from 'twenty-shared/utils';
import { type ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier';
import { type ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier';
export const useObjectMetadataItem = ({
objectNameSingular,