diff --git a/packages/@n8n/db/package.json b/packages/@n8n/db/package.json index c4fa6a7449..01b476eb3a 100644 --- a/packages/@n8n/db/package.json +++ b/packages/@n8n/db/package.json @@ -21,6 +21,12 @@ "dist/**/*" ], "dependencies": { + "@n8n/config": "workspace:^", + "@n8n/di": "workspace:^", + "@n8n/typeorm": "catalog:", + "n8n-core": "workspace:^", + "n8n-workflow": "workspace:^", + "nanoid": "catalog:", "reflect-metadata": "catalog:" }, "devDependencies": { diff --git a/packages/cli/src/databases/entities/abstract-entity.ts b/packages/@n8n/db/src/entities/abstract-entity.ts similarity index 80% rename from packages/cli/src/databases/entities/abstract-entity.ts rename to packages/@n8n/db/src/entities/abstract-entity.ts index ac16b55bf5..1788e16ff2 100644 --- a/packages/cli/src/databases/entities/abstract-entity.ts +++ b/packages/@n8n/db/src/entities/abstract-entity.ts @@ -4,6 +4,7 @@ import type { ColumnOptions } from '@n8n/typeorm'; import { BeforeInsert, BeforeUpdate, + Column, CreateDateColumn, PrimaryColumn, UpdateDateColumn, @@ -24,12 +25,26 @@ const timestampSyntax = { export const jsonColumnType = dbType === 'sqlite' ? 'simple-json' : 'json'; export const datetimeColumnType = dbType === 'postgresdb' ? 'timestamptz' : 'datetime'; +export function JsonColumn(options?: Omit) { + return Column({ + ...options, + type: jsonColumnType, + }); +} + +export function DateTimeColumn(options?: Omit) { + return Column({ + ...options, + type: datetimeColumnType, + }); +} const tsColumnOptions: ColumnOptions = { precision: 3, default: () => timestampSyntax, type: datetimeColumnType, }; +// eslint-disable-next-line @typescript-eslint/no-explicit-any function mixinStringId>(base: T) { class Derived extends base { @PrimaryColumn('varchar') @@ -45,6 +60,7 @@ function mixinStringId>(base: T) { return Derived; } +// eslint-disable-next-line @typescript-eslint/no-explicit-any function mixinTimestamps>(base: T) { class Derived extends base { @CreateDateColumn(tsColumnOptions) diff --git a/packages/@n8n/db/src/index.ts b/packages/@n8n/db/src/index.ts index cb0ff5c3b5..475df35aec 100644 --- a/packages/@n8n/db/src/index.ts +++ b/packages/@n8n/db/src/index.ts @@ -1 +1,14 @@ -export {}; +export { + WithStringId, + WithTimestamps, + WithTimestampsAndStringId, + jsonColumnType, + datetimeColumnType, + dbType, + JsonColumn, + DateTimeColumn, +} from './entities/abstract-entity'; + +export { generateNanoId } from './utils/generators'; +export { isStringArray } from './utils/is-string-array'; +export { separate } from './utils/separate'; diff --git a/packages/cli/src/databases/utils/generators.ts b/packages/@n8n/db/src/utils/generators.ts similarity index 100% rename from packages/cli/src/databases/utils/generators.ts rename to packages/@n8n/db/src/utils/generators.ts diff --git a/packages/@n8n/db/src/utils/is-string-array.ts b/packages/@n8n/db/src/utils/is-string-array.ts new file mode 100644 index 0000000000..358e7296dc --- /dev/null +++ b/packages/@n8n/db/src/utils/is-string-array.ts @@ -0,0 +1,3 @@ +export function isStringArray(value: unknown): value is string[] { + return Array.isArray(value) && value.every((item) => typeof item === 'string'); +} diff --git a/packages/@n8n/db/src/utils/separate.ts b/packages/@n8n/db/src/utils/separate.ts new file mode 100644 index 0000000000..10c8facfda --- /dev/null +++ b/packages/@n8n/db/src/utils/separate.ts @@ -0,0 +1,8 @@ +export const separate = (array: T[], test: (element: T) => boolean) => { + const pass: T[] = []; + const fail: T[] = []; + + array.forEach((i) => (test(i) ? pass : fail).push(i)); + + return [pass, fail]; +}; diff --git a/packages/@n8n/db/tsconfig.json b/packages/@n8n/db/tsconfig.json index eca44d32aa..118668f557 100644 --- a/packages/@n8n/db/tsconfig.json +++ b/packages/@n8n/db/tsconfig.json @@ -6,7 +6,10 @@ "baseUrl": "src", "tsBuildInfoFile": "dist/typecheck.tsbuildinfo", "experimentalDecorators": true, - "emitDecoratorMetadata": true + "emitDecoratorMetadata": true, + + // remove all options below this line + "strictPropertyInitialization": false }, "include": ["src/**/*.ts"] } diff --git a/packages/cli/package.json b/packages/cli/package.json index 166438bf8d..0110c3a30e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -102,7 +102,7 @@ "@n8n/permissions": "workspace:*", "@n8n/task-runner": "workspace:*", "@n8n/ai-workflow-builder": "workspace:*", - "@n8n/typeorm": "0.3.20-12", + "@n8n/typeorm": "catalog:", "@n8n_io/ai-assistant-sdk": "catalog:", "@n8n_io/license-sdk": "2.20.0", "@oclif/core": "4.0.7", diff --git a/packages/cli/src/active-executions.ts b/packages/cli/src/active-executions.ts index 8423f82823..60d8f73262 100644 --- a/packages/cli/src/active-executions.ts +++ b/packages/cli/src/active-executions.ts @@ -13,16 +13,12 @@ import type PCancelable from 'p-cancelable'; import { ExecutionRepository } from '@/databases/repositories/execution.repository'; import { ExecutionNotFoundError } from '@/errors/execution-not-found-error'; -import type { - CreateExecutionPayload, - IExecutingWorkflowData, - IExecutionDb, - IExecutionsCurrentSummary, -} from '@/interfaces'; +import type { IExecutingWorkflowData, IExecutionsCurrentSummary } from '@/interfaces'; import { isWorkflowIdValid } from '@/utils'; import { ConcurrencyControlService } from './concurrency/concurrency-control.service'; import config from './config'; +import type { CreateExecutionPayload, IExecutionDb } from './types-db'; @Service() export class ActiveExecutions { diff --git a/packages/cli/src/commands/import/workflow.ts b/packages/cli/src/commands/import/workflow.ts index 5ef25456e0..f790e692f6 100644 --- a/packages/cli/src/commands/import/workflow.ts +++ b/packages/cli/src/commands/import/workflow.ts @@ -1,3 +1,4 @@ +import { generateNanoId } from '@n8n/db'; import { Container } from '@n8n/di'; import { Flags } from '@oclif/core'; import glob from 'fast-glob'; @@ -11,7 +12,6 @@ import { ProjectRepository } from '@/databases/repositories/project.repository'; import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository'; import { UserRepository } from '@/databases/repositories/user.repository'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; -import { generateNanoId } from '@/databases/utils/generators'; import type { IWorkflowToImport } from '@/interfaces'; import { ImportService } from '@/services/import.service'; diff --git a/packages/cli/src/controllers/folder.controller.ts b/packages/cli/src/controllers/folder.controller.ts index 7e00196fd2..34ff1fc01c 100644 --- a/packages/cli/src/controllers/folder.controller.ts +++ b/packages/cli/src/controllers/folder.controller.ts @@ -21,9 +21,9 @@ import { FolderNotFoundError } from '@/errors/folder-not-found.error'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { InternalServerError } from '@/errors/response-errors/internal-server.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; -import type { ListQuery } from '@/requests'; import { AuthenticatedRequest } from '@/requests'; import { FolderService } from '@/services/folder.service'; +import type { ListQuery } from '@/types-db'; @RestController('/projects/:projectId/folders') export class ProjectController { diff --git a/packages/cli/src/controllers/users.controller.ts b/packages/cli/src/controllers/users.controller.ts index 5c6ae9e13e..3729e0ce89 100644 --- a/packages/cli/src/controllers/users.controller.ts +++ b/packages/cli/src/controllers/users.controller.ts @@ -27,10 +27,11 @@ import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { EventService } from '@/events/event.service'; import { ExternalHooks } from '@/external-hooks'; import { listQueryMiddleware } from '@/middlewares'; -import { AuthenticatedRequest, ListQuery, UserRequest } from '@/requests'; +import { AuthenticatedRequest, UserRequest } from '@/requests'; import { FolderService } from '@/services/folder.service'; import { ProjectService } from '@/services/project.service.ee'; import { UserService } from '@/services/user.service'; +import { ListQuery } from '@/types-db'; import type { PublicUser } from '@/types-db'; import { WorkflowService } from '@/workflows/workflow.service'; diff --git a/packages/cli/src/credentials/__tests__/credentials.controller.test.ts b/packages/cli/src/credentials/__tests__/credentials.controller.test.ts index 9481c16cf5..5ad369c6c5 100644 --- a/packages/cli/src/credentials/__tests__/credentials.controller.test.ts +++ b/packages/cli/src/credentials/__tests__/credentials.controller.test.ts @@ -50,6 +50,7 @@ describe('CredentialsController', () => { id: newCredentialsPayload.projectId, }); + // @ts-ignore credentialsService.createUnmanagedCredential.mockResolvedValue(createdCredentials); sharedCredentialsRepository.findCredentialOwningProject.mockResolvedValue( diff --git a/packages/cli/src/credentials/credentials.service.ts b/packages/cli/src/credentials/credentials.service.ts index 44f66cf0b4..64e7e3729a 100644 --- a/packages/cli/src/credentials/credentials.service.ts +++ b/packages/cli/src/credentials/credentials.service.ts @@ -33,13 +33,12 @@ import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { ExternalHooks } from '@/external-hooks'; import { validateEntity } from '@/generic-helpers'; import { userHasScopes } from '@/permissions.ee/check-access'; -import type { CredentialRequest, ListQuery } from '@/requests'; +import type { CredentialRequest } from '@/requests'; import { CredentialsTester } from '@/services/credentials-tester.service'; import { OwnershipService } from '@/services/ownership.service'; import { ProjectService } from '@/services/project.service.ee'; -import type { ScopesField } from '@/services/role.service'; import { RoleService } from '@/services/role.service'; -import type { ICredentialsDb } from '@/types-db'; +import type { ICredentialsDb, ListQuery, ScopesField } from '@/types-db'; import { CredentialsFinderService } from './credentials-finder.service'; diff --git a/packages/cli/src/databases/entities/annotation-tag-entity.ee.ts b/packages/cli/src/databases/entities/annotation-tag-entity.ee.ts index 4aed8df8af..48a0597290 100644 --- a/packages/cli/src/databases/entities/annotation-tag-entity.ee.ts +++ b/packages/cli/src/databases/entities/annotation-tag-entity.ee.ts @@ -1,11 +1,10 @@ +import { WithTimestampsAndStringId } from '@n8n/db'; import { Column, Entity, Index, ManyToMany, OneToMany } from '@n8n/typeorm'; import { IsString, Length } from 'class-validator'; import type { AnnotationTagMapping } from '@/databases/entities/annotation-tag-mapping.ee'; import type { ExecutionAnnotation } from '@/databases/entities/execution-annotation.ee'; -import { WithTimestampsAndStringId } from './abstract-entity'; - @Entity() export class AnnotationTagEntity extends WithTimestampsAndStringId { @Column({ length: 24 }) diff --git a/packages/cli/src/databases/entities/api-key.ts b/packages/cli/src/databases/entities/api-key.ts index 80a63e9180..db29187a4e 100644 --- a/packages/cli/src/databases/entities/api-key.ts +++ b/packages/cli/src/databases/entities/api-key.ts @@ -1,7 +1,7 @@ +import { JsonColumn, WithTimestampsAndStringId } from '@n8n/db'; import type { ApiKeyScope } from '@n8n/permissions'; import { Column, Entity, Index, ManyToOne, Unique } from '@n8n/typeorm'; -import { jsonColumnType, WithTimestampsAndStringId } from './abstract-entity'; import { User } from './user'; @Entity('user_api_keys') @@ -20,7 +20,7 @@ export class ApiKey extends WithTimestampsAndStringId { @Column({ type: String }) label: string; - @Column({ type: jsonColumnType, nullable: false }) + @JsonColumn({ nullable: false }) scopes: ApiKeyScope[]; @Index({ unique: true }) diff --git a/packages/cli/src/databases/entities/auth-identity.ts b/packages/cli/src/databases/entities/auth-identity.ts index 88d382bb3a..ee0c2283fd 100644 --- a/packages/cli/src/databases/entities/auth-identity.ts +++ b/packages/cli/src/databases/entities/auth-identity.ts @@ -1,6 +1,6 @@ +import { WithTimestamps } from '@n8n/db'; import { Column, Entity, ManyToOne, PrimaryColumn, Unique } from '@n8n/typeorm'; -import { WithTimestamps } from './abstract-entity'; import { User } from './user'; export type AuthProviderType = 'ldap' | 'email' | 'saml'; // | 'google'; diff --git a/packages/cli/src/databases/entities/auth-provider-sync-history.ts b/packages/cli/src/databases/entities/auth-provider-sync-history.ts index 626f6205eb..29a03dc7eb 100644 --- a/packages/cli/src/databases/entities/auth-provider-sync-history.ts +++ b/packages/cli/src/databases/entities/auth-provider-sync-history.ts @@ -1,6 +1,6 @@ +import { DateTimeColumn } from '@n8n/db'; import { Column, Entity, PrimaryGeneratedColumn } from '@n8n/typeorm'; -import { datetimeColumnType } from './abstract-entity'; import { AuthProviderType } from './auth-identity'; export type RunningMode = 'dry' | 'live'; @@ -20,10 +20,10 @@ export class AuthProviderSyncHistory { @Column('text') status: SyncStatus; - @Column(datetimeColumnType) + @DateTimeColumn() startedAt: Date; - @Column(datetimeColumnType) + @DateTimeColumn() endedAt: Date; @Column() diff --git a/packages/cli/src/databases/entities/credentials-entity.ts b/packages/cli/src/databases/entities/credentials-entity.ts index cfb91d9c57..58457237b0 100644 --- a/packages/cli/src/databases/entities/credentials-entity.ts +++ b/packages/cli/src/databases/entities/credentials-entity.ts @@ -1,9 +1,9 @@ +import { WithTimestampsAndStringId } from '@n8n/db'; import { Column, Entity, Index, OneToMany } from '@n8n/typeorm'; import { IsObject, IsString, Length } from 'class-validator'; import type { ICredentialsDb } from '@/types-db'; -import { WithTimestampsAndStringId } from './abstract-entity'; import type { SharedCredentials } from './shared-credentials'; @Entity() diff --git a/packages/cli/src/databases/entities/event-destinations.ts b/packages/cli/src/databases/entities/event-destinations.ts index f148ed983f..e451b1dbbd 100644 --- a/packages/cli/src/databases/entities/event-destinations.ts +++ b/packages/cli/src/databases/entities/event-destinations.ts @@ -1,13 +1,12 @@ -import { Column, Entity, PrimaryColumn } from '@n8n/typeorm'; +import { JsonColumn, WithTimestamps } from '@n8n/db'; +import { Entity, PrimaryColumn } from '@n8n/typeorm'; import { MessageEventBusDestinationOptions } from 'n8n-workflow'; -import { WithTimestamps, jsonColumnType } from './abstract-entity'; - @Entity({ name: 'event_destinations' }) export class EventDestinations extends WithTimestamps { @PrimaryColumn('uuid') id: string; - @Column(jsonColumnType) + @JsonColumn() destination: MessageEventBusDestinationOptions; } diff --git a/packages/cli/src/databases/entities/execution-data.ts b/packages/cli/src/databases/entities/execution-data.ts index 532e3a505c..8f1286596e 100644 --- a/packages/cli/src/databases/entities/execution-data.ts +++ b/packages/cli/src/databases/entities/execution-data.ts @@ -1,7 +1,7 @@ +import { JsonColumn } from '@n8n/db'; import { Column, Entity, ManyToOne, PrimaryColumn } from '@n8n/typeorm'; import { IWorkflowBase } from 'n8n-workflow'; -import { jsonColumnType } from './abstract-entity'; import { ExecutionEntity } from './execution-entity'; import { idStringifier } from '../utils/transformers'; @@ -15,7 +15,7 @@ export class ExecutionData { // This is because manual executions of unsaved workflows have no workflow id // and IWorkflowDb has it as a mandatory field. IWorkflowBase reflects the correct // data structure for this entity. - @Column(jsonColumnType) + @JsonColumn() workflowData: IWorkflowBase; @PrimaryColumn({ transformer: idStringifier }) diff --git a/packages/cli/src/databases/entities/execution-entity.ts b/packages/cli/src/databases/entities/execution-entity.ts index 1c4c11a797..f9576a1726 100644 --- a/packages/cli/src/databases/entities/execution-entity.ts +++ b/packages/cli/src/databases/entities/execution-entity.ts @@ -1,3 +1,4 @@ +import { DateTimeColumn, datetimeColumnType } from '@n8n/db'; import { Column, Entity, @@ -10,11 +11,11 @@ import { Relation, DeleteDateColumn, } from '@n8n/typeorm'; +import type { SimpleColumnType } from '@n8n/typeorm/driver/types/ColumnTypes'; import { ExecutionStatus, WorkflowExecuteMode } from 'n8n-workflow'; import type { ExecutionAnnotation } from '@/databases/entities/execution-annotation.ee'; -import { datetimeColumnType } from './abstract-entity'; import type { ExecutionData } from './execution-data'; import type { ExecutionMetadata } from './execution-metadata'; import { WorkflowEntity } from './workflow-entity'; @@ -58,20 +59,23 @@ export class ExecutionEntity { * Time when the processing of the execution actually started. This column * is `null` when an execution is enqueued but has not started yet. */ - @Column({ type: datetimeColumnType, nullable: true }) + @Column({ + type: datetimeColumnType as SimpleColumnType, + nullable: true, + }) startedAt: Date | null; @Index() - @Column({ type: datetimeColumnType, nullable: true }) + @DateTimeColumn({ nullable: true }) stoppedAt: Date; - @DeleteDateColumn({ type: datetimeColumnType, nullable: true }) + @DeleteDateColumn({ type: datetimeColumnType as SimpleColumnType, nullable: true }) deletedAt: Date; @Column({ nullable: true }) workflowId: string; - @Column({ type: datetimeColumnType, nullable: true }) + @DateTimeColumn({ nullable: true }) waitTill: Date | null; @OneToMany('ExecutionMetadata', 'execution') diff --git a/packages/cli/src/databases/entities/folder.ts b/packages/cli/src/databases/entities/folder.ts index eaa4aae774..224d2c1e69 100644 --- a/packages/cli/src/databases/entities/folder.ts +++ b/packages/cli/src/databases/entities/folder.ts @@ -1,3 +1,4 @@ +import { WithTimestampsAndStringId } from '@n8n/db'; import { Column, Entity, @@ -8,7 +9,6 @@ import { OneToMany, } from '@n8n/typeorm'; -import { WithTimestampsAndStringId } from './abstract-entity'; import { Project } from './project'; import { TagEntity } from './tag-entity'; import { type WorkflowEntity } from './workflow-entity'; diff --git a/packages/cli/src/databases/entities/installed-packages.ts b/packages/cli/src/databases/entities/installed-packages.ts index 830c3c40e2..34038bf745 100644 --- a/packages/cli/src/databases/entities/installed-packages.ts +++ b/packages/cli/src/databases/entities/installed-packages.ts @@ -1,6 +1,6 @@ +import { WithTimestamps } from '@n8n/db'; import { Column, Entity, JoinColumn, OneToMany, PrimaryColumn } from '@n8n/typeorm'; -import { WithTimestamps } from './abstract-entity'; import type { InstalledNodes } from './installed-nodes'; @Entity() diff --git a/packages/cli/src/databases/entities/invalid-auth-token.ts b/packages/cli/src/databases/entities/invalid-auth-token.ts index 67c8112c51..4ebe156f02 100644 --- a/packages/cli/src/databases/entities/invalid-auth-token.ts +++ b/packages/cli/src/databases/entities/invalid-auth-token.ts @@ -1,12 +1,11 @@ -import { Column, Entity, PrimaryColumn } from '@n8n/typeorm'; - -import { datetimeColumnType } from './abstract-entity'; +import { DateTimeColumn } from '@n8n/db'; +import { Entity, PrimaryColumn } from '@n8n/typeorm'; @Entity() export class InvalidAuthToken { @PrimaryColumn() token: string; - @Column(datetimeColumnType) + @DateTimeColumn() expiresAt: Date; } diff --git a/packages/cli/src/databases/entities/processed-data.ts b/packages/cli/src/databases/entities/processed-data.ts index bd638fca95..b96be916d6 100644 --- a/packages/cli/src/databases/entities/processed-data.ts +++ b/packages/cli/src/databases/entities/processed-data.ts @@ -1,8 +1,8 @@ -import { Column, Entity, PrimaryColumn } from '@n8n/typeorm'; +import { JsonColumn, WithTimestamps } from '@n8n/db'; +import { Entity, PrimaryColumn } from '@n8n/typeorm'; -import type { IProcessedDataEntries, IProcessedDataLatest } from '@/interfaces'; +import type { IProcessedDataEntries, IProcessedDataLatest } from '@/types-db'; -import { jsonColumnType, WithTimestamps } from './abstract-entity'; import { objectRetriever } from '../utils/transformers'; @Entity() @@ -13,8 +13,7 @@ export class ProcessedData extends WithTimestamps { @PrimaryColumn() workflowId: string; - @Column({ - type: jsonColumnType, + @JsonColumn({ nullable: true, transformer: objectRetriever, }) diff --git a/packages/cli/src/databases/entities/project-relation.ts b/packages/cli/src/databases/entities/project-relation.ts index eb73b62502..c1ca7c967d 100644 --- a/packages/cli/src/databases/entities/project-relation.ts +++ b/packages/cli/src/databases/entities/project-relation.ts @@ -1,7 +1,7 @@ import { ProjectRole } from '@n8n/api-types'; +import { WithTimestamps } from '@n8n/db'; import { Column, Entity, ManyToOne, PrimaryColumn } from '@n8n/typeorm'; -import { WithTimestamps } from './abstract-entity'; import { Project } from './project'; import { User } from './user'; diff --git a/packages/cli/src/databases/entities/project.ts b/packages/cli/src/databases/entities/project.ts index 48f86fe0e9..789b4fb5fb 100644 --- a/packages/cli/src/databases/entities/project.ts +++ b/packages/cli/src/databases/entities/project.ts @@ -1,7 +1,7 @@ import { ProjectIcon, ProjectType } from '@n8n/api-types'; +import { WithTimestampsAndStringId } from '@n8n/db'; import { Column, Entity, OneToMany } from '@n8n/typeorm'; -import { WithTimestampsAndStringId } from './abstract-entity'; import type { ProjectRelation } from './project-relation'; import type { SharedCredentials } from './shared-credentials'; import type { SharedWorkflow } from './shared-workflow'; diff --git a/packages/cli/src/databases/entities/shared-credentials.ts b/packages/cli/src/databases/entities/shared-credentials.ts index 24428584ca..4eb9bb5695 100644 --- a/packages/cli/src/databases/entities/shared-credentials.ts +++ b/packages/cli/src/databases/entities/shared-credentials.ts @@ -1,6 +1,6 @@ +import { WithTimestamps } from '@n8n/db'; import { Column, Entity, ManyToOne, PrimaryColumn } from '@n8n/typeorm'; -import { WithTimestamps } from './abstract-entity'; import { CredentialsEntity } from './credentials-entity'; import { Project } from './project'; diff --git a/packages/cli/src/databases/entities/shared-workflow.ts b/packages/cli/src/databases/entities/shared-workflow.ts index d77f749f7b..3422dcabba 100644 --- a/packages/cli/src/databases/entities/shared-workflow.ts +++ b/packages/cli/src/databases/entities/shared-workflow.ts @@ -1,6 +1,6 @@ +import { WithTimestamps } from '@n8n/db'; import { Column, Entity, ManyToOne, PrimaryColumn } from '@n8n/typeorm'; -import { WithTimestamps } from './abstract-entity'; import { Project } from './project'; import { WorkflowEntity } from './workflow-entity'; diff --git a/packages/cli/src/databases/entities/tag-entity.ts b/packages/cli/src/databases/entities/tag-entity.ts index b0d539af17..bbb3b1c307 100644 --- a/packages/cli/src/databases/entities/tag-entity.ts +++ b/packages/cli/src/databases/entities/tag-entity.ts @@ -1,7 +1,7 @@ +import { WithTimestampsAndStringId } from '@n8n/db'; import { Column, Entity, Index, ManyToMany, OneToMany } from '@n8n/typeorm'; import { IsString, Length } from 'class-validator'; -import { WithTimestampsAndStringId } from './abstract-entity'; import type { FolderTagMapping } from './folder-tag-mapping'; import type { WorkflowEntity } from './workflow-entity'; import type { WorkflowTagMapping } from './workflow-tag-mapping'; diff --git a/packages/cli/src/databases/entities/test-case-execution.ee.ts b/packages/cli/src/databases/entities/test-case-execution.ee.ts index d9beadbf8e..c6cc55c78b 100644 --- a/packages/cli/src/databases/entities/test-case-execution.ee.ts +++ b/packages/cli/src/databases/entities/test-case-execution.ee.ts @@ -1,11 +1,7 @@ +import { DateTimeColumn, JsonColumn, WithStringId } from '@n8n/db'; import { Column, Entity, ManyToOne, OneToOne } from '@n8n/typeorm'; import type { IDataObject } from 'n8n-workflow'; -import { - datetimeColumnType, - jsonColumnType, - WithStringId, -} from '@/databases/entities/abstract-entity'; import type { ExecutionEntity } from '@/databases/entities/execution-entity'; import { TestRun } from '@/databases/entities/test-run.ee'; import type { TestCaseExecutionErrorCode } from '@/evaluation.ee/test-runner/errors.ee'; @@ -62,18 +58,18 @@ export class TestCaseExecution extends WithStringId { @Column() status: TestCaseExecutionStatus; - @Column({ type: datetimeColumnType, nullable: true }) + @DateTimeColumn({ nullable: true }) runAt: Date | null; - @Column({ type: datetimeColumnType, nullable: true }) + @DateTimeColumn({ nullable: true }) completedAt: Date | null; @Column('varchar', { nullable: true }) errorCode: TestCaseExecutionErrorCode | null; - @Column(jsonColumnType, { nullable: true }) + @JsonColumn({ nullable: true }) errorDetails: IDataObject | null; - @Column(jsonColumnType, { nullable: true }) + @JsonColumn({ nullable: true }) metrics: TestCaseRunMetrics; } diff --git a/packages/cli/src/databases/entities/test-definition.ee.ts b/packages/cli/src/databases/entities/test-definition.ee.ts index bcbf701e79..44f8a00341 100644 --- a/packages/cli/src/databases/entities/test-definition.ee.ts +++ b/packages/cli/src/databases/entities/test-definition.ee.ts @@ -1,3 +1,4 @@ +import { JsonColumn, WithTimestampsAndStringId } from '@n8n/db'; import { Column, Entity, Index, ManyToOne, OneToMany, RelationId } from '@n8n/typeorm'; import { Length } from 'class-validator'; @@ -5,8 +6,6 @@ import { AnnotationTagEntity } from '@/databases/entities/annotation-tag-entity. import type { TestMetric } from '@/databases/entities/test-metric.ee'; import { WorkflowEntity } from '@/databases/entities/workflow-entity'; -import { jsonColumnType, WithTimestampsAndStringId } from './abstract-entity'; - // Entity representing a node in a workflow under test, for which data should be mocked during test execution export type MockedNodeItem = { name?: string; @@ -33,7 +32,7 @@ export class TestDefinition extends WithTimestampsAndStringId { @Column('text') description: string; - @Column(jsonColumnType, { default: '[]' }) + @JsonColumn({ default: '[]' }) mockedNodes: MockedNodeItem[]; /** diff --git a/packages/cli/src/databases/entities/test-metric.ee.ts b/packages/cli/src/databases/entities/test-metric.ee.ts index bc3dc07f7a..0af9c3f5e2 100644 --- a/packages/cli/src/databases/entities/test-metric.ee.ts +++ b/packages/cli/src/databases/entities/test-metric.ee.ts @@ -1,7 +1,7 @@ +import { WithTimestampsAndStringId } from '@n8n/db'; import { Column, Entity, Index, ManyToOne } from '@n8n/typeorm'; import { Length } from 'class-validator'; -import { WithTimestampsAndStringId } from '@/databases/entities/abstract-entity'; import { TestDefinition } from '@/databases/entities/test-definition.ee'; /** diff --git a/packages/cli/src/databases/entities/test-run.ee.ts b/packages/cli/src/databases/entities/test-run.ee.ts index 51549f763a..1c98e27e7d 100644 --- a/packages/cli/src/databases/entities/test-run.ee.ts +++ b/packages/cli/src/databases/entities/test-run.ee.ts @@ -1,11 +1,7 @@ +import { WithTimestampsAndStringId, JsonColumn, DateTimeColumn } from '@n8n/db'; import { Column, Entity, Index, ManyToOne, OneToMany, RelationId } from '@n8n/typeorm'; import type { IDataObject } from 'n8n-workflow'; -import { - datetimeColumnType, - jsonColumnType, - WithTimestampsAndStringId, -} from '@/databases/entities/abstract-entity'; import type { TestCaseExecution } from '@/databases/entities/test-case-execution.ee'; import { TestDefinition } from '@/databases/entities/test-definition.ee'; import type { TestRunFinalResult } from '@/databases/repositories/test-run.repository.ee'; @@ -31,13 +27,13 @@ export class TestRun extends WithTimestampsAndStringId { @Column('varchar') status: TestRunStatus; - @Column({ type: datetimeColumnType, nullable: true }) + @DateTimeColumn({ nullable: true }) runAt: Date | null; - @Column({ type: datetimeColumnType, nullable: true }) + @DateTimeColumn({ nullable: true }) completedAt: Date | null; - @Column(jsonColumnType, { nullable: true }) + @JsonColumn({ nullable: true }) metrics: AggregatedTestRunMetrics; /** @@ -69,7 +65,7 @@ export class TestRun extends WithTimestampsAndStringId { /** * Optional details about the error that happened during the test run */ - @Column(jsonColumnType, { nullable: true }) + @JsonColumn({ nullable: true }) errorDetails: IDataObject | null; @OneToMany('TestCaseExecution', 'testRun') diff --git a/packages/cli/src/databases/entities/user.ts b/packages/cli/src/databases/entities/user.ts index adabd72eec..dfd877c254 100644 --- a/packages/cli/src/databases/entities/user.ts +++ b/packages/cli/src/databases/entities/user.ts @@ -1,3 +1,4 @@ +import { JsonColumn, WithTimestamps } from '@n8n/db'; import { hasScope, type ScopeOptions, type Scope, GlobalRole } from '@n8n/permissions'; import { AfterLoad, @@ -22,7 +23,6 @@ import type { IPersonalizationSurveyAnswers } from '@/types-db'; import { NoUrl } from '@/validators/no-url.validator'; import { NoXss } from '@/validators/no-xss.validator'; -import { WithTimestamps, jsonColumnType } from './abstract-entity'; import type { ApiKey } from './api-key'; import type { AuthIdentity } from './auth-identity'; import type { ProjectRelation } from './project-relation'; @@ -68,17 +68,13 @@ export class User extends WithTimestamps implements IUser { @IsString({ message: 'Password must be of type string.' }) password: string; - @Column({ - type: jsonColumnType, + @JsonColumn({ nullable: true, transformer: objectRetriever, }) personalizationAnswers: IPersonalizationSurveyAnswers | null; - @Column({ - type: jsonColumnType, - nullable: true, - }) + @JsonColumn({ nullable: true }) settings: IUserSettings | null; @Column({ type: String }) diff --git a/packages/cli/src/databases/entities/variables.ts b/packages/cli/src/databases/entities/variables.ts index d6bf10431e..4205cdf6b2 100644 --- a/packages/cli/src/databases/entities/variables.ts +++ b/packages/cli/src/databases/entities/variables.ts @@ -1,7 +1,6 @@ +import { WithStringId } from '@n8n/db'; import { Column, Entity } from '@n8n/typeorm'; -import { WithStringId } from './abstract-entity'; - @Entity() export class Variables extends WithStringId { @Column('text') diff --git a/packages/cli/src/databases/entities/workflow-entity.ts b/packages/cli/src/databases/entities/workflow-entity.ts index b05c4863f1..cb4568d9dd 100644 --- a/packages/cli/src/databases/entities/workflow-entity.ts +++ b/packages/cli/src/databases/entities/workflow-entity.ts @@ -1,3 +1,4 @@ +import { JsonColumn, WithTimestampsAndStringId, dbType } from '@n8n/db'; import { Column, Entity, @@ -14,7 +15,6 @@ import type { IBinaryKeyData, INode, IPairedItemData } from 'n8n-workflow'; import type { IWorkflowDb } from '@/types-db'; -import { WithTimestampsAndStringId, dbType, jsonColumnType } from './abstract-entity'; import { type Folder } from './folder'; import type { SharedWorkflow } from './shared-workflow'; import type { TagEntity } from './tag-entity'; @@ -35,27 +35,22 @@ export class WorkflowEntity extends WithTimestampsAndStringId implements IWorkfl @Column() active: boolean; - @Column(jsonColumnType) + @JsonColumn() nodes: INode[]; - @Column(jsonColumnType) + @JsonColumn() connections: IConnections; - @Column({ - type: jsonColumnType, - nullable: true, - }) + @JsonColumn({ nullable: true }) settings?: IWorkflowSettings; - @Column({ - type: jsonColumnType, + @JsonColumn({ nullable: true, transformer: objectRetriever, }) staticData?: IDataObject; - @Column({ - type: jsonColumnType, + @JsonColumn({ nullable: true, transformer: objectRetriever, }) diff --git a/packages/cli/src/databases/entities/workflow-history.ts b/packages/cli/src/databases/entities/workflow-history.ts index 73a2b055d1..a0f2ccab23 100644 --- a/packages/cli/src/databases/entities/workflow-history.ts +++ b/packages/cli/src/databases/entities/workflow-history.ts @@ -1,8 +1,8 @@ +import { JsonColumn, WithTimestamps } from '@n8n/db'; import { Column, Entity, ManyToOne, PrimaryColumn } from '@n8n/typeorm'; import { IConnections } from 'n8n-workflow'; import type { INode } from 'n8n-workflow'; -import { WithTimestamps, jsonColumnType } from './abstract-entity'; import { WorkflowEntity } from './workflow-entity'; @Entity() @@ -13,10 +13,10 @@ export class WorkflowHistory extends WithTimestamps { @Column() workflowId: string; - @Column(jsonColumnType) + @JsonColumn() nodes: INode[]; - @Column(jsonColumnType) + @JsonColumn() connections: IConnections; @Column() diff --git a/packages/cli/src/databases/entities/workflow-statistics.ts b/packages/cli/src/databases/entities/workflow-statistics.ts index e12445a1a9..f2971f3750 100644 --- a/packages/cli/src/databases/entities/workflow-statistics.ts +++ b/packages/cli/src/databases/entities/workflow-statistics.ts @@ -1,6 +1,6 @@ +import { DateTimeColumn } from '@n8n/db'; import { Column, Entity, ManyToOne, PrimaryColumn } from '@n8n/typeorm'; -import { datetimeColumnType } from './abstract-entity'; import { WorkflowEntity } from './workflow-entity'; export const enum StatisticsNames { @@ -19,7 +19,7 @@ export class WorkflowStatistics { @Column() rootCount: number; - @Column(datetimeColumnType) + @DateTimeColumn() latestEvent: Date; @PrimaryColumn({ length: 128 }) diff --git a/packages/cli/src/databases/migrations/common/1714133768519-CreateProject.ts b/packages/cli/src/databases/migrations/common/1714133768519-CreateProject.ts index 32498fcf44..01cacdabbd 100644 --- a/packages/cli/src/databases/migrations/common/1714133768519-CreateProject.ts +++ b/packages/cli/src/databases/migrations/common/1714133768519-CreateProject.ts @@ -1,10 +1,10 @@ import type { ProjectRole } from '@n8n/api-types'; +import { generateNanoId } from '@n8n/db'; import { UserError } from 'n8n-workflow'; import { nanoid } from 'nanoid'; import type { User } from '@/databases/entities/user'; import type { MigrationContext, ReversibleMigration } from '@/databases/types'; -import { generateNanoId } from '@/databases/utils/generators'; const projectAdminRole: ProjectRole = 'project:personalOwner'; diff --git a/packages/cli/src/databases/migrations/common/1724951148974-AddApiKeysTable.ts b/packages/cli/src/databases/migrations/common/1724951148974-AddApiKeysTable.ts index a9ea5626bb..8dfebc5c26 100644 --- a/packages/cli/src/databases/migrations/common/1724951148974-AddApiKeysTable.ts +++ b/packages/cli/src/databases/migrations/common/1724951148974-AddApiKeysTable.ts @@ -1,6 +1,7 @@ +import { generateNanoId } from '@n8n/db'; + import type { ApiKey } from '@/databases/entities/api-key'; import type { MigrationContext, ReversibleMigration } from '@/databases/types'; -import { generateNanoId } from '@/databases/utils/generators'; export class AddApiKeysTable1724951148974 implements ReversibleMigration { async up({ diff --git a/packages/cli/src/databases/migrations/sqlite/1724951148974-AddApiKeysTable.ts b/packages/cli/src/databases/migrations/sqlite/1724951148974-AddApiKeysTable.ts index 71dcecdfb3..71d5868d6c 100644 --- a/packages/cli/src/databases/migrations/sqlite/1724951148974-AddApiKeysTable.ts +++ b/packages/cli/src/databases/migrations/sqlite/1724951148974-AddApiKeysTable.ts @@ -1,6 +1,7 @@ +import { generateNanoId } from '@n8n/db'; + import type { ApiKey } from '@/databases/entities/api-key'; import type { MigrationContext, ReversibleMigration } from '@/databases/types'; -import { generateNanoId } from '@/databases/utils/generators'; export class AddApiKeysTable1724951148974 implements ReversibleMigration { transaction = false as const; diff --git a/packages/cli/src/databases/repositories/credentials.repository.ts b/packages/cli/src/databases/repositories/credentials.repository.ts index ccc752ad8f..7e9617e550 100644 --- a/packages/cli/src/databases/repositories/credentials.repository.ts +++ b/packages/cli/src/databases/repositories/credentials.repository.ts @@ -2,7 +2,7 @@ import { Service } from '@n8n/di'; import { DataSource, In, Repository, Like } from '@n8n/typeorm'; import type { FindManyOptions } from '@n8n/typeorm'; -import type { ListQuery } from '@/requests'; +import type { ListQuery } from '@/types-db'; import { CredentialsEntity } from '../entities/credentials-entity'; diff --git a/packages/cli/src/databases/repositories/execution.repository.ts b/packages/cli/src/databases/repositories/execution.repository.ts index b9b9425af7..dff6a216a2 100644 --- a/packages/cli/src/databases/repositories/execution.repository.ts +++ b/packages/cli/src/databases/repositories/execution.repository.ts @@ -1,4 +1,5 @@ import { GlobalConfig } from '@n8n/config'; +import { separate } from '@n8n/db'; import { Service } from '@n8n/di'; import type { FindManyOptions, @@ -35,10 +36,13 @@ import { AnnotationTagEntity } from '@/databases/entities/annotation-tag-entity. import { AnnotationTagMapping } from '@/databases/entities/annotation-tag-mapping.ee'; import { ExecutionAnnotation } from '@/databases/entities/execution-annotation.ee'; import { PostgresLiveRowsRetrievalError } from '@/errors/postgres-live-rows-retrieval.error'; -import type { ExecutionSummaries } from '@/executions/execution.types'; -import type { CreateExecutionPayload, IExecutionFlattedDb } from '@/interfaces'; -import type { IExecutionBase, IExecutionResponse } from '@/types-db'; -import { separate } from '@/utils'; +import type { + CreateExecutionPayload, + IExecutionFlattedDb, + IExecutionBase, + IExecutionResponse, + ExecutionSummaries, +} from '@/types-db'; import { ExecutionDataRepository } from './execution-data.repository'; import { ExecutionData } from '../entities/execution-data'; diff --git a/packages/cli/src/databases/repositories/folder.repository.ts b/packages/cli/src/databases/repositories/folder.repository.ts index 209942082c..625fc571d0 100644 --- a/packages/cli/src/databases/repositories/folder.repository.ts +++ b/packages/cli/src/databases/repositories/folder.repository.ts @@ -3,7 +3,7 @@ import type { EntityManager, SelectQueryBuilder } from '@n8n/typeorm'; import { DataSource, Repository } from '@n8n/typeorm'; import { PROJECT_ROOT } from 'n8n-workflow'; -import type { ListQuery } from '@/requests'; +import type { ListQuery } from '@/types-db'; import type { FolderWithWorkflowAndSubFolderCount } from '../entities/folder'; import { Folder } from '../entities/folder'; diff --git a/packages/cli/src/databases/repositories/test-definition.repository.ee.ts b/packages/cli/src/databases/repositories/test-definition.repository.ee.ts index 0955e6f89d..12d3bba899 100644 --- a/packages/cli/src/databases/repositories/test-definition.repository.ee.ts +++ b/packages/cli/src/databases/repositories/test-definition.repository.ee.ts @@ -4,7 +4,7 @@ import { DataSource, In, Repository } from '@n8n/typeorm'; import { TestDefinition } from '@/databases/entities/test-definition.ee'; import { ForbiddenError } from '@/errors/response-errors/forbidden.error'; -import type { ListQuery } from '@/requests'; +import type { ListQuery } from '@/types-db'; @Service() export class TestDefinitionRepository extends Repository { diff --git a/packages/cli/src/databases/repositories/test-run.repository.ee.ts b/packages/cli/src/databases/repositories/test-run.repository.ee.ts index c86a3b5842..1d43208094 100644 --- a/packages/cli/src/databases/repositories/test-run.repository.ee.ts +++ b/packages/cli/src/databases/repositories/test-run.repository.ee.ts @@ -8,7 +8,7 @@ import { TestRun } from '@/databases/entities/test-run.ee'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import type { TestRunErrorCode } from '@/evaluation.ee/test-runner/errors.ee'; import { getTestRunFinalResult } from '@/evaluation.ee/test-runner/utils.ee'; -import type { ListQuery } from '@/requests'; +import type { ListQuery } from '@/types-db'; export type TestRunFinalResult = 'success' | 'error' | 'warning'; diff --git a/packages/cli/src/databases/repositories/user.repository.ts b/packages/cli/src/databases/repositories/user.repository.ts index b69946f651..ea5bf916c7 100644 --- a/packages/cli/src/databases/repositories/user.repository.ts +++ b/packages/cli/src/databases/repositories/user.repository.ts @@ -3,7 +3,7 @@ import type { GlobalRole } from '@n8n/permissions'; import type { DeepPartial, EntityManager, FindManyOptions } from '@n8n/typeorm'; import { DataSource, In, IsNull, Not, Repository } from '@n8n/typeorm'; -import type { ListQuery } from '@/requests'; +import type { ListQuery } from '@/types-db'; import { Project } from '../entities/project'; import { ProjectRelation } from '../entities/project-relation'; diff --git a/packages/cli/src/databases/repositories/workflow.repository.ts b/packages/cli/src/databases/repositories/workflow.repository.ts index 4e10b18eab..d67f22e94a 100644 --- a/packages/cli/src/databases/repositories/workflow.repository.ts +++ b/packages/cli/src/databases/repositories/workflow.repository.ts @@ -1,4 +1,5 @@ import { GlobalConfig } from '@n8n/config'; +import { isStringArray } from '@n8n/db'; import { Service } from '@n8n/di'; import { DataSource, Repository, In, Like } from '@n8n/typeorm'; import type { @@ -12,8 +13,7 @@ import type { } from '@n8n/typeorm'; import { PROJECT_ROOT } from 'n8n-workflow'; -import type { ListQuery } from '@/requests'; -import { isStringArray } from '@/utils'; +import type { ListQuery } from '@/types-db'; import { FolderRepository } from './folder.repository'; import type { Folder, FolderWithWorkflowAndSubFolderCount } from '../entities/folder'; diff --git a/packages/cli/src/deduplication/deduplication-helper.ts b/packages/cli/src/deduplication/deduplication-helper.ts index dc6b59ac29..00d547743e 100644 --- a/packages/cli/src/deduplication/deduplication-helper.ts +++ b/packages/cli/src/deduplication/deduplication-helper.ts @@ -15,7 +15,7 @@ import * as assert from 'node:assert/strict'; import type { ProcessedData } from '@/databases/entities/processed-data'; import { ProcessedDataRepository } from '@/databases/repositories/processed-data.repository'; import { DeduplicationError } from '@/errors/deduplication.error'; -import type { IProcessedDataEntries, IProcessedDataLatest } from '@/interfaces'; +import type { IProcessedDataEntries, IProcessedDataLatest } from '@/types-db'; export class DeduplicationHelper implements IDataDeduplicator { private static sortEntries( diff --git a/packages/cli/src/environments.ee/variables/variables.service.ee.ts b/packages/cli/src/environments.ee/variables/variables.service.ee.ts index f59880fe60..ab8c4b5409 100644 --- a/packages/cli/src/environments.ee/variables/variables.service.ee.ts +++ b/packages/cli/src/environments.ee/variables/variables.service.ee.ts @@ -1,8 +1,8 @@ +import { generateNanoId } from '@n8n/db'; import { Service } from '@n8n/di'; import type { Variables } from '@/databases/entities/variables'; import { VariablesRepository } from '@/databases/repositories/variables.repository'; -import { generateNanoId } from '@/databases/utils/generators'; import { VariableCountLimitReachedError } from '@/errors/variable-count-limit-reached.error'; import { VariableValidationError } from '@/errors/variable-validation.error'; import { EventService } from '@/events/event.service'; diff --git a/packages/cli/src/evaluation.ee/test-definition.service.ee.ts b/packages/cli/src/evaluation.ee/test-definition.service.ee.ts index 5129f3b389..6d3e69f2de 100644 --- a/packages/cli/src/evaluation.ee/test-definition.service.ee.ts +++ b/packages/cli/src/evaluation.ee/test-definition.service.ee.ts @@ -6,8 +6,8 @@ import { TestDefinitionRepository } from '@/databases/repositories/test-definiti import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { validateEntity } from '@/generic-helpers'; -import type { ListQuery } from '@/requests'; import { Telemetry } from '@/telemetry'; +import type { ListQuery } from '@/types-db'; type TestDefinitionLike = Omit< Partial, diff --git a/packages/cli/src/evaluation.ee/test-definitions.types.ee.ts b/packages/cli/src/evaluation.ee/test-definitions.types.ee.ts index eb19f964f7..86a15fa487 100644 --- a/packages/cli/src/evaluation.ee/test-definitions.types.ee.ts +++ b/packages/cli/src/evaluation.ee/test-definitions.types.ee.ts @@ -1,5 +1,6 @@ import type { MockedNodeItem } from '@/databases/entities/test-definition.ee'; -import type { AuthenticatedRequest, ListQuery } from '@/requests'; +import type { AuthenticatedRequest } from '@/requests'; +import type { ListQuery } from '@/types-db'; // ---------------------------------- // /test-definitions diff --git a/packages/cli/src/execution-lifecycle/shared/shared-hook-functions.ts b/packages/cli/src/execution-lifecycle/shared/shared-hook-functions.ts index 657c430e17..5cd74269ad 100644 --- a/packages/cli/src/execution-lifecycle/shared/shared-hook-functions.ts +++ b/packages/cli/src/execution-lifecycle/shared/shared-hook-functions.ts @@ -4,8 +4,9 @@ import { Logger } from 'n8n-core'; import { ensureError, type ExecutionStatus, type IRun, type IWorkflowBase } from 'n8n-workflow'; import { ExecutionRepository } from '@/databases/repositories/execution.repository'; -import type { IExecutionDb, UpdateExecutionPayload } from '@/interfaces'; +import type { UpdateExecutionPayload } from '@/interfaces'; import { ExecutionMetadataService } from '@/services/execution-metadata.service'; +import type { IExecutionDb } from '@/types-db'; import { isWorkflowIdValid } from '@/utils'; export function determineFinalExecutionStatus(runData: IRun): ExecutionStatus { diff --git a/packages/cli/src/executions/__tests__/executions.controller.test.ts b/packages/cli/src/executions/__tests__/executions.controller.test.ts index aea4c567e9..ecd95e98ed 100644 --- a/packages/cli/src/executions/__tests__/executions.controller.test.ts +++ b/packages/cli/src/executions/__tests__/executions.controller.test.ts @@ -3,8 +3,9 @@ import { mock } from 'jest-mock-extended'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import type { ExecutionService } from '@/executions/execution.service'; -import type { ExecutionRequest, ExecutionSummaries } from '@/executions/execution.types'; +import type { ExecutionRequest } from '@/executions/execution.types'; import { ExecutionsController } from '@/executions/executions.controller'; +import type { ExecutionSummaries } from '@/types-db'; import type { WorkflowSharingService } from '@/workflows/workflow-sharing.service'; describe('ExecutionsController', () => { diff --git a/packages/cli/src/executions/execution.service.ts b/packages/cli/src/executions/execution.service.ts index 84d787855d..76d729914e 100644 --- a/packages/cli/src/executions/execution.service.ts +++ b/packages/cli/src/executions/execution.service.ts @@ -33,15 +33,15 @@ import { MissingExecutionStopError } from '@/errors/missing-execution-stop.error import { QueuedExecutionRetryError } from '@/errors/queued-execution-retry.error'; import { InternalServerError } from '@/errors/response-errors/internal-server.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; -import type { CreateExecutionPayload, IExecutionFlattedResponse } from '@/interfaces'; +import type { IExecutionFlattedResponse } from '@/interfaces'; import { License } from '@/license'; import { NodeTypes } from '@/node-types'; -import type { IExecutionResponse } from '@/types-db'; +import type { CreateExecutionPayload, ExecutionSummaries, IExecutionResponse } from '@/types-db'; import { WaitTracker } from '@/wait-tracker'; import { WorkflowRunner } from '@/workflow-runner'; import { WorkflowSharingService } from '@/workflows/workflow-sharing.service'; -import type { ExecutionRequest, ExecutionSummaries, StopResult } from './execution.types'; +import type { ExecutionRequest, StopResult } from './execution.types'; export const schemaGetExecutionsQueryFilter = { $id: '/IGetExecutionsQueryFilter', diff --git a/packages/cli/src/executions/execution.types.ts b/packages/cli/src/executions/execution.types.ts index 04d68d8197..39305e28a3 100644 --- a/packages/cli/src/executions/execution.types.ts +++ b/packages/cli/src/executions/execution.types.ts @@ -1,14 +1,13 @@ -import type { Scope } from '@n8n/permissions'; import type { AnnotationVote, ExecutionStatus, - ExecutionSummary, IDataObject, WorkflowExecuteMode, } from 'n8n-workflow'; import type { ExecutionEntity } from '@/databases/entities/execution-entity'; import type { AuthenticatedRequest } from '@/requests'; +import type { ExecutionSummaries } from '@/types-db'; export declare namespace ExecutionRequest { namespace QueryParams { @@ -56,55 +55,6 @@ export declare namespace ExecutionRequest { type Update = AuthenticatedRequest; } -export namespace ExecutionSummaries { - export type Query = RangeQuery | CountQuery; - - export type RangeQuery = { kind: 'range' } & FilterFields & - AccessFields & - RangeFields & - OrderFields; - - export type CountQuery = { kind: 'count' } & FilterFields & AccessFields; - - type FilterFields = Partial<{ - id: string; - finished: boolean; - mode: string; - retryOf: string; - retrySuccessId: string; - status: ExecutionStatus[]; - workflowId: string; - waitTill: boolean; - metadata: Array<{ key: string; value: string }>; - startedAfter: string; - startedBefore: string; - annotationTags: string[]; // tag IDs - vote: AnnotationVote; - projectId: string; - }>; - - type AccessFields = { - accessibleWorkflowIds?: string[]; - }; - - type RangeFields = { - range: { - limit: number; - firstId?: string; - lastId?: string; - }; - }; - - type OrderFields = { - order?: { - top?: ExecutionStatus; - startedAt?: 'DESC'; - }; - }; - - export type ExecutionSummaryWithScopes = ExecutionSummary & { scopes: Scope[] }; -} - export type StopResult = { mode: WorkflowExecuteMode; startedAt: Date; diff --git a/packages/cli/src/executions/executions.controller.ts b/packages/cli/src/executions/executions.controller.ts index 057ad847bc..8127efc55b 100644 --- a/packages/cli/src/executions/executions.controller.ts +++ b/packages/cli/src/executions/executions.controller.ts @@ -5,12 +5,13 @@ import type { User } from '@/databases/entities/user'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { License } from '@/license'; +import type { ExecutionSummaries } from '@/types-db'; import { isPositiveInteger } from '@/utils'; import { WorkflowSharingService } from '@/workflows/workflow-sharing.service'; import { ExecutionService } from './execution.service'; import { EnterpriseExecutionsService } from './execution.service.ee'; -import { ExecutionRequest, type ExecutionSummaries } from './execution.types'; +import { ExecutionRequest } from './execution.types'; import { parseRangeQuery } from './parse-range-query.middleware'; import { validateExecutionUpdatePayload } from './validation'; diff --git a/packages/cli/src/interfaces.ts b/packages/cli/src/interfaces.ts index 4b90feea5f..3f99c304f4 100644 --- a/packages/cli/src/interfaces.ts +++ b/packages/cli/src/interfaces.ts @@ -7,7 +7,6 @@ import type { IDeferredPromise, IExecuteResponsePromiseData, IRun, - IRunExecutionData, ITelemetryTrackProperties, IWorkflowBase, CredentialLoadingDetails, @@ -15,14 +14,12 @@ import type { ExecutionStatus, ExecutionSummary, IWorkflowExecutionDataProcess, - DeduplicationMode, - DeduplicationItemTypes, } from 'n8n-workflow'; import type PCancelable from 'p-cancelable'; import type { ActiveWorkflowManager } from '@/active-workflow-manager'; import type { ExternalHooks } from '@/external-hooks'; -import type { ICredentialsBase, IExecutionBase, ITagBase } from '@/types-db'; +import type { ICredentialsBase, IExecutionBase, IExecutionDb, ITagBase } from '@/types-db'; export interface ICredentialsTypeData { [key: string]: CredentialLoadingDetails; @@ -32,20 +29,6 @@ export interface ICredentialsOverwrite { [key: string]: ICredentialDataDecryptedObject; } -// ---------------------------------- -// ProcessedData -// ---------------------------------- - -export interface IProcessedDataLatest { - mode: DeduplicationMode; - data: DeduplicationItemTypes; -} - -export interface IProcessedDataEntries { - mode: DeduplicationMode; - data: DeduplicationItemTypes[]; -} - // ---------------------------------- // tags // ---------------------------------- @@ -82,15 +65,6 @@ export type ICredentialsDecryptedResponse = ICredentialsDecryptedDb; export type SaveExecutionDataType = 'all' | 'none'; -// Data in regular format with references -export interface IExecutionDb extends IExecutionBase { - data: IRunExecutionData; - workflowData: IWorkflowBase; -} - -/** Payload for creating an execution. */ -export type CreateExecutionPayload = Omit; - /** Payload for updating an execution. */ export type UpdateExecutionPayload = Omit; @@ -101,13 +75,6 @@ export interface IExecutionFlatted extends IExecutionBase { workflowData: IWorkflowBase; } -export interface IExecutionFlattedDb extends IExecutionBase { - id: string; - data: string; - workflowData: Omit; - customData: Record; -} - export interface IExecutionFlattedResponse extends IExecutionFlatted { id: string; retryOf?: string; diff --git a/packages/cli/src/ldap.ee/__tests__/helpers.test.ts b/packages/cli/src/ldap.ee/__tests__/helpers.test.ts index 3e7a9c4b4b..b84bbdbe1a 100644 --- a/packages/cli/src/ldap.ee/__tests__/helpers.test.ts +++ b/packages/cli/src/ldap.ee/__tests__/helpers.test.ts @@ -1,7 +1,8 @@ +import { generateNanoId } from '@n8n/db'; + import { AuthIdentity } from '@/databases/entities/auth-identity'; import { User } from '@/databases/entities/user'; import { UserRepository } from '@/databases/repositories/user.repository'; -import { generateNanoId } from '@/databases/utils/generators'; import * as helpers from '@/ldap.ee/helpers.ee'; import { mockInstance } from '@test/mocking'; diff --git a/packages/cli/src/middlewares/list-query/__tests__/list-query.test.ts b/packages/cli/src/middlewares/list-query/__tests__/list-query.test.ts index 1e83827536..da55c9c43b 100644 --- a/packages/cli/src/middlewares/list-query/__tests__/list-query.test.ts +++ b/packages/cli/src/middlewares/list-query/__tests__/list-query.test.ts @@ -3,8 +3,8 @@ import type { Response, NextFunction } from 'express'; import { filterListQueryMiddleware } from '@/middlewares/list-query/filter'; import { paginationListQueryMiddleware } from '@/middlewares/list-query/pagination'; import { selectListQueryMiddleware } from '@/middlewares/list-query/select'; -import type { ListQuery } from '@/requests'; import * as ResponseHelper from '@/response-helper'; +import type { ListQuery } from '@/types-db'; import { sortByQueryMiddleware } from '../sort-by'; diff --git a/packages/cli/src/middlewares/list-query/dtos/base.select.dto.ts b/packages/cli/src/middlewares/list-query/dtos/base.select.dto.ts index 7a186c47ea..41b40ea5d0 100644 --- a/packages/cli/src/middlewares/list-query/dtos/base.select.dto.ts +++ b/packages/cli/src/middlewares/list-query/dtos/base.select.dto.ts @@ -1,7 +1,6 @@ +import { isStringArray } from '@n8n/db'; import { jsonParse, UnexpectedError } from 'n8n-workflow'; -import { isStringArray } from '@/utils'; - export class BaseSelect { static selectableFields: Set; diff --git a/packages/cli/src/middlewares/list-query/filter.ts b/packages/cli/src/middlewares/list-query/filter.ts index 8443d01747..dbdb4106c0 100644 --- a/packages/cli/src/middlewares/list-query/filter.ts +++ b/packages/cli/src/middlewares/list-query/filter.ts @@ -1,7 +1,7 @@ import type { NextFunction, Response } from 'express'; -import type { ListQuery } from '@/requests'; import * as ResponseHelper from '@/response-helper'; +import type { ListQuery } from '@/types-db'; import { toError } from '@/utils'; import { CredentialsFilter } from './dtos/credentials.filter.dto'; diff --git a/packages/cli/src/middlewares/list-query/index.ts b/packages/cli/src/middlewares/list-query/index.ts index 81f6215cf9..3ba662614c 100644 --- a/packages/cli/src/middlewares/list-query/index.ts +++ b/packages/cli/src/middlewares/list-query/index.ts @@ -1,6 +1,6 @@ import { type NextFunction, type Response } from 'express'; -import type { ListQuery } from '@/requests'; +import type { ListQuery } from '@/types-db'; import { filterListQueryMiddleware } from './filter'; import { paginationListQueryMiddleware } from './pagination'; diff --git a/packages/cli/src/middlewares/list-query/pagination.ts b/packages/cli/src/middlewares/list-query/pagination.ts index da24db6d5c..565948ed94 100644 --- a/packages/cli/src/middlewares/list-query/pagination.ts +++ b/packages/cli/src/middlewares/list-query/pagination.ts @@ -1,8 +1,8 @@ import type { RequestHandler } from 'express'; import { UnexpectedError } from 'n8n-workflow'; -import type { ListQuery } from '@/requests'; import * as ResponseHelper from '@/response-helper'; +import type { ListQuery } from '@/types-db'; import { toError } from '@/utils'; import { Pagination } from './dtos/pagination.dto'; diff --git a/packages/cli/src/middlewares/list-query/select.ts b/packages/cli/src/middlewares/list-query/select.ts index 7eb2de0d37..946ab6e559 100644 --- a/packages/cli/src/middlewares/list-query/select.ts +++ b/packages/cli/src/middlewares/list-query/select.ts @@ -1,7 +1,7 @@ import type { RequestHandler } from 'express'; -import type { ListQuery } from '@/requests'; import * as ResponseHelper from '@/response-helper'; +import type { ListQuery } from '@/types-db'; import { toError } from '@/utils'; import { CredentialsSelect } from './dtos/credentials.select.dto'; diff --git a/packages/cli/src/middlewares/list-query/sort-by.ts b/packages/cli/src/middlewares/list-query/sort-by.ts index f600b1fdca..d93f59f5a1 100644 --- a/packages/cli/src/middlewares/list-query/sort-by.ts +++ b/packages/cli/src/middlewares/list-query/sort-by.ts @@ -3,8 +3,8 @@ import { validateSync } from 'class-validator'; import type { RequestHandler } from 'express'; import { UnexpectedError } from 'n8n-workflow'; -import type { ListQuery } from '@/requests'; import * as ResponseHelper from '@/response-helper'; +import type { ListQuery } from '@/types-db'; import { toError } from '@/utils'; import { WorkflowSorting } from './dtos/workflow.sort-by.dto'; diff --git a/packages/cli/src/modules/insights/database/entities/insights-by-period.ts b/packages/cli/src/modules/insights/database/entities/insights-by-period.ts index 973982ded8..cef6aeefa8 100644 --- a/packages/cli/src/modules/insights/database/entities/insights-by-period.ts +++ b/packages/cli/src/modules/insights/database/entities/insights-by-period.ts @@ -1,3 +1,4 @@ +import { DateTimeColumn } from '@n8n/db'; import { BaseEntity, Column, @@ -8,8 +9,6 @@ import { } from '@n8n/typeorm'; import { UnexpectedError } from 'n8n-workflow'; -import { datetimeColumnType } from '@/databases/entities/abstract-entity'; - import { InsightsMetadata } from './insights-metadata'; import type { PeriodUnit } from './insights-shared'; import { @@ -70,6 +69,6 @@ export class InsightsByPeriod extends BaseEntity { this.periodUnit_ = PeriodUnitToNumber[value]; } - @Column({ type: datetimeColumnType }) + @DateTimeColumn() periodStart: Date; } diff --git a/packages/cli/src/modules/insights/database/entities/insights-raw.ts b/packages/cli/src/modules/insights/database/entities/insights-raw.ts index fddf90759d..57c3d30736 100644 --- a/packages/cli/src/modules/insights/database/entities/insights-raw.ts +++ b/packages/cli/src/modules/insights/database/entities/insights-raw.ts @@ -1,10 +1,9 @@ import { GlobalConfig } from '@n8n/config'; +import { DateTimeColumn } from '@n8n/db'; import { Container } from '@n8n/di'; import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from '@n8n/typeorm'; import { UnexpectedError } from 'n8n-workflow'; -import { datetimeColumnType } from '@/databases/entities/abstract-entity'; - import { isValidTypeNumber, NumberToType, TypeToNumber } from './insights-shared'; export const { type: dbType } = Container.get(GlobalConfig).database; @@ -42,9 +41,6 @@ export class InsightsRaw extends BaseEntity { @Column() value: number; - @Column({ - name: 'timestamp', - type: datetimeColumnType, - }) + @DateTimeColumn({ name: 'timestamp' }) timestamp: Date; } diff --git a/packages/cli/src/requests.ts b/packages/cli/src/requests.ts index 120e4c6d96..192cd92cc0 100644 --- a/packages/cli/src/requests.ts +++ b/packages/cli/src/requests.ts @@ -5,17 +5,13 @@ import type { ICredentialDataDecryptedObject, INodeCredentialTestRequest, IPersonalizationSurveyAnswersV4, - IUser, } from 'n8n-workflow'; -import type { CredentialsEntity } from '@/databases/entities/credentials-entity'; import type { Project } from '@/databases/entities/project'; import type { User } from '@/databases/entities/user'; import type { Variables } from '@/databases/entities/variables'; -import type { WorkflowEntity } from '@/databases/entities/workflow-entity'; import type { WorkflowHistory } from '@/databases/entities/workflow-history'; -import type { ScopesField } from '@/services/role.service'; -import type { SlimProject } from '@/types-db'; +import type { ListQuery } from '@/types-db'; export type APIRequest< RouteParams = {}, @@ -50,80 +46,6 @@ export type AuthenticatedRequest< // list query // ---------------------------------- -export namespace ListQuery { - export type Request = AuthenticatedRequest<{}, {}, {}, Params> & { - listQueryOptions?: Options; - }; - - export type Params = { - filter?: string; - skip?: string; - take?: string; - select?: string; - sortBy?: string; - }; - - export type Options = { - filter?: Record; - select?: Record; - skip?: number; - take?: number; - sortBy?: string; - }; - - /** - * Slim workflow returned from a list query operation. - */ - export namespace Workflow { - type OptionalBaseFields = 'name' | 'active' | 'versionId' | 'createdAt' | 'updatedAt' | 'tags'; - - type BaseFields = Pick & - Partial>; - - type SharedField = Partial>; - - type SortingField = 'createdAt' | 'updatedAt' | 'name'; - - export type SortOrder = `${SortingField}:asc` | `${SortingField}:desc`; - - type OwnedByField = { ownedBy: SlimUser | null; homeProject: SlimProject | null }; - - export type Plain = BaseFields; - - export type WithSharing = BaseFields & SharedField; - - export type WithOwnership = BaseFields & OwnedByField; - - type SharedWithField = { sharedWith: SlimUser[]; sharedWithProjects: SlimProject[] }; - - export type WithOwnedByAndSharedWith = BaseFields & - OwnedByField & - SharedWithField & - SharedField; - - export type WithScopes = BaseFields & ScopesField & SharedField; - } - - export namespace Credentials { - type OwnedByField = { homeProject: SlimProject | null }; - - type SharedField = Partial>; - - type SharedWithField = { sharedWithProjects: SlimProject[] }; - - export type WithSharing = CredentialsEntity & SharedField; - - export type WithOwnedByAndSharedWith = CredentialsEntity & - OwnedByField & - SharedWithField & - SharedField; - - export type WithScopes = CredentialsEntity & ScopesField & SharedField; - } -} - -type SlimUser = Pick; - export function hasSharing( workflows: ListQuery.Workflow.Plain[] | ListQuery.Workflow.WithSharing[], ): workflows is ListQuery.Workflow.WithSharing[] { diff --git a/packages/cli/src/security-audit/risk-reporters/instance-risk-reporter.ts b/packages/cli/src/security-audit/risk-reporters/instance-risk-reporter.ts index 43064daca4..e838009ef9 100644 --- a/packages/cli/src/security-audit/risk-reporters/instance-risk-reporter.ts +++ b/packages/cli/src/security-audit/risk-reporters/instance-risk-reporter.ts @@ -1,4 +1,5 @@ import { GlobalConfig } from '@n8n/config'; +import { separate } from '@n8n/db'; import { Service } from '@n8n/di'; import axios from 'axios'; import { InstanceSettings, Logger } from 'n8n-core'; @@ -15,7 +16,6 @@ import { } from '@/security-audit/constants'; import type { RiskReporter, Risk, n8n } from '@/security-audit/types'; import { toFlaggedNode } from '@/security-audit/utils'; -import { separate } from '@/utils'; @Service() export class InstanceRiskReporter implements RiskReporter { diff --git a/packages/cli/src/services/folder.service.ts b/packages/cli/src/services/folder.service.ts index fc35452139..a2cf5c9bd2 100644 --- a/packages/cli/src/services/folder.service.ts +++ b/packages/cli/src/services/folder.service.ts @@ -9,7 +9,7 @@ import { FolderTagMappingRepository } from '@/databases/repositories/folder-tag- import { FolderRepository } from '@/databases/repositories/folder.repository'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; import { FolderNotFoundError } from '@/errors/folder-not-found.error'; -import type { ListQuery } from '@/requests'; +import type { ListQuery } from '@/types-db'; export interface SimpleFolderNode { id: string; diff --git a/packages/cli/src/services/ownership.service.ts b/packages/cli/src/services/ownership.service.ts index 21ce4b573a..2ef2055f07 100644 --- a/packages/cli/src/services/ownership.service.ts +++ b/packages/cli/src/services/ownership.service.ts @@ -6,8 +6,8 @@ import { ProjectRelationRepository } from '@/databases/repositories/project-rela import { ProjectRepository } from '@/databases/repositories/project.repository'; import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository'; import { UserRepository } from '@/databases/repositories/user.repository'; -import type { ListQuery } from '@/requests'; import { CacheService } from '@/services/cache/cache.service'; +import type { ListQuery } from '@/types-db'; @Service() export class OwnershipService { diff --git a/packages/cli/src/services/role.service.ts b/packages/cli/src/services/role.service.ts index 157994b72f..c9ac878f92 100644 --- a/packages/cli/src/services/role.service.ts +++ b/packages/cli/src/services/role.service.ts @@ -30,7 +30,7 @@ import { WORKFLOW_SHARING_EDITOR_SCOPES, WORKFLOW_SHARING_OWNER_SCOPES, } from '@/permissions.ee/resource-roles'; -import type { ListQuery } from '@/requests'; +import type { ListQuery, ScopesField } from '@/types-db'; export type RoleNamespace = 'global' | 'project' | 'credential' | 'workflow'; @@ -100,7 +100,7 @@ const ROLE_NAMES: Record< 'workflow:editor': 'Workflow Editor', }; -export type ScopesField = { scopes: Scope[] }; +// export type ScopesField = { scopes: Scope[] }; @Service() export class RoleService { @@ -189,7 +189,10 @@ export class RoleService { | ListQuery.Workflow.WithScopes | ListQuery.Credentials.WithScopes { const shared = rawEntity.shared; - const entity = rawEntity as ListQuery.Workflow.WithScopes | ListQuery.Credentials.WithScopes; + const entity = rawEntity as + | (CredentialsEntity & ScopesField) + | ListQuery.Workflow.WithScopes + | ListQuery.Credentials.WithScopes; Object.assign(entity, { scopes: [], diff --git a/packages/cli/src/sso.ee/saml/__tests__/saml-helpers.test.ts b/packages/cli/src/sso.ee/saml/__tests__/saml-helpers.test.ts index d75fdc8a7f..2708161c26 100644 --- a/packages/cli/src/sso.ee/saml/__tests__/saml-helpers.test.ts +++ b/packages/cli/src/sso.ee/saml/__tests__/saml-helpers.test.ts @@ -1,8 +1,9 @@ +import { generateNanoId } from '@n8n/db'; + import type { AuthIdentity } from '@/databases/entities/auth-identity'; import { User } from '@/databases/entities/user'; import { AuthIdentityRepository } from '@/databases/repositories/auth-identity.repository'; import { UserRepository } from '@/databases/repositories/user.repository'; -import { generateNanoId } from '@/databases/utils/generators'; import * as helpers from '@/sso.ee/saml/saml-helpers'; import type { SamlUserAttributes } from '@/sso.ee/saml/types'; import { mockInstance } from '@test/mocking'; diff --git a/packages/cli/src/types-db.ts b/packages/cli/src/types-db.ts index 19e9753855..6cf46f5fdf 100644 --- a/packages/cli/src/types-db.ts +++ b/packages/cli/src/types-db.ts @@ -1,4 +1,5 @@ import type { GlobalRole, Scope } from '@n8n/permissions'; +import type express from 'express'; import type { ICredentialsEncrypted, IRunExecutionData, @@ -7,10 +8,16 @@ import type { ExecutionStatus, FeatureFlags, IUserSettings, + DeduplicationMode, + DeduplicationItemTypes, + AnnotationVote, + ExecutionSummary, + IUser, } from 'n8n-workflow'; import type { AnnotationTagEntity } from '@/databases/entities/annotation-tag-entity.ee'; import type { AuthProviderType } from '@/databases/entities/auth-identity'; +import type { CredentialsEntity } from '@/databases/entities/credentials-entity'; import type { Folder } from '@/databases/entities/folder'; import type { Project } from '@/databases/entities/project'; import type { SharedCredentials } from '@/databases/entities/shared-credentials'; @@ -140,3 +147,176 @@ export interface WorkflowWithSharingsMetaDataAndCredentials extends Omit; + +// Data in regular format with references +export interface IExecutionDb extends IExecutionBase { + data: IRunExecutionData; + workflowData: IWorkflowBase; +} + +export interface IExecutionFlattedDb extends IExecutionBase { + id: string; + data: string; + workflowData: Omit; + customData: Record; +} + +export namespace ExecutionSummaries { + export type Query = RangeQuery | CountQuery; + + export type RangeQuery = { kind: 'range' } & FilterFields & + AccessFields & + RangeFields & + OrderFields; + + export type CountQuery = { kind: 'count' } & FilterFields & AccessFields; + + type FilterFields = Partial<{ + id: string; + finished: boolean; + mode: string; + retryOf: string; + retrySuccessId: string; + status: ExecutionStatus[]; + workflowId: string; + waitTill: boolean; + metadata: Array<{ key: string; value: string }>; + startedAfter: string; + startedBefore: string; + annotationTags: string[]; // tag IDs + vote: AnnotationVote; + projectId: string; + }>; + + type AccessFields = { + accessibleWorkflowIds?: string[]; + }; + + type RangeFields = { + range: { + limit: number; + firstId?: string; + lastId?: string; + }; + }; + + type OrderFields = { + order?: { + top?: ExecutionStatus; + startedAt?: 'DESC'; + }; + }; + + export type ExecutionSummaryWithScopes = ExecutionSummary & { scopes: Scope[] }; +} + +export type APIRequest< + RouteParams = {}, + ResponseBody = {}, + RequestBody = {}, + RequestQuery = {}, +> = express.Request & { + browserId?: string; +}; + +export type AuthenticatedRequest< + RouteParams = {}, + ResponseBody = {}, + RequestBody = {}, + RequestQuery = {}, +> = Omit, 'user' | 'cookies'> & { + user: User; + cookies: Record; + headers: express.Request['headers'] & { + 'push-ref': string; + }; +}; + +export namespace ListQuery { + export type Request = AuthenticatedRequest<{}, {}, {}, Params> & { + listQueryOptions?: Options; + }; + + export type Params = { + filter?: string; + skip?: string; + take?: string; + select?: string; + sortBy?: string; + }; + + export type Options = { + filter?: Record; + select?: Record; + skip?: number; + take?: number; + sortBy?: string; + }; + + /** + * Slim workflow returned from a list query operation. + */ + export namespace Workflow { + type OptionalBaseFields = 'name' | 'active' | 'versionId' | 'createdAt' | 'updatedAt' | 'tags'; + + type BaseFields = Pick & + Partial>; + + type SharedField = Partial>; + + type SortingField = 'createdAt' | 'updatedAt' | 'name'; + + export type SortOrder = `${SortingField}:asc` | `${SortingField}:desc`; + + type OwnedByField = { ownedBy: SlimUser | null; homeProject: SlimProject | null }; + + export type Plain = BaseFields; + + export type WithSharing = BaseFields & SharedField; + + export type WithOwnership = BaseFields & OwnedByField; + + type SharedWithField = { sharedWith: SlimUser[]; sharedWithProjects: SlimProject[] }; + + export type WithOwnedByAndSharedWith = BaseFields & + OwnedByField & + SharedWithField & + SharedField; + + export type WithScopes = BaseFields & ScopesField & SharedField; + } + + export namespace Credentials { + type OwnedByField = { homeProject: SlimProject | null }; + + type SharedField = Partial>; + + type SharedWithField = { sharedWithProjects: SlimProject[] }; + + export type WithSharing = CredentialsEntity & SharedField; + + export type WithOwnedByAndSharedWith = CredentialsEntity & + OwnedByField & + SharedWithField & + SharedField; + + export type WithScopes = CredentialsEntity & ScopesField & SharedField; + } +} + +type SlimUser = Pick; + +export type ScopesField = { scopes: Scope[] }; diff --git a/packages/cli/src/utils.ts b/packages/cli/src/utils.ts index 6f19f33dc6..f8cf5168a4 100644 --- a/packages/cli/src/utils.ts +++ b/packages/cli/src/utils.ts @@ -39,23 +39,10 @@ export const findSubworkflowStart = findWorkflowStart('integrated'); export const findCliWorkflowStart = findWorkflowStart('cli'); -export const separate = (array: T[], test: (element: T) => boolean) => { - const pass: T[] = []; - const fail: T[] = []; - - array.forEach((i) => (test(i) ? pass : fail).push(i)); - - return [pass, fail]; -}; - export const toError = (maybeError: unknown) => // eslint-disable-next-line @typescript-eslint/restrict-template-expressions maybeError instanceof Error ? maybeError : new Error(`${maybeError}`); -export function isStringArray(value: unknown): value is string[] { - return Array.isArray(value) && value.every((item) => typeof item === 'string'); -} - export const isIntegerString = (value: string) => /^\d+$/.test(value); export function removeTrailingSlash(path: string) { diff --git a/packages/cli/src/webhooks/__tests__/test-webhooks.test.ts b/packages/cli/src/webhooks/__tests__/test-webhooks.test.ts index bde459591b..cd90e2f211 100644 --- a/packages/cli/src/webhooks/__tests__/test-webhooks.test.ts +++ b/packages/cli/src/webhooks/__tests__/test-webhooks.test.ts @@ -1,3 +1,4 @@ +import { generateNanoId } from '@n8n/db'; import type * as express from 'express'; import { mock } from 'jest-mock-extended'; import type { ITaskData, IWorkflowBase } from 'n8n-workflow'; @@ -8,7 +9,6 @@ import { } from 'n8n-workflow'; import { v4 as uuid } from 'uuid'; -import { generateNanoId } from '@/databases/utils/generators'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { WebhookNotFoundError } from '@/errors/response-errors/webhook-not-found.error'; import type { diff --git a/packages/cli/src/workflows/workflow-execution.service.ts b/packages/cli/src/workflows/workflow-execution.service.ts index 8f6d78049f..53a0e79507 100644 --- a/packages/cli/src/workflows/workflow-execution.service.ts +++ b/packages/cli/src/workflows/workflow-execution.service.ts @@ -23,8 +23,9 @@ import { ExecutionRepository } from '@/databases/repositories/execution.reposito import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; import { ExecutionDataService } from '@/executions/execution-data.service'; import { SubworkflowPolicyChecker } from '@/executions/pre-execution-checks'; -import type { CreateExecutionPayload, IWorkflowErrorData } from '@/interfaces'; +import type { IWorkflowErrorData } from '@/interfaces'; import { NodeTypes } from '@/node-types'; +import type { CreateExecutionPayload } from '@/types-db'; import { TestWebhooks } from '@/webhooks/test-webhooks'; import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data'; import { WorkflowRunner } from '@/workflow-runner'; diff --git a/packages/cli/src/workflows/workflow.request.ts b/packages/cli/src/workflows/workflow.request.ts index a9cba76bf5..259f25cf17 100644 --- a/packages/cli/src/workflows/workflow.request.ts +++ b/packages/cli/src/workflows/workflow.request.ts @@ -8,7 +8,8 @@ import type { IWorkflowBase, } from 'n8n-workflow'; -import type { AuthenticatedRequest, ListQuery } from '@/requests'; +import type { AuthenticatedRequest } from '@/requests'; +import type { ListQuery } from '@/types-db'; export declare namespace WorkflowRequest { type CreateUpdatePayload = Partial<{ diff --git a/packages/cli/src/workflows/workflow.service.ts b/packages/cli/src/workflows/workflow.service.ts index 15cbf925ff..153aa47fb3 100644 --- a/packages/cli/src/workflows/workflow.service.ts +++ b/packages/cli/src/workflows/workflow.service.ts @@ -27,13 +27,14 @@ import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { EventService } from '@/events/event.service'; import { ExternalHooks } from '@/external-hooks'; import { validateEntity } from '@/generic-helpers'; -import { hasSharing, type ListQuery } from '@/requests'; +import { hasSharing } from '@/requests'; import { FolderService } from '@/services/folder.service'; import { OrchestrationService } from '@/services/orchestration.service'; import { OwnershipService } from '@/services/ownership.service'; import { ProjectService } from '@/services/project.service.ee'; import { RoleService } from '@/services/role.service'; import { TagService } from '@/services/tag.service'; +import type { ListQuery } from '@/types-db'; import * as WorkflowHelpers from '@/workflow-helpers'; import { WorkflowFinderService } from './workflow-finder.service'; diff --git a/packages/cli/test/integration/credentials/credentials.api.ee.test.ts b/packages/cli/test/integration/credentials/credentials.api.ee.test.ts index e8a47cc055..56783c282a 100644 --- a/packages/cli/test/integration/credentials/credentials.api.ee.test.ts +++ b/packages/cli/test/integration/credentials/credentials.api.ee.test.ts @@ -8,8 +8,8 @@ import type { Project } from '@/databases/entities/project'; import type { User } from '@/databases/entities/user'; import { ProjectRepository } from '@/databases/repositories/project.repository'; import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository'; -import type { ListQuery } from '@/requests'; import { ProjectService } from '@/services/project.service.ee'; +import type { ListQuery } from '@/types-db'; import { UserManagementMailer } from '@/user-management/email'; import { createWorkflow, shareWorkflowWithUsers } from '@test-integration/db/workflows'; diff --git a/packages/cli/test/integration/credentials/credentials.api.test.ts b/packages/cli/test/integration/credentials/credentials.api.test.ts index 20290e7d5e..4a6c036d28 100644 --- a/packages/cli/test/integration/credentials/credentials.api.test.ts +++ b/packages/cli/test/integration/credentials/credentials.api.test.ts @@ -14,8 +14,8 @@ import type { User } from '@/databases/entities/user'; import { CredentialsRepository } from '@/databases/repositories/credentials.repository'; import { ProjectRepository } from '@/databases/repositories/project.repository'; import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository'; -import type { ListQuery } from '@/requests'; import { CredentialsTester } from '@/services/credentials-tester.service'; +import type { ListQuery } from '@/types-db'; import { decryptCredentialData, diff --git a/packages/cli/test/integration/debug.controller.test.ts b/packages/cli/test/integration/debug.controller.test.ts index 7ca483a912..25018bb313 100644 --- a/packages/cli/test/integration/debug.controller.test.ts +++ b/packages/cli/test/integration/debug.controller.test.ts @@ -1,10 +1,10 @@ +import { generateNanoId } from '@n8n/db'; import { Container } from '@n8n/di'; import { InstanceSettings } from 'n8n-core'; import { ActiveWorkflowManager } from '@/active-workflow-manager'; import type { WorkflowEntity } from '@/databases/entities/workflow-entity'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; -import { generateNanoId } from '@/databases/utils/generators'; import { MultiMainSetup } from '@/scaling/multi-main-setup.ee'; import { createOwner } from './shared/db/users'; diff --git a/packages/cli/test/integration/execution.service.integration.test.ts b/packages/cli/test/integration/execution.service.integration.test.ts index e1de129d7c..cf633d215d 100644 --- a/packages/cli/test/integration/execution.service.integration.test.ts +++ b/packages/cli/test/integration/execution.service.integration.test.ts @@ -5,7 +5,7 @@ import { ExecutionMetadataRepository } from '@/databases/repositories/execution- import { ExecutionRepository } from '@/databases/repositories/execution.repository'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; import { ExecutionService } from '@/executions/execution.service'; -import type { ExecutionSummaries } from '@/executions/execution.types'; +import type { ExecutionSummaries } from '@/types-db'; import { createTeamProject } from '@test-integration/db/projects'; import { annotateExecution, createAnnotationTags, createExecution } from './shared/db/executions'; diff --git a/packages/cli/test/integration/security-audit/credentials-risk-reporter.test.ts b/packages/cli/test/integration/security-audit/credentials-risk-reporter.test.ts index ba38f04bd6..2a69c38ed9 100644 --- a/packages/cli/test/integration/security-audit/credentials-risk-reporter.test.ts +++ b/packages/cli/test/integration/security-audit/credentials-risk-reporter.test.ts @@ -1,4 +1,5 @@ import type { SecurityConfig } from '@n8n/config'; +import { generateNanoId } from '@n8n/db'; import { Container } from '@n8n/di'; import { mock } from 'jest-mock-extended'; import { v4 as uuid } from 'uuid'; @@ -7,7 +8,6 @@ import { CredentialsRepository } from '@/databases/repositories/credentials.repo import { ExecutionDataRepository } from '@/databases/repositories/execution-data.repository'; import { ExecutionRepository } from '@/databases/repositories/execution.repository'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; -import { generateNanoId } from '@/databases/utils/generators'; import { CREDENTIALS_REPORT } from '@/security-audit/constants'; import { SecurityAuditService } from '@/security-audit/security-audit.service'; diff --git a/packages/cli/test/integration/security-audit/database-risk-reporter.test.ts b/packages/cli/test/integration/security-audit/database-risk-reporter.test.ts index 67927426b3..d0c4f02e85 100644 --- a/packages/cli/test/integration/security-audit/database-risk-reporter.test.ts +++ b/packages/cli/test/integration/security-audit/database-risk-reporter.test.ts @@ -1,9 +1,9 @@ +import { generateNanoId } from '@n8n/db'; import { Container } from '@n8n/di'; import { mock } from 'jest-mock-extended'; import { v4 as uuid } from 'uuid'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; -import { generateNanoId } from '@/databases/utils/generators'; import { DATABASE_REPORT, SQL_NODE_TYPES, diff --git a/packages/cli/test/integration/security-audit/instance-risk-reporter.test.ts b/packages/cli/test/integration/security-audit/instance-risk-reporter.test.ts index caa6ac9036..d722b5d88d 100644 --- a/packages/cli/test/integration/security-audit/instance-risk-reporter.test.ts +++ b/packages/cli/test/integration/security-audit/instance-risk-reporter.test.ts @@ -1,11 +1,11 @@ import { GlobalConfig } from '@n8n/config'; +import { generateNanoId } from '@n8n/db'; import { Container } from '@n8n/di'; import { mock } from 'jest-mock-extended'; import { NodeConnectionTypes } from 'n8n-workflow'; import { v4 as uuid } from 'uuid'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; -import { generateNanoId } from '@/databases/utils/generators'; import { INSTANCE_REPORT, WEBHOOK_VALIDATOR_NODE_TYPES } from '@/security-audit/constants'; import { SecurityAuditService } from '@/security-audit/security-audit.service'; import { toReportTitle } from '@/security-audit/utils'; diff --git a/packages/cli/test/integration/shared/db/tags.ts b/packages/cli/test/integration/shared/db/tags.ts index 3dd851ef4f..a08a8cd70c 100644 --- a/packages/cli/test/integration/shared/db/tags.ts +++ b/packages/cli/test/integration/shared/db/tags.ts @@ -1,3 +1,4 @@ +import { generateNanoId } from '@n8n/db'; import { Container } from '@n8n/di'; import type { IWorkflowBase } from 'n8n-workflow'; @@ -5,7 +6,6 @@ import type { TagEntity } from '@/databases/entities/tag-entity'; import type { WorkflowEntity } from '@/databases/entities/workflow-entity'; import { TagRepository } from '@/databases/repositories/tag.repository'; import { WorkflowTagMappingRepository } from '@/databases/repositories/workflow-tag-mapping.repository'; -import { generateNanoId } from '@/databases/utils/generators'; import { randomName } from '../random'; diff --git a/packages/cli/test/integration/shared/db/variables.ts b/packages/cli/test/integration/shared/db/variables.ts index 2ff052e7c0..0ea1a6eb09 100644 --- a/packages/cli/test/integration/shared/db/variables.ts +++ b/packages/cli/test/integration/shared/db/variables.ts @@ -1,8 +1,8 @@ +import { generateNanoId } from '@n8n/db'; import { Container } from '@n8n/di'; import { randomString } from 'n8n-workflow'; import { VariablesRepository } from '@/databases/repositories/variables.repository'; -import { generateNanoId } from '@/databases/utils/generators'; export async function createVariable(key = randomString(5), value = randomString(5)) { return await Container.get(VariablesRepository).save({ id: generateNanoId(), key, value }); diff --git a/packages/cli/test/integration/variables.test.ts b/packages/cli/test/integration/variables.test.ts index 19626f4f5d..da7ccb1cfa 100644 --- a/packages/cli/test/integration/variables.test.ts +++ b/packages/cli/test/integration/variables.test.ts @@ -1,8 +1,8 @@ +import { generateNanoId } from '@n8n/db'; import { Container } from '@n8n/di'; import type { Variables } from '@/databases/entities/variables'; import { VariablesRepository } from '@/databases/repositories/variables.repository'; -import { generateNanoId } from '@/databases/utils/generators'; import { VariablesService } from '@/environments.ee/variables/variables.service.ee'; import { CacheService } from '@/services/cache/cache.service'; diff --git a/packages/cli/test/integration/workflows/workflows.controller.test.ts b/packages/cli/test/integration/workflows/workflows.controller.test.ts index 7084cf0180..46a8553b44 100644 --- a/packages/cli/test/integration/workflows/workflows.controller.test.ts +++ b/packages/cli/test/integration/workflows/workflows.controller.test.ts @@ -12,8 +12,8 @@ import { WorkflowHistoryRepository } from '@/databases/repositories/workflow-his import type { WorkflowFolderUnionFull } from '@/databases/repositories/workflow.repository'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; import { License } from '@/license'; -import type { ListQuery } from '@/requests'; import { ProjectService } from '@/services/project.service.ee'; +import type { ListQuery } from '@/types-db'; import { EnterpriseWorkflowService } from '@/workflows/workflow.service.ee'; import { createFolder } from '@test-integration/db/folders'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1206644464..b291fc00ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,9 @@ catalogs: '@langchain/openai': specifier: 0.3.17 version: 0.3.17 + '@n8n/typeorm': + specifier: 0.3.20-12 + version: 0.3.20-12 '@n8n_io/ai-assistant-sdk': specifier: 1.14.0 version: 1.14.0 @@ -463,6 +466,24 @@ importers: packages/@n8n/db: dependencies: + '@n8n/config': + specifier: workspace:^ + version: link:../config + '@n8n/di': + specifier: workspace:^ + version: link:../di + '@n8n/typeorm': + specifier: 'catalog:' + version: 0.3.20-12(@sentry/node@8.52.1)(ioredis@5.3.2)(mssql@10.0.2)(mysql2@3.11.0)(pg@8.12.0)(redis@4.6.14)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.8.2)) + n8n-core: + specifier: workspace:^ + version: link:../../core + n8n-workflow: + specifier: workspace:^ + version: link:../../workflow + nanoid: + specifier: 'catalog:' + version: 3.3.8 reflect-metadata: specifier: 'catalog:' version: 0.2.2 @@ -647,7 +668,7 @@ importers: version: 3.666.0(@aws-sdk/client-sts@3.666.0) '@getzep/zep-cloud': specifier: 1.0.12 - version: 1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(73c39badb3fd5b3eb4d1084b1fb22de6)) + version: 1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(e320b1d8e94e7308fefdef3743329630)) '@getzep/zep-js': specifier: 0.9.0 version: 0.9.0 @@ -674,7 +695,7 @@ importers: version: 0.3.2(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13) '@langchain/community': specifier: 'catalog:' - version: 0.3.24(d72b3dbd91eb98a3175f929d13e7c0a7) + version: 0.3.24(a23560be5fb93c23c5c4ed2a6b67082b) '@langchain/core': specifier: 'catalog:' version: 0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) @@ -773,7 +794,7 @@ importers: version: 23.0.1 langchain: specifier: 0.3.11 - version: 0.3.11(73c39badb3fd5b3eb4d1084b1fb22de6) + version: 0.3.11(e320b1d8e94e7308fefdef3743329630) lodash: specifier: 'catalog:' version: 4.17.21 @@ -1040,7 +1061,7 @@ importers: specifier: workspace:* version: link:../@n8n/task-runner '@n8n/typeorm': - specifier: 0.3.20-12 + specifier: 'catalog:' version: 0.3.20-12(@sentry/node@8.52.1)(ioredis@5.3.2)(mssql@10.0.2)(mysql2@3.11.0)(pg@8.12.0)(redis@4.6.14)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.8.2)) '@n8n_io/ai-assistant-sdk': specifier: 'catalog:' @@ -8047,15 +8068,6 @@ packages: supports-color: optional: true - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -16323,7 +16335,7 @@ snapshots: '@gar/promisify@1.1.3': optional: true - '@getzep/zep-cloud@1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(73c39badb3fd5b3eb4d1084b1fb22de6))': + '@getzep/zep-cloud@1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(e320b1d8e94e7308fefdef3743329630))': dependencies: form-data: 4.0.0 node-fetch: 2.7.0(encoding@0.1.13) @@ -16332,7 +16344,7 @@ snapshots: zod: 3.24.1 optionalDependencies: '@langchain/core': 0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) - langchain: 0.3.11(73c39badb3fd5b3eb4d1084b1fb22de6) + langchain: 0.3.11(e320b1d8e94e7308fefdef3743329630) transitivePeerDependencies: - encoding @@ -16847,7 +16859,7 @@ snapshots: - aws-crt - encoding - '@langchain/community@0.3.24(d72b3dbd91eb98a3175f929d13e7c0a7)': + '@langchain/community@0.3.24(a23560be5fb93c23c5c4ed2a6b67082b)': dependencies: '@browserbasehq/stagehand': 1.9.0(@playwright/test@1.49.1)(deepmerge@4.3.1)(dotenv@16.4.5)(encoding@0.1.13)(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))(zod@3.24.1) '@ibm-cloud/watsonx-ai': 1.1.2 @@ -16858,7 +16870,7 @@ snapshots: flat: 5.0.2 ibm-cloud-sdk-core: 5.3.2 js-yaml: 4.1.0 - langchain: 0.3.11(73c39badb3fd5b3eb4d1084b1fb22de6) + langchain: 0.3.11(e320b1d8e94e7308fefdef3743329630) langsmith: 0.2.15(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) openai: 4.78.1(encoding@0.1.13)(zod@3.24.1) uuid: 10.0.0 @@ -16873,7 +16885,7 @@ snapshots: '@aws-sdk/credential-provider-node': 3.666.0(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@aws-sdk/client-sts@3.666.0) '@azure/storage-blob': 12.18.0(encoding@0.1.13) '@browserbasehq/sdk': 2.0.0(encoding@0.1.13) - '@getzep/zep-cloud': 1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(73c39badb3fd5b3eb4d1084b1fb22de6)) + '@getzep/zep-cloud': 1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(e320b1d8e94e7308fefdef3743329630)) '@getzep/zep-js': 0.9.0 '@google-ai/generativelanguage': 2.6.0(encoding@0.1.13) '@google-cloud/storage': 7.12.1(encoding@0.1.13) @@ -17255,8 +17267,8 @@ snapshots: buffer: 6.0.3 chalk: 4.1.2 dayjs: 1.11.10 - debug: 4.3.7 - dotenv: 16.3.1 + debug: 4.4.0(supports-color@8.1.1) + dotenv: 16.4.5 glob: 10.4.5 mkdirp: 2.1.3 reflect-metadata: 0.2.2 @@ -17287,8 +17299,8 @@ snapshots: buffer: 6.0.3 chalk: 4.1.2 dayjs: 1.11.10 - debug: 4.3.7 - dotenv: 16.3.1 + debug: 4.4.0(supports-color@8.1.1) + dotenv: 16.4.5 glob: 10.4.5 mkdirp: 2.1.3 reflect-metadata: 0.2.2 @@ -21342,10 +21354,6 @@ snapshots: optionalDependencies: supports-color: 8.1.1 - debug@4.3.7: - dependencies: - ms: 2.1.3 - debug@4.4.0(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -23071,7 +23079,7 @@ snapshots: '@types/debug': 4.1.12 '@types/node': 18.16.16 '@types/tough-cookie': 4.0.2 - axios: 1.8.3(debug@4.4.0) + axios: 1.8.3 camelcase: 6.3.0 debug: 4.4.0(supports-color@8.1.1) dotenv: 16.4.5 @@ -23081,7 +23089,7 @@ snapshots: isstream: 0.1.2 jsonwebtoken: 9.0.2 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.8.3) + retry-axios: 2.6.0(axios@1.8.3(debug@4.4.0)) tough-cookie: 4.1.3 transitivePeerDependencies: - supports-color @@ -24075,7 +24083,7 @@ snapshots: kuler@2.0.0: {} - langchain@0.3.11(73c39badb3fd5b3eb4d1084b1fb22de6): + langchain@0.3.11(e320b1d8e94e7308fefdef3743329630): dependencies: '@langchain/core': 0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) '@langchain/openai': 0.3.17(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13) @@ -26448,7 +26456,7 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - retry-axios@2.6.0(axios@1.8.3): + retry-axios@2.6.0(axios@1.8.3(debug@4.4.0)): dependencies: axios: 1.8.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f9a0a69f7d..2b6e4d5c22 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,6 +6,7 @@ packages: - cypress catalog: + '@n8n/typeorm': 0.3.20-12 '@sentry/node': 8.52.1 '@types/basic-auth': ^1.1.3 '@types/express': ^5.0.1