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
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
225 changed files with 622 additions and 4600 deletions

View file

@ -11,6 +11,8 @@ import unicornPlugin from 'eslint-plugin-unicorn';
import unusedImportsPlugin from 'eslint-plugin-unused-imports'; import unusedImportsPlugin from 'eslint-plugin-unused-imports';
import jsoncParser from 'jsonc-eslint-parser'; import jsoncParser from 'jsonc-eslint-parser';
const twentyRules = await nxPlugin.loadWorkspaceRules('packages/twenty-eslint-rules');
export default [ export default [
// Base JavaScript configuration // Base JavaScript configuration
js.configs.recommended, js.configs.recommended,
@ -195,6 +197,7 @@ export default [
plugins: { plugins: {
...mdxPlugin.flat.plugins, ...mdxPlugin.flat.plugins,
'@nx': nxPlugin, '@nx': nxPlugin,
'twenty': { rules: twentyRules },
}, },
}, },
mdxPlugin.flatCodeBlocks, mdxPlugin.flatCodeBlocks,
@ -205,9 +208,9 @@ export default [
'unused-imports/no-unused-imports': 'off', 'unused-imports/no-unused-imports': 'off',
'unused-imports/no-unused-vars': 'off', 'unused-imports/no-unused-vars': 'off',
// Enforce JSX tags on separate lines to prevent Crowdin translation issues // Enforce JSX tags on separate lines to prevent Crowdin translation issues
'@nx/workspace-mdx-component-newlines': 'error', 'twenty/mdx-component-newlines': 'error',
// Disallow angle bracket placeholders to prevent Crowdin translation errors // Disallow angle bracket placeholders to prevent Crowdin translation errors
'@nx/workspace-no-angle-bracket-placeholders': 'error', 'twenty/no-angle-bracket-placeholders': 'error',
}, },
}, },
]; ];

View file

@ -1,4 +1,9 @@
const nxPreset = require('@nx/jest/preset').default; const nxPreset = require('@nx/jest/preset').default;
module.exports = { ...nxPreset }; module.exports = {
...nxPreset,
// Override the new testEnvironmentOptions added in @nx/jest 22.3.3
// which breaks Lingui's module resolution
testEnvironmentOptions: {},
};

117
nx.json
View file

