From 1faf725498c39ae2c527c5017c565bd62d8ebfa6 Mon Sep 17 00:00:00 2001 From: neo773 <62795688+neo773@users.noreply.github.com> Date: Thu, 7 May 2026 13:25:53 +0530 Subject: [PATCH] Fix NestJS CLI pin chokidar to v3 (#20316) fixes `EMFILE` by downgrading chokidar to v3 root cause is v4 removed kernel level FSEvents on macOS and instead uses `node:fs.watch` which doesn't scales for a repo of our size Seems to be working well, even survives multiple hot reloads after editing files --- package.json | 3 +- packages/twenty-sdk/src/cli/types.ts | 11 ++++ .../build/manifest/manifest-watcher.ts | 7 ++- .../steps/start-watchers-orchestrator-step.ts | 7 ++- yarn.lock | 54 ++----------------- 5 files changed, 28 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index f5e65b17a6..f68418e144 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,8 @@ "@types/qs": "6.9.16", "@wyw-in-js/transform@npm:0.6.0": "patch:@wyw-in-js/transform@npm%3A0.7.0#~/.yarn/patches/@wyw-in-js-transform-npm-0.7.0-ba641dc99f.patch", "@wyw-in-js/transform@npm:0.7.0": "patch:@wyw-in-js/transform@npm%3A0.7.0#~/.yarn/patches/@wyw-in-js-transform-npm-0.7.0-ba641dc99f.patch", - "@opentelemetry/api": "1.9.1" + "@opentelemetry/api": "1.9.1", + "chokidar": "^3.6.0" }, "version": "0.2.1", "nx": {}, diff --git a/packages/twenty-sdk/src/cli/types.ts b/packages/twenty-sdk/src/cli/types.ts index 3acfef26dc..e1d1f94792 100644 --- a/packages/twenty-sdk/src/cli/types.ts +++ b/packages/twenty-sdk/src/cli/types.ts @@ -76,3 +76,14 @@ export type FunctionExecutionResult = { stackTrace: string; }; }; + +export type ChokidarFsEvent = + | 'add' + | 'addDir' + | 'change' + | 'unlink' + | 'unlinkDir' + | 'ready' + | 'raw' + | 'error' + | 'all'; diff --git a/packages/twenty-sdk/src/cli/utilities/build/manifest/manifest-watcher.ts b/packages/twenty-sdk/src/cli/utilities/build/manifest/manifest-watcher.ts index aa5d662077..426e195c9b 100644 --- a/packages/twenty-sdk/src/cli/utilities/build/manifest/manifest-watcher.ts +++ b/packages/twenty-sdk/src/cli/utilities/build/manifest/manifest-watcher.ts @@ -1,7 +1,7 @@ import path, { relative } from 'path'; import chokidar, { type FSWatcher } from 'chokidar'; -import { type EventName } from 'chokidar/handler.js'; import { ASSETS_DIR } from 'twenty-shared/application'; +import { type ChokidarFsEvent } from '@/cli/types'; export type ManifestWatcherOptions = { appPath: string; @@ -13,7 +13,10 @@ const IGNORED_DIRECTORY_NAMES = new Set(['node_modules', 'dist', '.twenty']); export class ManifestWatcher { private appPath: string; - private handleChangeDetected: (filePath: string, event: EventName) => void; + private handleChangeDetected: ( + filePath: string, + event: ChokidarFsEvent, + ) => void; private verbose: boolean; private watcher: FSWatcher | null = null; diff --git a/packages/twenty-sdk/src/cli/utilities/dev/orchestrator/steps/start-watchers-orchestrator-step.ts b/packages/twenty-sdk/src/cli/utilities/dev/orchestrator/steps/start-watchers-orchestrator-step.ts index a917cee015..d130d2b9a4 100644 --- a/packages/twenty-sdk/src/cli/utilities/dev/orchestrator/steps/start-watchers-orchestrator-step.ts +++ b/packages/twenty-sdk/src/cli/utilities/dev/orchestrator/steps/start-watchers-orchestrator-step.ts @@ -10,7 +10,7 @@ import { type ManifestBuildResult } from '@/cli/utilities/build/manifest/manifes import { ManifestWatcher } from '@/cli/utilities/build/manifest/manifest-watcher'; import { type OrchestratorState } from '@/cli/utilities/dev/orchestrator/dev-mode-orchestrator-state'; import type { Location } from 'esbuild'; -import { type EventName } from 'chokidar/handler.js'; +import { type ChokidarFsEvent } from '@/cli/types'; import { ASSETS_DIR } from 'twenty-shared/application'; import { FileFolder } from 'twenty-shared/types'; @@ -102,7 +102,10 @@ export class StartWatchersOrchestratorStep { ]); } - private handleChangeDetected(sourcePath: string, event: EventName): void { + private handleChangeDetected( + sourcePath: string, + event: ChokidarFsEvent, + ): void { this.state.addEvent({ message: `Change detected: ${sourcePath}`, status: 'info', diff --git a/yarn.lock b/yarn.lock index 9218a2acfd..d7e038f9a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25941,7 +25941,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3, anymatch@npm:^3.1.3, anymatch@npm:~3.1.1, anymatch@npm:~3.1.2": +"anymatch@npm:^3.0.3, anymatch@npm:^3.1.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -28520,26 +28520,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.1": - version: 3.5.1 - resolution: "chokidar@npm:3.5.1" - dependencies: - anymatch: "npm:~3.1.1" - braces: "npm:~3.0.2" - fsevents: "npm:~2.3.1" - glob-parent: "npm:~5.1.0" - is-binary-path: "npm:~2.1.0" - is-glob: "npm:~4.0.1" - normalize-path: "npm:~3.0.0" - readdirp: "npm:~3.5.0" - dependenciesMeta: - fsevents: - optional: true - checksum: 10c0/894d2fdeeef6a0bc61993a20b864e29e9296f2308628b8b2edf1bef2d59ab11f21938eebbbcbf581f15d16d3e030c08860d2fb035f7b9f3baebac57049a37959 - languageName: node - linkType: hard - -"chokidar@npm:3.6.0, chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": +"chokidar@npm:^3.6.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -28558,15 +28539,6 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:4.0.3, chokidar@npm:^4.0.0, chokidar@npm:^4.0.1, chokidar@npm:^4.0.3": - version: 4.0.3 - resolution: "chokidar@npm:4.0.3" - dependencies: - readdirp: "npm:^4.0.1" - checksum: 10c0/a58b9df05bb452f7d105d9e7229ac82fa873741c0c40ddcc7bb82f8a909fbe3f7814c9ebe9bc9a2bef9b737c0ec6e2d699d179048ef06ad3ec46315df0ebe6ad - languageName: node - linkType: hard - "chownr@npm:^1.1.1": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -34725,7 +34697,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:^2.3.3, fsevents@npm:~2.3.1, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": +"fsevents@npm:^2.3.2, fsevents@npm:^2.3.3, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -34744,7 +34716,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A^2.3.3#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.1#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A^2.3.3#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -35154,7 +35126,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.0, glob-parent@npm:~5.1.2": +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -48897,22 +48869,6 @@ __metadata: languageName: node linkType: hard -"readdirp@npm:^4.0.1": - version: 4.1.2 - resolution: "readdirp@npm:4.1.2" - checksum: 10c0/60a14f7619dec48c9c850255cd523e2717001b0e179dc7037cfa0895da7b9e9ab07532d324bfb118d73a710887d1e35f79c495fa91582784493e085d18c72c62 - languageName: node - linkType: hard - -"readdirp@npm:~3.5.0": - version: 3.5.0 - resolution: "readdirp@npm:3.5.0" - dependencies: - picomatch: "npm:^2.2.1" - checksum: 10c0/293de2ed981884a09e76fbf90bddc7e1a87667e57e0284ddc8c177e3151b0d179a9a56441d9f2f3654423924ec100af57ba9e507086527f98fd1d21bdd041c3e - languageName: node - linkType: hard - "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0"