# Introduction
Lately encountering a lot of out of memory error when running
twenty-front in watch mode with both TypeScript and lint checkers
```ts
Error: Worker terminated due to reaching memory limit: JS heap out of memory
at new NodeError (node:internal/errors:405:5)
at [kOnExit] (node:internal/worker:287:26)
at Worker.<computed>.onexit (node:internal/worker:209:20)
```
The existing configuration looks like this:
```ts
// packages/twenty-front/vite.config.ts
'cd ../.. && eslint packages/twenty-front --report-unused-disable-directives --max-warnings 0 --config .eslintrc.cjs',
```
This is wrong as computing the root eslintrc completely omitting
twenty-front's one ***and its ignorePattern*** so will be checking in
`node_modules` etc checking for project-structure :).
For example this a
[snippet](https://gist.github.com/prastoin/d7f8ad4ef5eb2f7732209b756a38094c)
of the above commands errors. We can see rule that should be disabled by
`eslintrc.react.cjs` extension made from twenty-front `eslintrc` :
```ts
/Users/paulrastoin/ws/twenty-two/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldSettingsFormCard.stories.tsx
23:27 warning Forbidden non-null assertion @typescript-eslint/no-non-null-assertion
```
## Fixes
- consume the `twenty-front` package eslint configuration within the
vite lint checker
- eslint overrides extends are getting merged based on glob inclusion of
their files declarations
- any linted files should be included in one of our `tsconfig`
- removed redundant and counter-productive negative `ignorePatterns`, as
eslint will naturally only lint files within configuration file
directory by default which will result making it go through local
`node_modules` project structure
## Now
Less cpu usage <3.5 gb and faster
```ts
// from packages/twenty-front
TIMING=1 npx eslint . --report-unused-disable-directives --max-warnings 0 --config .eslintrc.cjs --debug
#...
Rule | Time (ms) | Relative
:-----------------------------------------------|----------:|--------:
project-structure/folder-structure | 19578.927 | 20.2%
prettier/prettier | 13746.156 | 14.2%
no-redeclare | 9546.570 | 9.9%
@nx/workspace-explicit-boolean-predicates-in-if | 8167.805 | 8.4%
@typescript-eslint/no-unused-vars | 6872.803 | 7.1%
import/no-relative-packages | 6577.273 | 6.8%
@nx/enforce-module-boundaries | 6520.945 | 6.7%
import/no-duplicates | 4987.476 | 5.2%
react/no-direct-mutation-state | 2323.082 | 2.4%
react/require-render-return | 1155.261 | 1.2%
```
## Conclusion
Please note that `nx linter` might not be as strict as vite config
eslint runner
---------
Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com>
169 lines
4.6 KiB
JSON
169 lines
4.6 KiB
JSON
{
|
|
"name": "twenty-front",
|
|
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
"projectType": "application",
|
|
"tags": ["scope:frontend"],
|
|
"targets": {
|
|
"build": {
|
|
"outputs": ["{options.outputPath}"],
|
|
"options": {
|
|
"outputPath": "{projectRoot}/build"
|
|
},
|
|
"dependsOn": ["^build"]
|
|
},
|
|
"build:sourcemaps": {
|
|
"outputs": ["{options.outputPath}"],
|
|
"options": {
|
|
"outputPath": "{projectRoot}/build"
|
|
},
|
|
"dependsOn": ["^build"]
|
|
},
|
|
"serve": {
|
|
"executor": "nx:run-commands",
|
|
"options": {
|
|
"command": "npx serve -s {projectRoot}/build"
|
|
}
|
|
},
|
|
"start": {
|
|
"executor": "@nx/vite:dev-server",
|
|
"options": {
|
|
"buildTarget": "twenty-front:build",
|
|
"hmr": true
|
|
}
|
|
},
|
|
"preview": {
|
|
"executor": "@nx/vite:preview-server",
|
|
"options": {
|
|
"buildTarget": "twenty-front:build",
|
|
"port": 3001,
|
|
"open": true
|
|
}
|
|
},
|
|
"reset:env": {
|
|
"executor": "nx:run-commands",
|
|
"inputs": ["{projectRoot}/.env.example"],
|
|
"outputs": ["{projectRoot}/.env"],
|
|
"cache": true,
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"command": "cp .env.example .env"
|
|
}
|
|
},
|
|
"typecheck": {},
|
|
"lint": {
|
|
"options": {
|
|
"maxWarnings": 0,
|
|
"reportUnusedDisableDirectives": "error"
|
|
},
|
|
"configurations": {
|
|
"ci": {
|
|
"eslintConfig": "{projectRoot}/.eslintrc-ci.cjs"
|
|
},
|
|
"fix": {}
|
|
}
|
|
},
|
|
"fmt": {
|
|
"options": {
|
|
"files": "src"
|
|
},
|
|
"configurations": {
|
|
"fix": {}
|
|
}
|
|
},
|
|
"test": {},
|
|
"storybook:build": {
|
|
"options": {
|
|
"env": { "NODE_OPTIONS": "--max_old_space_size=8000" }
|
|
},
|
|
"configurations": {
|
|
"docs": { "env": { "STORYBOOK_SCOPE": "ui-docs" } },
|
|
"modules": { "env": { "STORYBOOK_SCOPE": "modules" } },
|
|
"pages": { "env": { "STORYBOOK_SCOPE": "pages" } },
|
|
"performance": { "env": { "STORYBOOK_SCOPE": "performance" } }
|
|
}
|
|
},
|
|
"storybook:serve:dev": {
|
|
"options": { "port": 6006 },
|
|
"configurations": {
|
|
"docs": { "env": { "STORYBOOK_SCOPE": "ui-docs" } },
|
|
"modules": { "env": { "STORYBOOK_SCOPE": "modules" } },
|
|
"pages": { "env": { "STORYBOOK_SCOPE": "pages" } },
|
|
"performance": { "env": { "STORYBOOK_SCOPE": "performance" } }
|
|
}
|
|
},
|
|
"storybook:serve:static": {
|
|
"options": { "port": 6006 },
|
|
"configurations": {
|
|
"docs": { "env": { "STORYBOOK_SCOPE": "ui-docs" } },
|
|
"modules": { "env": { "STORYBOOK_SCOPE": "modules" } },
|
|
"pages": { "env": { "STORYBOOK_SCOPE": "pages" } },
|
|
"performance": { "env": { "STORYBOOK_SCOPE": "performance" } }
|
|
}
|
|
},
|
|
"storybook:coverage": {
|
|
"configurations": {
|
|
"text": {},
|
|
"docs": { "env": { "STORYBOOK_SCOPE": "ui-docs" } },
|
|
"modules": { "env": { "STORYBOOK_SCOPE": "modules" } },
|
|
"pages": { "env": { "STORYBOOK_SCOPE": "pages" } },
|
|
"performance": { "env": { "STORYBOOK_SCOPE": "performance" } }
|
|
}
|
|
},
|
|
"storybook:test": {
|
|
"options": { "port": 6006 },
|
|
"configurations": {
|
|
"docs": { "env": { "STORYBOOK_SCOPE": "ui-docs" } },
|
|
"modules": { "env": { "STORYBOOK_SCOPE": "modules" } },
|
|
"pages": { "env": { "STORYBOOK_SCOPE": "pages" } },
|
|
"performance": { "env": { "STORYBOOK_SCOPE": "performance" } }
|
|
}
|
|
},
|
|
"storybook:serve-and-test:static": {
|
|
"options": {
|
|
"port": 6006
|
|
},
|
|
"configurations": {
|
|
"docs": { "scope": "ui-docs" },
|
|
"modules": { "scope": "modules" },
|
|
"pages": { "scope": "pages" },
|
|
"performance": { "scope": "performance" }
|
|
}
|
|
},
|
|
"graphql:generate": {
|
|
"executor": "nx:run-commands",
|
|
"defaultConfiguration": "data",
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"command": "dotenv cross-var graphql-codegen -- --config={args.config}"
|
|
},
|
|
"configurations": {
|
|
"data": {
|
|
"config": "codegen.cjs"
|
|
},
|
|
"metadata": {
|
|
"config": "codegen-metadata.cjs"
|
|
}
|
|
}
|
|
},
|
|
"chromatic": {
|
|
"configurations": {
|
|
"ci": {}
|
|
}
|
|
},
|
|
"lingui:extract": {
|
|
"executor": "nx:run-commands",
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"command": "lingui extract --overwrite"
|
|
}
|
|
},
|
|
"lingui:compile": {
|
|
"executor": "nx:run-commands",
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"command": "lingui compile --typescript"
|
|
}
|
|
}
|
|
}
|
|
}
|