@ -4,9 +4,7 @@
"libsDir": "packages" "libsDir": "packages"
}, },
"namedInputs": { "namedInputs": {
"default": [ "default": ["{projectRoot}/**/*"],
"{projectRoot}/**/*"
],
"excludeStories": [ "excludeStories": [
"default", "default",
"!{projectRoot}/.storybook/*", "!{projectRoot}/.storybook/*",
@ -34,26 +32,17 @@
"targetDefaults": { "targetDefaults": {
"build": { "build": {
"cache": true, "cache": true,
"inputs": [ "inputs": ["^production", "production"],
"^production", "dependsOn": ["^build"]
"production"
],
"dependsOn": [
"^build"
]
}, },
"start": { "start": {
"cache": false, "cache": false,
"dependsOn": [ "dependsOn": ["^build"]
"^build"
]
}, },
"lint": { "lint": {
"executor": "@nx/eslint:lint", "executor": "@nx/eslint:lint",
"cache": true, "cache": true,
"outputs": [ "outputs": ["{options.outputFile}"],
"{options.outputFile}"
],
"options": { "options": {
"eslintConfig": "{projectRoot}/eslint.config.mjs", "eslintConfig": "{projectRoot}/eslint.config.mjs",
"cache": true, "cache": true,
@ -67,9 +56,7 @@
"fix": true "fix": true
} }
}, },
"dependsOn": [ "dependsOn": ["^build"]
"^build"
]
}, },
"lint:diff-with-main": { "lint:diff-with-main": {
"executor": "nx:run-commands", "executor": "nx:run-commands",
@ -103,9 +90,7 @@
"write": true "write": true
} }
}, },
"dependsOn": [ "dependsOn": ["^build"]
"^build"
]
}, },
"typecheck": { "typecheck": {
"executor": "nx:run-commands", "executor": "nx:run-commands",
@ -119,30 +104,22 @@
"watch": true "watch": true
} }
}, },
"dependsOn": [ "dependsOn": ["^build"]
"^build"
]
}, },
"test": { "test": {
"executor": "@nx/jest:jest", "executor": "@nx/jest:jest",
"cache": true, "cache": true,
"dependsOn": [ "dependsOn": ["^build"],
"^build"
],
"inputs": [ "inputs": [
"^default", "^default",
"excludeStories", "excludeStories",
"{workspaceRoot}/jest.preset.js" "{workspaceRoot}/jest.preset.js"
], ],
"outputs": [ "outputs": ["{projectRoot}/coverage"],
"{projectRoot}/coverage"
],
"options": { "options": {
"jestConfig": "{projectRoot}/jest.config.mjs", "jestConfig": "{projectRoot}/jest.config.mjs",
"coverage": true, "coverage": true,
"coverageReporters": [ "coverageReporters": ["text-summary"],
"text-summary"
],
"cacheDirectory": "../../.cache/jest/{projectRoot}" "cacheDirectory": "../../.cache/jest/{projectRoot}"
}, },
"configurations": { "configurations": {
@ -151,10 +128,7 @@
"maxWorkers": 3 "maxWorkers": 3
}, },
"coverage": { "coverage": {
"coverageReporters": [ "coverageReporters": ["lcov", "text"]
"lcov",
"text"
]
}, },
"watch": { "watch": {
"watch": true "watch": true
@ -163,36 +137,25 @@
}, },
"test:e2e": { "test:e2e": {
"cache": true, "cache": true,
"dependsOn": [ "dependsOn": ["^build"]
"^build"
]
}, },
"storybook:build": { "storybook:build": {
"executor": "nx:run-commands", "executor": "nx:run-commands",
"cache": true, "cache": true,
"inputs": [ "inputs": ["^default", "excludeTests"],
"^default", "outputs": ["{projectRoot}/{options.output-dir}"],
"excludeTests"
],
"outputs": [
"{projectRoot}/{options.output-dir}"
],
"options": { "options": {
"cwd": "{projectRoot}", "cwd": "{projectRoot}",
"command": "NODE_OPTIONS='--max-old-space-size=10240' VITE_DISABLE_TYPESCRIPT_CHECKER=true storybook build --test", "command": "NODE_OPTIONS='--max-old-space-size=10240' VITE_DISABLE_TYPESCRIPT_CHECKER=true storybook build --test",
"output-dir": "storybook-static", "output-dir": "storybook-static",
"config-dir": ".storybook" "config-dir": ".storybook"
}, },
"dependsOn": [ "dependsOn": ["^build"]
"^build"
]
}, },
"storybook:serve:dev": { "storybook:serve:dev": {
"executor": "nx:run-commands", "executor": "nx:run-commands",
"cache": true, "cache": true,
"dependsOn": [ "dependsOn": ["^build"],
"^build"
],
"options": { "options": {
"cwd": "{projectRoot}", "cwd": "{projectRoot}",
"command": "storybook dev", "command": "storybook dev",
@ -201,9 +164,7 @@
}, },
"storybook:serve:static": { "storybook:serve:static": {
"executor": "nx:run-commands", "executor": "nx:run-commands",
"dependsOn": [ "dependsOn": ["storybook:build"],
"storybook:build"
],
"options": { "options": {
"cwd": "{projectRoot}", "cwd": "{projectRoot}",
"command": "npx http-server {args.staticDir} -a={args.host} --port={args.port} --silent={args.silent}", "command": "npx http-server {args.staticDir} -a={args.host} --port={args.port} --silent={args.silent}",
@ -216,13 +177,8 @@
"storybook:test": { "storybook:test": {
"executor": "nx:run-commands", "executor": "nx:run-commands",
"cache": true, "cache": true,
"inputs": [ "inputs": ["^default", "excludeTests"],
"^default", "outputs": ["{projectRoot}/coverage/storybook"],
"excludeTests"
],
"outputs": [
"{projectRoot}/coverage/storybook"
],
"options": { "options": {
"cwd": "{projectRoot}", "cwd": "{projectRoot}",
"commands": [ "commands": [
@ -238,10 +194,7 @@
}, },
"storybook:test:no-coverage": { "storybook:test:no-coverage": {
"executor": "nx:run-commands", "executor": "nx:run-commands",
"inputs": [ "inputs": ["^default", "excludeTests"],
"^default",
"excludeTests"
],
"options": { "options": {
"cwd": "{projectRoot}", "cwd": "{projectRoot}",
"commands": [ "commands": [
@ -326,29 +279,21 @@
"inputs": [ "inputs": [
"default", "default",
"{workspaceRoot}/eslint.config.mjs", "{workspaceRoot}/eslint.config.mjs",
"{workspaceRoot}/tools/eslint-rules/**/*" "{workspaceRoot}/packages/twenty-eslint-rules/**/*"
]
},
"@nx/vite:test": {
"cache": true,
"inputs": [
"default",
"^default"
] ]
}, },
"@nx/vite:build": { "@nx/vite:build": {
"cache": true, "cache": true,
"dependsOn": [ "dependsOn": ["^build"],
"^build" "inputs": ["default", "^default"]
], },
"inputs": [ "@nx/vitest:test": {
"default", "cache": true,
"^default" "inputs": ["default", "^default"]
]
} }
}, },
"installation": { "installation": {
"version": "22.0.3" "version": "22.3.3"
}, },
"generators": { "generators": {
"@nx/react": { "@nx/react": {
@ -376,9 +321,7 @@
"tasksRunnerOptions": { "tasksRunnerOptions": {
"default": { "default": {
"options": { "options": {
"cacheableOperations": [ "cacheableOperations": ["storybook:build"]
"storybook:build"
]
} }
} }
}, },

View file

@ -72,14 +72,14 @@
"@graphql-codegen/typescript": "^3.0.4", "@graphql-codegen/typescript": "^3.0.4",
"@graphql-codegen/typescript-operations": "^3.0.4", "@graphql-codegen/typescript-operations": "^3.0.4",
"@graphql-codegen/typescript-react-apollo": "^3.3.7", "@graphql-codegen/typescript-react-apollo": "^3.3.7",
"@nx/eslint": "22.0.3", "@nx/eslint": "22.3.3",
"@nx/eslint-plugin": "22.0.3", "@nx/eslint-plugin": "22.3.3",
"@nx/jest": "22.0.3", "@nx/jest": "22.3.3",
"@nx/js": "22.0.3", "@nx/js": "22.3.3",
"@nx/react": "22.0.3", "@nx/react": "22.3.3",
"@nx/storybook": "22.0.3", "@nx/storybook": "22.3.3",
"@nx/vite": "22.0.3", "@nx/vite": "22.3.3",
"@nx/web": "22.0.3", "@nx/web": "22.3.3",
"@sentry/types": "^8", "@sentry/types": "^8",
"@storybook-community/storybook-addon-cookie": "^5.0.0", "@storybook-community/storybook-addon-cookie": "^5.0.0",
"@storybook/addon-coverage": "^3.0.0", "@storybook/addon-coverage": "^3.0.0",
@ -165,7 +165,7 @@
"jsdom": "~22.1.0", "jsdom": "~22.1.0",
"msw": "^2.0.11", "msw": "^2.0.11",
"msw-storybook-addon": "^2.0.5", "msw-storybook-addon": "^2.0.5",
"nx": "22.0.3", "nx": "22.3.3",
"prettier": "^3.1.1", "prettier": "^3.1.1",
"raw-loader": "^4.0.2", "raw-loader": "^4.0.2",
"rimraf": "^5.0.5", "rimraf": "^5.0.5",
@ -195,7 +195,9 @@
"typescript": "5.9.2", "typescript": "5.9.2",
"graphql-redis-subscriptions/ioredis": "^5.6.0", "graphql-redis-subscriptions/ioredis": "^5.6.0",
"prosemirror-view": "1.40.0", "prosemirror-view": "1.40.0",
"prosemirror-transform": "1.10.4" "prosemirror-transform": "1.10.4",
"@lingui/core": "5.1.2",
"@types/qs": "6.9.16"
}, },
"version": "0.2.1", "version": "0.2.1",
"nx": {}, "nx": {},
@ -220,7 +222,7 @@
"packages/twenty-apps", "packages/twenty-apps",
"packages/twenty-cli", "packages/twenty-cli",
"packages/create-twenty-app", "packages/create-twenty-app",
"tools/eslint-rules" "packages/twenty-eslint-rules"
] ]
}, },
"prettier": { "prettier": {

View file

@ -1,7 +1,7 @@
import typescriptParser from '@typescript-eslint/parser'; import typescriptParser from '@typescript-eslint/parser';
import path from 'path'; import path from 'path';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
import reactConfig from '../../../../../tools/eslint-rules/eslint.config.react.mjs'; import reactConfig from '../../../../twenty-eslint-rules/eslint.config.react.mjs';
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename); const __dirname = path.dirname(__filename);

View file

@ -8,7 +8,7 @@ COPY ./yarn.lock .
COPY ./.yarnrc.yml . COPY ./.yarnrc.yml .
COPY ./.yarn/releases /app/.yarn/releases COPY ./.yarn/releases /app/.yarn/releases
COPY ./.yarn/patches /app/.yarn/patches COPY ./.yarn/patches /app/.yarn/patches
COPY ./tools/eslint-rules /app/tools/eslint-rules COPY ./packages/twenty-eslint-rules /app/packages/twenty-eslint-rules
COPY ./packages/twenty-ui/package.json /app/packages/twenty-ui/ COPY ./packages/twenty-ui/package.json /app/packages/twenty-ui/
COPY ./packages/twenty-shared/package.json /app/packages/twenty-shared/ COPY ./packages/twenty-shared/package.json /app/packages/twenty-shared/
COPY ./packages/twenty-website/package.json /app/packages/twenty-website/package.json COPY ./packages/twenty-website/package.json /app/packages/twenty-website/package.json

View file

@ -1,7 +1,7 @@
import typescriptParser from '@typescript-eslint/parser'; import typescriptParser from '@typescript-eslint/parser';
import path from 'path'; import path from 'path';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
import reactConfig from '../../tools/eslint-rules/eslint.config.react.mjs'; import reactConfig from '../twenty-eslint-rules/eslint.config.react.mjs';
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename); const __dirname = path.dirname(__filename);

View file

@ -1,4 +1,4 @@
/* eslint-disable @nx/workspace-no-hardcoded-colors */ /* eslint-disable twenty/no-hardcoded-colors */
const grayScale = { const grayScale = {
gray100: '#000000', gray100: '#000000',

View file

@ -13,6 +13,8 @@ import unicornPlugin from 'eslint-plugin-unicorn';
import unusedImportsPlugin from 'eslint-plugin-unused-imports'; import unusedImportsPlugin from 'eslint-plugin-unused-imports';
import jsoncParser from 'jsonc-eslint-parser'; import jsoncParser from 'jsonc-eslint-parser';
const twentyRules = await nxPlugin.loadWorkspaceRules('packages/twenty-eslint-rules');
export default [ export default [
// Base JavaScript configuration // Base JavaScript configuration
js.configs.recommended, js.configs.recommended,
@ -34,6 +36,7 @@ export default [
'import': importPlugin, 'import': importPlugin,
'unused-imports': unusedImportsPlugin, 'unused-imports': unusedImportsPlugin,
'unicorn': unicornPlugin, 'unicorn': unicornPlugin,
'twenty': { rules: twentyRules },
}, },
settings: { settings: {
react: { react: {
@ -567,17 +570,17 @@ export default [
'@typescript-eslint/no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': 'off',
// Custom workspace rules // Custom workspace rules
'@nx/workspace-effect-components': 'error', 'twenty/effect-components': 'error',
'@nx/workspace-no-hardcoded-colors': 'error', 'twenty/no-hardcoded-colors': 'error',
'@nx/workspace-matching-state-variable': 'error', 'twenty/matching-state-variable': 'error',
'@nx/workspace-sort-css-properties-alphabetically': 'error', 'twenty/sort-css-properties-alphabetically': 'error',
'@nx/workspace-styled-components-prefixed-with-styled': 'error', 'twenty/styled-components-prefixed-with-styled': 'error',
'@nx/workspace-no-state-useref': 'error', 'twenty/no-state-useref': 'error',
'@nx/workspace-component-props-naming': 'error', 'twenty/component-props-naming': 'error',
'@nx/workspace-explicit-boolean-predicates-in-if': 'error', 'twenty/explicit-boolean-predicates-in-if': 'error',
'@nx/workspace-use-getLoadable-and-getValue-to-get-atoms': 'error', 'twenty/use-getLoadable-and-getValue-to-get-atoms': 'error',
'@nx/workspace-useRecoilCallback-has-dependency-array': 'error', 'twenty/useRecoilCallback-has-dependency-array': 'error',
'@nx/workspace-no-navigate-prefer-link': 'error', 'twenty/no-navigate-prefer-link': 'error',
}, },
}, },
@ -721,7 +724,7 @@ export default [
}, },
}, },
], ],
'@nx/workspace-max-consts-per-file': ['error', { max: 1 }], 'twenty/max-consts-per-file': ['error', { max: 1 }],
}, },
}, },
@ -778,7 +781,7 @@ export default [
}, },
}, },
], ],
'@nx/workspace-max-consts-per-file': ['error', { max: 1 }], 'twenty/max-consts-per-file': ['error', { max: 1 }],
}, },
}, },

