2022-12-01 14:58:08 +00:00
|
|
|
{
|
2023-12-10 17:10:54 +00:00
|
|
|
"name": "twenty-server",
|
2022-12-01 14:58:08 +00:00
|
|
|
"description": "",
|
|
|
|
|
"author": "",
|
|
|
|
|
"private": true,
|
2024-01-05 13:59:58 +00:00
|
|
|
"license": "AGPL-3.0",
|
2022-12-01 14:58:08 +00:00
|
|
|
"scripts": {
|
2024-01-04 15:39:57 +00:00
|
|
|
"nx": "NX_DEFAULT_PROJECT=twenty-server node ../../node_modules/nx/bin/nx.js",
|
Upgrade NestJS from 10.x to 11.x (#15836)
## Overview
This PR upgrades all NestJS dependencies from version 10.x to 11.x,
following the [official migration
guide](https://docs.nestjs.com/migration-guide). This builds on top of
the v9 to v10 upgrade completed in PR #15835.
## Changes
### Dependencies Updated
**Core packages (10.x → 11.x):**
- `@nestjs/common`: 10.4.16 → 11.0.8
- `@nestjs/core`: 10.4.16 → 11.0.8
- `@nestjs/platform-express`: 10.4.16 → 11.0.8
- `@nestjs/config`: 3.2.3 → 3.3.0
- `@nestjs/passport`: 10.0.3 → 11.0.0
- `@nestjs/axios`: 3.0.2 → 3.1.2
- `@nestjs/schedule`: ^3.0.0 → ^4.1.1
- `@nestjs/serve-static`: 4.0.2 → 5.0.1
- `@nestjs/cache-manager`: ^2.2.1 → ^2.3.0
- `@nestjs/jwt`: 10.2.0 → 11.0.0
- `@nestjs/typeorm`: 10.0.2 → 11.0.0
- `@nestjs/terminus`: 11.0.0 (already on v11)
- `@nestjs/event-emitter`: 2.1.0 (compatible)
**DevDependencies:**
- `@nestjs/testing`: ^10.4.16 → ^11.0.8
- `@nestjs/schematics`: ^10.1.0 → ^11.0.2
- `@nestjs/cli`: 10.3.0 → 11.0.0
### Code Changes
**Fixed: TwentyConfigModule conditional imports**
- Updated `TwentyConfigModule.forRoot()` to use spread operator for
conditional imports
- Fixes TypeScript error with NestJS 11's stricter DynamicModule type
checking
**Cleanup: Removed unused package**
- Removed `@revertdotdev/revert-react` (not being used anywhere in the
codebase)
## Breaking Changes Addressed
### 1. ✅ Reflector Type Inference
- **Impact**: None - codebase only uses `reflector.get()` method
- **Analysis**: Does not use `getAllAndMerge()` or `getAllAndOverride()`
(the methods with breaking changes)
- **Files reviewed**: feature-flag.guard.ts,
message-queue-metadata.accessor.ts,
workspace-query-hook-metadata.accessor.ts
### 2. ✅ Lifecycle Hooks Execution Order
- **Change**: Termination hooks (`OnModuleDestroy`,
`BeforeApplicationShutdown`, `OnApplicationShutdown`) now execute in
REVERSE order
- **Analysis**: Reviewed all lifecycle hook implementations
- Redis client cleanup
- Database connection cleanup (GlobalWorkspaceDataSource)
- BullMQ queue/worker cleanup
- Cache storage cleanup
- **Result**: Dependency order is safe - services using connections
clean up before the connections themselves
### 3. ✅ Middleware Registration Order
- **Change**: Global middleware now executes first regardless of import
order
- **Analysis**: Middleware is not registered as global, so execution
order remains consistent
- **Files reviewed**: app.module.ts, middleware.module.ts
## Testing
All tests passing and build successful:
**Unit Tests (283+ tests):**
- ✅ Health module: 38 tests passed
- ✅ Auth module: 115 tests passed (passport v11 integration)
- ✅ REST API: 90 tests passed (middleware and express platform)
- ✅ Feature flags: 17 tests passed (Reflector usage)
- ✅ Workspace: 23 tests passed
**Build & Quality:**
- ✅ Type checking: Passed
- ✅ Linting: Passed
- ✅ Build: 3,683 files compiled successfully
## Verification
Tested critical NestJS functionality:
- ✅ Authentication & Security (JWT, OAuth, guards)
- ✅ HTTP Platform (Express integration, REST endpoints)
- ✅ Dependency Injection (Services, factories, providers)
- ✅ Cache Management (Redis with @nestjs/cache-manager)
- ✅ GraphQL (Query runners, resolvers)
- ✅ Configuration (Environment config)
- ✅ Scheduling (Cron jobs with @nestjs/schedule v4)
- ✅ Lifecycle Hooks (Module initialization and cleanup)
- ✅ Reflector (Metadata reflection in guards)
## Related PRs
- #15835 - Upgrade NestJS from 9.x to 10.x (completed)
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Upgrades NestJS to v11 and updates routing patterns, auth strategies,
GraphQL schema options, and build/dist paths (scripts, Docker, Nx,
migrations, assets), plus enables Devtools in development.
>
> - **Backend (NestJS 11 upgrade)**:
> - Bump `@nestjs/*` packages (core, platform-express, jwt, passport,
typeorm, serve-static, schedule, cli/testing/schematics) to v11.
> - Update REST/route-trigger/file controllers to new wildcard syntax
(`*path`).
> - Refactor OAuth (Google/Microsoft) and SAML strategies (abstract base
+ explicit `validate`); minor typings.
> - Enable `DevtoolsModule` in development.
> - **GraphQL**:
> - Add `buildSchemaOptions.orphanedTypes` for client-config types; keep
Yoga/Sentry setup.
> - **Build/Runtime & Config**:
> - Standardize dist layout (remove `src` in paths): update scripts,
Docker `CMD`, Nx `project.json`, render scripts, TypeORM migration
paths, asset resolution.
> - Adjust `nest-cli.json` (watchOptions, asset globs, migrations
outDir, monorepo/root).
> - Improve config module imports (spread conditional); tsconfig
excludes `node_modules`.
> - Minor Nx default: `start` target caching disabled.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1139fd85a97d0c72314d416d07464cc3c9942783. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-11-16 17:20:06 +00:00
|
|
|
"start:prod": "node dist/main",
|
|
|
|
|
"command:prod": "node dist/command/command",
|
|
|
|
|
"worker:prod": "node dist/queue-worker/queue-worker",
|
2024-03-25 11:31:18 +00:00
|
|
|
"database:init:prod": "npx ts-node ./scripts/setup-db.ts && yarn database:migrate:prod",
|
Upgrade NestJS from 10.x to 11.x (#15836)
## Overview
This PR upgrades all NestJS dependencies from version 10.x to 11.x,
following the [official migration
guide](https://docs.nestjs.com/migration-guide). This builds on top of
the v9 to v10 upgrade completed in PR #15835.
## Changes
### Dependencies Updated
**Core packages (10.x → 11.x):**
- `@nestjs/common`: 10.4.16 → 11.0.8
- `@nestjs/core`: 10.4.16 → 11.0.8
- `@nestjs/platform-express`: 10.4.16 → 11.0.8
- `@nestjs/config`: 3.2.3 → 3.3.0
- `@nestjs/passport`: 10.0.3 → 11.0.0
- `@nestjs/axios`: 3.0.2 → 3.1.2
- `@nestjs/schedule`: ^3.0.0 → ^4.1.1
- `@nestjs/serve-static`: 4.0.2 → 5.0.1
- `@nestjs/cache-manager`: ^2.2.1 → ^2.3.0
- `@nestjs/jwt`: 10.2.0 → 11.0.0
- `@nestjs/typeorm`: 10.0.2 → 11.0.0
- `@nestjs/terminus`: 11.0.0 (already on v11)
- `@nestjs/event-emitter`: 2.1.0 (compatible)
**DevDependencies:**
- `@nestjs/testing`: ^10.4.16 → ^11.0.8
- `@nestjs/schematics`: ^10.1.0 → ^11.0.2
- `@nestjs/cli`: 10.3.0 → 11.0.0
### Code Changes
**Fixed: TwentyConfigModule conditional imports**
- Updated `TwentyConfigModule.forRoot()` to use spread operator for
conditional imports
- Fixes TypeScript error with NestJS 11's stricter DynamicModule type
checking
**Cleanup: Removed unused package**
- Removed `@revertdotdev/revert-react` (not being used anywhere in the
codebase)
## Breaking Changes Addressed
### 1. ✅ Reflector Type Inference
- **Impact**: None - codebase only uses `reflector.get()` method
- **Analysis**: Does not use `getAllAndMerge()` or `getAllAndOverride()`
(the methods with breaking changes)
- **Files reviewed**: feature-flag.guard.ts,
message-queue-metadata.accessor.ts,
workspace-query-hook-metadata.accessor.ts
### 2. ✅ Lifecycle Hooks Execution Order
- **Change**: Termination hooks (`OnModuleDestroy`,
`BeforeApplicationShutdown`, `OnApplicationShutdown`) now execute in
REVERSE order
- **Analysis**: Reviewed all lifecycle hook implementations
- Redis client cleanup
- Database connection cleanup (GlobalWorkspaceDataSource)
- BullMQ queue/worker cleanup
- Cache storage cleanup
- **Result**: Dependency order is safe - services using connections
clean up before the connections themselves
### 3. ✅ Middleware Registration Order
- **Change**: Global middleware now executes first regardless of import
order
- **Analysis**: Middleware is not registered as global, so execution
order remains consistent
- **Files reviewed**: app.module.ts, middleware.module.ts
## Testing
All tests passing and build successful:
**Unit Tests (283+ tests):**
- ✅ Health module: 38 tests passed
- ✅ Auth module: 115 tests passed (passport v11 integration)
- ✅ REST API: 90 tests passed (middleware and express platform)
- ✅ Feature flags: 17 tests passed (Reflector usage)
- ✅ Workspace: 23 tests passed
**Build & Quality:**
- ✅ Type checking: Passed
- ✅ Linting: Passed
- ✅ Build: 3,683 files compiled successfully
## Verification
Tested critical NestJS functionality:
- ✅ Authentication & Security (JWT, OAuth, guards)
- ✅ HTTP Platform (Express integration, REST endpoints)
- ✅ Dependency Injection (Services, factories, providers)
- ✅ Cache Management (Redis with @nestjs/cache-manager)
- ✅ GraphQL (Query runners, resolvers)
- ✅ Configuration (Environment config)
- ✅ Scheduling (Cron jobs with @nestjs/schedule v4)
- ✅ Lifecycle Hooks (Module initialization and cleanup)
- ✅ Reflector (Metadata reflection in guards)
## Related PRs
- #15835 - Upgrade NestJS from 9.x to 10.x (completed)
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Upgrades NestJS to v11 and updates routing patterns, auth strategies,
GraphQL schema options, and build/dist paths (scripts, Docker, Nx,
migrations, assets), plus enables Devtools in development.
>
> - **Backend (NestJS 11 upgrade)**:
> - Bump `@nestjs/*` packages (core, platform-express, jwt, passport,
typeorm, serve-static, schedule, cli/testing/schematics) to v11.
> - Update REST/route-trigger/file controllers to new wildcard syntax
(`*path`).
> - Refactor OAuth (Google/Microsoft) and SAML strategies (abstract base
+ explicit `validate`); minor typings.
> - Enable `DevtoolsModule` in development.
> - **GraphQL**:
> - Add `buildSchemaOptions.orphanedTypes` for client-config types; keep
Yoga/Sentry setup.
> - **Build/Runtime & Config**:
> - Standardize dist layout (remove `src` in paths): update scripts,
Docker `CMD`, Nx `project.json`, render scripts, TypeORM migration
paths, asset resolution.
> - Adjust `nest-cli.json` (watchOptions, asset globs, migrations
outDir, monorepo/root).
> - Improve config module imports (spread conditional); tsconfig
excludes `node_modules`.
> - Minor Nx default: `start` target caching disabled.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1139fd85a97d0c72314d416d07464cc3c9942783. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-11-16 17:20:06 +00:00
|
|
|
"database:migrate:prod": "npx -y typeorm migration:run -d dist/database/typeorm/core/core.datasource",
|
|
|
|
|
"clickhouse:migrate:prod": "node dist/database/clickHouse/migrations/run-migrations.js",
|
2024-08-16 19:20:02 +00:00
|
|
|
"typeorm": "../../node_modules/typeorm/.bin/typeorm"
|
2022-12-01 14:58:08 +00:00
|
|
|
},
|
|
|
|
|
"dependencies": {
|
2025-09-22 20:13:43 +00:00
|
|
|
"@ai-sdk/anthropic": "^2.0.17",
|
2026-02-09 13:26:02 +00:00
|
|
|
"@ai-sdk/groq": "^2.0.34",
|
2025-09-22 20:13:43 +00:00
|
|
|
"@ai-sdk/openai": "^2.0.30",
|
|
|
|
|
"@ai-sdk/provider-utils": "^3.0.9",
|
|
|
|
|
"@ai-sdk/xai": "^2.0.19",
|
2026-02-05 12:09:47 +00:00
|
|
|
"@aws-sdk/client-lambda": "3.983.0",
|
|
|
|
|
"@aws-sdk/client-s3": "3.983.0",
|
|
|
|
|
"@aws-sdk/client-sesv2": "3.983.0",
|
|
|
|
|
"@aws-sdk/client-sts": "3.983.0",
|
|
|
|
|
"@aws-sdk/credential-providers": "3.983.0",
|
2026-01-08 17:18:35 +00:00
|
|
|
"@azure/msal-node": "^3.8.4",
|
2025-08-11 13:58:05 +00:00
|
|
|
"@babel/preset-env": "7.26.9",
|
2025-06-06 16:35:30 +00:00
|
|
|
"@blocknote/server-util": "^0.31.1",
|
2025-04-16 16:33:10 +00:00
|
|
|
"@clickhouse/client": "^1.11.0",
|
2025-08-29 13:17:53 +00:00
|
|
|
"@dagrejs/dagre": "^1.1.2",
|
feat(ai): add code interpreter for AI data analysis (#16559)
## Summary
- Add code interpreter tool that enables AI to execute Python code for
data analysis, CSV processing, and chart generation
- Support for both local (development) and E2B (sandboxed production)
execution drivers
- Real-time streaming of stdout/stderr and generated files
- Frontend components for displaying code execution results with
expandable sections
## Code Quality Improvements
- Extract `getMimeType` to shared utility to reduce code duplication
between drivers
- Fix security issue: escape single quotes/backslashes in E2B driver env
variable injection
- Add `buildExecutionState` helper to reduce duplicated state object
construction
- Add `DEFAULT_CODE_INTERPRETER_TIMEOUT_MS` constant for consistency
- Fix lingui linting warning and TypeScript theme errors in frontend
## Test Plan
- [ ] Test code interpreter with local driver in development
- [ ] Test code interpreter with E2B driver in production environment
- [ ] Verify streaming output displays correctly in chat UI
- [ ] Verify generated files (charts, CSVs) are uploaded and
downloadable
- [ ] Test file upload flow (CSV, Excel) triggers code interpreter
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Updates generated i18n catalogs for Polish and pseudo-English, adding
strings for code execution/output (code interpreter) and various UI
messages, with minor text adjustments.
>
> - **Localization**:
> - **Generated catalogs**: Refresh `locales/generated/pl-PL.ts` and
`locales/generated/pseudo-en.ts`.
> - Add strings for code execution/output (e.g., code, copy code/output,
running/waiting states, download files, generated files, Python code
execution).
> - Include new UI texts (errors, prompts, menus) and minor text
corrections.
> - No changes to `pt-BR`; other files unchanged functionally.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
befc13d02c21e5a6647bc1aa6daa2a89f60b7ef8. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-12-15 15:11:24 +00:00
|
|
|
"@e2b/code-interpreter": "^1.0.4",
|
2025-08-11 13:58:05 +00:00
|
|
|
"@envelop/core": "4.0.3",
|
|
|
|
|
"@envelop/on-resolve": "4.1.0",
|
2024-09-02 13:25:20 +00:00
|
|
|
"@esbuild-plugins/node-modules-polyfill": "^0.2.2",
|
2025-08-11 13:58:05 +00:00
|
|
|
"@eslint/js": "9.32.0",
|
|
|
|
|
"@faker-js/faker": "9.8.0",
|
|
|
|
|
"@graphql-tools/schema": "10.0.4",
|
|
|
|
|
"@graphql-tools/utils": "9.2.1",
|
2024-09-18 15:35:08 +00:00
|
|
|
"@graphql-yoga/nestjs": "patch:@graphql-yoga/nestjs@2.1.0#./patches/@graphql-yoga+nestjs+2.1.0.patch",
|
2025-12-19 16:04:48 +00:00
|
|
|
"@jrmdayn/googleapis-batcher": "^0.10.1",
|
2025-08-11 13:58:05 +00:00
|
|
|
"@lingui/conf": "5.1.2",
|
2025-03-17 09:09:07 +00:00
|
|
|
"@lingui/core": "^5.1.2",
|
2025-08-11 13:58:05 +00:00
|
|
|
"@lingui/format-po": "5.1.2",
|
|
|
|
|
"@lingui/react": "5.1.2",
|
|
|
|
|
"@lingui/vite-plugin": "5.1.2",
|
|
|
|
|
"@microsoft/microsoft-graph-client": "3.0.7",
|
|
|
|
|
"@microsoft/microsoft-graph-types": "^2.40.0",
|
Upgrade NestJS from 10.x to 11.x (#15836)
## Overview
This PR upgrades all NestJS dependencies from version 10.x to 11.x,
following the [official migration
guide](https://docs.nestjs.com/migration-guide). This builds on top of
the v9 to v10 upgrade completed in PR #15835.
## Changes
### Dependencies Updated
**Core packages (10.x → 11.x):**
- `@nestjs/common`: 10.4.16 → 11.0.8
- `@nestjs/core`: 10.4.16 → 11.0.8
- `@nestjs/platform-express`: 10.4.16 → 11.0.8
- `@nestjs/config`: 3.2.3 → 3.3.0
- `@nestjs/passport`: 10.0.3 → 11.0.0
- `@nestjs/axios`: 3.0.2 → 3.1.2
- `@nestjs/schedule`: ^3.0.0 → ^4.1.1
- `@nestjs/serve-static`: 4.0.2 → 5.0.1
- `@nestjs/cache-manager`: ^2.2.1 → ^2.3.0
- `@nestjs/jwt`: 10.2.0 → 11.0.0
- `@nestjs/typeorm`: 10.0.2 → 11.0.0
- `@nestjs/terminus`: 11.0.0 (already on v11)
- `@nestjs/event-emitter`: 2.1.0 (compatible)
**DevDependencies:**
- `@nestjs/testing`: ^10.4.16 → ^11.0.8
- `@nestjs/schematics`: ^10.1.0 → ^11.0.2
- `@nestjs/cli`: 10.3.0 → 11.0.0
### Code Changes
**Fixed: TwentyConfigModule conditional imports**
- Updated `TwentyConfigModule.forRoot()` to use spread operator for
conditional imports
- Fixes TypeScript error with NestJS 11's stricter DynamicModule type
checking
**Cleanup: Removed unused package**
- Removed `@revertdotdev/revert-react` (not being used anywhere in the
codebase)
## Breaking Changes Addressed
### 1. ✅ Reflector Type Inference
- **Impact**: None - codebase only uses `reflector.get()` method
- **Analysis**: Does not use `getAllAndMerge()` or `getAllAndOverride()`
(the methods with breaking changes)
- **Files reviewed**: feature-flag.guard.ts,
message-queue-metadata.accessor.ts,
workspace-query-hook-metadata.accessor.ts
### 2. ✅ Lifecycle Hooks Execution Order
- **Change**: Termination hooks (`OnModuleDestroy`,
`BeforeApplicationShutdown`, `OnApplicationShutdown`) now execute in
REVERSE order
- **Analysis**: Reviewed all lifecycle hook implementations
- Redis client cleanup
- Database connection cleanup (GlobalWorkspaceDataSource)
- BullMQ queue/worker cleanup
- Cache storage cleanup
- **Result**: Dependency order is safe - services using connections
clean up before the connections themselves
### 3. ✅ Middleware Registration Order
- **Change**: Global middleware now executes first regardless of import
order
- **Analysis**: Middleware is not registered as global, so execution
order remains consistent
- **Files reviewed**: app.module.ts, middleware.module.ts
## Testing
All tests passing and build successful:
**Unit Tests (283+ tests):**
- ✅ Health module: 38 tests passed
- ✅ Auth module: 115 tests passed (passport v11 integration)
- ✅ REST API: 90 tests passed (middleware and express platform)
- ✅ Feature flags: 17 tests passed (Reflector usage)
- ✅ Workspace: 23 tests passed
**Build & Quality:**
- ✅ Type checking: Passed
- ✅ Linting: Passed
- ✅ Build: 3,683 files compiled successfully
## Verification
Tested critical NestJS functionality:
- ✅ Authentication & Security (JWT, OAuth, guards)
- ✅ HTTP Platform (Express integration, REST endpoints)
- ✅ Dependency Injection (Services, factories, providers)
- ✅ Cache Management (Redis with @nestjs/cache-manager)
- ✅ GraphQL (Query runners, resolvers)
- ✅ Configuration (Environment config)
- ✅ Scheduling (Cron jobs with @nestjs/schedule v4)
- ✅ Lifecycle Hooks (Module initialization and cleanup)
- ✅ Reflector (Metadata reflection in guards)
## Related PRs
- #15835 - Upgrade NestJS from 9.x to 10.x (completed)
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Upgrades NestJS to v11 and updates routing patterns, auth strategies,
GraphQL schema options, and build/dist paths (scripts, Docker, Nx,
migrations, assets), plus enables Devtools in development.
>
> - **Backend (NestJS 11 upgrade)**:
> - Bump `@nestjs/*` packages (core, platform-express, jwt, passport,
typeorm, serve-static, schedule, cli/testing/schematics) to v11.
> - Update REST/route-trigger/file controllers to new wildcard syntax
(`*path`).
> - Refactor OAuth (Google/Microsoft) and SAML strategies (abstract base
+ explicit `validate`); minor typings.
> - Enable `DevtoolsModule` in development.
> - **GraphQL**:
> - Add `buildSchemaOptions.orphanedTypes` for client-config types; keep
Yoga/Sentry setup.
> - **Build/Runtime & Config**:
> - Standardize dist layout (remove `src` in paths): update scripts,
Docker `CMD`, Nx `project.json`, render scripts, TypeORM migration
paths, asset resolution.
> - Adjust `nest-cli.json` (watchOptions, asset globs, migrations
outDir, monorepo/root).
> - Improve config module imports (spread conditional); tsconfig
excludes `node_modules`.
> - Minor Nx default: `start` target caching disabled.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1139fd85a97d0c72314d416d07464cc3c9942783. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-11-16 17:20:06 +00:00
|
|
|
"@nestjs/axios": "3.1.2",
|
|
|
|
|
"@nestjs/cache-manager": "^2.3.0",
|
|
|
|
|
"@nestjs/common": "11.1.9",
|
|
|
|
|
"@nestjs/config": "3.3.0",
|
|
|
|
|
"@nestjs/core": "11.1.9",
|
Upgrade NestJS from 9.x to 10.x (#15835)
## Overview
This PR upgrades all NestJS dependencies from version 9.x to 10.x,
following the [official migration
guide](https://docs.nestjs.com/v10/migration-guide). This is the first
step before upgrading to NestJS 11.x in a future PR.
## Changes
### Dependencies Updated
- `@nestjs/common`: 9.4.3 → 10.4.16
- `@nestjs/core`: 9.4.3 → 10.4.16
- `@nestjs/passport`: 9.0.3 → 10.0.3
- `@nestjs/platform-express`: 9.4.3 → 10.4.16
- `@nestjs/config`: 2.3.4 → 3.2.3
- `@nestjs/event-emitter`: 2.0.4 → 2.1.0
- `@nestjs/testing`: ^9.0.0 → ^10.4.16
- `@nestjs/schematics`: ^9.0.0 → ^10.1.0
### Code Changes
- Fixed `CacheModuleOptions` import from `@nestjs/common` to
`@nestjs/cache-manager` in cache-storage.module-factory.ts
## Breaking Changes Addressed
✅ **CacheModule Migration**: Already using `@nestjs/cache-manager`
package
✅ **TypeScript Version**: Using 5.9.2 (requires 4.8+)
✅ **Node.js Version**: Using 24.5.0 (requires 16+)
✅ **Deprecated APIs**: All v9 deprecations removed in v10 - standard
patterns in use
## Testing
All tests passing and build successful:
- ✅ Health module: 38 tests passed
- ✅ Auth module: 115 tests passed (critical - uses @nestjs/passport)
- ✅ Admin panel: 30 tests passed
- ✅ REST API: 90 tests passed (uses @nestjs/platform-express)
- ✅ Feature flags: 17 tests passed
- ✅ Workspace: 23 tests passed
- ✅ GraphQL query runner: 17 tests passed
- ✅ **Total: 330+ tests passing**
- ✅ Build: 3,683 files compiled successfully
- ✅ Type checking: Passed
- ✅ Linting: Passed
## Verification
Tested critical NestJS functionality:
- Authentication & Security (JWT, OAuth, guards)
- HTTP Platform (Express integration, REST endpoints)
- Dependency Injection (Services, factories, providers)
- Cache Management (Redis with @nestjs/cache-manager)
- GraphQL (Query runners, resolvers)
- Configuration (Environment config)
- Event Emitters (Event-driven architecture)
## Next Steps
This upgrade positions the codebase for the next upgrade to NestJS 11.x,
which will be handled in a separate PR.
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Upgrades NestJS to v10, fixes cache module import, and narrows CI
GraphQL generation diff to generated directories.
>
> - **Backend**
> - **Dependencies**: Upgrade `@nestjs/common`, `@nestjs/core`,
`@nestjs/platform-express`, `@nestjs/passport`, `@nestjs/config`,
`@nestjs/event-emitter`, `@nestjs/testing`, and `@nestjs/schematics` to
v10-compatible versions in `packages/twenty-server/package.json`.
> - **Code**: Update `CacheModuleOptions` import to
`@nestjs/cache-manager` in
`src/engine/core-modules/cache-storage/cache-storage.module-factory.ts`.
> - **CI**
> - **GraphQL**: Restrict schema change detection to
`packages/twenty-front/src/generated` and
`packages/twenty-front/src/generated-metadata` in
`.github/workflows/ci-server.yaml`.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f621230fcf06ea86585b58ea9b61d6a5064230db. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-11-15 22:06:13 +00:00
|
|
|
"@nestjs/event-emitter": "2.1.0",
|
2024-03-20 15:23:46 +00:00
|
|
|
"@nestjs/graphql": "patch:@nestjs/graphql@12.1.1#./patches/@nestjs+graphql+12.1.1.patch",
|
Upgrade NestJS from 10.x to 11.x (#15836)
## Overview
This PR upgrades all NestJS dependencies from version 10.x to 11.x,
following the [official migration
guide](https://docs.nestjs.com/migration-guide). This builds on top of
the v9 to v10 upgrade completed in PR #15835.
## Changes
### Dependencies Updated
**Core packages (10.x → 11.x):**
- `@nestjs/common`: 10.4.16 → 11.0.8
- `@nestjs/core`: 10.4.16 → 11.0.8
- `@nestjs/platform-express`: 10.4.16 → 11.0.8
- `@nestjs/config`: 3.2.3 → 3.3.0
- `@nestjs/passport`: 10.0.3 → 11.0.0
- `@nestjs/axios`: 3.0.2 → 3.1.2
- `@nestjs/schedule`: ^3.0.0 → ^4.1.1
- `@nestjs/serve-static`: 4.0.2 → 5.0.1
- `@nestjs/cache-manager`: ^2.2.1 → ^2.3.0
- `@nestjs/jwt`: 10.2.0 → 11.0.0
- `@nestjs/typeorm`: 10.0.2 → 11.0.0
- `@nestjs/terminus`: 11.0.0 (already on v11)
- `@nestjs/event-emitter`: 2.1.0 (compatible)
**DevDependencies:**
- `@nestjs/testing`: ^10.4.16 → ^11.0.8
- `@nestjs/schematics`: ^10.1.0 → ^11.0.2
- `@nestjs/cli`: 10.3.0 → 11.0.0
### Code Changes
**Fixed: TwentyConfigModule conditional imports**
- Updated `TwentyConfigModule.forRoot()` to use spread operator for
conditional imports
- Fixes TypeScript error with NestJS 11's stricter DynamicModule type
checking
**Cleanup: Removed unused package**
- Removed `@revertdotdev/revert-react` (not being used anywhere in the
codebase)
## Breaking Changes Addressed
### 1. ✅ Reflector Type Inference
- **Impact**: None - codebase only uses `reflector.get()` method
- **Analysis**: Does not use `getAllAndMerge()` or `getAllAndOverride()`
(the methods with breaking changes)
- **Files reviewed**: feature-flag.guard.ts,
message-queue-metadata.accessor.ts,
workspace-query-hook-metadata.accessor.ts
### 2. ✅ Lifecycle Hooks Execution Order
- **Change**: Termination hooks (`OnModuleDestroy`,
`BeforeApplicationShutdown`, `OnApplicationShutdown`) now execute in
REVERSE order
- **Analysis**: Reviewed all lifecycle hook implementations
- Redis client cleanup
- Database connection cleanup (GlobalWorkspaceDataSource)
- BullMQ queue/worker cleanup
- Cache storage cleanup
- **Result**: Dependency order is safe - services using connections
clean up before the connections themselves
### 3. ✅ Middleware Registration Order
- **Change**: Global middleware now executes first regardless of import
order
- **Analysis**: Middleware is not registered as global, so execution
order remains consistent
- **Files reviewed**: app.module.ts, middleware.module.ts
## Testing
All tests passing and build successful:
**Unit Tests (283+ tests):**
- ✅ Health module: 38 tests passed
- ✅ Auth module: 115 tests passed (passport v11 integration)
- ✅ REST API: 90 tests passed (middleware and express platform)
- ✅ Feature flags: 17 tests passed (Reflector usage)
- ✅ Workspace: 23 tests passed
**Build & Quality:**
- ✅ Type checking: Passed
- ✅ Linting: Passed
- ✅ Build: 3,683 files compiled successfully
## Verification
Tested critical NestJS functionality:
- ✅ Authentication & Security (JWT, OAuth, guards)
- ✅ HTTP Platform (Express integration, REST endpoints)
- ✅ Dependency Injection (Services, factories, providers)
- ✅ Cache Management (Redis with @nestjs/cache-manager)
- ✅ GraphQL (Query runners, resolvers)
- ✅ Configuration (Environment config)
- ✅ Scheduling (Cron jobs with @nestjs/schedule v4)
- ✅ Lifecycle Hooks (Module initialization and cleanup)
- ✅ Reflector (Metadata reflection in guards)
## Related PRs
- #15835 - Upgrade NestJS from 9.x to 10.x (completed)
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Upgrades NestJS to v11 and updates routing patterns, auth strategies,
GraphQL schema options, and build/dist paths (scripts, Docker, Nx,
migrations, assets), plus enables Devtools in development.
>
> - **Backend (NestJS 11 upgrade)**:
> - Bump `@nestjs/*` packages (core, platform-express, jwt, passport,
typeorm, serve-static, schedule, cli/testing/schematics) to v11.
> - Update REST/route-trigger/file controllers to new wildcard syntax
(`*path`).
> - Refactor OAuth (Google/Microsoft) and SAML strategies (abstract base
+ explicit `validate`); minor typings.
> - Enable `DevtoolsModule` in development.
> - **GraphQL**:
> - Add `buildSchemaOptions.orphanedTypes` for client-config types; keep
Yoga/Sentry setup.
> - **Build/Runtime & Config**:
> - Standardize dist layout (remove `src` in paths): update scripts,
Docker `CMD`, Nx `project.json`, render scripts, TypeORM migration
paths, asset resolution.
> - Adjust `nest-cli.json` (watchOptions, asset globs, migrations
outDir, monorepo/root).
> - Improve config module imports (spread conditional); tsconfig
excludes `node_modules`.
> - Minor Nx default: `start` target caching disabled.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1139fd85a97d0c72314d416d07464cc3c9942783. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-11-16 17:20:06 +00:00
|
|
|
"@nestjs/jwt": "11.0.1",
|
|
|
|
|
"@nestjs/passport": "11.0.5",
|
|
|
|
|
"@nestjs/platform-express": "11.1.9",
|
|
|
|
|
"@nestjs/schedule": "^6.0.1",
|
|
|
|
|
"@nestjs/serve-static": "5.0.4",
|
2025-08-11 13:58:05 +00:00
|
|
|
"@nestjs/terminus": "11.0.0",
|
Upgrade NestJS from 10.x to 11.x (#15836)
## Overview
This PR upgrades all NestJS dependencies from version 10.x to 11.x,
following the [official migration
guide](https://docs.nestjs.com/migration-guide). This builds on top of
the v9 to v10 upgrade completed in PR #15835.
## Changes
### Dependencies Updated
**Core packages (10.x → 11.x):**
- `@nestjs/common`: 10.4.16 → 11.0.8
- `@nestjs/core`: 10.4.16 → 11.0.8
- `@nestjs/platform-express`: 10.4.16 → 11.0.8
- `@nestjs/config`: 3.2.3 → 3.3.0
- `@nestjs/passport`: 10.0.3 → 11.0.0
- `@nestjs/axios`: 3.0.2 → 3.1.2
- `@nestjs/schedule`: ^3.0.0 → ^4.1.1
- `@nestjs/serve-static`: 4.0.2 → 5.0.1
- `@nestjs/cache-manager`: ^2.2.1 → ^2.3.0
- `@nestjs/jwt`: 10.2.0 → 11.0.0
- `@nestjs/typeorm`: 10.0.2 → 11.0.0
- `@nestjs/terminus`: 11.0.0 (already on v11)
- `@nestjs/event-emitter`: 2.1.0 (compatible)
**DevDependencies:**
- `@nestjs/testing`: ^10.4.16 → ^11.0.8
- `@nestjs/schematics`: ^10.1.0 → ^11.0.2
- `@nestjs/cli`: 10.3.0 → 11.0.0
### Code Changes
**Fixed: TwentyConfigModule conditional imports**
- Updated `TwentyConfigModule.forRoot()` to use spread operator for
conditional imports
- Fixes TypeScript error with NestJS 11's stricter DynamicModule type
checking
**Cleanup: Removed unused package**
- Removed `@revertdotdev/revert-react` (not being used anywhere in the
codebase)
## Breaking Changes Addressed
### 1. ✅ Reflector Type Inference
- **Impact**: None - codebase only uses `reflector.get()` method
- **Analysis**: Does not use `getAllAndMerge()` or `getAllAndOverride()`
(the methods with breaking changes)
- **Files reviewed**: feature-flag.guard.ts,
message-queue-metadata.accessor.ts,
workspace-query-hook-metadata.accessor.ts
### 2. ✅ Lifecycle Hooks Execution Order
- **Change**: Termination hooks (`OnModuleDestroy`,
`BeforeApplicationShutdown`, `OnApplicationShutdown`) now execute in
REVERSE order
- **Analysis**: Reviewed all lifecycle hook implementations
- Redis client cleanup
- Database connection cleanup (GlobalWorkspaceDataSource)
- BullMQ queue/worker cleanup
- Cache storage cleanup
- **Result**: Dependency order is safe - services using connections
clean up before the connections themselves
### 3. ✅ Middleware Registration Order
- **Change**: Global middleware now executes first regardless of import
order
- **Analysis**: Middleware is not registered as global, so execution
order remains consistent
- **Files reviewed**: app.module.ts, middleware.module.ts
## Testing
All tests passing and build successful:
**Unit Tests (283+ tests):**
- ✅ Health module: 38 tests passed
- ✅ Auth module: 115 tests passed (passport v11 integration)
- ✅ REST API: 90 tests passed (middleware and express platform)
- ✅ Feature flags: 17 tests passed (Reflector usage)
- ✅ Workspace: 23 tests passed
**Build & Quality:**
- ✅ Type checking: Passed
- ✅ Linting: Passed
- ✅ Build: 3,683 files compiled successfully
## Verification
Tested critical NestJS functionality:
- ✅ Authentication & Security (JWT, OAuth, guards)
- ✅ HTTP Platform (Express integration, REST endpoints)
- ✅ Dependency Injection (Services, factories, providers)
- ✅ Cache Management (Redis with @nestjs/cache-manager)
- ✅ GraphQL (Query runners, resolvers)
- ✅ Configuration (Environment config)
- ✅ Scheduling (Cron jobs with @nestjs/schedule v4)
- ✅ Lifecycle Hooks (Module initialization and cleanup)
- ✅ Reflector (Metadata reflection in guards)
## Related PRs
- #15835 - Upgrade NestJS from 9.x to 10.x (completed)
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Upgrades NestJS to v11 and updates routing patterns, auth strategies,
GraphQL schema options, and build/dist paths (scripts, Docker, Nx,
migrations, assets), plus enables Devtools in development.
>
> - **Backend (NestJS 11 upgrade)**:
> - Bump `@nestjs/*` packages (core, platform-express, jwt, passport,
typeorm, serve-static, schedule, cli/testing/schematics) to v11.
> - Update REST/route-trigger/file controllers to new wildcard syntax
(`*path`).
> - Refactor OAuth (Google/Microsoft) and SAML strategies (abstract base
+ explicit `validate`); minor typings.
> - Enable `DevtoolsModule` in development.
> - **GraphQL**:
> - Add `buildSchemaOptions.orphanedTypes` for client-config types; keep
Yoga/Sentry setup.
> - **Build/Runtime & Config**:
> - Standardize dist layout (remove `src` in paths): update scripts,
Docker `CMD`, Nx `project.json`, render scripts, TypeORM migration
paths, asset resolution.
> - Adjust `nest-cli.json` (watchOptions, asset globs, migrations
outDir, monorepo/root).
> - Improve config module imports (spread conditional); tsconfig
excludes `node_modules`.
> - Minor Nx default: `start` target caching disabled.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1139fd85a97d0c72314d416d07464cc3c9942783. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-11-16 17:20:06 +00:00
|
|
|
"@nestjs/typeorm": "11.0.0",
|
2025-10-06 13:14:02 +00:00
|
|
|
"@node-saml/node-saml": "5.1.0",
|
|
|
|
|
"@node-saml/passport-saml": "^5.1.0",
|
2025-03-28 07:45:24 +00:00
|
|
|
"@opentelemetry/api": "^1.9.0",
|
2025-06-05 10:28:42 +00:00
|
|
|
"@opentelemetry/auto-instrumentations-node": "^0.60.0",
|
2025-03-28 07:45:24 +00:00
|
|
|
"@opentelemetry/exporter-metrics-otlp-http": "^0.200.0",
|
2026-01-23 15:38:15 +00:00
|
|
|
"@opentelemetry/exporter-prometheus": "^0.211.0",
|
2025-03-28 07:45:24 +00:00
|
|
|
"@opentelemetry/sdk-metrics": "^2.0.0",
|
2025-06-05 10:28:42 +00:00
|
|
|
"@opentelemetry/sdk-node": "^0.202.0",
|
2025-08-11 13:58:05 +00:00
|
|
|
"@ptc-org/nestjs-query-core": "4.4.0",
|
2023-12-11 09:54:57 +00:00
|
|
|
"@ptc-org/nestjs-query-graphql": "patch:@ptc-org/nestjs-query-graphql@4.2.0#./patches/@ptc-org+nestjs-query-graphql+4.2.0.patch",
|
2025-08-11 13:58:05 +00:00
|
|
|
"@ptc-org/nestjs-query-typeorm": "4.2.1-alpha.2",
|
2025-09-21 14:55:34 +00:00
|
|
|
"@react-email/render": "^1.2.3",
|
2025-11-27 12:28:59 +00:00
|
|
|
"@sentry/nestjs": "^10.27.0",
|
|
|
|
|
"@sentry/node": "^10.27.0",
|
|
|
|
|
"@sentry/profiling-node": "^10.27.0",
|
2025-08-11 13:58:05 +00:00
|
|
|
"@sniptt/guards": "0.2.0",
|
|
|
|
|
"addressparser": "1.0.1",
|
2025-11-17 18:03:45 +00:00
|
|
|
"ai": "5.0.52",
|
2025-08-11 13:58:05 +00:00
|
|
|
"apollo-server-core": "3.13.0",
|
|
|
|
|
"archiver": "7.0.1",
|
2025-10-16 11:39:09 +00:00
|
|
|
"axios": "1.12.2",
|
2025-08-11 13:58:05 +00:00
|
|
|
"babel-plugin-module-resolver": "5.0.2",
|
|
|
|
|
"bcrypt": "5.1.1",
|
|
|
|
|
"bullmq": "5.40.0",
|
|
|
|
|
"bytes": "3.1.2",
|
2024-03-07 13:07:01 +00:00
|
|
|
"cache-manager": "^5.4.0",
|
|
|
|
|
"cache-manager-redis-yet": "^4.1.2",
|
2025-08-11 13:58:05 +00:00
|
|
|
"chalk": "4.1.2",
|
|
|
|
|
"class-transformer": "0.5.1",
|
2025-11-13 16:06:04 +00:00
|
|
|
"class-validator": "0.14.0",
|
2025-07-16 19:32:32 +00:00
|
|
|
"class-validator-jsonschema": "^5.0.2",
|
2025-08-01 07:01:27 +00:00
|
|
|
"cloudflare": "^4.5.0",
|
2024-10-21 18:07:08 +00:00
|
|
|
"connect-redis": "^7.1.1",
|
2025-08-11 13:58:05 +00:00
|
|
|
"cron-parser": "5.1.1",
|
|
|
|
|
"dataloader": "2.2.2",
|
|
|
|
|
"date-fns": "2.30.0",
|
|
|
|
|
"deep-equal": "2.2.3",
|
2025-08-12 13:18:59 +00:00
|
|
|
"dompurify": "3.2.6",
|
2025-08-11 13:58:05 +00:00
|
|
|
"dotenv": "16.4.5",
|
2026-01-07 15:58:12 +00:00
|
|
|
"express": "4.22.1",
|
2025-10-29 19:32:15 +00:00
|
|
|
"express-session": "^1.18.2",
|
2025-08-11 13:58:05 +00:00
|
|
|
"file-type": "16.5.4",
|
|
|
|
|
"gaxios": "5.1.3",
|
|
|
|
|
"google-auth-library": "8.9.0",
|
|
|
|
|
"googleapis": "105.0.0",
|
2025-10-22 14:07:47 +00:00
|
|
|
"graphql": "16.8.1",
|
2025-08-11 13:58:05 +00:00
|
|
|
"graphql-fields": "2.0.3",
|
2025-08-05 13:57:37 +00:00
|
|
|
"graphql-middleware": "^6.1.35",
|
2025-08-11 13:58:05 +00:00
|
|
|
"graphql-redis-subscriptions": "2.7.0",
|
|
|
|
|
"graphql-scalars": "1.23.0",
|
|
|
|
|
"graphql-subscriptions": "2.0.0",
|
|
|
|
|
"graphql-tag": "2.12.6",
|
|
|
|
|
"graphql-type-json": "0.3.2",
|
2025-11-21 10:09:47 +00:00
|
|
|
"graphql-upload": "16.0.2",
|
2025-08-11 13:58:05 +00:00
|
|
|
"graphql-yoga": "4.0.5",
|
2025-08-20 05:49:05 +00:00
|
|
|
"html-to-text": "^9.0.5",
|
2025-12-19 14:12:07 +00:00
|
|
|
"imapflow": "1.2.1",
|
2025-08-11 13:58:05 +00:00
|
|
|
"ioredis": "5.6.0",
|
2025-08-12 13:18:59 +00:00
|
|
|
"jsdom": "^26.1.0",
|
2025-08-11 13:58:05 +00:00
|
|
|
"json-schema": "0.4.0",
|
|
|
|
|
"jsonc-eslint-parser": "2.4.0",
|
|
|
|
|
"jsonwebtoken": "9.0.2",
|
|
|
|
|
"libphonenumber-js": "1.11.5",
|
|
|
|
|
"lodash.camelcase": "4.3.0",
|
|
|
|
|
"lodash.chunk": "4.2.0",
|
|
|
|
|
"lodash.compact": "3.0.1",
|
2024-03-22 17:10:55 +00:00
|
|
|
"lodash.differencewith": "^4.5.0",
|
2025-08-11 13:58:05 +00:00
|
|
|
"lodash.groupby": "4.6.0",
|
|
|
|
|
"lodash.isempty": "4.4.0",
|
|
|
|
|
"lodash.isequal": "4.5.0",
|
|
|
|
|
"lodash.isobject": "3.0.2",
|
|
|
|
|
"lodash.kebabcase": "4.1.1",
|
feat: add new ACTOR field type and createdBy standard fields (#6324)
This pull request introduces a new `FieldMetadataType` called `ACTOR`.
The primary objective of this new type is to add an extra column to the
following objects: `person`, `company`, `opportunity`, `note`, `task`,
and all custom objects.
This composite type contains three properties:
- `source`
```typescript
export enum FieldActorSource {
EMAIL = 'EMAIL',
CALENDAR = 'CALENDAR',
API = 'API',
IMPORT = 'IMPORT',
MANUAL = 'MANUAL',
}
```
- `workspaceMemberId`
- This property can be `undefined` in some cases and refers to the
member who created the record.
- `name`
- Serves as a fallback if the `workspaceMember` is deleted and is used
for other source types like `API`.
### Functionality
The pre-hook system has been updated to allow real-time argument
updates. When a record is created, a pre-hook can now compute and update
the arguments accordingly. This enhancement enables the `createdBy`
field to be populated with the correct values based on the
`authContext`.
The `authContext` now includes:
- An optional User entity
- An optional ApiKey entity
- The workspace entity
This provides access to the necessary data for the `createdBy` field.
In the GraphQL API, only the `source` can be specified in the
`createdBy` input. This allows the front-end to specify the source when
creating records from a CSV file.
### Front-End Handling
On the front-end, `orderBy` and `filter` are only applied to the name
property of the `ACTOR` composite type. Currently, we are unable to
apply these operations to the workspace member relation. This means that
if a workspace member changes their first name or last name, there may
be a mismatch because the name will differ from the new one. The name
displayed on the screen is based on the workspace member entity when
available.
### Missing Components
Currently, this PR does not include a `createdBy` value for the `MAIL`
and `CALENDAR` sources. These records are created in a job, and at
present, we only have access to the workspaceId within the job. To
address this, we should use a function similar to
`loadServiceWithContext`, which was recently removed from `TwentyORM`.
This function would allow us to pass the `authContext` to the jobs
without disrupting existing jobs.
Another PR will be created to handle these cases.
### Related Issues
Fixes issue #5155.
### Additional Notes
This PR doesn't include the migrations of the current records and views.
Everything works properly when the database is reset but this part is
still missing for now. We'll add that in another PR.
- There is a minor issue: front-end tests are broken since this commit:
[https://github.com/twentyhq/twenty/commit/80c0fc7ff108d61c0e8d89fd334da64bd224f7aa](https://github.com/twentyhq/twenty/commit/80c0fc7ff108d61c0e8d89fd334da64bd224f7aa).
---------
Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
Co-authored-by: Charles Bochet <charles@twenty.com>
2024-08-03 13:43:31 +00:00
|
|
|
"lodash.merge": "^4.6.2",
|
2025-08-11 13:58:05 +00:00
|
|
|
"lodash.omit": "4.5.0",
|
feat: Enhancements to MessageQueue Module with Decorators (#5657)
### Overview
This PR introduces significant enhancements to the MessageQueue module
by integrating `@Processor`, `@Process`, and `@InjectMessageQueue`
decorators. These changes streamline the process of defining and
managing queue processors and job handlers, and also allow for
request-scoped handlers, improving compatibility with services that rely
on scoped providers like TwentyORM repositories.
### Key Features
1. **Decorator-based Job Handling**: Use `@Processor` and `@Process`
decorators to define job handlers declaratively.
2. **Request Scope Support**: Job handlers can be scoped per request,
enhancing integration with request-scoped services.
### Usage
#### Defining Processors and Job Handlers
The `@Processor` decorator is used to define a class that processes jobs
for a specific queue. The `@Process` decorator is applied to methods
within this class to define specific job handlers.
##### Example 1: Specific Job Handlers
```typescript
import { Processor, Process, InjectMessageQueue } from 'src/engine/integrations/message-queue';
@Processor('taskQueue')
export class TaskProcessor {
@Process('taskA')
async handleTaskA(job: { id: string, data: any }) {
console.log(`Handling task A with data:`, job.data);
// Logic for task A
}
@Process('taskB')
async handleTaskB(job: { id: string, data: any }) {
console.log(`Handling task B with data:`, job.data);
// Logic for task B
}
}
```
In the example above, `TaskProcessor` is responsible for processing jobs
in the `taskQueue`. The `handleTaskA` method will only be called for
jobs with the name `taskA`, while `handleTaskB` will be called for
`taskB` jobs.
##### Example 2: General Job Handler
```typescript
import { Processor, Process, InjectMessageQueue } from 'src/engine/integrations/message-queue';
@Processor('generalQueue')
export class GeneralProcessor {
@Process()
async handleAnyJob(job: { id: string, name: string, data: any }) {
console.log(`Handling job ${job.name} with data:`, job.data);
// Logic for any job
}
}
```
In this example, `GeneralProcessor` handles all jobs in the
`generalQueue`, regardless of the job name. The `handleAnyJob` method
will be invoked for every job added to the `generalQueue`.
#### Adding Jobs to a Queue
You can use the `@InjectMessageQueue` decorator to inject a queue into a
service and add jobs to it.
##### Example:
```typescript
import { Injectable } from '@nestjs/common';
import { InjectMessageQueue, MessageQueue } from 'src/engine/integrations/message-queue';
@Injectable()
export class TaskService {
constructor(
@InjectMessageQueue('taskQueue') private readonly taskQueue: MessageQueue,
) {}
async addTaskA(data: any) {
await this.taskQueue.add('taskA', data);
}
async addTaskB(data: any) {
await this.taskQueue.add('taskB', data);
}
}
```
In this example, `TaskService` adds jobs to the `taskQueue`. The
`addTaskA` and `addTaskB` methods add jobs named `taskA` and `taskB`,
respectively, to the queue.
#### Using Scoped Job Handlers
To utilize request-scoped job handlers, specify the scope in the
`@Processor` decorator. This is particularly useful for services that
use scoped repositories like those in TwentyORM.
##### Example:
```typescript
import { Processor, Process, InjectMessageQueue, Scope } from 'src/engine/integrations/message-queue';
@Processor({ name: 'scopedQueue', scope: Scope.REQUEST })
export class ScopedTaskProcessor {
@Process('scopedTask')
async handleScopedTask(job: { id: string, data: any }) {
console.log(`Handling scoped task with data:`, job.data);
// Logic for scoped task, which might use request-scoped services
}
}
```
Here, the `ScopedTaskProcessor` is associated with `scopedQueue` and
operates with request scope. This setup is essential when the job
handler relies on services that need to be instantiated per request,
such as scoped repositories.
### Migration Notes
- **Decorators**: Refactor job handlers to use `@Processor` and
`@Process` decorators.
- **Request Scope**: Utilize the scope option in `@Processor` if your
job handlers depend on request-scoped services.
Fix #5628
---------
Co-authored-by: Weiko <corentin@twenty.com>
2024-06-17 07:49:37 +00:00
|
|
|
"lodash.omitby": "^4.6.0",
|
2025-08-11 13:58:05 +00:00
|
|
|
"lodash.snakecase": "4.1.1",
|
2024-03-22 17:44:14 +00:00
|
|
|
"lodash.uniq": "^4.5.0",
|
|
|
|
|
"lodash.uniqby": "^4.7.0",
|
2025-08-11 13:58:05 +00:00
|
|
|
"lodash.upperfirst": "4.3.1",
|
2025-12-19 14:12:07 +00:00
|
|
|
"mailparser": "3.9.1",
|
2025-08-11 13:58:05 +00:00
|
|
|
"microdiff": "1.4.0",
|
|
|
|
|
"ms": "2.1.3",
|
2025-09-10 13:12:38 +00:00
|
|
|
"nest-commander": "^3.19.1",
|
2025-07-15 15:41:23 +00:00
|
|
|
"node-ical": "^0.20.1",
|
2025-12-19 14:12:07 +00:00
|
|
|
"nodemailer": "^7.0.11",
|
2025-08-11 13:58:05 +00:00
|
|
|
"openapi-types": "12.1.3",
|
2024-10-21 18:07:08 +00:00
|
|
|
"openid-client": "^5.7.0",
|
2025-01-24 17:23:57 +00:00
|
|
|
"otplib": "^12.0.1",
|
2024-03-04 16:50:41 +00:00
|
|
|
"passport": "^0.7.0",
|
2025-08-11 13:58:05 +00:00
|
|
|
"passport-google-oauth20": "2.0.0",
|
|
|
|
|
"passport-jwt": "4.0.1",
|
|
|
|
|
"passport-microsoft": "2.1.0",
|
2025-09-02 09:24:59 +00:00
|
|
|
"path-to-regexp": "^8.2.0",
|
2025-08-11 13:58:05 +00:00
|
|
|
"pg": "8.12.0",
|
|
|
|
|
"planer": "1.2.0",
|
|
|
|
|
"pluralize": "8.0.0",
|
2025-12-04 13:32:41 +00:00
|
|
|
"postal-mime": "^2.6.1",
|
2024-03-21 18:22:21 +00:00
|
|
|
"psl": "^1.9.0",
|
2025-08-11 13:58:05 +00:00
|
|
|
"react": "18.3.1",
|
|
|
|
|
"react-dom": "18.3.1",
|
2024-10-21 18:07:08 +00:00
|
|
|
"redis": "^4.7.0",
|
2025-08-11 13:58:05 +00:00
|
|
|
"reflect-metadata": "0.2.2",
|
|
|
|
|
"rxjs": "7.8.1",
|
|
|
|
|
"semver": "7.6.3",
|
|
|
|
|
"sharp": "0.32.6",
|
2025-12-28 14:42:18 +00:00
|
|
|
"stripe": "19.3.1",
|
2026-01-20 09:57:20 +00:00
|
|
|
"temporal-polyfill": "^0.3.0",
|
2025-08-11 13:58:05 +00:00
|
|
|
"transliteration": "2.3.5",
|
2024-07-04 06:57:26 +00:00
|
|
|
"tsconfig-paths": "^4.2.0",
|
2025-07-15 15:41:23 +00:00
|
|
|
"tsdav": "^2.1.5",
|
2025-08-11 13:58:05 +00:00
|
|
|
"tslib": "2.8.1",
|
|
|
|
|
"type-fest": "4.10.1",
|
2024-08-27 12:13:05 +00:00
|
|
|
"typeorm": "patch:typeorm@0.3.20#./patches/typeorm+0.3.20.patch",
|
2024-09-02 13:25:20 +00:00
|
|
|
"unzipper": "^0.12.3",
|
2025-08-11 13:58:05 +00:00
|
|
|
"uuid": "9.0.1",
|
|
|
|
|
"vite-tsconfig-paths": "4.3.2",
|
2025-10-06 14:38:44 +00:00
|
|
|
"zod": "^4.1.11"
|
2024-01-23 08:59:00 +00:00
|
|
|
},
|
|
|
|
|
"devDependencies": {
|
2025-05-28 10:22:28 +00:00
|
|
|
"@faker-js/faker": "^9.8.0",
|
2025-03-17 09:09:07 +00:00
|
|
|
"@lingui/cli": "^5.1.2",
|
2026-02-09 12:12:05 +00:00
|
|
|
"@nestjs/cli": "^11.0.16",
|
2025-10-06 13:14:57 +00:00
|
|
|
"@nestjs/devtools-integration": "^0.2.1",
|
Upgrade NestJS from 10.x to 11.x (#15836)
## Overview
This PR upgrades all NestJS dependencies from version 10.x to 11.x,
following the [official migration
guide](https://docs.nestjs.com/migration-guide). This builds on top of
the v9 to v10 upgrade completed in PR #15835.
## Changes
### Dependencies Updated
**Core packages (10.x → 11.x):**
- `@nestjs/common`: 10.4.16 → 11.0.8
- `@nestjs/core`: 10.4.16 → 11.0.8
- `@nestjs/platform-express`: 10.4.16 → 11.0.8
- `@nestjs/config`: 3.2.3 → 3.3.0
- `@nestjs/passport`: 10.0.3 → 11.0.0
- `@nestjs/axios`: 3.0.2 → 3.1.2
- `@nestjs/schedule`: ^3.0.0 → ^4.1.1
- `@nestjs/serve-static`: 4.0.2 → 5.0.1
- `@nestjs/cache-manager`: ^2.2.1 → ^2.3.0
- `@nestjs/jwt`: 10.2.0 → 11.0.0
- `@nestjs/typeorm`: 10.0.2 → 11.0.0
- `@nestjs/terminus`: 11.0.0 (already on v11)
- `@nestjs/event-emitter`: 2.1.0 (compatible)
**DevDependencies:**
- `@nestjs/testing`: ^10.4.16 → ^11.0.8
- `@nestjs/schematics`: ^10.1.0 → ^11.0.2
- `@nestjs/cli`: 10.3.0 → 11.0.0
### Code Changes
**Fixed: TwentyConfigModule conditional imports**
- Updated `TwentyConfigModule.forRoot()` to use spread operator for
conditional imports
- Fixes TypeScript error with NestJS 11's stricter DynamicModule type
checking
**Cleanup: Removed unused package**
- Removed `@revertdotdev/revert-react` (not being used anywhere in the
codebase)
## Breaking Changes Addressed
### 1. ✅ Reflector Type Inference
- **Impact**: None - codebase only uses `reflector.get()` method
- **Analysis**: Does not use `getAllAndMerge()` or `getAllAndOverride()`
(the methods with breaking changes)
- **Files reviewed**: feature-flag.guard.ts,
message-queue-metadata.accessor.ts,
workspace-query-hook-metadata.accessor.ts
### 2. ✅ Lifecycle Hooks Execution Order
- **Change**: Termination hooks (`OnModuleDestroy`,
`BeforeApplicationShutdown`, `OnApplicationShutdown`) now execute in
REVERSE order
- **Analysis**: Reviewed all lifecycle hook implementations
- Redis client cleanup
- Database connection cleanup (GlobalWorkspaceDataSource)
- BullMQ queue/worker cleanup
- Cache storage cleanup
- **Result**: Dependency order is safe - services using connections
clean up before the connections themselves
### 3. ✅ Middleware Registration Order
- **Change**: Global middleware now executes first regardless of import
order
- **Analysis**: Middleware is not registered as global, so execution
order remains consistent
- **Files reviewed**: app.module.ts, middleware.module.ts
## Testing
All tests passing and build successful:
**Unit Tests (283+ tests):**
- ✅ Health module: 38 tests passed
- ✅ Auth module: 115 tests passed (passport v11 integration)
- ✅ REST API: 90 tests passed (middleware and express platform)
- ✅ Feature flags: 17 tests passed (Reflector usage)
- ✅ Workspace: 23 tests passed
**Build & Quality:**
- ✅ Type checking: Passed
- ✅ Linting: Passed
- ✅ Build: 3,683 files compiled successfully
## Verification
Tested critical NestJS functionality:
- ✅ Authentication & Security (JWT, OAuth, guards)
- ✅ HTTP Platform (Express integration, REST endpoints)
- ✅ Dependency Injection (Services, factories, providers)
- ✅ Cache Management (Redis with @nestjs/cache-manager)
- ✅ GraphQL (Query runners, resolvers)
- ✅ Configuration (Environment config)
- ✅ Scheduling (Cron jobs with @nestjs/schedule v4)
- ✅ Lifecycle Hooks (Module initialization and cleanup)
- ✅ Reflector (Metadata reflection in guards)
## Related PRs
- #15835 - Upgrade NestJS from 9.x to 10.x (completed)
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Upgrades NestJS to v11 and updates routing patterns, auth strategies,
GraphQL schema options, and build/dist paths (scripts, Docker, Nx,
migrations, assets), plus enables Devtools in development.
>
> - **Backend (NestJS 11 upgrade)**:
> - Bump `@nestjs/*` packages (core, platform-express, jwt, passport,
typeorm, serve-static, schedule, cli/testing/schematics) to v11.
> - Update REST/route-trigger/file controllers to new wildcard syntax
(`*path`).
> - Refactor OAuth (Google/Microsoft) and SAML strategies (abstract base
+ explicit `validate`); minor typings.
> - Enable `DevtoolsModule` in development.
> - **GraphQL**:
> - Add `buildSchemaOptions.orphanedTypes` for client-config types; keep
Yoga/Sentry setup.
> - **Build/Runtime & Config**:
> - Standardize dist layout (remove `src` in paths): update scripts,
Docker `CMD`, Nx `project.json`, render scripts, TypeORM migration
paths, asset resolution.
> - Adjust `nest-cli.json` (watchOptions, asset globs, migrations
outDir, monorepo/root).
> - Improve config module imports (spread conditional); tsconfig
excludes `node_modules`.
> - Minor Nx default: `start` target caching disabled.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1139fd85a97d0c72314d416d07464cc3c9942783. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-11-16 17:20:06 +00:00
|
|
|
"@nestjs/schematics": "^11.0.9",
|
|
|
|
|
"@nestjs/testing": "^11.1.9",
|
2025-08-12 05:15:20 +00:00
|
|
|
"@types/babel__preset-env": "7.10.0",
|
|
|
|
|
"@types/bytes": "^3.1.1",
|
|
|
|
|
"@types/dompurify": "^3.0.5",
|
|
|
|
|
"@types/express": "^4.17.13",
|
2024-10-21 18:07:08 +00:00
|
|
|
"@types/express-session": "^1.18.0",
|
2025-11-21 10:09:47 +00:00
|
|
|
"@types/graphql-upload": "^16.0.7",
|
2025-08-20 05:49:05 +00:00
|
|
|
"@types/html-to-text": "^9.0.4",
|
2025-08-12 05:15:20 +00:00
|
|
|
"@types/lodash.chunk": "^4.2.9",
|
2024-03-22 17:10:55 +00:00
|
|
|
"@types/lodash.differencewith": "^4.5.9",
|
2024-01-23 08:59:00 +00:00
|
|
|
"@types/lodash.isempty": "^4.4.7",
|
2024-02-15 17:04:12 +00:00
|
|
|
"@types/lodash.isequal": "^4.5.8",
|
2024-01-23 08:59:00 +00:00
|
|
|
"@types/lodash.isobject": "^3.0.7",
|
feat: add new ACTOR field type and createdBy standard fields (#6324)
This pull request introduces a new `FieldMetadataType` called `ACTOR`.
The primary objective of this new type is to add an extra column to the
following objects: `person`, `company`, `opportunity`, `note`, `task`,
and all custom objects.
This composite type contains three properties:
- `source`
```typescript
export enum FieldActorSource {
EMAIL = 'EMAIL',
CALENDAR = 'CALENDAR',
API = 'API',
IMPORT = 'IMPORT',
MANUAL = 'MANUAL',
}
```
- `workspaceMemberId`
- This property can be `undefined` in some cases and refers to the
member who created the record.
- `name`
- Serves as a fallback if the `workspaceMember` is deleted and is used
for other source types like `API`.
### Functionality
The pre-hook system has been updated to allow real-time argument
updates. When a record is created, a pre-hook can now compute and update
the arguments accordingly. This enhancement enables the `createdBy`
field to be populated with the correct values based on the
`authContext`.
The `authContext` now includes:
- An optional User entity
- An optional ApiKey entity
- The workspace entity
This provides access to the necessary data for the `createdBy` field.
In the GraphQL API, only the `source` can be specified in the
`createdBy` input. This allows the front-end to specify the source when
creating records from a CSV file.
### Front-End Handling
On the front-end, `orderBy` and `filter` are only applied to the name
property of the `ACTOR` composite type. Currently, we are unable to
apply these operations to the workspace member relation. This means that
if a workspace member changes their first name or last name, there may
be a mismatch because the name will differ from the new one. The name
displayed on the screen is based on the workspace member entity when
available.
### Missing Components
Currently, this PR does not include a `createdBy` value for the `MAIL`
and `CALENDAR` sources. These records are created in a job, and at
present, we only have access to the workspaceId within the job. To
address this, we should use a function similar to
`loadServiceWithContext`, which was recently removed from `TwentyORM`.
This function would allow us to pass the `authContext` to the jobs
without disrupting existing jobs.
Another PR will be created to handle these cases.
### Related Issues
Fixes issue #5155.
### Additional Notes
This PR doesn't include the migrations of the current records and views.
Everything works properly when the database is reset but this part is
still missing for now. We'll add that in another PR.
- There is a minor issue: front-end tests are broken since this commit:
[https://github.com/twentyhq/twenty/commit/80c0fc7ff108d61c0e8d89fd334da64bd224f7aa](https://github.com/twentyhq/twenty/commit/80c0fc7ff108d61c0e8d89fd334da64bd224f7aa).
---------
Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
Co-authored-by: Charles Bochet <charles@twenty.com>
2024-08-03 13:43:31 +00:00
|
|
|
"@types/lodash.merge": "^4.6.9",
|
2024-01-30 13:40:55 +00:00
|
|
|
"@types/lodash.omit": "^4.5.9",
|
feat: Enhancements to MessageQueue Module with Decorators (#5657)
### Overview
This PR introduces significant enhancements to the MessageQueue module
by integrating `@Processor`, `@Process`, and `@InjectMessageQueue`
decorators. These changes streamline the process of defining and
managing queue processors and job handlers, and also allow for
request-scoped handlers, improving compatibility with services that rely
on scoped providers like TwentyORM repositories.
### Key Features
1. **Decorator-based Job Handling**: Use `@Processor` and `@Process`
decorators to define job handlers declaratively.
2. **Request Scope Support**: Job handlers can be scoped per request,
enhancing integration with request-scoped services.
### Usage
#### Defining Processors and Job Handlers
The `@Processor` decorator is used to define a class that processes jobs
for a specific queue. The `@Process` decorator is applied to methods
within this class to define specific job handlers.
##### Example 1: Specific Job Handlers
```typescript
import { Processor, Process, InjectMessageQueue } from 'src/engine/integrations/message-queue';
@Processor('taskQueue')
export class TaskProcessor {
@Process('taskA')
async handleTaskA(job: { id: string, data: any }) {
console.log(`Handling task A with data:`, job.data);
// Logic for task A
}
@Process('taskB')
async handleTaskB(job: { id: string, data: any }) {
console.log(`Handling task B with data:`, job.data);
// Logic for task B
}
}
```
In the example above, `TaskProcessor` is responsible for processing jobs
in the `taskQueue`. The `handleTaskA` method will only be called for
jobs with the name `taskA`, while `handleTaskB` will be called for
`taskB` jobs.
##### Example 2: General Job Handler
```typescript
import { Processor, Process, InjectMessageQueue } from 'src/engine/integrations/message-queue';
@Processor('generalQueue')
export class GeneralProcessor {
@Process()
async handleAnyJob(job: { id: string, name: string, data: any }) {
console.log(`Handling job ${job.name} with data:`, job.data);
// Logic for any job
}
}
```
In this example, `GeneralProcessor` handles all jobs in the
`generalQueue`, regardless of the job name. The `handleAnyJob` method
will be invoked for every job added to the `generalQueue`.
#### Adding Jobs to a Queue
You can use the `@InjectMessageQueue` decorator to inject a queue into a
service and add jobs to it.
##### Example:
```typescript
import { Injectable } from '@nestjs/common';
import { InjectMessageQueue, MessageQueue } from 'src/engine/integrations/message-queue';
@Injectable()
export class TaskService {
constructor(
@InjectMessageQueue('taskQueue') private readonly taskQueue: MessageQueue,
) {}
async addTaskA(data: any) {
await this.taskQueue.add('taskA', data);
}
async addTaskB(data: any) {
await this.taskQueue.add('taskB', data);
}
}
```
In this example, `TaskService` adds jobs to the `taskQueue`. The
`addTaskA` and `addTaskB` methods add jobs named `taskA` and `taskB`,
respectively, to the queue.
#### Using Scoped Job Handlers
To utilize request-scoped job handlers, specify the scope in the
`@Processor` decorator. This is particularly useful for services that
use scoped repositories like those in TwentyORM.
##### Example:
```typescript
import { Processor, Process, InjectMessageQueue, Scope } from 'src/engine/integrations/message-queue';
@Processor({ name: 'scopedQueue', scope: Scope.REQUEST })
export class ScopedTaskProcessor {
@Process('scopedTask')
async handleScopedTask(job: { id: string, data: any }) {
console.log(`Handling scoped task with data:`, job.data);
// Logic for scoped task, which might use request-scoped services
}
}
```
Here, the `ScopedTaskProcessor` is associated with `scopedQueue` and
operates with request scope. This setup is essential when the job
handler relies on services that need to be instantiated per request,
such as scoped repositories.
### Migration Notes
- **Decorators**: Refactor job handlers to use `@Processor` and
`@Process` decorators.
- **Request Scope**: Utilize the scope option in `@Processor` if your
job handlers depend on request-scoped services.
Fix #5628
---------
Co-authored-by: Weiko <corentin@twenty.com>
2024-06-17 07:49:37 +00:00
|
|
|
"@types/lodash.omitby": "^4.6.9",
|
2024-01-23 08:59:00 +00:00
|
|
|
"@types/lodash.snakecase": "^4.1.7",
|
2024-03-22 17:44:14 +00:00
|
|
|
"@types/lodash.uniq": "^4.5.9",
|
|
|
|
|
"@types/lodash.uniqby": "^4.7.9",
|
2024-01-23 08:59:00 +00:00
|
|
|
"@types/lodash.upperfirst": "^4.3.7",
|
2025-08-12 05:15:20 +00:00
|
|
|
"@types/mailparser": "^3.4.6",
|
|
|
|
|
"@types/ms": "^0.7.31",
|
|
|
|
|
"@types/node": "^24.0.0",
|
2025-10-26 06:08:13 +00:00
|
|
|
"@types/nodemailer": "^7.0.3",
|
2024-10-21 18:07:08 +00:00
|
|
|
"@types/openid-client": "^3.7.0",
|
2025-08-12 05:15:20 +00:00
|
|
|
"@types/passport-google-oauth20": "^2.0.11",
|
|
|
|
|
"@types/passport-jwt": "^3.0.8",
|
|
|
|
|
"@types/passport-microsoft": "^2.1.0",
|
|
|
|
|
"@types/pluralize": "^0.0.33",
|
2025-06-27 12:31:27 +00:00
|
|
|
"@types/psl": "^1.1.3",
|
2024-01-23 08:59:00 +00:00
|
|
|
"@types/react": "^18.2.39",
|
2024-09-02 13:25:20 +00:00
|
|
|
"@types/unzipper": "^0",
|
2025-08-12 05:15:20 +00:00
|
|
|
"@yarnpkg/types": "^4.0.0",
|
2024-02-14 15:56:37 +00:00
|
|
|
"rimraf": "^5.0.5",
|
2025-01-20 22:10:39 +00:00
|
|
|
"twenty-emails": "workspace:*",
|
2025-10-06 08:47:42 +00:00
|
|
|
"twenty-shared": "workspace:*"
|
2023-12-11 09:54:57 +00:00
|
|
|
},
|
|
|
|
|
"engines": {
|
2025-08-07 16:22:28 +00:00
|
|
|
"node": "^24.5.0",
|
2023-12-11 09:54:57 +00:00
|
|
|
"npm": "please-use-yarn",
|
|
|
|
|
"yarn": "^4.0.2"
|
2022-12-01 14:58:08 +00:00
|
|
|
}
|
2024-02-05 14:01:37 +00:00
|
|
|
}
|