View file

@ -1,11 +1,11 @@
export default { export default {
displayName: 'eslint-rules', displayName: 'twenty-eslint-rules',
silent: false, silent: false,
preset: '../../jest.preset.js', preset: '../../jest.preset.js',
transform: { transform: {
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }], '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
}, },
moduleFileExtensions: ['ts', 'js', 'html'], moduleFileExtensions: ['ts', 'js', 'html'],
coverageDirectory: '../../coverage/tools/eslint-rules', coverageDirectory: '../../coverage/packages/twenty-eslint-rules',
}; };

View file

@ -1,7 +1,7 @@
{ {
"name": "eslint-rules", "name": "twenty-eslint-rules",
"$schema": "../../node_modules/nx/schemas/project-schema.json", "$schema": "../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "tools/eslint-rules", "sourceRoot": "packages/twenty-eslint-rules",
"tags": ["scope:shared"], "tags": ["scope:shared"],
"targets": { "targets": {
"lint": { "lint": {

View file

@ -1,7 +1,10 @@
import { ThemeProvider } from '@emotion/react'; import { ThemeProvider } from '@emotion/react';
import { i18n } from '@lingui/core';
import { I18nProvider } from '@lingui/react';
import { type Preview } from '@storybook/react-vite'; import { type Preview } from '@storybook/react-vite';
import { initialize, mswLoader } from 'msw-storybook-addon'; import { initialize, mswLoader } from 'msw-storybook-addon';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { SOURCE_LOCALE } from 'twenty-shared/translations';
//import { useDarkMode } from 'storybook-dark-mode'; //import { useDarkMode } from 'storybook-dark-mode';
// eslint-disable-next-line no-restricted-imports // eslint-disable-next-line no-restricted-imports
@ -10,6 +13,12 @@ import { RootDecorator } from '../src/testing/decorators/RootDecorator';
import 'react-loading-skeleton/dist/skeleton.css'; import 'react-loading-skeleton/dist/skeleton.css';
import 'twenty-ui/style.css'; import 'twenty-ui/style.css';
import { THEME_LIGHT, ThemeContextProvider } from 'twenty-ui/theme'; import { THEME_LIGHT, ThemeContextProvider } from 'twenty-ui/theme';
// eslint-disable-next-line no-restricted-imports
import { messages as enMessages } from '../src/locales/generated/en';
// Initialize i18n globally for all stories
i18n.load({ [SOURCE_LOCALE]: enMessages });
i18n.activate(SOURCE_LOCALE);
import { mockedUserJWT } from '~/testing/mock-data/jwt'; import { mockedUserJWT } from '~/testing/mock-data/jwt';
// eslint-disable-next-line no-restricted-imports // eslint-disable-next-line no-restricted-imports
import { ClickOutsideListenerContext } from '../src/modules/ui/utilities/pointer-event/contexts/ClickOutsideListenerContext'; import { ClickOutsideListenerContext } from '../src/modules/ui/utilities/pointer-event/contexts/ClickOutsideListenerContext';
@ -59,15 +68,17 @@ const preview: Preview = {
}, [theme]); }, [theme]);
return ( return (
<ThemeProvider theme={theme}> <I18nProvider i18n={i18n}>
<ThemeContextProvider theme={theme}> <ThemeProvider theme={theme}>
<ClickOutsideListenerContext.Provider <ThemeContextProvider theme={theme}>
value={{ excludedClickOutsideId: undefined }} <ClickOutsideListenerContext.Provider
> value={{ excludedClickOutsideId: undefined }}
<Story /> >
</ClickOutsideListenerContext.Provider> <Story />
</ThemeContextProvider> </ClickOutsideListenerContext.Provider>
</ThemeProvider> </ThemeContextProvider>
</ThemeProvider>
</I18nProvider>
); );
}, },
RootDecorator, RootDecorator,

View file

@ -1,7 +1,7 @@
import typescriptParser from '@typescript-eslint/parser'; import typescriptParser from '@typescript-eslint/parser';
import path from 'path'; import path from 'path';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
import reactConfig from '../../tools/eslint-rules/eslint.config.react.mjs'; import reactConfig from '../twenty-eslint-rules/eslint.config.react.mjs';
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename); const __dirname = path.dirname(__filename);

View file

@ -22,6 +22,7 @@ const jestConfig = {
preset: '../../jest.preset.js', preset: '../../jest.preset.js',
setupFilesAfterEnv: ['./setupTests.ts'], setupFilesAfterEnv: ['./setupTests.ts'],
testEnvironment: 'jsdom', testEnvironment: 'jsdom',
testEnvironmentOptions: {},
transformIgnorePatterns: [ transformIgnorePatterns: [
'/node_modules/(?!(twenty-ui)/.*)', '/node_modules/(?!(twenty-ui)/.*)',

View file

@ -4,6 +4,14 @@
// learn more: https://github.com/testing-library/jest-dom // learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom'; import '@testing-library/jest-dom';
import { i18n } from '@lingui/core';
import { SOURCE_LOCALE } from 'twenty-shared/translations';
import { messages as enMessages } from '~/locales/generated/en';
// Initialize i18n for all tests
i18n.load({ [SOURCE_LOCALE]: enMessages });
i18n.activate(SOURCE_LOCALE);
// Add Jest matchers for toThrowError and other missing methods // Add Jest matchers for toThrowError and other missing methods
declare global { declare global {
namespace jest { namespace jest {

View file

@ -1,7 +1,7 @@
import { useRef } from 'react'; import { useRef } from 'react';
export const useFirstMountState = (): boolean => { export const useFirstMountState = (): boolean => {
// eslint-disable-next-line @nx/workspace-no-state-useref // eslint-disable-next-line twenty/no-state-useref
const isFirst = useRef(true); const isFirst = useRef(true);
if (isFirst.current) { if (isFirst.current) {

View file

@ -15,7 +15,6 @@ import {
getCanvasElementForDropdownTesting, getCanvasElementForDropdownTesting,
} from 'twenty-ui/testing'; } from 'twenty-ui/testing';
import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorator'; import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorator';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
const deleteMock = test.fn(); const deleteMock = test.fn();
const addToFavoritesMock = test.fn(); const addToFavoritesMock = test.fn();
const exportMock = test.fn(); const exportMock = test.fn();
@ -24,7 +23,6 @@ const meta: Meta<typeof CommandMenuActionMenuDropdown> = {
title: 'Modules/ActionMenu/CommandMenuActionMenuDropdown', title: 'Modules/ActionMenu/CommandMenuActionMenuDropdown',
component: CommandMenuActionMenuDropdown, component: CommandMenuActionMenuDropdown,
decorators: [ decorators: [
I18nFrontDecorator,
(Story) => ( (Story) => (
<RecoilRoot <RecoilRoot
initializeState={({ set }) => { initializeState={({ set }) => {

View file

@ -15,7 +15,6 @@ import {
getCanvasElementForDropdownTesting, getCanvasElementForDropdownTesting,
} from 'twenty-ui/testing'; } from 'twenty-ui/testing';
import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorator'; import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorator';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
const deleteMock = test.fn(); const deleteMock = test.fn();
const addToFavoritesMock = test.fn(); const addToFavoritesMock = test.fn();
@ -25,7 +24,6 @@ const meta: Meta<typeof RecordIndexActionMenuDropdown> = {
title: 'Modules/ActionMenu/RecordIndexActionMenuDropdown', title: 'Modules/ActionMenu/RecordIndexActionMenuDropdown',
component: RecordIndexActionMenuDropdown, component: RecordIndexActionMenuDropdown,
decorators: [ decorators: [
I18nFrontDecorator,
(Story) => ( (Story) => (
<RecoilRoot <RecoilRoot
initializeState={({ set }) => { initializeState={({ set }) => {

View file

@ -8,7 +8,6 @@ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSi
import { LayoutRenderingProvider } from '@/ui/layout/contexts/LayoutRenderingContext'; import { LayoutRenderingProvider } from '@/ui/layout/contexts/LayoutRenderingContext';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { PageLayoutType } from '~/generated/graphql'; import { PageLayoutType } from '~/generated/graphql';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { graphqlMocks } from '~/testing/graphqlMocks'; import { graphqlMocks } from '~/testing/graphqlMocks';
@ -18,7 +17,6 @@ const meta: Meta<typeof CalendarEventsCard> = {
title: 'Modules/Activities/Calendar/CalendarEventsCard', title: 'Modules/Activities/Calendar/CalendarEventsCard',
component: CalendarEventsCard, component: CalendarEventsCard,
decorators: [ decorators: [
I18nFrontDecorator,
ComponentDecorator, ComponentDecorator,
ObjectMetadataItemsDecorator, ObjectMetadataItemsDecorator,
SnackBarDecorator, SnackBarDecorator,

View file

@ -5,7 +5,6 @@ import { type ActivityTargetableObject } from '@/activities/types/ActivityTarget
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext'; import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { TabListComponentInstanceContext } from '@/ui/layout/tab-list/states/contexts/TabListComponentInstanceContext'; import { TabListComponentInstanceContext } from '@/ui/layout/tab-list/states/contexts/TabListComponentInstanceContext';
import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator'; import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { graphqlMocks } from '~/testing/graphqlMocks'; import { graphqlMocks } from '~/testing/graphqlMocks';
@ -29,7 +28,6 @@ const meta: Meta<typeof TaskGroups> = {
ComponentWithRouterDecorator, ComponentWithRouterDecorator,
ObjectMetadataItemsDecorator, ObjectMetadataItemsDecorator,
SnackBarDecorator, SnackBarDecorator,
I18nFrontDecorator,
], ],
}; };

View file

@ -3,7 +3,6 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
import { TaskList } from '@/activities/tasks/components/TaskList'; import { TaskList } from '@/activities/tasks/components/TaskList';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorator'; import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorator';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator'; import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { RightDrawerDecorator } from '~/testing/decorators/RightDrawerDecorator'; import { RightDrawerDecorator } from '~/testing/decorators/RightDrawerDecorator';
@ -17,7 +16,6 @@ const meta: Meta<typeof TaskList> = {
decorators: [ decorators: [
ComponentDecorator, ComponentDecorator,
ContextStoreDecorator, ContextStoreDecorator,
I18nFrontDecorator,
MemoryRouterDecorator, MemoryRouterDecorator,
ObjectMetadataItemsDecorator, ObjectMetadataItemsDecorator,
SnackBarDecorator, SnackBarDecorator,

View file

@ -3,7 +3,6 @@ import { HttpResponse, graphql } from 'msw';
import { EventCardCalendarEvent } from '@/activities/timeline-activities/rows/calendar/components/EventCardCalendarEvent'; import { EventCardCalendarEvent } from '@/activities/timeline-activities/rows/calendar/components/EventCardCalendarEvent';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
@ -11,7 +10,6 @@ const meta: Meta<typeof EventCardCalendarEvent> = {
title: 'Modules/TimelineActivities/Rows/CalendarEvent/EventCardCalendarEvent', title: 'Modules/TimelineActivities/Rows/CalendarEvent/EventCardCalendarEvent',
component: EventCardCalendarEvent, component: EventCardCalendarEvent,
decorators: [ decorators: [
I18nFrontDecorator,
ComponentDecorator, ComponentDecorator,
ObjectMetadataItemsDecorator, ObjectMetadataItemsDecorator,
SnackBarDecorator, SnackBarDecorator,

View file

@ -3,7 +3,6 @@ import { type TimelineActivity } from '@/activities/timeline-activities/types/Ti
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing'; import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems'; import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems';
@ -45,7 +44,6 @@ const meta: Meta<typeof EventRowMainObjectUpdated> = {
ObjectMetadataItemsDecorator, ObjectMetadataItemsDecorator,
SnackBarDecorator, SnackBarDecorator,
RouterDecorator, RouterDecorator,
I18nFrontDecorator,
], ],
}; };

View file

@ -6,7 +6,6 @@ import { TimelineActivityContext } from '@/activities/timeline-activities/contex
import { EventCardMessage } from '@/activities/timeline-activities/rows/message/components/EventCardMessage'; import { EventCardMessage } from '@/activities/timeline-activities/rows/message/components/EventCardMessage';
import { FIELD_RESTRICTED_ADDITIONAL_PERMISSIONS_REQUIRED } from 'twenty-shared/constants'; import { FIELD_RESTRICTED_ADDITIONAL_PERMISSIONS_REQUIRED } from 'twenty-shared/constants';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
@ -14,7 +13,6 @@ const meta: Meta<typeof EventCardMessage> = {
title: 'Modules/TimelineActivities/Rows/Message/EventCardMessage', title: 'Modules/TimelineActivities/Rows/Message/EventCardMessage',
component: EventCardMessage, component: EventCardMessage,
decorators: [ decorators: [
I18nFrontDecorator,
ComponentDecorator, ComponentDecorator,
ObjectMetadataItemsDecorator, ObjectMetadataItemsDecorator,
SnackBarDecorator, SnackBarDecorator,

View file

@ -4,7 +4,6 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, waitFor } from 'storybook/test'; import { expect, fn, userEvent, waitFor } from 'storybook/test';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing'; import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { WorkflowStepActionDrawerDecorator } from '~/testing/decorators/WorkflowStepActionDrawerDecorator'; import { WorkflowStepActionDrawerDecorator } from '~/testing/decorators/WorkflowStepActionDrawerDecorator';
@ -75,7 +74,6 @@ const meta: Meta<typeof EditorWrapper> = {
SnackBarDecorator, SnackBarDecorator,
RouterDecorator, RouterDecorator,
WorkspaceDecorator, WorkspaceDecorator,
I18nFrontDecorator,
], ],
}; };

View file

@ -4,7 +4,6 @@ import { type ExtendedUIMessage } from 'twenty-shared/ai';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { AIChatMessage } from '@/ai/components/AIChatMessage'; import { AIChatMessage } from '@/ai/components/AIChatMessage';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { RootDecorator } from '~/testing/decorators/RootDecorator'; import { RootDecorator } from '~/testing/decorators/RootDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
@ -176,12 +175,7 @@ print(df.head())`,
const meta: Meta<typeof AIChatMessage> = { const meta: Meta<typeof AIChatMessage> = {
title: 'Modules/AI/AIChatMessage', title: 'Modules/AI/AIChatMessage',
component: AIChatMessage, component: AIChatMessage,
decorators: [ decorators: [ComponentDecorator, RootDecorator, SnackBarDecorator],
ComponentDecorator,
RootDecorator,
I18nFrontDecorator,
SnackBarDecorator,
],
parameters: { parameters: {
container: { width: 700 }, container: { width: 700 },
}, },

View file

@ -3,7 +3,6 @@ import { expect, userEvent, within } from 'storybook/test';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { CodeExecutionDisplay } from '@/ai/components/CodeExecutionDisplay'; import { CodeExecutionDisplay } from '@/ai/components/CodeExecutionDisplay';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
const samplePythonCode = `import pandas as pd const samplePythonCode = `import pandas as pd
@ -31,7 +30,7 @@ plt.savefig('revenue_chart.png')`;
const meta: Meta<typeof CodeExecutionDisplay> = { const meta: Meta<typeof CodeExecutionDisplay> = {
title: 'Modules/AI/CodeExecutionDisplay', title: 'Modules/AI/CodeExecutionDisplay',
component: CodeExecutionDisplay, component: CodeExecutionDisplay,
decorators: [I18nFrontDecorator, SnackBarDecorator, ComponentDecorator], decorators: [SnackBarDecorator, ComponentDecorator],
parameters: { parameters: {
container: { width: 600 }, container: { width: 600 },
}, },

View file

@ -3,13 +3,12 @@ import { expect, userEvent, within } from 'storybook/test';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { TerminalOutput } from '@/ai/components/TerminalOutput'; import { TerminalOutput } from '@/ai/components/TerminalOutput';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
const meta: Meta<typeof TerminalOutput> = { const meta: Meta<typeof TerminalOutput> = {
title: 'Modules/AI/TerminalOutput', title: 'Modules/AI/TerminalOutput',
component: TerminalOutput, component: TerminalOutput,
decorators: [I18nFrontDecorator, SnackBarDecorator, ComponentDecorator], decorators: [SnackBarDecorator, ComponentDecorator],
parameters: { parameters: {
container: { width: 500 }, container: { width: 500 },
}, },

View file

@ -20,7 +20,7 @@ import { isDefined } from 'twenty-shared/utils';
import { ApolloFactory, type Options } from '@/apollo/services/apollo.factory'; import { ApolloFactory, type Options } from '@/apollo/services/apollo.factory';
export const useApolloFactory = (options: Partial<Options<any>> = {}) => { export const useApolloFactory = (options: Partial<Options<any>> = {}) => {
// eslint-disable-next-line @nx/workspace-no-state-useref // eslint-disable-next-line twenty/no-state-useref
const apolloRef = useRef<ApolloFactory<NormalizedCacheObject> | null>(null); const apolloRef = useRef<ApolloFactory<NormalizedCacheObject> | null>(null);
const navigate = useNavigate(); const navigate = useNavigate();

View file

@ -1,15 +1,15 @@
import { OperationType } from '@/apollo/types/operation-type'; import { OperationType } from '@/apollo/types/operation-type';
const operationTypeColors = { const operationTypeColors = {
// eslint-disable-next-line @nx/workspace-no-hardcoded-colors // eslint-disable-next-line twenty/no-hardcoded-colors
query: '#03A9F4', query: '#03A9F4',
// eslint-disable-next-line @nx/workspace-no-hardcoded-colors // eslint-disable-next-line twenty/no-hardcoded-colors
mutation: '#61A600', mutation: '#61A600',
// eslint-disable-next-line @nx/workspace-no-hardcoded-colors // eslint-disable-next-line twenty/no-hardcoded-colors
subscription: '#61A600', subscription: '#61A600',
// eslint-disable-next-line @nx/workspace-no-hardcoded-colors // eslint-disable-next-line twenty/no-hardcoded-colors
error: '#F51818', error: '#F51818',
// eslint-disable-next-line @nx/workspace-no-hardcoded-colors // eslint-disable-next-line twenty/no-hardcoded-colors
default: '#61A600', default: '#61A600',
}; };

View file

@ -70,7 +70,7 @@ export const loggerLink = (getSchemaName: (operation: Operation) => string) =>
errors.forEach((err: any) => { errors.forEach((err: any) => {
logDebug( logDebug(
`%c${err.message}`, `%c${err.message}`,
// eslint-disable-next-line @nx/workspace-no-hardcoded-colors // eslint-disable-next-line twenty/no-hardcoded-colors
'color: #F51818; font-weight: lighter', 'color: #F51818; font-weight: lighter',
); );
}); });

View file

@ -31,13 +31,13 @@ export const variables = {
email, email,
password, password,
workspacePersonalInviteToken: null, workspacePersonalInviteToken: null,
locale: '', locale: 'en',
}, },
signUpInWorkspace: { signUpInWorkspace: {
email, email,
password, password,
workspacePersonalInviteToken: null, workspacePersonalInviteToken: null,
locale: '', locale: 'en',
}, },
getCurrentUser: {}, getCurrentUser: {},
}; };

View file

@ -35,7 +35,6 @@ import { RecordComponentInstanceContextsWrapper } from '@/object-record/componen
import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext'; import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext';
import { HttpResponse, graphql } from 'msw'; import { HttpResponse, graphql } from 'msw';
import { IconDotsVertical } from 'twenty-ui/display'; import { IconDotsVertical } from 'twenty-ui/display';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { JestContextStoreSetter } from '~/testing/jest/JestContextStoreSetter'; import { JestContextStoreSetter } from '~/testing/jest/JestContextStoreSetter';
const openTimeout = 50; const openTimeout = 50;
@ -72,7 +71,6 @@ const meta: Meta<typeof CommandMenu> = {
title: 'Modules/CommandMenu/CommandMenu', title: 'Modules/CommandMenu/CommandMenu',
component: CommandMenuRouter, component: CommandMenuRouter,
decorators: [ decorators: [
I18nFrontDecorator,
(Story) => { (Story) => {
const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState); const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState);
const setCurrentUserWorkspace = useSetRecoilState( const setCurrentUserWorkspace = useSetRecoilState(

View file

@ -7,13 +7,11 @@ import { KeyboardShortcutMenu } from '@/keyboard-shortcut-menu/components/Keyboa
import { useKeyboardShortcutMenu } from '@/keyboard-shortcut-menu/hooks/useKeyboardShortcutMenu'; import { useKeyboardShortcutMenu } from '@/keyboard-shortcut-menu/hooks/useKeyboardShortcutMenu';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator'; import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
const meta: Meta<typeof KeyboardShortcutMenu> = { const meta: Meta<typeof KeyboardShortcutMenu> = {
title: 'Modules/KeyboardShortcutMenu/KeyboardShortcutMenu', title: 'Modules/KeyboardShortcutMenu/KeyboardShortcutMenu',
component: KeyboardShortcutMenu, component: KeyboardShortcutMenu,
decorators: [ decorators: [
I18nFrontDecorator,
(Story) => { (Story) => {
const { openKeyboardShortcutMenu } = useKeyboardShortcutMenu(); const { openKeyboardShortcutMenu } = useKeyboardShortcutMenu();
useEffect(() => { useEffect(() => {

View file

@ -15,7 +15,6 @@ import {
} from '@/navigation/components/AppNavigationDrawer'; } from '@/navigation/components/AppNavigationDrawer';
import { isNavigationDrawerExpandedState } from '@/ui/navigation/states/isNavigationDrawerExpanded'; import { isNavigationDrawerExpandedState } from '@/ui/navigation/states/isNavigationDrawerExpanded';
import { AppPath } from 'twenty-shared/types'; import { AppPath } from 'twenty-shared/types';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
const MobileNavigationDrawerStateSetterEffect = ({ const MobileNavigationDrawerStateSetterEffect = ({
mobileNavigationDrawer = 'main', mobileNavigationDrawer = 'main',
@ -55,7 +54,6 @@ const meta: Meta<StoryArgs> = {
decorators: [ decorators: [
IconsProviderDecorator, IconsProviderDecorator,
ObjectMetadataItemsDecorator, ObjectMetadataItemsDecorator,
I18nFrontDecorator,
(Story, { args }) => ( (Story, { args }) => (
<MemoryRouter initialEntries={[args.routePath]}> <MemoryRouter initialEntries={[args.routePath]}>
<Story /> <Story />

View file

@ -18,7 +18,6 @@ import { MemoryRouter } from 'react-router-dom';
import { useSetRecoilState } from 'recoil'; import { useSetRecoilState } from 'recoil';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorator'; import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorator';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator'; import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
@ -31,7 +30,6 @@ const meta: Meta<typeof ObjectOptionsDropdownContent> = {
'Modules/ObjectRecord/ObjectOptionsDropdown/ObjectOptionsDropdownContent', 'Modules/ObjectRecord/ObjectOptionsDropdown/ObjectOptionsDropdownContent',
component: ObjectOptionsDropdownContent, component: ObjectOptionsDropdownContent,
decorators: [ decorators: [
I18nFrontDecorator,
(Story) => { (Story) => {
const setObjectMetadataItems = useSetRecoilState( const setObjectMetadataItems = useSetRecoilState(
objectMetadataItemsState, objectMetadataItemsState,

View file

@ -22,7 +22,6 @@ import { coreViewsState } from '@/views/states/coreViewState';
import { useSetRecoilState } from 'recoil'; import { useSetRecoilState } from 'recoil';
import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing'; import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing';
import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorator'; import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorator';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator'; import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
@ -141,7 +140,6 @@ const meta: Meta<typeof RecordCalendarMonth> = {
SnackBarDecorator, SnackBarDecorator,
ComponentDecorator, ComponentDecorator,
IconsProviderDecorator, IconsProviderDecorator,
I18nFrontDecorator,
RouterDecorator, RouterDecorator,
], ],
}; };

View file

@ -15,7 +15,6 @@ import { RecordDetailRelationSection } from '@/object-record/record-field-list/r
import { LayoutRenderingProvider } from '@/ui/layout/contexts/LayoutRenderingContext'; import { LayoutRenderingProvider } from '@/ui/layout/contexts/LayoutRenderingContext';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { PageLayoutType } from '~/generated/graphql'; import { PageLayoutType } from '~/generated/graphql';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { RightDrawerDecorator } from '~/testing/decorators/RightDrawerDecorator'; import { RightDrawerDecorator } from '~/testing/decorators/RightDrawerDecorator';
import { allMockPersonRecords } from '~/testing/mock-data/people'; import { allMockPersonRecords } from '~/testing/mock-data/people';
import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems'; import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems';
@ -78,7 +77,6 @@ const meta: Meta<typeof RecordDetailRelationSection> = {
ObjectMetadataItemsDecorator, ObjectMetadataItemsDecorator,
SnackBarDecorator, SnackBarDecorator,
MemoryRouterDecorator, MemoryRouterDecorator,
I18nFrontDecorator,
], ],
parameters: { parameters: {
msw: graphqlMocks, msw: graphqlMocks,

View file

@ -1,7 +1,6 @@
import { FormAddressFieldInput } from '@/object-record/record-field/ui/form-types/components/FormAddressFieldInput'; import { FormAddressFieldInput } from '@/object-record/record-field/ui/form-types/components/FormAddressFieldInput';
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, within } from 'storybook/test'; import { expect, fn, userEvent, within } from 'storybook/test';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
const meta: Meta<typeof FormAddressFieldInput> = { const meta: Meta<typeof FormAddressFieldInput> = {
@ -9,7 +8,7 @@ const meta: Meta<typeof FormAddressFieldInput> = {
component: FormAddressFieldInput, component: FormAddressFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -4,7 +4,6 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
import { graphql, HttpResponse } from 'msw'; import { graphql, HttpResponse } from 'msw';
import { expect, fn, userEvent, within } from 'storybook/test'; import { expect, fn, userEvent, within } from 'storybook/test';
import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing'; import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { WorkflowStepActionDrawerDecorator } from '~/testing/decorators/WorkflowStepActionDrawerDecorator'; import { WorkflowStepActionDrawerDecorator } from '~/testing/decorators/WorkflowStepActionDrawerDecorator';
@ -101,7 +100,6 @@ const meta: Meta<typeof FormAdvancedTextFieldInput> = {
SnackBarDecorator, SnackBarDecorator,
RouterDecorator, RouterDecorator,
WorkspaceDecorator, WorkspaceDecorator,
I18nFrontDecorator,
], ],
}; };

View file

@ -3,7 +3,6 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, waitFor, within } from 'storybook/test'; import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
import { getCanvasElementForDropdownTesting } from 'twenty-ui/testing'; import { getCanvasElementForDropdownTesting } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -12,7 +11,7 @@ const meta: Meta<typeof FormArrayFieldInput> = {
component: FormArrayFieldInput, component: FormArrayFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -2,7 +2,6 @@ import { FormBooleanFieldInput } from '@/object-record/record-field/ui/form-type
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, waitFor, within } from 'storybook/test'; import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
import { getCanvasElementForDropdownTesting } from 'twenty-ui/testing'; import { getCanvasElementForDropdownTesting } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -11,7 +10,7 @@ const meta: Meta<typeof FormBooleanFieldInput> = {
component: FormBooleanFieldInput, component: FormBooleanFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -3,7 +3,6 @@ import { type FieldCurrencyValue } from '@/object-record/record-field/ui/types/F
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, within } from 'storybook/test'; import { expect, within } from 'storybook/test';
import { CurrencyCode } from 'twenty-shared/constants'; import { CurrencyCode } from 'twenty-shared/constants';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -12,7 +11,7 @@ const meta: Meta<typeof FormCurrencyFieldInput> = {
component: FormCurrencyFieldInput, component: FormCurrencyFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -1,7 +1,6 @@
import { FormEmailsFieldInput } from '@/object-record/record-field/ui/form-types/components/FormEmailsFieldInput'; import { FormEmailsFieldInput } from '@/object-record/record-field/ui/form-types/components/FormEmailsFieldInput';
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, waitFor, within } from 'storybook/test'; import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -10,7 +9,7 @@ const meta: Meta<typeof FormEmailsFieldInput> = {
component: FormEmailsFieldInput, component: FormEmailsFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -1,7 +1,6 @@
import { FormFullNameFieldInput } from '@/object-record/record-field/ui/form-types/components/FormFullNameFieldInput'; import { FormFullNameFieldInput } from '@/object-record/record-field/ui/form-types/components/FormFullNameFieldInput';
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, within } from 'storybook/test'; import { expect, fn, userEvent, within } from 'storybook/test';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -10,7 +9,7 @@ const meta: Meta<typeof FormFullNameFieldInput> = {
component: FormFullNameFieldInput, component: FormFullNameFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -1,7 +1,6 @@
import { FormLinksFieldInput } from '@/object-record/record-field/ui/form-types/components/FormLinksFieldInput'; import { FormLinksFieldInput } from '@/object-record/record-field/ui/form-types/components/FormLinksFieldInput';
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, within } from 'storybook/test'; import { expect, fn, userEvent, within } from 'storybook/test';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
const meta: Meta<typeof FormLinksFieldInput> = { const meta: Meta<typeof FormLinksFieldInput> = {
@ -9,7 +8,7 @@ const meta: Meta<typeof FormLinksFieldInput> = {
component: FormLinksFieldInput, component: FormLinksFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -1,7 +1,6 @@
import { FormMultiSelectFieldInput } from '@/object-record/record-field/ui/form-types/components/FormMultiSelectFieldInput'; import { FormMultiSelectFieldInput } from '@/object-record/record-field/ui/form-types/components/FormMultiSelectFieldInput';
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, within } from 'storybook/test'; import { expect, fn, userEvent, within } from 'storybook/test';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -10,7 +9,7 @@ const meta: Meta<typeof FormMultiSelectFieldInput> = {
component: FormMultiSelectFieldInput, component: FormMultiSelectFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -4,7 +4,6 @@ import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
import { FormPhoneFieldInput } from '@/object-record/record-field/ui/form-types/components/FormPhoneFieldInput'; import { FormPhoneFieldInput } from '@/object-record/record-field/ui/form-types/components/FormPhoneFieldInput';
import { type FieldPhonesValue } from '@/object-record/record-field/ui/types/FieldMetadata'; import { type FieldPhonesValue } from '@/object-record/record-field/ui/types/FieldMetadata';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -13,7 +12,7 @@ const meta: Meta<typeof FormPhoneFieldInput> = {
component: FormPhoneFieldInput, component: FormPhoneFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -2,7 +2,6 @@ import { FormRawJsonFieldInput } from '@/object-record/record-field/ui/form-type
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, waitFor, within } from 'storybook/test'; import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
import { getUserDevice } from 'twenty-ui/utilities'; import { getUserDevice } from 'twenty-ui/utilities';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -11,7 +10,7 @@ const meta: Meta<typeof FormRawJsonFieldInput> = {
component: FormRawJsonFieldInput, component: FormRawJsonFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -9,7 +9,6 @@ import {
within, within,
} from 'storybook/test'; } from 'storybook/test';
import { getUserDevice } from 'twenty-ui/utilities'; import { getUserDevice } from 'twenty-ui/utilities';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -18,7 +17,7 @@ const meta: Meta<typeof FormRichTextV2FieldInput> = {
component: FormRichTextV2FieldInput, component: FormRichTextV2FieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -1,7 +1,6 @@
import { FormSelectFieldInput } from '@/object-record/record-field/ui/form-types/components/FormSelectFieldInput'; import { FormSelectFieldInput } from '@/object-record/record-field/ui/form-types/components/FormSelectFieldInput';
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, within } from 'storybook/test'; import { expect, fn, userEvent, within } from 'storybook/test';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -10,7 +9,7 @@ const meta: Meta<typeof FormSelectFieldInput> = {
component: FormSelectFieldInput, component: FormSelectFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -3,7 +3,6 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, within } from 'storybook/test'; import { expect, fn, userEvent, within } from 'storybook/test';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing'; import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
@ -20,7 +19,6 @@ const meta: Meta<typeof FormSingleRecordPicker> = {
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [ decorators: [
I18nFrontDecorator,
ObjectMetadataItemsDecorator, ObjectMetadataItemsDecorator,
ComponentDecorator, ComponentDecorator,
WorkspaceDecorator, WorkspaceDecorator,

View file

@ -9,7 +9,6 @@ import {
within, within,
} from 'storybook/test'; } from 'storybook/test';
import { getUserDevice } from 'twenty-ui/utilities'; import { getUserDevice } from 'twenty-ui/utilities';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -18,7 +17,7 @@ const meta: Meta<typeof FormTextFieldInput> = {
component: FormTextFieldInput, component: FormTextFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -1,7 +1,6 @@
import { FormUuidFieldInput } from '@/object-record/record-field/ui/form-types/components/FormUuidFieldInput'; import { FormUuidFieldInput } from '@/object-record/record-field/ui/form-types/components/FormUuidFieldInput';
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, fn, userEvent, waitFor, within } from 'storybook/test'; import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
@ -10,7 +9,7 @@ const meta: Meta<typeof FormUuidFieldInput> = {
component: FormUuidFieldInput, component: FormUuidFieldInput,
args: {}, args: {},
argTypes: {}, argTypes: {},
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -1,14 +1,13 @@
import { VariableChip } from '@/object-record/record-field/ui/form-types/components/VariableChip'; import { VariableChip } from '@/object-record/record-field/ui/form-types/components/VariableChip';
import { type Meta, type StoryObj } from '@storybook/react-vite'; import { type Meta, type StoryObj } from '@storybook/react-vite';
import { expect, within } from 'storybook/test'; import { expect, within } from 'storybook/test';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator';
import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow';
const meta: Meta<typeof VariableChip> = { const meta: Meta<typeof VariableChip> = {
title: 'UI/Data/Field/Form/Input/VariableChip', title: 'UI/Data/Field/Form/Input/VariableChip',
component: VariableChip, component: VariableChip,
decorators: [WorkflowStepDecorator, I18nFrontDecorator], decorators: [WorkflowStepDecorator],
}; };
export default meta; export default meta;

View file

@ -2,7 +2,6 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
import { EmailsFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/EmailsFieldDisplay'; import { EmailsFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/EmailsFieldDisplay';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator'; import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { getFieldDecorator } from '~/testing/decorators/getFieldDecorator'; import { getFieldDecorator } from '~/testing/decorators/getFieldDecorator';
@ -11,7 +10,6 @@ import { getProfilingStory } from '~/testing/profiling/utils/getProfilingStory';
const meta: Meta = { const meta: Meta = {
title: 'UI/Data/Field/Display/EmailsFieldDisplay', title: 'UI/Data/Field/Display/EmailsFieldDisplay',
decorators: [ decorators: [
I18nFrontDecorator,
MemoryRouterDecorator, MemoryRouterDecorator,
getFieldDecorator('person', 'emails', { getFieldDecorator('person', 'emails', {
primaryEmail: 'test@test.com', primaryEmail: 'test@test.com',

View file

@ -5,7 +5,6 @@ import { FieldFocusContext } from '@/object-record/record-field/ui/contexts/Fiel
import { FieldFocusContextProvider } from '@/object-record/record-field/ui/contexts/FieldFocusContextProvider'; import { FieldFocusContextProvider } from '@/object-record/record-field/ui/contexts/FieldFocusContextProvider';
import { LinksFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/LinksFieldDisplay'; import { LinksFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/LinksFieldDisplay';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator'; import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { getFieldDecorator } from '~/testing/decorators/getFieldDecorator'; import { getFieldDecorator } from '~/testing/decorators/getFieldDecorator';
@ -24,7 +23,6 @@ const FieldFocusEffect = () => {
const meta: Meta = { const meta: Meta = {
title: 'UI/Data/Field/Display/LinksFieldDisplay', title: 'UI/Data/Field/Display/LinksFieldDisplay',
decorators: [ decorators: [
I18nFrontDecorator,
MemoryRouterDecorator, MemoryRouterDecorator,
getFieldDecorator('company', 'domainName', { getFieldDecorator('company', 'domainName', {
primaryLinkUrl: 'https://www.google.com', primaryLinkUrl: 'https://www.google.com',

View file

@ -2,7 +2,6 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
import { PhonesFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/PhonesFieldDisplay'; import { PhonesFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/PhonesFieldDisplay';
import { ComponentDecorator } from 'twenty-ui/testing'; import { ComponentDecorator } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator'; import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { getFieldDecorator } from '~/testing/decorators/getFieldDecorator'; import { getFieldDecorator } from '~/testing/decorators/getFieldDecorator';
@ -14,7 +13,6 @@ const meta: Meta = {
MemoryRouterDecorator, MemoryRouterDecorator,
getFieldDecorator('person', 'phones'), getFieldDecorator('person', 'phones'),
ComponentDecorator, ComponentDecorator,
I18nFrontDecorator,
SnackBarDecorator, SnackBarDecorator,
], ],
component: PhonesFieldDisplay, component: PhonesFieldDisplay,

View file

@ -13,7 +13,6 @@ import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentTyp
import { ArrayFieldInput } from '@/object-record/record-field/ui/meta-types/input/components/ArrayFieldInput'; import { ArrayFieldInput } from '@/object-record/record-field/ui/meta-types/input/components/ArrayFieldInput';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
const { FieldInputEventContextProviderWithJestMocks } = const { FieldInputEventContextProviderWithJestMocks } =
getFieldInputEventContextProviderWithJestMocks(); getFieldInputEventContextProviderWithJestMocks();
@ -102,7 +101,7 @@ const ArrayInputWithContext = ({
const meta: Meta<typeof ArrayInputWithContext> = { const meta: Meta<typeof ArrayInputWithContext> = {
title: 'UI/Input/ArrayFieldInput', title: 'UI/Input/ArrayFieldInput',
component: ArrayInputWithContext, component: ArrayInputWithContext,
decorators: [I18nFrontDecorator], decorators: [],
}; };
export default meta; export default meta;

View file

@ -12,7 +12,6 @@ import { BooleanFieldInput } from '@/object-record/record-field/ui/meta-types/in
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/ui/states/contexts/RecordFieldComponentInstanceContext'; import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/ui/states/contexts/RecordFieldComponentInstanceContext';
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix'; import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
const { FieldInputEventContextProviderWithJestMocks, handleSubmitMocked } = const { FieldInputEventContextProviderWithJestMocks, handleSubmitMocked } =
getFieldInputEventContextProviderWithJestMocks(); getFieldInputEventContextProviderWithJestMocks();
@ -85,7 +84,7 @@ const BooleanFieldInputWithContext = ({
const meta: Meta = { const meta: Meta = {
title: 'UI/Data/Field/Input/BooleanFieldInput', title: 'UI/Data/Field/Input/BooleanFieldInput',
component: BooleanFieldInputWithContext, component: BooleanFieldInputWithContext,
decorators: [I18nFrontDecorator], decorators: [],
args: { args: {
value: true, value: true,
recordId: 'id-1', recordId: 'id-1',

View file

@ -14,7 +14,6 @@ import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFi
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack'; import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType'; import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
const updateRecord = fn(); const updateRecord = fn();
@ -102,7 +101,7 @@ const EmailInputWithContext = ({
const meta: Meta<typeof EmailInputWithContext> = { const meta: Meta<typeof EmailInputWithContext> = {
title: 'UI/Input/EmailsFieldInput', title: 'UI/Input/EmailsFieldInput',
component: EmailInputWithContext, component: EmailInputWithContext,
decorators: [SnackBarDecorator, I18nFrontDecorator], decorators: [SnackBarDecorator],
}; };
export default meta; export default meta;

View file

@ -13,7 +13,6 @@ import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePush
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType'; import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
import { getCanvasElementForDropdownTesting } from 'twenty-ui/testing'; import { getCanvasElementForDropdownTesting } from 'twenty-ui/testing';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
const updateRecord = fn(); const updateRecord = fn();
@ -122,7 +121,7 @@ const getPrimaryLinkBookmarkIcon = (canvasElement: HTMLElement) =>
const meta: Meta = { const meta: Meta = {
title: 'UI/Data/Field/Input/LinksFieldInput', title: 'UI/Data/Field/Input/LinksFieldInput',
component: LinksInputWithContext, component: LinksInputWithContext,
decorators: [I18nFrontDecorator], decorators: [],
args: { args: {
value: { value: {
primaryLinkUrl: null, primaryLinkUrl: null,

View file

@ -20,7 +20,6 @@ import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType'; import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect'; import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
const { const {
FieldInputEventContextProviderWithJestMocks, FieldInputEventContextProviderWithJestMocks,
@ -147,7 +146,7 @@ const meta: Meta = {
onTab: { control: false }, onTab: { control: false },
onShiftTab: { control: false }, onShiftTab: { control: false },
}, },
decorators: [clearMocksDecorator, SnackBarDecorator, I18nFrontDecorator], decorators: [clearMocksDecorator, SnackBarDecorator],
parameters: { parameters: {
clearMocks: true, clearMocks: true,
}, },

Some files were not shown because too many files have changed in this diff Show more