From 547a60642ce9e54819d4e600c822d87dabd59b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Wed, 21 Aug 2024 16:18:16 +0200 Subject: [PATCH 001/233] fix(core): Use class-validator with XSS check for survey answers (#10490) Co-authored-by: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> --- packages/cli/src/GenericHelpers.ts | 41 +------ .../__tests__/me.controller.test.ts | 38 +++++- packages/cli/src/controllers/me.controller.ts | 17 ++- .../cli/src/controllers/survey-answers.dto.ts | 109 ++++++++++++++++++ .../__tests__/telemetry-event-relay.test.ts | 12 +- packages/cli/src/events/relay-event-map.ts | 9 +- .../cli/src/events/telemetry-event-relay.ts | 12 +- packages/cli/src/requests.ts | 3 +- .../__tests__/no-xss.validator.test.ts | 35 +++++- .../cli/src/validators/no-xss.validator.ts | 4 +- packages/cli/test/integration/me.api.test.ts | 45 +++++--- packages/editor-ui/src/Interface.ts | 19 +-- .../src/components/PersonalizationModal.vue | 10 +- packages/editor-ui/src/utils/userUtils.ts | 2 +- packages/workflow/src/Interfaces.ts | 20 ++++ 15 files changed, 274 insertions(+), 102 deletions(-) create mode 100644 packages/cli/src/controllers/survey-answers.dto.ts diff --git a/packages/cli/src/GenericHelpers.ts b/packages/cli/src/GenericHelpers.ts index 57dcb60207..39bdc4c9c1 100644 --- a/packages/cli/src/GenericHelpers.ts +++ b/packages/cli/src/GenericHelpers.ts @@ -1,4 +1,4 @@ -import { ValidationError, validate } from 'class-validator'; +import { validate } from 'class-validator'; import type { WorkflowEntity } from '@db/entities/WorkflowEntity'; import type { CredentialsEntity } from '@db/entities/CredentialsEntity'; import type { TagEntity } from '@db/entities/TagEntity'; @@ -9,7 +9,7 @@ import type { UserUpdatePayload, } from '@/requests'; import { BadRequestError } from './errors/response-errors/bad-request.error'; -import { NoXss } from '@/validators/no-xss.validator'; +import type { PersonalizationSurveyAnswersV4 } from './controllers/survey-answers.dto'; export async function validateEntity( entity: @@ -19,7 +19,8 @@ export async function validateEntity( | User | UserUpdatePayload | UserRoleChangePayload - | UserSettingsUpdatePayload, + | UserSettingsUpdatePayload + | PersonalizationSurveyAnswersV4, ): Promise { const errors = await validate(entity); @@ -37,37 +38,3 @@ export async function validateEntity( } export const DEFAULT_EXECUTIONS_GET_ALL_LIMIT = 20; - -class StringWithNoXss { - @NoXss() - value: string; - - constructor(value: string) { - this.value = value; - } -} - -// Temporary solution until we implement payload validation middleware -export async function validateRecordNoXss(record: Record) { - const errors: ValidationError[] = []; - - for (const [key, value] of Object.entries(record)) { - const stringWithNoXss = new StringWithNoXss(value); - const validationErrors = await validate(stringWithNoXss); - - if (validationErrors.length > 0) { - const error = new ValidationError(); - error.property = key; - error.constraints = validationErrors[0].constraints; - errors.push(error); - } - } - - if (errors.length > 0) { - const errorMessages = errors - .map((error) => `${error.property}: ${Object.values(error.constraints ?? {}).join(', ')}`) - .join(' | '); - - throw new BadRequestError(errorMessages); - } -} diff --git a/packages/cli/src/controllers/__tests__/me.controller.test.ts b/packages/cli/src/controllers/__tests__/me.controller.test.ts index 71a6d69384..9363cefd0a 100644 --- a/packages/cli/src/controllers/__tests__/me.controller.test.ts +++ b/packages/cli/src/controllers/__tests__/me.controller.test.ts @@ -349,10 +349,40 @@ describe('MeController', () => { ); }); - it('should throw BadRequestError on XSS attempt', async () => { - const req = mock({ - body: { 'test-answer': '' }, - }); + test.each([ + 'automationGoalDevops', + 'companyIndustryExtended', + 'otherCompanyIndustryExtended', + 'automationGoalSm', + 'usageModes', + ])('should throw BadRequestError on XSS attempt for an array field %s', async (fieldName) => { + const req = mock(); + req.body = { + version: 'v4', + personalization_survey_n8n_version: '1.0.0', + personalization_survey_submitted_at: new Date().toISOString(), + [fieldName]: [''], + }; + + await expect(controller.storeSurveyAnswers(req)).rejects.toThrowError(BadRequestError); + }); + + test.each([ + 'automationGoalDevopsOther', + 'companySize', + 'companyType', + 'automationGoalSmOther', + 'roleOther', + 'reportedSource', + 'reportedSourceOther', + ])('should throw BadRequestError on XSS attempt for a string field %s', async (fieldName) => { + const req = mock(); + req.body = { + version: 'v4', + personalization_survey_n8n_version: '1.0.0', + personalization_survey_submitted_at: new Date().toISOString(), + [fieldName]: '', + }; await expect(controller.storeSurveyAnswers(req)).rejects.toThrowError(BadRequestError); }); diff --git a/packages/cli/src/controllers/me.controller.ts b/packages/cli/src/controllers/me.controller.ts index 19429228ed..f931feecef 100644 --- a/packages/cli/src/controllers/me.controller.ts +++ b/packages/cli/src/controllers/me.controller.ts @@ -6,7 +6,7 @@ import { randomBytes } from 'crypto'; import { AuthService } from '@/auth/auth.service'; import { Delete, Get, Patch, Post, RestController } from '@/decorators'; import { PasswordUtility } from '@/services/password.utility'; -import { validateEntity, validateRecordNoXss } from '@/GenericHelpers'; +import { validateEntity } from '@/GenericHelpers'; import type { User } from '@db/entities/User'; import { AuthenticatedRequest, @@ -25,6 +25,7 @@ import { isApiEnabled } from '@/PublicApi'; import { EventService } from '@/events/event.service'; import { MfaService } from '@/Mfa/mfa.service'; import { InvalidMfaCodeError } from '@/errors/response-errors/invalid-mfa-code.error'; +import { PersonalizationSurveyAnswersV4 } from './survey-answers.dto'; export const API_KEY_PREFIX = 'n8n_api_'; @@ -195,7 +196,7 @@ export class MeController { if (!personalizationAnswers) { this.logger.debug( - 'Request to store user personalization survey failed because of empty payload', + 'Request to store user personalization survey failed because of undefined payload', { userId: req.user.id, }, @@ -203,12 +204,18 @@ export class MeController { throw new BadRequestError('Personalization answers are mandatory'); } - await validateRecordNoXss(personalizationAnswers); + const validatedAnswers = plainToInstance( + PersonalizationSurveyAnswersV4, + personalizationAnswers, + { excludeExtraneousValues: true }, + ); + + await validateEntity(validatedAnswers); await this.userRepository.save( { id: req.user.id, - personalizationAnswers, + personalizationAnswers: validatedAnswers, }, { transaction: false }, ); @@ -217,7 +224,7 @@ export class MeController { this.eventService.emit('user-submitted-personalization-survey', { userId: req.user.id, - answers: personalizationAnswers, + answers: validatedAnswers, }); return { success: true }; diff --git a/packages/cli/src/controllers/survey-answers.dto.ts b/packages/cli/src/controllers/survey-answers.dto.ts new file mode 100644 index 0000000000..f115a6992b --- /dev/null +++ b/packages/cli/src/controllers/survey-answers.dto.ts @@ -0,0 +1,109 @@ +import { NoXss } from '@/validators/no-xss.validator'; +import { Expose } from 'class-transformer'; +import { IsString, IsArray, IsOptional, IsEmail, IsEnum } from 'class-validator'; +import type { IPersonalizationSurveyAnswersV4 } from 'n8n-workflow'; + +export class PersonalizationSurveyAnswersV4 implements IPersonalizationSurveyAnswersV4 { + @NoXss() + @Expose() + @IsEnum(['v4']) + version: 'v4'; + + @NoXss() + @Expose() + @IsString() + personalization_survey_submitted_at: string; + + @NoXss() + @Expose() + @IsString() + personalization_survey_n8n_version: string; + + @Expose() + @IsOptional() + @IsArray() + @NoXss({ each: true }) + @IsString({ each: true }) + automationGoalDevops?: string[] | null; + + @NoXss() + @Expose() + @IsOptional() + @IsString() + automationGoalDevopsOther?: string | null; + + @NoXss({ each: true }) + @Expose() + @IsOptional() + @IsArray() + @IsString({ each: true }) + companyIndustryExtended?: string[] | null; + + @NoXss({ each: true }) + @Expose() + @IsOptional() + @IsString({ each: true }) + otherCompanyIndustryExtended?: string[] | null; + + @NoXss() + @Expose() + @IsOptional() + @IsString() + companySize?: string | null; + + @NoXss() + @Expose() + @IsOptional() + @IsString() + companyType?: string | null; + + @NoXss({ each: true }) + @Expose() + @IsOptional() + @IsArray() + @IsString({ each: true }) + automationGoalSm?: string[] | null; + + @NoXss() + @Expose() + @IsOptional() + @IsString() + automationGoalSmOther?: string | null; + + @NoXss({ each: true }) + @Expose() + @IsOptional() + @IsArray() + @IsString({ each: true }) + usageModes?: string[] | null; + + @NoXss() + @Expose() + @IsOptional() + @IsEmail() + email?: string | null; + + @NoXss() + @Expose() + @IsOptional() + @IsString() + role?: string | null; + + @NoXss() + @Expose() + @IsOptional() + @IsString() + roleOther?: string | null; + + @NoXss() + @Expose() + @IsOptional() + @IsString() + reportedSource?: string | null; + + @NoXss() + @Expose() + @IsOptional() + @IsString() + reportedSourceOther?: string | null; +} diff --git a/packages/cli/src/events/__tests__/telemetry-event-relay.test.ts b/packages/cli/src/events/__tests__/telemetry-event-relay.test.ts index 56149a1e9e..8e4fb444c6 100644 --- a/packages/cli/src/events/__tests__/telemetry-event-relay.test.ts +++ b/packages/cli/src/events/__tests__/telemetry-event-relay.test.ts @@ -863,10 +863,10 @@ describe('TelemetryEventRelay', () => { const event: RelayEventMap['user-submitted-personalization-survey'] = { userId: 'user123', answers: { + version: 'v4', + personalization_survey_n8n_version: '1.0.0', + personalization_survey_submitted_at: '2021-10-01T00:00:00.000Z', companySize: '1-10', - workArea: 'IT', - automationGoal: 'Improve efficiency', - valueExpectation: 'Time savings', }, }; @@ -874,10 +874,10 @@ describe('TelemetryEventRelay', () => { expect(telemetry.track).toHaveBeenCalledWith('User responded to personalization questions', { user_id: 'user123', + version: 'v4', + personalization_survey_n8n_version: '1.0.0', + personalization_survey_submitted_at: '2021-10-01T00:00:00.000Z', company_size: '1-10', - work_area: 'IT', - automation_goal: 'Improve efficiency', - value_expectation: 'Time savings', }); }); diff --git a/packages/cli/src/events/relay-event-map.ts b/packages/cli/src/events/relay-event-map.ts index 8f0efc2fed..ffc9c9d716 100644 --- a/packages/cli/src/events/relay-event-map.ts +++ b/packages/cli/src/events/relay-event-map.ts @@ -1,4 +1,9 @@ -import type { AuthenticationMethod, IRun, IWorkflowBase } from 'n8n-workflow'; +import type { + AuthenticationMethod, + IPersonalizationSurveyAnswersV4, + IRun, + IWorkflowBase, +} from 'n8n-workflow'; import type { IWorkflowDb, IWorkflowExecutionDataProcess } from '@/Interfaces'; import type { ProjectRole } from '@/databases/entities/ProjectRelation'; import type { GlobalRole } from '@/databases/entities/User'; @@ -106,7 +111,7 @@ export type RelayEventMap = { 'user-submitted-personalization-survey': { userId: string; - answers: Record; + answers: IPersonalizationSurveyAnswersV4; }; 'user-deleted': { diff --git a/packages/cli/src/events/telemetry-event-relay.ts b/packages/cli/src/events/telemetry-event-relay.ts index d09481f911..3389e24b3f 100644 --- a/packages/cli/src/events/telemetry-event-relay.ts +++ b/packages/cli/src/events/telemetry-event-relay.ts @@ -945,11 +945,15 @@ export class TelemetryEventRelay extends EventRelay { userId, answers, }: RelayEventMap['user-submitted-personalization-survey']) { - const camelCaseKeys = Object.keys(answers); const personalizationSurveyData = { user_id: userId } as Record; - camelCaseKeys.forEach((camelCaseKey) => { - personalizationSurveyData[snakeCase(camelCaseKey)] = answers[camelCaseKey]; - }); + + // ESlint is wrong here + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + for (const [camelCaseKey, value] of Object.entries(answers)) { + if (value) { + personalizationSurveyData[snakeCase(camelCaseKey)] = value; + } + } this.telemetry.track('User responded to personalization questions', personalizationSurveyData); } diff --git a/packages/cli/src/requests.ts b/packages/cli/src/requests.ts index a847281d7d..bae7990c1a 100644 --- a/packages/cli/src/requests.ts +++ b/packages/cli/src/requests.ts @@ -8,6 +8,7 @@ import type { INodeCredentials, INodeParameters, INodeTypeNameVersion, + IPersonalizationSurveyAnswersV4, IUser, } from 'n8n-workflow'; @@ -235,7 +236,7 @@ export declare namespace MeRequest { {}, { currentPassword: string; newPassword: string; mfaCode?: string } >; - export type SurveyAnswers = AuthenticatedRequest<{}, {}, Record | {}>; + export type SurveyAnswers = AuthenticatedRequest<{}, {}, IPersonalizationSurveyAnswersV4>; } export interface UserSetupPayload { diff --git a/packages/cli/src/validators/__tests__/no-xss.validator.test.ts b/packages/cli/src/validators/__tests__/no-xss.validator.test.ts index 33821787ec..75eaeb9072 100644 --- a/packages/cli/src/validators/__tests__/no-xss.validator.test.ts +++ b/packages/cli/src/validators/__tests__/no-xss.validator.test.ts @@ -11,6 +11,9 @@ describe('NoXss', () => { @NoXss() version = ''; + + @NoXss({ each: true }) + categories: string[] = []; } const entity = new Entity(); @@ -71,7 +74,7 @@ describe('NoXss', () => { } }); - describe('Miscellanous strings', () => { + describe('Miscellaneous strings', () => { const VALID_MISCELLANEOUS_STRINGS = ['CI/CD']; for (const str of VALID_MISCELLANEOUS_STRINGS) { @@ -81,4 +84,34 @@ describe('NoXss', () => { }); } }); + + describe('Array of strings', () => { + const VALID_STRING_ARRAYS = [ + ['cloud-infrastructure-orchestration', 'ci-cd', 'reporting'], + ['automationGoalDevops', 'cloudComputing', 'containerization'], + ]; + + for (const arr of VALID_STRING_ARRAYS) { + test(`should allow array: ${JSON.stringify(arr)}`, async () => { + entity.categories = arr; + await expect(validate(entity)).resolves.toBeEmptyArray(); + }); + } + + const INVALID_STRING_ARRAYS = [ + ['valid-string', '', 'another-valid-string'], + ['', 'valid-string'], + ]; + + for (const arr of INVALID_STRING_ARRAYS) { + test(`should reject array containing invalid string: ${JSON.stringify(arr)}`, async () => { + entity.categories = arr; + const errors = await validate(entity); + expect(errors).toHaveLength(1); + const [error] = errors; + expect(error.property).toEqual('categories'); + expect(error.constraints).toEqual({ NoXss: 'Potentially malicious string' }); + }); + } + }); }); diff --git a/packages/cli/src/validators/no-xss.validator.ts b/packages/cli/src/validators/no-xss.validator.ts index 7c65f02dfe..69960c39dd 100644 --- a/packages/cli/src/validators/no-xss.validator.ts +++ b/packages/cli/src/validators/no-xss.validator.ts @@ -4,7 +4,9 @@ import { registerDecorator, ValidatorConstraint } from 'class-validator'; @ValidatorConstraint({ name: 'NoXss', async: false }) class NoXssConstraint implements ValidatorConstraintInterface { - validate(value: string) { + validate(value: unknown) { + if (typeof value !== 'string') return false; + return ( value === xss(value, { diff --git a/packages/cli/test/integration/me.api.test.ts b/packages/cli/test/integration/me.api.test.ts index ef9757dc44..b644d61550 100644 --- a/packages/cli/test/integration/me.api.test.ts +++ b/packages/cli/test/integration/me.api.test.ts @@ -1,7 +1,6 @@ import { Container } from 'typedi'; import { IsNull } from '@n8n/typeorm'; import validator from 'validator'; -import { randomString } from 'n8n-workflow'; import type { User } from '@db/entities/User'; import { UserRepository } from '@db/repositories/user.repository'; @@ -15,6 +14,7 @@ import { addApiKey, createOwner, createUser, createUserShell } from './shared/db import type { SuperAgentTest } from './shared/types'; import { mockInstance } from '@test/mocking'; import { GlobalConfig } from '@n8n/config'; +import type { IPersonalizationSurveyAnswersV4 } from 'n8n-workflow'; const testServer = utils.setupTestServer({ endpointGroups: ['me'] }); @@ -145,16 +145,16 @@ describe('Owner shell', () => { }); test('POST /me/survey should succeed with valid inputs', async () => { - const validPayloads = [SURVEY, {}]; + const validPayloads = [SURVEY, EMPTY_SURVEY]; for (const validPayload of validPayloads) { const response = await authOwnerShellAgent.post('/me/survey').send(validPayload); - expect(response.statusCode).toBe(200); expect(response.body).toEqual(SUCCESS_RESPONSE_BODY); + expect(response.statusCode).toBe(200); const storedShellOwner = await Container.get(UserRepository).findOneOrFail({ - where: { email: IsNull() }, + where: { id: ownerShell.id }, }); expect(storedShellOwner.personalizationAnswers).toEqual(validPayload); @@ -300,7 +300,7 @@ describe('Member', () => { }); test('POST /me/survey should succeed with valid inputs', async () => { - const validPayloads = [SURVEY, {}]; + const validPayloads = [SURVEY, EMPTY_SURVEY]; for (const validPayload of validPayloads) { const response = await authMemberAgent.post('/me/survey').send(validPayload); @@ -392,16 +392,31 @@ describe('Owner', () => { }); }); -const SURVEY = [ - 'codingSkill', - 'companyIndustry', - 'companySize', - 'otherCompanyIndustry', - 'otherWorkArea', - 'workArea', -].reduce>((acc, cur) => { - return (acc[cur] = randomString(2, 10)), acc; -}, {}); +const SURVEY: IPersonalizationSurveyAnswersV4 = { + version: 'v4', + personalization_survey_submitted_at: '2024-08-21T13:05:51.709Z', + personalization_survey_n8n_version: '1.0.0', + automationGoalDevops: ['test'], + automationGoalDevopsOther: 'test', + companyIndustryExtended: ['test'], + otherCompanyIndustryExtended: ['test'], + companySize: 'test', + companyType: 'test', + automationGoalSm: ['test'], + automationGoalSmOther: 'test', + usageModes: ['test'], + email: 'test@email.com', + role: 'test', + roleOther: 'test', + reportedSource: 'test', + reportedSourceOther: 'test', +}; + +const EMPTY_SURVEY: IPersonalizationSurveyAnswersV4 = { + version: 'v4', + personalization_survey_submitted_at: '2024-08-21T13:05:51.709Z', + personalization_survey_n8n_version: '1.0.0', +}; const VALID_PATCH_ME_PAYLOADS = [ { diff --git a/packages/editor-ui/src/Interface.ts b/packages/editor-ui/src/Interface.ts index 05c40402f1..a3f17a5582 100644 --- a/packages/editor-ui/src/Interface.ts +++ b/packages/editor-ui/src/Interface.ts @@ -48,6 +48,7 @@ import type { NodeConnectionType, INodeCredentialsDetails, StartNodeData, + IPersonalizationSurveyAnswersV4, } from 'n8n-workflow'; import type { BulkCommand, Undoable } from '@/models/history'; import type { PartialBy, TupleToUnion } from '@/utils/typeHelpers'; @@ -648,24 +649,6 @@ export type IPersonalizationSurveyAnswersV3 = { email?: string | null; }; -export type IPersonalizationSurveyAnswersV4 = { - version: 'v4'; - automationGoalDevops?: string[] | null; - automationGoalDevopsOther?: string | null; - companyIndustryExtended?: string[] | null; - otherCompanyIndustryExtended?: string[] | null; - companySize?: string | null; - companyType?: string | null; - automationGoalSm?: string[] | null; - automationGoalSmOther?: string | null; - usageModes?: string[] | null; - email?: string | null; - role?: string | null; - roleOther?: string | null; - reportedSource?: string | null; - reportedSourceOther?: string | null; -}; - export type IPersonalizationLatestVersion = IPersonalizationSurveyAnswersV4; export type IPersonalizationSurveyVersions = diff --git a/packages/editor-ui/src/components/PersonalizationModal.vue b/packages/editor-ui/src/components/PersonalizationModal.vue index 3f74e06f4e..cd4693565e 100644 --- a/packages/editor-ui/src/components/PersonalizationModal.vue +++ b/packages/editor-ui/src/components/PersonalizationModal.vue @@ -140,7 +140,6 @@ import { import { useToast } from '@/composables/useToast'; import Modal from '@/components/Modal.vue'; import type { IFormInputs, IPersonalizationLatestVersion } from '@/Interface'; -import type { GenericValue } from 'n8n-workflow'; import { useUIStore } from '@/stores/ui.store'; import { useSettingsStore } from '@/stores/settings.store'; import { useRootStore } from '@/stores/root.store'; @@ -696,19 +695,16 @@ export default defineComponent({ this.isSaving = true; try { - const survey: Record = { + const survey: IPersonalizationLatestVersion = { ...values, version: SURVEY_VERSION, personalization_survey_submitted_at: new Date().toISOString(), personalization_survey_n8n_version: this.rootStore.versionCli, }; - await this.externalHooks.run( - 'personalizationModal.onSubmit', - survey as IPersonalizationLatestVersion, - ); + await this.externalHooks.run('personalizationModal.onSubmit', survey); - await this.usersStore.submitPersonalizationSurvey(survey as IPersonalizationLatestVersion); + await this.usersStore.submitPersonalizationSurvey(survey); this.posthogStore.setMetadata(survey, 'user'); diff --git a/packages/editor-ui/src/utils/userUtils.ts b/packages/editor-ui/src/utils/userUtils.ts index 3d8aa21637..ff862ecfd8 100644 --- a/packages/editor-ui/src/utils/userUtils.ts +++ b/packages/editor-ui/src/utils/userUtils.ts @@ -65,11 +65,11 @@ import type { IPersonalizationSurveyAnswersV1, IPersonalizationSurveyAnswersV2, IPersonalizationSurveyAnswersV3, - IPersonalizationSurveyAnswersV4, IPersonalizationSurveyVersions, IUser, ILogInStatus, } from '@/Interface'; +import type { IPersonalizationSurveyAnswersV4 } from 'n8n-workflow'; /* Utility functions used to handle users in n8n diff --git a/packages/workflow/src/Interfaces.ts b/packages/workflow/src/Interfaces.ts index 3faa825f7b..a66dcc5eb4 100644 --- a/packages/workflow/src/Interfaces.ts +++ b/packages/workflow/src/Interfaces.ts @@ -2789,3 +2789,23 @@ export type Functionality = 'regular' | 'configuration-node' | 'pairedItem'; export type Result = { ok: true; result: T } | { ok: false; error: E }; export type CallbackManager = CallbackManagerLC; + +export type IPersonalizationSurveyAnswersV4 = { + version: 'v4'; + personalization_survey_submitted_at: string; + personalization_survey_n8n_version: string; + automationGoalDevops?: string[] | null; + automationGoalDevopsOther?: string | null; + companyIndustryExtended?: string[] | null; + otherCompanyIndustryExtended?: string[] | null; + companySize?: string | null; + companyType?: string | null; + automationGoalSm?: string[] | null; + automationGoalSmOther?: string | null; + usageModes?: string[] | null; + email?: string | null; + role?: string | null; + roleOther?: string | null; + reportedSource?: string | null; + reportedSourceOther?: string | null; +}; From 0276323881d90b0b85a74008e105a93ffd6f7d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milorad=20FIlipovi=C4=87?= Date: Wed, 21 Aug 2024 17:31:02 +0200 Subject: [PATCH 002/233] fix(editor): Sending 'Assistant session started event' to posthog (no-changelog) (#10500) Co-authored-by: Shireen Missi --- .../AskAssistantFloatingButton.vue | 16 +++++--------- .../AskAssistant/NewAssistantSessionModal.vue | 22 ++++++++----------- .../src/components/Error/NodeErrorView.vue | 20 +++++++---------- .../editor-ui/src/stores/assistant.store.ts | 12 ++++++---- 4 files changed, 31 insertions(+), 39 deletions(-) diff --git a/packages/editor-ui/src/components/AskAssistant/AskAssistantFloatingButton.vue b/packages/editor-ui/src/components/AskAssistant/AskAssistantFloatingButton.vue index b7fa424af0..853dd960fb 100644 --- a/packages/editor-ui/src/components/AskAssistant/AskAssistantFloatingButton.vue +++ b/packages/editor-ui/src/components/AskAssistant/AskAssistantFloatingButton.vue @@ -28,16 +28,12 @@ const lastUnread = computed(() => { const onClick = () => { assistantStore.openChat(); - telemetry.track( - 'User opened assistant', - { - source: 'canvas', - task: 'placeholder', - has_existing_session: !assistantStore.isSessionEnded, - workflow_id: workflowStore.workflowId, - }, - { withPostHog: true }, - ); + telemetry.track('User opened assistant', { + source: 'canvas', + task: 'placeholder', + has_existing_session: !assistantStore.isSessionEnded, + workflow_id: workflowStore.workflowId, + }); }; diff --git a/packages/editor-ui/src/components/AskAssistant/NewAssistantSessionModal.vue b/packages/editor-ui/src/components/AskAssistant/NewAssistantSessionModal.vue index b2496b07fb..54b87a83be 100644 --- a/packages/editor-ui/src/components/AskAssistant/NewAssistantSessionModal.vue +++ b/packages/editor-ui/src/components/AskAssistant/NewAssistantSessionModal.vue @@ -29,19 +29,15 @@ const close = () => { const startNewSession = async () => { await assistantStore.initErrorHelper(props.data.context); - telemetry.track( - 'User opened assistant', - { - source: 'error', - task: 'error', - has_existing_session: true, - workflow_id: workflowsStore.workflowId, - node_type: props.data.context.node.type, - error: props.data.context.error, - chat_session_id: assistantStore.currentSessionId, - }, - { withPostHog: true }, - ); + telemetry.track('User opened assistant', { + source: 'error', + task: 'error', + has_existing_session: true, + workflow_id: workflowsStore.workflowId, + node_type: props.data.context.node.type, + error: props.data.context.error, + chat_session_id: assistantStore.currentSessionId, + }); close(); }; diff --git a/packages/editor-ui/src/components/Error/NodeErrorView.vue b/packages/editor-ui/src/components/Error/NodeErrorView.vue index ba9c476a40..7ca1b7d2d9 100644 --- a/packages/editor-ui/src/components/Error/NodeErrorView.vue +++ b/packages/editor-ui/src/components/Error/NodeErrorView.vue @@ -433,18 +433,14 @@ async function onAskAssistantClick() { return; } await assistantStore.initErrorHelper(errorPayload); - telemetry.track( - 'User opened assistant', - { - source: 'error', - task: 'error', - has_existing_session: false, - workflow_id: workflowsStore.workflowId, - node_type: node.value.type, - error: props.error, - }, - { withPostHog: true }, - ); + telemetry.track('User opened assistant', { + source: 'error', + task: 'error', + has_existing_session: false, + workflow_id: workflowsStore.workflowId, + node_type: node.value.type, + error: props.error, + }); } diff --git a/packages/editor-ui/src/stores/assistant.store.ts b/packages/editor-ui/src/stores/assistant.store.ts index 229e2227f5..75ee335cfc 100644 --- a/packages/editor-ui/src/stores/assistant.store.ts +++ b/packages/editor-ui/src/stores/assistant.store.ts @@ -245,10 +245,14 @@ export const useAssistantStore = defineStore(STORES.ASSISTANT, () => { function onEachStreamingMessage(response: ChatRequest.ResponsePayload, id: string) { if (response.sessionId && !currentSessionId.value) { currentSessionId.value = response.sessionId; - telemetry.track('Assistant session started', { - chat_session_id: currentSessionId.value, - task: 'error', - }); + telemetry.track( + 'Assistant session started', + { + chat_session_id: currentSessionId.value, + task: 'error', + }, + { withPostHog: true }, + ); } else if (currentSessionId.value !== response.sessionId) { return; } From bcc4bb3c57861d9b90ca35880be95afc51b34249 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2024 16:47:06 +0100 Subject: [PATCH 003/233] :rocket: Release 1.56.0 (#10502) Co-authored-by: ShireenMissi --- CHANGELOG.md | 42 ++++++++++++++++++++++ package.json | 2 +- packages/@n8n/config/package.json | 2 +- packages/@n8n/nodes-langchain/package.json | 2 +- packages/cli/package.json | 2 +- packages/core/package.json | 2 +- packages/design-system/package.json | 2 +- packages/editor-ui/package.json | 2 +- packages/node-dev/package.json | 2 +- packages/nodes-base/package.json | 2 +- packages/workflow/package.json | 2 +- 11 files changed, 52 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06ded0c1ca..08aadc87da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,45 @@ +# [1.56.0](https://github.com/n8n-io/n8n/compare/n8n@1.55.0...n8n@1.56.0) (2024-08-21) + + +### Bug Fixes + +* Better errors in Switch, If and Filter nodes ([#10457](https://github.com/n8n-io/n8n/issues/10457)) ([aea82cb](https://github.com/n8n-io/n8n/commit/aea82cb74421d516919742127daf669808b57604)) +* **Calendly Trigger Node:** Fix issue with webhook url matching ([#10378](https://github.com/n8n-io/n8n/issues/10378)) ([09c3a8b](https://github.com/n8n-io/n8n/commit/09c3a8b36733a9634ef5948922d6aa7a19bbb592)) +* **core:** Fix payload property in `workflow-post-execute` event ([#10413](https://github.com/n8n-io/n8n/issues/10413)) ([d98e29e](https://github.com/n8n-io/n8n/commit/d98e29e3d53de87aec276260615fa60473a2692f)) +* **core:** Fix XSS validation and separate URL validation ([#10424](https://github.com/n8n-io/n8n/issues/10424)) ([91467ab](https://github.com/n8n-io/n8n/commit/91467ab325e4c71c20c522f3143246d270101626)) +* **core:** Replace `sanitize-html` with `xss` in XSS validator constraint ([#10479](https://github.com/n8n-io/n8n/issues/10479)) ([5dea51a](https://github.com/n8n-io/n8n/commit/5dea51aad7d9e7ffc676d16f4bbbdecce5876f0b)) +* **core:** Use class-validator with XSS check for survey answers ([#10490](https://github.com/n8n-io/n8n/issues/10490)) ([547a606](https://github.com/n8n-io/n8n/commit/547a60642ce9e54819d4e600c822d87dabd59b2e)) +* **core:** Use explicit types in configs to ensure valid decorator metadata ([#10433](https://github.com/n8n-io/n8n/issues/10433)) ([2043daa](https://github.com/n8n-io/n8n/commit/2043daa2570bc04b0b8d41f277901a8cc8a7b98f)) +* **editor:** Add workflow scopes when initializing workflow ([#10455](https://github.com/n8n-io/n8n/issues/10455)) ([b857c2c](https://github.com/n8n-io/n8n/commit/b857c2cda0a9e4386a540d5e1e741570d9453588)) +* **editor:** Buffer json chunks in stream response ([#10439](https://github.com/n8n-io/n8n/issues/10439)) ([37797f3](https://github.com/n8n-io/n8n/commit/37797f38d81b12d030ba85034baeb49192ea575c)) +* **editor:** Fix flaky mapping tests ([#10453](https://github.com/n8n-io/n8n/issues/10453)) ([fc6d413](https://github.com/n8n-io/n8n/commit/fc6d4138d58282f676b32f1a6011b1b6d0184bf2)) +* **editor:** Fix overflow in AI Assistant chat messages ([#10491](https://github.com/n8n-io/n8n/issues/10491)) ([4a6ca63](https://github.com/n8n-io/n8n/commit/4a6ca632100731f85875c639f2164bf1ef415009)) +* **editor:** Highlight matching type in filter component ([#10425](https://github.com/n8n-io/n8n/issues/10425)) ([6bca879](https://github.com/n8n-io/n8n/commit/6bca879d4ae30c7f9a35e8d6672de42cf93be727)) +* **editor:** Show item count in output panel schema view ([#10426](https://github.com/n8n-io/n8n/issues/10426)) ([4dee7cc](https://github.com/n8n-io/n8n/commit/4dee7cc36e5f7768d0b71095b194bf357c92e941)) +* **editor:** Truncate long data pill labels in schema view ([#10427](https://github.com/n8n-io/n8n/issues/10427)) ([1bf2f4f](https://github.com/n8n-io/n8n/commit/1bf2f4f6171d666391bb3a3a312468bc083446e3)) +* Filter component - improve errors ([#10456](https://github.com/n8n-io/n8n/issues/10456)) ([61ac0c7](https://github.com/n8n-io/n8n/commit/61ac0c77755210f570b887951fe6bbec1a323811)) +* **Google Sheets Node:** Better error when column to match on is empty ([#10442](https://github.com/n8n-io/n8n/issues/10442)) ([ce46bf5](https://github.com/n8n-io/n8n/commit/ce46bf516a86d9779f37dd75b0c680d26d88e15d)) +* **Google Sheets Node:** Update name and hint for useAppend option ([#10443](https://github.com/n8n-io/n8n/issues/10443)) ([c5a0c04](https://github.com/n8n-io/n8n/commit/c5a0c049eaf44419c690d151de42fb0c10bd406e)) +* **Google Sheets Node:** Update to returnAllMatches option ([#10440](https://github.com/n8n-io/n8n/issues/10440)) ([f7fb02e](https://github.com/n8n-io/n8n/commit/f7fb02e92a756781f8e35bbbfc25d71c12cb70af)) +* **Invoice Ninja Node:** Fix payment types ([#10462](https://github.com/n8n-io/n8n/issues/10462)) ([129245d](https://github.com/n8n-io/n8n/commit/129245da10be1d645f61e929e40b128bd7813f17)) +* **n8n Form Trigger Node:** Show basic authentication modal on wrong credentials ([#10423](https://github.com/n8n-io/n8n/issues/10423)) ([0dc3e99](https://github.com/n8n-io/n8n/commit/0dc3e99b26bec45e747d83f383cfe5169d89e6b7)) +* **OpenAI Node:** Throw node operations error in case of openAi client error ([#10448](https://github.com/n8n-io/n8n/issues/10448)) ([0d3ed46](https://github.com/n8n-io/n8n/commit/0d3ed461996bbad06015c455f133baab6506437f)) +* Project Viewer always seeing a connection error when testing credentials ([#10417](https://github.com/n8n-io/n8n/issues/10417)) ([613cdd2](https://github.com/n8n-io/n8n/commit/613cdd2ba2c0f224c4857a5fc3eea36dbd683049)) +* Remove unimplemented Postgres credentials options ([#10461](https://github.com/n8n-io/n8n/issues/10461)) ([17ac784](https://github.com/n8n-io/n8n/commit/17ac7844f29d819b91dfaf90b9fe386d98060c42)) +* Rename Assistant back ([#10481](https://github.com/n8n-io/n8n/issues/10481)) ([c410aed](https://github.com/n8n-io/n8n/commit/c410aed4c22182943dc80ede63acda00b7898e10)) +* Require mfa code to change email ([#10354](https://github.com/n8n-io/n8n/issues/10354)) ([39c8e50](https://github.com/n8n-io/n8n/commit/39c8e50ad0513649f5a8cef911b7d6cdd61c2372)) +* **Respond to Webhook Node:** Fix issue preventing the chat trigger from working ([#9886](https://github.com/n8n-io/n8n/issues/9886)) ([9d6ad88](https://github.com/n8n-io/n8n/commit/9d6ad88c14a88fd0dfcb4f9981e38d19cf5f3067)) +* Show input names when node has multiple inputs ([#10434](https://github.com/n8n-io/n8n/issues/10434)) ([973956c](https://github.com/n8n-io/n8n/commit/973956cc26c78c329ff6eb6934d4f0a24060c87c)) +* **Toggl Trigger Node:** Update API version ([#10207](https://github.com/n8n-io/n8n/issues/10207)) ([9bdb1d6](https://github.com/n8n-io/n8n/commit/9bdb1d6dca43fe491c5eb96f093b7eec4509eaff)) + + +### Features + +* **core:** Support bidirectional communication between specific mains and specific workers ([#10377](https://github.com/n8n-io/n8n/issues/10377)) ([d0fc9de](https://github.com/n8n-io/n8n/commit/d0fc9dee0e17211c1ed130b19286e9573c9ebfbd)) +* **Facebook Graph API Node:** Update node to support API v18 - v20 ([#10419](https://github.com/n8n-io/n8n/issues/10419)) ([e7ee10f](https://github.com/n8n-io/n8n/commit/e7ee10f243663d899d32e61bc6264b4df444e2af)) + + + # [1.55.0](https://github.com/n8n-io/n8n/compare/n8n@1.54.0...n8n@1.55.0) (2024-08-14) diff --git a/package.json b/package.json index f6fb54778e..545a7c851f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "n8n-monorepo", - "version": "1.55.0", + "version": "1.56.0", "private": true, "engines": { "node": ">=20.15", diff --git a/packages/@n8n/config/package.json b/packages/@n8n/config/package.json index 1ee3fb9160..36d280a71f 100644 --- a/packages/@n8n/config/package.json +++ b/packages/@n8n/config/package.json @@ -1,6 +1,6 @@ { "name": "@n8n/config", - "version": "1.5.0", + "version": "1.6.0", "scripts": { "clean": "rimraf dist .turbo", "dev": "pnpm watch", diff --git a/packages/@n8n/nodes-langchain/package.json b/packages/@n8n/nodes-langchain/package.json index acec252253..28303136c2 100644 --- a/packages/@n8n/nodes-langchain/package.json +++ b/packages/@n8n/nodes-langchain/package.json @@ -1,6 +1,6 @@ { "name": "@n8n/n8n-nodes-langchain", - "version": "1.55.0", + "version": "1.56.0", "description": "", "main": "index.js", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 97b9373ab5..c7608d1c34 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "n8n", - "version": "1.55.0", + "version": "1.56.0", "description": "n8n Workflow Automation Tool", "main": "dist/index", "types": "dist/index.d.ts", diff --git a/packages/core/package.json b/packages/core/package.json index 24da0bf137..601930264b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "n8n-core", - "version": "1.55.0", + "version": "1.56.0", "description": "Core functionality of n8n", "main": "dist/index", "types": "dist/index.d.ts", diff --git a/packages/design-system/package.json b/packages/design-system/package.json index 0de4c11ce9..09116e5218 100644 --- a/packages/design-system/package.json +++ b/packages/design-system/package.json @@ -1,6 +1,6 @@ { "name": "n8n-design-system", - "version": "1.45.0", + "version": "1.46.0", "main": "src/main.ts", "import": "src/main.ts", "scripts": { diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 279233c94f..00ec044bf9 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -1,6 +1,6 @@ { "name": "n8n-editor-ui", - "version": "1.55.0", + "version": "1.56.0", "description": "Workflow Editor UI for n8n", "main": "index.js", "scripts": { diff --git a/packages/node-dev/package.json b/packages/node-dev/package.json index 87083a81cd..256b992fa2 100644 --- a/packages/node-dev/package.json +++ b/packages/node-dev/package.json @@ -1,6 +1,6 @@ { "name": "n8n-node-dev", - "version": "1.55.0", + "version": "1.56.0", "description": "CLI to simplify n8n credentials/node development", "main": "dist/src/index", "types": "dist/src/index.d.ts", diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 4056861f01..db05bf38c1 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -1,6 +1,6 @@ { "name": "n8n-nodes-base", - "version": "1.55.0", + "version": "1.56.0", "description": "Base nodes of n8n", "main": "index.js", "scripts": { diff --git a/packages/workflow/package.json b/packages/workflow/package.json index 49d904bdf2..bbddb85cd4 100644 --- a/packages/workflow/package.json +++ b/packages/workflow/package.json @@ -1,6 +1,6 @@ { "name": "n8n-workflow", - "version": "1.54.0", + "version": "1.55.0", "description": "Workflow base code of n8n", "main": "dist/index.js", "module": "src/index.ts", From 18491f6a6f5e8873a8e29c1c45d6ad20d98f211f Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Thu, 22 Aug 2024 09:31:40 +0300 Subject: [PATCH 004/233] refactor(editor): Add types to codeNodeEditorEventBus (no-changelog) (#10501) --- .../src/components/CodeNodeEditor/CodeNodeEditor.vue | 4 ++-- .../editor-ui/src/components/SqlEditor/SqlEditor.vue | 4 ++-- .../editor-ui/src/composables/usePushConnection.ts | 2 +- packages/editor-ui/src/event-bus/code-node-editor.ts | 12 +++++++++++- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue b/packages/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue index 36a5d169e1..1e19e4400f 100644 --- a/packages/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue +++ b/packages/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue @@ -118,7 +118,7 @@ const i18n = useI18n(); const telemetry = useTelemetry(); onMounted(() => { - if (!props.isReadOnly) codeNodeEditorEventBus.on('error-line-number', highlightLine); + if (!props.isReadOnly) codeNodeEditorEventBus.on('highlightLine', highlightLine); codeNodeEditorEventBus.on('codeDiffApplied', diffApplied); @@ -188,7 +188,7 @@ onMounted(() => { onBeforeUnmount(() => { codeNodeEditorEventBus.off('codeDiffApplied', diffApplied); - if (!props.isReadOnly) codeNodeEditorEventBus.off('error-line-number', highlightLine); + if (!props.isReadOnly) codeNodeEditorEventBus.off('highlightLine', highlightLine); }); const aiEnabled = computed(() => { diff --git a/packages/editor-ui/src/components/SqlEditor/SqlEditor.vue b/packages/editor-ui/src/components/SqlEditor/SqlEditor.vue index b6ef67981e..06ec2606b4 100644 --- a/packages/editor-ui/src/components/SqlEditor/SqlEditor.vue +++ b/packages/editor-ui/src/components/SqlEditor/SqlEditor.vue @@ -154,7 +154,7 @@ watch(segments, () => { }); onMounted(() => { - codeNodeEditorEventBus.on('error-line-number', highlightLine); + codeNodeEditorEventBus.on('highlightLine', highlightLine); if (props.fullscreen) { focus(); @@ -162,7 +162,7 @@ onMounted(() => { }); onBeforeUnmount(() => { - codeNodeEditorEventBus.off('error-line-number', highlightLine); + codeNodeEditorEventBus.off('highlightLine', highlightLine); }); function line(lineNumber: number): Line | null { diff --git a/packages/editor-ui/src/composables/usePushConnection.ts b/packages/editor-ui/src/composables/usePushConnection.ts index 7c5c229a19..77d7201ca1 100644 --- a/packages/editor-ui/src/composables/usePushConnection.ts +++ b/packages/editor-ui/src/composables/usePushConnection.ts @@ -295,7 +295,7 @@ export function usePushConnection({ router }: { router: ReturnType(); From 7bf25ea5054f21be4b13ab65ddcf2a103a25b14d Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Thu, 22 Aug 2024 09:31:48 +0300 Subject: [PATCH 005/233] refactor(editor): Add types for dataPinningEventBus (no-changelog) (#10499) --- .../src/components/NodeDetailsView.vue | 7 +++--- .../src/composables/useNodeHelpers.ts | 7 +++--- .../editor-ui/src/event-bus/data-pinning.ts | 22 ++++++++++++++++++- .../editor-ui/src/stores/workflows.store.ts | 10 +++++---- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/packages/editor-ui/src/components/NodeDetailsView.vue b/packages/editor-ui/src/components/NodeDetailsView.vue index 54a0336aec..17a2195a8c 100644 --- a/packages/editor-ui/src/components/NodeDetailsView.vue +++ b/packages/editor-ui/src/components/NodeDetailsView.vue @@ -160,6 +160,7 @@ import { STICKY_NODE_TYPE, } from '@/constants'; import { useWorkflowActivate } from '@/composables/useWorkflowActivate'; +import type { DataPinningDiscoveryEvent } from '@/event-bus'; import { dataPinningEventBus } from '@/event-bus'; import { useWorkflowsStore } from '@/stores/workflows.store'; import { useNDVStore } from '@/stores/ndv.store'; @@ -238,7 +239,7 @@ const activeNodeType = computed(() => { return null; }); -const workflowRunning = computed(() => uiStore.isActionActive['workflowRunning']); +const workflowRunning = computed(() => uiStore.isActionActive.workflowRunning); const showTriggerWaitingWarning = computed( () => @@ -428,7 +429,7 @@ const featureRequestUrl = computed(() => { const outputPanelEditMode = computed(() => ndvStore.outputPanelEditMode); -const isWorkflowRunning = computed(() => uiStore.isActionActive['workflowRunning']); +const isWorkflowRunning = computed(() => uiStore.isActionActive.workflowRunning); const isExecutionWaitingForWebhook = computed(() => workflowsStore.executionWaitingForWebhook); @@ -458,7 +459,7 @@ const hasForeignCredential = computed(() => foreignCredentials.value.length > 0) //methods -const setIsTooltipVisible = ({ isTooltipVisible }: { isTooltipVisible: boolean }) => { +const setIsTooltipVisible = ({ isTooltipVisible }: DataPinningDiscoveryEvent) => { pinDataDiscoveryTooltipVisible.value = isTooltipVisible; }; diff --git a/packages/editor-ui/src/composables/useNodeHelpers.ts b/packages/editor-ui/src/composables/useNodeHelpers.ts index a8c763b11f..fd2fb50a81 100644 --- a/packages/editor-ui/src/composables/useNodeHelpers.ts +++ b/packages/editor-ui/src/composables/useNodeHelpers.ts @@ -63,6 +63,7 @@ import { useCanvasStore } from '@/stores/canvas.store'; import { getEndpointScope } from '@/utils/nodeViewUtils'; import { useSourceControlStore } from '@/stores/sourceControl.store'; import { getConnectionInfo } from '@/utils/canvasUtils'; +import type { UnpinNodeDataEvent } from '@/event-bus/data-pinning'; declare namespace HttpRequestNode { namespace V2 { @@ -992,8 +993,8 @@ export function useNodeHelpers() { }); } - function removePinDataConnections(pinData: IPinData) { - Object.keys(pinData).forEach((nodeName) => { + function removePinDataConnections(event: UnpinNodeDataEvent) { + for (const nodeName of event.nodeNames) { const node = workflowsStore.getNodeByName(nodeName); if (!node) { return; @@ -1015,7 +1016,7 @@ export function useNodeHelpers() { canvasStore.jsPlumbInstance.setSuspendDrawing(true); connectionsArray.forEach(NodeViewUtils.resetConnection); canvasStore.jsPlumbInstance.setSuspendDrawing(false, true); - }); + } } function getOutputEndpointUUID( diff --git a/packages/editor-ui/src/event-bus/data-pinning.ts b/packages/editor-ui/src/event-bus/data-pinning.ts index aa6548741f..4f29fdc772 100644 --- a/packages/editor-ui/src/event-bus/data-pinning.ts +++ b/packages/editor-ui/src/event-bus/data-pinning.ts @@ -1,3 +1,23 @@ import { createEventBus } from 'n8n-design-system/utils'; +import type { IPinData } from 'n8n-workflow'; -export const dataPinningEventBus = createEventBus(); +export type DataPinningDiscoveryEvent = { + isTooltipVisible: boolean; +}; + +export type UnpinNodeDataEvent = { + nodeNames: string[]; +}; + +export interface DataPinningEventBusEvents { + /** Command to show or hide the data pinning discovery tooltip */ + 'data-pinning-discovery': DataPinningDiscoveryEvent; + + /** Event that data has been pinned for workflow */ + 'pin-data': IPinData; + + /** Event that data has been unpinned for specific nodes */ + 'unpin-data': UnpinNodeDataEvent; +} + +export const dataPinningEventBus = createEventBus(); diff --git a/packages/editor-ui/src/stores/workflows.store.ts b/packages/editor-ui/src/stores/workflows.store.ts index d60e7db763..45f8a4c658 100644 --- a/packages/editor-ui/src/stores/workflows.store.ts +++ b/packages/editor-ui/src/stores/workflows.store.ts @@ -669,14 +669,14 @@ export const useWorkflowsStore = defineStore(STORES.WORKFLOWS, () => { }; } - function setWorkflowPinData(pinData: IPinData) { + function setWorkflowPinData(pinData?: IPinData) { workflow.value = { ...workflow.value, - pinData: pinData || {}, + pinData: pinData ?? {}, }; updateCachedWorkflow(); - dataPinningEventBus.emit('pin-data', pinData || {}); + dataPinningEventBus.emit('pin-data', pinData ?? {}); } function setWorkflowTagIds(tags: string[]) { @@ -768,7 +768,9 @@ export const useWorkflowsStore = defineStore(STORES.WORKFLOWS, () => { uiStore.stateIsDirty = true; updateCachedWorkflow(); - dataPinningEventBus.emit('unpin-data', { [payload.node.name]: undefined }); + dataPinningEventBus.emit('unpin-data', { + nodeNames: [payload.node.name], + }); } function addConnection(data: { connection: IConnection[] }): void { From 8ab7fea32cf41301ee061d1f388dbcd1066258a2 Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Thu, 22 Aug 2024 09:31:57 +0300 Subject: [PATCH 006/233] refactor(editor): Add types to htmlEditorEventBus (no-changelog) (#10498) --- packages/editor-ui/src/event-bus/html-editor.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/editor-ui/src/event-bus/html-editor.ts b/packages/editor-ui/src/event-bus/html-editor.ts index 7a53bf86a4..e40e7dd16c 100644 --- a/packages/editor-ui/src/event-bus/html-editor.ts +++ b/packages/editor-ui/src/event-bus/html-editor.ts @@ -1,3 +1,8 @@ import { createEventBus } from 'n8n-design-system/utils'; -export const htmlEditorEventBus = createEventBus(); +export interface HtmlEditorEventBusEvents { + /** Command to format the content in the HtmlEditor */ + 'format-html': never; +} + +export const htmlEditorEventBus = createEventBus(); From b805e8ddb896cfa37240100e2aaa26e244457053 Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Thu, 22 Aug 2024 09:32:05 +0300 Subject: [PATCH 007/233] refactor(editor): Add types to importCurlEventBus (no-changelog) (#10497) --- packages/editor-ui/src/components/NodeSettings.vue | 9 ++++----- packages/editor-ui/src/event-bus/import-curl.ts | 8 +++++++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/editor-ui/src/components/NodeSettings.vue b/packages/editor-ui/src/components/NodeSettings.vue index fd2f5b4e30..d9b8a734c1 100644 --- a/packages/editor-ui/src/components/NodeSettings.vue +++ b/packages/editor-ui/src/components/NodeSettings.vue @@ -189,7 +189,6 @@ import type { INodeProperties, NodeParameterValue, ConnectionTypes, - NodeParameterValueType, } from 'n8n-workflow'; import { NodeHelpers, @@ -201,6 +200,7 @@ import { displayParameter, } from 'n8n-workflow'; import type { + CurlToJSONResponse, INodeUi, INodeUpdatePropertiesInformation, IUpdateInformation, @@ -235,9 +235,8 @@ import { useCredentialsStore } from '@/stores/credentials.store'; import type { EventBus } from 'n8n-design-system'; import { useExternalHooks } from '@/composables/useExternalHooks'; import { useNodeHelpers } from '@/composables/useNodeHelpers'; -import { importCurlEventBus } from '@/event-bus'; +import { importCurlEventBus, ndvEventBus } from '@/event-bus'; import { useToast } from '@/composables/useToast'; -import { ndvEventBus } from '@/event-bus'; export default defineComponent({ name: 'NodeSettings', @@ -489,12 +488,12 @@ export default defineComponent({ ndvEventBus.off('updateParameterValue', this.valueChanged); }, methods: { - setHttpNodeParameters(parameters: NodeParameterValueType) { + setHttpNodeParameters(parameters: CurlToJSONResponse) { try { this.valueChanged({ node: this.node?.name, name: 'parameters', - value: parameters, + value: parameters as unknown as INodeParameters, }); } catch {} }, diff --git a/packages/editor-ui/src/event-bus/import-curl.ts b/packages/editor-ui/src/event-bus/import-curl.ts index 7a517bf3f4..3ff4df697b 100644 --- a/packages/editor-ui/src/event-bus/import-curl.ts +++ b/packages/editor-ui/src/event-bus/import-curl.ts @@ -1,3 +1,9 @@ +import type { CurlToJSONResponse } from '@/Interface'; import { createEventBus } from 'n8n-design-system/utils'; -export const importCurlEventBus = createEventBus(); +export interface ImportCurlEventBusEvents { + /** Command to set the HTTP node parameters based on the curl to JSON response */ + setHttpNodeParameters: CurlToJSONResponse; +} + +export const importCurlEventBus = createEventBus(); From 9fe6a71690154c77bc005a9338e148674e14f519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=95=E0=A4=BE=E0=A4=B0=E0=A4=A4=E0=A5=8B=E0=A4=AB?= =?UTF-8?q?=E0=A5=8D=E0=A4=AB=E0=A5=87=E0=A4=B2=E0=A4=B8=E0=A5=8D=E0=A4=95?= =?UTF-8?q?=E0=A5=8D=E0=A4=B0=E0=A4=BF=E0=A4=AA=E0=A5=8D=E0=A4=9F=E2=84=A2?= Date: Thu, 22 Aug 2024 09:33:06 +0200 Subject: [PATCH 008/233] feat(core): Logout should invalidate the auth token (no-changelog) (#10335) --- .../src/auth/__tests__/auth.service.test.ts | 50 ++++++++++++++++++- packages/cli/src/auth/auth.service.ts | 20 ++++++++ .../__tests__/me.controller.test.ts | 12 +++-- .../cli/src/controllers/auth.controller.ts | 5 +- .../databases/entities/InvalidAuthToken.ts | 11 ++++ packages/cli/src/databases/entities/index.ts | 2 + ...23627610222-CreateInvalidAuthTokenTable.ts | 16 ++++++ .../src/databases/migrations/mysqldb/index.ts | 2 + .../databases/migrations/postgresdb/index.ts | 2 + .../src/databases/migrations/sqlite/index.ts | 2 + .../invalidAuthToken.repository.ts | 10 ++++ packages/cli/src/services/jwt.service.ts | 8 ++- .../cli/test/integration/auth.api.test.ts | 8 ++- packages/editor-ui/src/constants.ts | 3 ++ packages/editor-ui/src/stores/users.store.ts | 4 +- packages/editor-ui/src/utils/apiUtils.ts | 26 +++++----- 16 files changed, 158 insertions(+), 23 deletions(-) create mode 100644 packages/cli/src/databases/entities/InvalidAuthToken.ts create mode 100644 packages/cli/src/databases/migrations/common/1723627610222-CreateInvalidAuthTokenTable.ts create mode 100644 packages/cli/src/databases/repositories/invalidAuthToken.repository.ts diff --git a/packages/cli/src/auth/__tests__/auth.service.test.ts b/packages/cli/src/auth/__tests__/auth.service.test.ts index 60fdd12126..82c820ac9e 100644 --- a/packages/cli/src/auth/__tests__/auth.service.test.ts +++ b/packages/cli/src/auth/__tests__/auth.service.test.ts @@ -6,6 +6,7 @@ import { AuthService } from '@/auth/auth.service'; import config from '@/config'; import { AUTH_COOKIE_NAME, Time } from '@/constants'; import type { User } from '@db/entities/User'; +import type { InvalidAuthTokenRepository } from '@db/repositories/invalidAuthToken.repository'; import type { UserRepository } from '@db/repositories/user.repository'; import { JwtService } from '@/services/jwt.service'; import type { UrlService } from '@/services/url.service'; @@ -26,7 +27,15 @@ describe('AuthService', () => { const jwtService = new JwtService(mock()); const urlService = mock(); const userRepository = mock(); - const authService = new AuthService(mock(), mock(), jwtService, urlService, userRepository); + const invalidAuthTokenRepository = mock(); + const authService = new AuthService( + mock(), + mock(), + jwtService, + urlService, + userRepository, + invalidAuthTokenRepository, + ); const now = new Date('2024-02-01T01:23:45.678Z'); jest.useFakeTimers({ now }); @@ -70,16 +79,36 @@ describe('AuthService', () => { it('should 401 if no cookie is set', async () => { req.cookies[AUTH_COOKIE_NAME] = undefined; + await authService.authMiddleware(req, res, next); + + expect(invalidAuthTokenRepository.existsBy).not.toHaveBeenCalled(); expect(next).not.toHaveBeenCalled(); expect(res.status).toHaveBeenCalledWith(401); }); it('should 401 and clear the cookie if the JWT is expired', async () => { req.cookies[AUTH_COOKIE_NAME] = validToken; + invalidAuthTokenRepository.existsBy.mockResolvedValue(false); jest.advanceTimersByTime(365 * Time.days.toMilliseconds); await authService.authMiddleware(req, res, next); + + expect(invalidAuthTokenRepository.existsBy).toHaveBeenCalled(); + expect(userRepository.findOne).not.toHaveBeenCalled(); + expect(next).not.toHaveBeenCalled(); + expect(res.status).toHaveBeenCalledWith(401); + expect(res.clearCookie).toHaveBeenCalledWith(AUTH_COOKIE_NAME); + }); + + it('should 401 and clear the cookie if the JWT has been invalidated', async () => { + req.cookies[AUTH_COOKIE_NAME] = validToken; + invalidAuthTokenRepository.existsBy.mockResolvedValue(true); + + await authService.authMiddleware(req, res, next); + + expect(invalidAuthTokenRepository.existsBy).toHaveBeenCalled(); + expect(userRepository.findOne).not.toHaveBeenCalled(); expect(next).not.toHaveBeenCalled(); expect(res.status).toHaveBeenCalledWith(401); expect(res.clearCookie).toHaveBeenCalledWith(AUTH_COOKIE_NAME); @@ -88,9 +117,11 @@ describe('AuthService', () => { it('should refresh the cookie before it expires', async () => { req.cookies[AUTH_COOKIE_NAME] = validToken; jest.advanceTimersByTime(6 * Time.days.toMilliseconds); + invalidAuthTokenRepository.existsBy.mockResolvedValue(false); userRepository.findOne.mockResolvedValue(user); await authService.authMiddleware(req, res, next); + expect(next).toHaveBeenCalled(); expect(res.cookie).toHaveBeenCalledWith('n8n-auth', expect.any(String), { httpOnly: true, @@ -302,4 +333,21 @@ describe('AuthService', () => { expect(resolvedUser).toEqual(user); }); }); + + describe('invalidateToken', () => { + const req = mock({ + cookies: { + [AUTH_COOKIE_NAME]: validToken, + }, + }); + + it('should invalidate the token', async () => { + await authService.invalidateToken(req); + + expect(invalidAuthTokenRepository.insert).toHaveBeenCalledWith({ + token: validToken, + expiresAt: new Date('2024-02-08T01:23:45.000Z'), + }); + }); + }); }); diff --git a/packages/cli/src/auth/auth.service.ts b/packages/cli/src/auth/auth.service.ts index e2487e6f6f..cb75fa158b 100644 --- a/packages/cli/src/auth/auth.service.ts +++ b/packages/cli/src/auth/auth.service.ts @@ -6,6 +6,7 @@ import { JsonWebTokenError, TokenExpiredError } from 'jsonwebtoken'; import config from '@/config'; import { AUTH_COOKIE_NAME, RESPONSE_ERROR_MESSAGES, Time } from '@/constants'; import type { User } from '@db/entities/User'; +import { InvalidAuthTokenRepository } from '@db/repositories/invalidAuthToken.repository'; import { UserRepository } from '@db/repositories/user.repository'; import { AuthError } from '@/errors/response-errors/auth.error'; import { ForbiddenError } from '@/errors/response-errors/forbidden.error'; @@ -53,6 +54,7 @@ export class AuthService { private readonly jwtService: JwtService, private readonly urlService: UrlService, private readonly userRepository: UserRepository, + private readonly invalidAuthTokenRepository: InvalidAuthTokenRepository, ) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment this.authMiddleware = this.authMiddleware.bind(this); @@ -62,6 +64,8 @@ export class AuthService { const token = req.cookies[AUTH_COOKIE_NAME]; if (token) { try { + const isInvalid = await this.invalidAuthTokenRepository.existsBy({ token }); + if (isInvalid) throw new AuthError('Unauthorized'); req.user = await this.resolveJwt(token, req, res); } catch (error) { if (error instanceof JsonWebTokenError || error instanceof AuthError) { @@ -80,6 +84,22 @@ export class AuthService { res.clearCookie(AUTH_COOKIE_NAME); } + async invalidateToken(req: AuthenticatedRequest) { + const token = req.cookies[AUTH_COOKIE_NAME]; + if (!token) return; + try { + const { exp } = this.jwtService.decode(token); + if (exp) { + await this.invalidAuthTokenRepository.insert({ + token, + expiresAt: new Date(exp * 1000), + }); + } + } catch (e) { + this.logger.warn('failed to invalidate auth token', { error: (e as Error).message }); + } + } + issueCookie(res: Response, user: User, browserId?: string) { // TODO: move this check to the login endpoint in AuthController // If the instance has exceeded its user quota, prevent non-owners from logging in diff --git a/packages/cli/src/controllers/__tests__/me.controller.test.ts b/packages/cli/src/controllers/__tests__/me.controller.test.ts index 9363cefd0a..54a0f39a7c 100644 --- a/packages/cli/src/controllers/__tests__/me.controller.test.ts +++ b/packages/cli/src/controllers/__tests__/me.controller.test.ts @@ -2,6 +2,7 @@ import type { Response } from 'express'; import { Container } from 'typedi'; import jwt from 'jsonwebtoken'; import { mock, anyObject } from 'jest-mock-extended'; + import type { PublicUser } from '@/Interfaces'; import type { User } from '@db/entities/User'; import { API_KEY_PREFIX, MeController } from '@/controllers/me.controller'; @@ -11,14 +12,16 @@ import { UserService } from '@/services/user.service'; import { ExternalHooks } from '@/ExternalHooks'; import { License } from '@/License'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; -import { UserRepository } from '@/databases/repositories/user.repository'; import { EventService } from '@/events/event.service'; -import { badPasswords } from '@test/testData'; -import { mockInstance } from '@test/mocking'; -import { AuthUserRepository } from '@/databases/repositories/authUser.repository'; +import { AuthUserRepository } from '@db/repositories/authUser.repository'; +import { InvalidAuthTokenRepository } from '@db/repositories/invalidAuthToken.repository'; +import { UserRepository } from '@db/repositories/user.repository'; import { MfaService } from '@/Mfa/mfa.service'; import { InvalidMfaCodeError } from '@/errors/response-errors/invalid-mfa-code.error'; +import { badPasswords } from '@test/testData'; +import { mockInstance } from '@test/mocking'; + const browserId = 'test-browser-id'; describe('MeController', () => { @@ -28,6 +31,7 @@ describe('MeController', () => { const userRepository = mockInstance(UserRepository); const mockMfaService = mockInstance(MfaService); mockInstance(AuthUserRepository); + mockInstance(InvalidAuthTokenRepository); mockInstance(License).isWithinUsersLimit.mockReturnValue(true); const controller = Container.get(MeController); diff --git a/packages/cli/src/controllers/auth.controller.ts b/packages/cli/src/controllers/auth.controller.ts index 99b5c52320..bf4ce5a388 100644 --- a/packages/cli/src/controllers/auth.controller.ts +++ b/packages/cli/src/controllers/auth.controller.ts @@ -1,9 +1,9 @@ import validator from 'validator'; +import { Response } from 'express'; import { AuthService } from '@/auth/auth.service'; import { Get, Post, RestController } from '@/decorators'; import { RESPONSE_ERROR_MESSAGES } from '@/constants'; -import { Request, Response } from 'express'; import type { User } from '@db/entities/User'; import { AuthenticatedRequest, LoginRequest, UserRequest } from '@/requests'; import type { PublicUser } from '@/Interfaces'; @@ -185,7 +185,8 @@ export class AuthController { /** Log out a user */ @Post('/logout') - logout(_: Request, res: Response) { + async logout(req: AuthenticatedRequest, res: Response) { + await this.authService.invalidateToken(req); this.authService.clearCookie(res); return { loggedOut: true }; } diff --git a/packages/cli/src/databases/entities/InvalidAuthToken.ts b/packages/cli/src/databases/entities/InvalidAuthToken.ts new file mode 100644 index 0000000000..e21860d146 --- /dev/null +++ b/packages/cli/src/databases/entities/InvalidAuthToken.ts @@ -0,0 +1,11 @@ +import { Column, Entity, PrimaryColumn } from '@n8n/typeorm'; +import { datetimeColumnType } from './AbstractEntity'; + +@Entity() +export class InvalidAuthToken { + @PrimaryColumn() + token: string; + + @Column(datetimeColumnType) + expiresAt: Date; +} diff --git a/packages/cli/src/databases/entities/index.ts b/packages/cli/src/databases/entities/index.ts index db8b113baf..bd7d187486 100644 --- a/packages/cli/src/databases/entities/index.ts +++ b/packages/cli/src/databases/entities/index.ts @@ -21,6 +21,7 @@ import { ExecutionData } from './ExecutionData'; import { WorkflowHistory } from './WorkflowHistory'; import { Project } from './Project'; import { ProjectRelation } from './ProjectRelation'; +import { InvalidAuthToken } from './InvalidAuthToken'; export const entities = { AuthIdentity, @@ -31,6 +32,7 @@ export const entities = { ExecutionEntity, InstalledNodes, InstalledPackages, + InvalidAuthToken, Settings, SharedCredentials, SharedWorkflow, diff --git a/packages/cli/src/databases/migrations/common/1723627610222-CreateInvalidAuthTokenTable.ts b/packages/cli/src/databases/migrations/common/1723627610222-CreateInvalidAuthTokenTable.ts new file mode 100644 index 0000000000..f28696c199 --- /dev/null +++ b/packages/cli/src/databases/migrations/common/1723627610222-CreateInvalidAuthTokenTable.ts @@ -0,0 +1,16 @@ +import type { MigrationContext, ReversibleMigration } from '@db/types'; + +const tableName = 'invalid_auth_token'; + +export class CreateInvalidAuthTokenTable1723627610222 implements ReversibleMigration { + async up({ schemaBuilder: { createTable, column } }: MigrationContext) { + await createTable(tableName).withColumns( + column('token').varchar(512).primary, + column('expiresAt').timestamp().notNull, + ); + } + + async down({ schemaBuilder: { dropTable } }: MigrationContext) { + await dropTable(tableName); + } +} diff --git a/packages/cli/src/databases/migrations/mysqldb/index.ts b/packages/cli/src/databases/migrations/mysqldb/index.ts index ecd5f66a7c..b4900eb59d 100644 --- a/packages/cli/src/databases/migrations/mysqldb/index.ts +++ b/packages/cli/src/databases/migrations/mysqldb/index.ts @@ -59,6 +59,7 @@ import { RemoveNodesAccess1712044305787 } from '../common/1712044305787-RemoveNo import { MakeExecutionStatusNonNullable1714133768521 } from '../common/1714133768521-MakeExecutionStatusNonNullable'; import { AddActivatedAtUserSetting1717498465931 } from './1717498465931-AddActivatedAtUserSetting'; import { AddConstraintToExecutionMetadata1720101653148 } from '../common/1720101653148-AddConstraintToExecutionMetadata'; +import { CreateInvalidAuthTokenTable1723627610222 } from '../common/1723627610222-CreateInvalidAuthTokenTable'; export const mysqlMigrations: Migration[] = [ InitialMigration1588157391238, @@ -121,4 +122,5 @@ export const mysqlMigrations: Migration[] = [ MakeExecutionStatusNonNullable1714133768521, AddActivatedAtUserSetting1717498465931, AddConstraintToExecutionMetadata1720101653148, + CreateInvalidAuthTokenTable1723627610222, ]; diff --git a/packages/cli/src/databases/migrations/postgresdb/index.ts b/packages/cli/src/databases/migrations/postgresdb/index.ts index 720c79a8e3..85bd58f371 100644 --- a/packages/cli/src/databases/migrations/postgresdb/index.ts +++ b/packages/cli/src/databases/migrations/postgresdb/index.ts @@ -59,6 +59,7 @@ import { MakeExecutionStatusNonNullable1714133768521 } from '../common/171413376 import { AddActivatedAtUserSetting1717498465931 } from './1717498465931-AddActivatedAtUserSetting'; import { AddConstraintToExecutionMetadata1720101653148 } from '../common/1720101653148-AddConstraintToExecutionMetadata'; import { FixExecutionMetadataSequence1721377157740 } from './1721377157740-FixExecutionMetadataSequence'; +import { CreateInvalidAuthTokenTable1723627610222 } from '../common/1723627610222-CreateInvalidAuthTokenTable'; export const postgresMigrations: Migration[] = [ InitialMigration1587669153312, @@ -121,4 +122,5 @@ export const postgresMigrations: Migration[] = [ AddActivatedAtUserSetting1717498465931, AddConstraintToExecutionMetadata1720101653148, FixExecutionMetadataSequence1721377157740, + CreateInvalidAuthTokenTable1723627610222, ]; diff --git a/packages/cli/src/databases/migrations/sqlite/index.ts b/packages/cli/src/databases/migrations/sqlite/index.ts index 15000a78e0..974c743d0f 100644 --- a/packages/cli/src/databases/migrations/sqlite/index.ts +++ b/packages/cli/src/databases/migrations/sqlite/index.ts @@ -56,6 +56,7 @@ import { RemoveNodesAccess1712044305787 } from '../common/1712044305787-RemoveNo import { MakeExecutionStatusNonNullable1714133768521 } from '../common/1714133768521-MakeExecutionStatusNonNullable'; import { AddActivatedAtUserSetting1717498465931 } from './1717498465931-AddActivatedAtUserSetting'; import { AddConstraintToExecutionMetadata1720101653148 } from '../common/1720101653148-AddConstraintToExecutionMetadata'; +import { CreateInvalidAuthTokenTable1723627610222 } from '../common/1723627610222-CreateInvalidAuthTokenTable'; const sqliteMigrations: Migration[] = [ InitialMigration1588102412422, @@ -115,6 +116,7 @@ const sqliteMigrations: Migration[] = [ MakeExecutionStatusNonNullable1714133768521, AddActivatedAtUserSetting1717498465931, AddConstraintToExecutionMetadata1720101653148, + CreateInvalidAuthTokenTable1723627610222, ]; export { sqliteMigrations }; diff --git a/packages/cli/src/databases/repositories/invalidAuthToken.repository.ts b/packages/cli/src/databases/repositories/invalidAuthToken.repository.ts new file mode 100644 index 0000000000..c6340ba88a --- /dev/null +++ b/packages/cli/src/databases/repositories/invalidAuthToken.repository.ts @@ -0,0 +1,10 @@ +import { Service } from 'typedi'; +import { DataSource, Repository } from '@n8n/typeorm'; +import { InvalidAuthToken } from '../entities/InvalidAuthToken'; + +@Service() +export class InvalidAuthTokenRepository extends Repository { + constructor(dataSource: DataSource) { + super(InvalidAuthToken, dataSource.manager); + } +} diff --git a/packages/cli/src/services/jwt.service.ts b/packages/cli/src/services/jwt.service.ts index 7f9f4fdd84..bcc2cdcbad 100644 --- a/packages/cli/src/services/jwt.service.ts +++ b/packages/cli/src/services/jwt.service.ts @@ -23,11 +23,15 @@ export class JwtService { } } - public sign(payload: object, options: jwt.SignOptions = {}): string { + sign(payload: object, options: jwt.SignOptions = {}): string { return jwt.sign(payload, this.jwtSecret, options); } - public verify(token: string, options: jwt.VerifyOptions = {}) { + decode(token: string) { + return jwt.decode(token) as JwtPayload; + } + + verify(token: string, options: jwt.VerifyOptions = {}) { return jwt.verify(token, this.jwtSecret, options) as T; } } diff --git a/packages/cli/test/integration/auth.api.test.ts b/packages/cli/test/integration/auth.api.test.ts index 08d4eb0a66..887cba4a04 100644 --- a/packages/cli/test/integration/auth.api.test.ts +++ b/packages/cli/test/integration/auth.api.test.ts @@ -386,13 +386,19 @@ describe('GET /resolve-signup-token', () => { describe('POST /logout', () => { test('should log user out', async () => { const owner = await createUser({ role: 'global:owner' }); + const ownerAgent = testServer.authAgentFor(owner); + // @ts-expect-error `accessInfo` types are incorrect + const cookie = ownerAgent.jar.getCookie(AUTH_COOKIE_NAME, { path: '/' }); - const response = await testServer.authAgentFor(owner).post('/logout'); + const response = await ownerAgent.post('/logout'); expect(response.statusCode).toBe(200); expect(response.body).toEqual(LOGGED_OUT_RESPONSE_BODY); const authToken = utils.getAuthToken(response); expect(authToken).toBeUndefined(); + + ownerAgent.jar.setCookie(`${AUTH_COOKIE_NAME}=${cookie!.value}`); + await ownerAgent.get('/login').expect(401); }); }); diff --git a/packages/editor-ui/src/constants.ts b/packages/editor-ui/src/constants.ts index cf3c5bebb8..8d23f2dea1 100644 --- a/packages/editor-ui/src/constants.ts +++ b/packages/editor-ui/src/constants.ts @@ -859,3 +859,6 @@ export const INSECURE_CONNECTION_WARNING = ` export const CanvasNodeKey = 'canvasNode' as unknown as InjectionKey; export const CanvasNodeHandleKey = 'canvasNodeHandle' as unknown as InjectionKey; + +/** Auth */ +export const BROWSER_ID_STORAGE_KEY = 'n8n-browserId'; diff --git a/packages/editor-ui/src/stores/users.store.ts b/packages/editor-ui/src/stores/users.store.ts index ef153bb4b7..613d2ea48d 100644 --- a/packages/editor-ui/src/stores/users.store.ts +++ b/packages/editor-ui/src/stores/users.store.ts @@ -1,6 +1,6 @@ import type { IUpdateUserSettingsReqPayload, UpdateGlobalRolePayload } from '@/api/users'; import * as usersApi from '@/api/users'; -import { PERSONALIZATION_MODAL_KEY, STORES, ROLE } from '@/constants'; +import { BROWSER_ID_STORAGE_KEY, PERSONALIZATION_MODAL_KEY, STORES, ROLE } from '@/constants'; import type { Cloud, IPersonalizationLatestVersion, @@ -180,6 +180,8 @@ export const useUsersStore = defineStore(STORES.USERS, () => { postHogStore.reset(); uiStore.clearBannerStack(); npsSurveyStore.resetNpsSurveyOnLogOut(); + + localStorage.removeItem(BROWSER_ID_STORAGE_KEY); }; const createOwner = async (params: { diff --git a/packages/editor-ui/src/utils/apiUtils.ts b/packages/editor-ui/src/utils/apiUtils.ts index b07f8910b9..fef135769e 100644 --- a/packages/editor-ui/src/utils/apiUtils.ts +++ b/packages/editor-ui/src/utils/apiUtils.ts @@ -1,16 +1,20 @@ import type { AxiosRequestConfig, Method, RawAxiosRequestHeaders } from 'axios'; import axios from 'axios'; import { ApplicationError, jsonParse, type GenericValue, type IDataObject } from 'n8n-workflow'; -import type { IExecutionFlattedResponse, IExecutionResponse, IRestApiContext } from '@/Interface'; import { parse } from 'flatted'; import { assert } from '@/utils/assert'; -const BROWSER_ID_STORAGE_KEY = 'n8n-browserId'; -let browserId = localStorage.getItem(BROWSER_ID_STORAGE_KEY); -if (!browserId && 'randomUUID' in crypto) { - browserId = crypto.randomUUID(); - localStorage.setItem(BROWSER_ID_STORAGE_KEY, browserId); -} +import { BROWSER_ID_STORAGE_KEY } from '@/constants'; +import type { IExecutionFlattedResponse, IExecutionResponse, IRestApiContext } from '@/Interface'; + +const getBrowserId = () => { + let browserId = localStorage.getItem(BROWSER_ID_STORAGE_KEY); + if (!browserId && 'randomUUID' in crypto) { + browserId = crypto.randomUUID(); + localStorage.setItem(BROWSER_ID_STORAGE_KEY, browserId); + } + return browserId!; +}; export const NO_NETWORK_ERROR_CODE = 999; export const STREAM_SEPERATOR = '⧉⇋⇋➽⌑⧉§§\n'; @@ -82,8 +86,8 @@ export async function request(config: { baseURL, headers: headers ?? {}, }; - if (baseURL.startsWith('/') && browserId) { - options.headers!['browser-id'] = browserId; + if (baseURL.startsWith('/')) { + options.headers!['browser-id'] = getBrowserId(); } if ( import.meta.env.NODE_ENV !== 'production' && @@ -204,11 +208,9 @@ export async function streamRequest( separator = STREAM_SEPERATOR, ): Promise { const headers: Record = { + 'browser-id': getBrowserId(), 'Content-Type': 'application/json', }; - if (browserId) { - headers['browser-id'] = browserId; - } const assistantRequest: RequestInit = { headers, method: 'POST', From ea6ca04a7f7ae47003948f9de0a1634e98972460 Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Thu, 22 Aug 2024 11:33:11 +0300 Subject: [PATCH 009/233] feat: Add n8n-benchmark cli (no-changelog) (#10410) --- .github/workflows/docker-images-benchmark.yml | 43 ++ packages/@n8n/benchmark/Dockerfile | 62 +++ packages/@n8n/benchmark/README.md | 55 +++ packages/@n8n/benchmark/bin/n8n-benchmark | 13 + packages/@n8n/benchmark/package.json | 48 ++ .../benchmark/scenarios/scenario.schema.json | 42 ++ .../singleWebhook/singleWebhook.json | 25 + .../singleWebhook/singleWebhook.manifest.json | 7 + .../singleWebhook/singleWebhook.script.ts | 11 + packages/@n8n/benchmark/src/commands/list.ts | 21 + packages/@n8n/benchmark/src/commands/run.ts | 39 ++ packages/@n8n/benchmark/src/config/config.ts | 50 ++ .../n8nApiClient/authenticatedN8nApiClient.ts | 67 +++ .../src/n8nApiClient/n8nApiClient.ts | 78 ++++ .../src/n8nApiClient/n8nApiClient.types.ts | 8 + .../src/n8nApiClient/workflowsApiClient.ts | 31 ++ .../src/scenario/scenarioDataLoader.ts | 35 ++ .../benchmark/src/scenario/scenarioLoader.ts | 67 +++ .../benchmark/src/testExecution/k6Executor.ts | 28 ++ .../src/testExecution/scenarioDataImporter.ts | 56 +++ .../src/testExecution/scenarioRunner.ts | 50 ++ packages/@n8n/benchmark/src/types/scenario.ts | 27 ++ packages/@n8n/benchmark/tsconfig.build.json | 9 + packages/@n8n/benchmark/tsconfig.json | 11 + pnpm-lock.yaml | 437 +++++++++++------- 25 files changed, 1159 insertions(+), 161 deletions(-) create mode 100644 .github/workflows/docker-images-benchmark.yml create mode 100644 packages/@n8n/benchmark/Dockerfile create mode 100644 packages/@n8n/benchmark/README.md create mode 100755 packages/@n8n/benchmark/bin/n8n-benchmark create mode 100644 packages/@n8n/benchmark/package.json create mode 100644 packages/@n8n/benchmark/scenarios/scenario.schema.json create mode 100644 packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.json create mode 100644 packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.manifest.json create mode 100644 packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.script.ts create mode 100644 packages/@n8n/benchmark/src/commands/list.ts create mode 100644 packages/@n8n/benchmark/src/commands/run.ts create mode 100644 packages/@n8n/benchmark/src/config/config.ts create mode 100644 packages/@n8n/benchmark/src/n8nApiClient/authenticatedN8nApiClient.ts create mode 100644 packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts create mode 100644 packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.types.ts create mode 100644 packages/@n8n/benchmark/src/n8nApiClient/workflowsApiClient.ts create mode 100644 packages/@n8n/benchmark/src/scenario/scenarioDataLoader.ts create mode 100644 packages/@n8n/benchmark/src/scenario/scenarioLoader.ts create mode 100644 packages/@n8n/benchmark/src/testExecution/k6Executor.ts create mode 100644 packages/@n8n/benchmark/src/testExecution/scenarioDataImporter.ts create mode 100644 packages/@n8n/benchmark/src/testExecution/scenarioRunner.ts create mode 100644 packages/@n8n/benchmark/src/types/scenario.ts create mode 100644 packages/@n8n/benchmark/tsconfig.build.json create mode 100644 packages/@n8n/benchmark/tsconfig.json diff --git a/.github/workflows/docker-images-benchmark.yml b/.github/workflows/docker-images-benchmark.yml new file mode 100644 index 0000000000..e4b09cab61 --- /dev/null +++ b/.github/workflows/docker-images-benchmark.yml @@ -0,0 +1,43 @@ +name: Benchmark Docker Image CI + +on: + workflow_dispatch: + push: + branches: + - main + paths: + - 'packages/benchmark/**' + - 'pnpm-lock.yaml' + - 'pnpm-workspace.yaml' + - '.github/workflows/docker-images-benchmark.yml' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4.1.1 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3.0.0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3.0.0 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3.0.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build + uses: docker/build-push-action@v5.1.0 + with: + context: . + file: ./packages/benchmark/Dockerfile + platforms: linux/amd64 + provenance: false + push: true + tags: | + ghcr.io/${{ github.repository_owner }}/n8n-benchmark:latest diff --git a/packages/@n8n/benchmark/Dockerfile b/packages/@n8n/benchmark/Dockerfile new file mode 100644 index 0000000000..5fa1aeae93 --- /dev/null +++ b/packages/@n8n/benchmark/Dockerfile @@ -0,0 +1,62 @@ +# syntax=docker/dockerfile:1 +FROM node:20.16.0 AS base + +# Install required dependencies +RUN apt-get update && apt-get install -y gnupg2 curl + +# Add k6 GPG key and repository +RUN mkdir -p /etc/apt/keyrings && \ + curl -sS https://dl.k6.io/key.gpg | gpg --dearmor --yes -o /etc/apt/keyrings/k6.gpg && \ + chmod a+x /etc/apt/keyrings/k6.gpg && \ + echo "deb [signed-by=/etc/apt/keyrings/k6.gpg] https://dl.k6.io/deb stable main" | tee /etc/apt/sources.list.d/k6.list + +# Update and install k6 +RUN apt-get update && \ + apt-get install -y k6 tini && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable + +# +# Builder +FROM base AS builder + +WORKDIR /app + +COPY --chown=node:node ./pnpm-lock.yaml /app/pnpm-lock.yaml +COPY --chown=node:node ./pnpm-workspace.yaml /app/pnpm-workspace.yaml +COPY --chown=node:node ./package.json /app/package.json +COPY --chown=node:node ./packages/@n8n/benchmark/package.json /app/packages/@n8n/benchmark/package.json +COPY --chown=node:node ./patches /app/patches +COPY --chown=node:node ./scripts /app/scripts + +RUN pnpm install --frozen-lockfile + +# TS config files +COPY --chown=node:node ./tsconfig.json /app/tsconfig.json +COPY --chown=node:node ./tsconfig.build.json /app/tsconfig.build.json +COPY --chown=node:node ./tsconfig.backend.json /app/tsconfig.backend.json +COPY --chown=node:node ./packages/@n8n/benchmark/tsconfig.json /app/packages/@n8n/benchmark/tsconfig.json +COPY --chown=node:node ./packages/@n8n/benchmark/tsconfig.build.json /app/packages/@n8n/benchmark/tsconfig.build.json + +# Source files +COPY --chown=node:node ./packages/@n8n/benchmark/src /app/packages/@n8n/benchmark/src +COPY --chown=node:node ./packages/@n8n/benchmark/bin /app/packages/@n8n/benchmark/bin +COPY --chown=node:node ./packages/@n8n/benchmark/scenarios /app/packages/@n8n/benchmark/scenarios + +WORKDIR /app/packages/@n8n/benchmark +RUN pnpm build + +# +# Runner +FROM base AS runner + +COPY --from=builder /app /app + +WORKDIR /app/packages/@n8n/benchmark +USER node + +ENTRYPOINT [ "/app/packages/@n8n/benchmark/bin/n8n-benchmark" ] diff --git a/packages/@n8n/benchmark/README.md b/packages/@n8n/benchmark/README.md new file mode 100644 index 0000000000..569bcf897f --- /dev/null +++ b/packages/@n8n/benchmark/README.md @@ -0,0 +1,55 @@ +# n8n benchmarking tool + +Tool for executing benchmarks against an n8n instance. + +## Running locally with Docker + +Build the Docker image: + +```sh +# Must be run in the repository root +# k6 doesn't have an arm64 build available for linux, we need to build against amd64 +docker build --platform linux/amd64 -t n8n-benchmark -f packages/@n8n/benchmark/Dockerfile . +``` + +Run the image + +```sh +docker run \ + -e N8N_USER_EMAIL=user@n8n.io \ + -e N8N_USER_PASSWORD=password \ + # For macos, n8n running outside docker + -e N8N_BASE_URL=http://host.docker.internal:5678 \ + n8n-benchmark +``` + +## Running locally without Docker + +Requirements: + +- [k6](https://grafana.com/docs/k6/latest/set-up/install-k6/) +- Node.js v20 or higher + +```sh +pnpm build + +# Run tests against http://localhost:5678 with specified email and password +N8N_USER_EMAIL=user@n8n.io N8N_USER_PASSWORD=password ./bin/n8n-benchmark run + +# If you installed k6 using brew, you might have to specify it explicitly +K6_PATH=/opt/homebrew/bin/k6 N8N_USER_EMAIL=user@n8n.io N8N_USER_PASSWORD=password ./bin/n8n-benchmark run +``` + +## Configuration + +The configuration options the cli accepts can be seen from [config.ts](./src/config/config.ts) + +## Benchmark scenarios + +A benchmark scenario defines one or multiple steps to execute and measure. It consists of: + +- Manifest file which describes and configures the scenario +- Any test data that is imported before the scenario is run +- A [`k6`](https://grafana.com/docs/k6/latest/using-k6/http-requests/) script which executes the steps and receives `API_BASE_URL` environment variable in runtime. + +Available scenarios are located in [`./scenarios`](./scenarios/). diff --git a/packages/@n8n/benchmark/bin/n8n-benchmark b/packages/@n8n/benchmark/bin/n8n-benchmark new file mode 100755 index 0000000000..c7f0996f09 --- /dev/null +++ b/packages/@n8n/benchmark/bin/n8n-benchmark @@ -0,0 +1,13 @@ +#!/usr/bin/env node + +// Check if version should be displayed +const versionFlags = ['-v', '-V', '--version']; +if (versionFlags.includes(process.argv.slice(-1)[0])) { + console.log(require('../package').version); + process.exit(0); +} + +(async () => { + const oclif = require('@oclif/core'); + await oclif.execute({ dir: __dirname }); +})(); diff --git a/packages/@n8n/benchmark/package.json b/packages/@n8n/benchmark/package.json new file mode 100644 index 0000000000..3a7afb50a3 --- /dev/null +++ b/packages/@n8n/benchmark/package.json @@ -0,0 +1,48 @@ +{ + "name": "@n8n/n8n-benchmark", + "version": "1.0.0", + "description": "Cli for running benchmark tests for n8n", + "main": "dist/index", + "scripts": { + "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json", + "start": "./bin/n8n-benchmark", + "test": "echo \"Error: no test specified\" && exit 1", + "typecheck": "tsc --noEmit", + "watch": "concurrently \"tsc -w -p tsconfig.build.json\" \"tsc-alias -w -p tsconfig.build.json\"" + }, + "engines": { + "node": ">=20.10" + }, + "keywords": [ + "automate", + "automation", + "IaaS", + "iPaaS", + "n8n", + "workflow", + "benchmark", + "performance" + ], + "dependencies": { + "@oclif/core": "4.0.7", + "axios": "catalog:", + "convict": "6.2.4", + "dotenv": "8.6.0", + "zx": "^8.1.4" + }, + "devDependencies": { + "@types/convict": "^6.1.1", + "@types/k6": "^0.52.0", + "@types/node": "^20.14.8", + "tsc-alias": "^1.8.7", + "typescript": "^5.5.2" + }, + "bin": { + "n8n-benchmark": "./bin/n8n-benchmark" + }, + "oclif": { + "bin": "n8n-benchmark", + "commands": "./dist/commands", + "topicSeparator": " " + } +} diff --git a/packages/@n8n/benchmark/scenarios/scenario.schema.json b/packages/@n8n/benchmark/scenarios/scenario.schema.json new file mode 100644 index 0000000000..661fc054b6 --- /dev/null +++ b/packages/@n8n/benchmark/scenarios/scenario.schema.json @@ -0,0 +1,42 @@ +{ + "definitions": { + "ScenarioData": { + "type": "object", + "properties": { + "workflowFiles": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + } + }, + "type": "object", + "properties": { + "$schema": { + "type": "string", + "description": "The JSON schema to validate this file" + }, + "name": { + "type": "string", + "description": "The name of the scenario" + }, + "description": { + "type": "string", + "description": "A longer description of the scenario" + }, + "scriptPath": { + "type": "string", + "description": "Relative path to the k6 test script" + }, + "scenarioData": { + "$ref": "#/definitions/ScenarioData", + "description": "Data to import before running the scenario" + } + }, + "required": ["name", "description", "scriptPath", "scenarioData"], + "additionalProperties": false +} diff --git a/packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.json b/packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.json new file mode 100644 index 0000000000..cba1aa5832 --- /dev/null +++ b/packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.json @@ -0,0 +1,25 @@ +{ + "createdAt": "2024-08-06T12:19:51.268Z", + "updatedAt": "2024-08-06T12:20:45.000Z", + "name": "Single Webhook", + "active": true, + "nodes": [ + { + "parameters": { "path": "single-webhook", "options": {} }, + "id": "7587ab0e-cc15-424f-83c0-c887a0eb97fb", + "name": "Webhook", + "type": "n8n-nodes-base.webhook", + "typeVersion": 2, + "position": [760, 400], + "webhookId": "fa563fc2-c73f-4631-99a1-39c16f1f858f" + } + ], + "connections": {}, + "settings": { "executionOrder": "v1" }, + "staticData": null, + "meta": { "templateCredsSetupCompleted": true, "responseMode": "lastNode", "options": {} }, + "pinData": {}, + "versionId": "840a38a1-ba37-433d-9f20-de73f5131a2b", + "triggerCount": 1, + "tags": [] +} diff --git a/packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.manifest.json b/packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.manifest.json new file mode 100644 index 0000000000..e9b4664a96 --- /dev/null +++ b/packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.manifest.json @@ -0,0 +1,7 @@ +{ + "$schema": "../scenario.schema.json", + "name": "SingleWebhook", + "description": "A single webhook trigger that responds with a 200 status code", + "scenarioData": { "workflowFiles": ["singleWebhook.json"] }, + "scriptPath": "singleWebhook.script.ts" +} diff --git a/packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.script.ts b/packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.script.ts new file mode 100644 index 0000000000..72e2563cbe --- /dev/null +++ b/packages/@n8n/benchmark/scenarios/singleWebhook/singleWebhook.script.ts @@ -0,0 +1,11 @@ +import http from 'k6/http'; +import { check } from 'k6'; + +const apiBaseUrl = __ENV.API_BASE_URL; + +export default function () { + const res = http.get(`${apiBaseUrl}/webhook/single-webhook`); + check(res, { + 'is status 200': (r) => r.status === 200, + }); +} diff --git a/packages/@n8n/benchmark/src/commands/list.ts b/packages/@n8n/benchmark/src/commands/list.ts new file mode 100644 index 0000000000..fcc60b1b81 --- /dev/null +++ b/packages/@n8n/benchmark/src/commands/list.ts @@ -0,0 +1,21 @@ +import { Command } from '@oclif/core'; +import { ScenarioLoader } from '@/scenario/scenarioLoader'; +import { loadConfig } from '@/config/config'; + +export default class ListCommand extends Command { + static description = 'List all available scenarios'; + + async run() { + const config = loadConfig(); + const scenarioLoader = new ScenarioLoader(); + + const allScenarios = scenarioLoader.loadAll(config.get('testScenariosPath')); + + console.log('Available test scenarios:'); + console.log(''); + + for (const scenario of allScenarios) { + console.log('\t', scenario.name, ':', scenario.description); + } + } +} diff --git a/packages/@n8n/benchmark/src/commands/run.ts b/packages/@n8n/benchmark/src/commands/run.ts new file mode 100644 index 0000000000..d69b4a54d4 --- /dev/null +++ b/packages/@n8n/benchmark/src/commands/run.ts @@ -0,0 +1,39 @@ +import { Command, Flags } from '@oclif/core'; +import { loadConfig } from '@/config/config'; +import { ScenarioLoader } from '@/scenario/scenarioLoader'; +import { ScenarioRunner } from '@/testExecution/scenarioRunner'; +import { N8nApiClient } from '@/n8nApiClient/n8nApiClient'; +import { ScenarioDataFileLoader } from '@/scenario/scenarioDataLoader'; +import { K6Executor } from '@/testExecution/k6Executor'; + +export default class RunCommand extends Command { + static description = 'Run all (default) or specified test scenarios'; + + // TODO: Add support for filtering scenarios + static flags = { + scenarios: Flags.string({ + char: 't', + description: 'Comma-separated list of test scenarios to run', + required: false, + }), + }; + + async run() { + const config = loadConfig(); + const scenarioLoader = new ScenarioLoader(); + + const scenarioRunner = new ScenarioRunner( + new N8nApiClient(config.get('n8n.baseUrl')), + new ScenarioDataFileLoader(), + new K6Executor(config.get('k6ExecutablePath'), config.get('n8n.baseUrl')), + { + email: config.get('n8n.user.email'), + password: config.get('n8n.user.password'), + }, + ); + + const allScenarios = scenarioLoader.loadAll(config.get('testScenariosPath')); + + await scenarioRunner.runManyScenarios(allScenarios); + } +} diff --git a/packages/@n8n/benchmark/src/config/config.ts b/packages/@n8n/benchmark/src/config/config.ts new file mode 100644 index 0000000000..896ecc9296 --- /dev/null +++ b/packages/@n8n/benchmark/src/config/config.ts @@ -0,0 +1,50 @@ +import convict from 'convict'; +import dotenv from 'dotenv'; + +dotenv.config(); + +const configSchema = { + testScenariosPath: { + doc: 'The path to the scenarios', + format: String, + default: 'scenarios', + }, + n8n: { + baseUrl: { + doc: 'The base URL for the n8n instance', + format: String, + default: 'http://localhost:5678', + env: 'N8N_BASE_URL', + }, + user: { + email: { + doc: 'The email address of the n8n user', + format: String, + default: 'benchmark-user@n8n.io', + env: 'N8N_USER_EMAIL', + }, + password: { + doc: 'The password of the n8n user', + format: String, + default: 'VerySecret!123', + env: 'N8N_USER_PASSWORD', + }, + }, + }, + k6ExecutablePath: { + doc: 'The path to the k6 binary', + format: String, + default: 'k6', + env: 'K6_PATH', + }, +}; + +export type Config = ReturnType; + +export function loadConfig() { + const config = convict(configSchema); + + config.validate({ allowed: 'strict' }); + + return config; +} diff --git a/packages/@n8n/benchmark/src/n8nApiClient/authenticatedN8nApiClient.ts b/packages/@n8n/benchmark/src/n8nApiClient/authenticatedN8nApiClient.ts new file mode 100644 index 0000000000..93cd767347 --- /dev/null +++ b/packages/@n8n/benchmark/src/n8nApiClient/authenticatedN8nApiClient.ts @@ -0,0 +1,67 @@ +import { strict as assert } from 'node:assert'; +import { N8nApiClient } from './n8nApiClient'; +import { AxiosRequestConfig } from 'axios'; + +export class AuthenticatedN8nApiClient extends N8nApiClient { + constructor( + apiBaseUrl: string, + private readonly authCookie: string, + ) { + super(apiBaseUrl); + } + + static async createUsingUsernameAndPassword( + apiClient: N8nApiClient, + loginDetails: { + email: string; + password: string; + }, + ) { + const response = await apiClient.restApiRequest('/login', { + method: 'POST', + data: loginDetails, + }); + + const cookieHeader = response.headers['set-cookie']; + const authCookie = Array.isArray(cookieHeader) ? cookieHeader.join('; ') : cookieHeader; + assert(authCookie); + + return new AuthenticatedN8nApiClient(apiClient.apiBaseUrl, authCookie); + } + + async get(endpoint: string) { + return await this.authenticatedRequest(endpoint, { + method: 'GET', + }); + } + + async post(endpoint: string, data: unknown) { + return await this.authenticatedRequest(endpoint, { + method: 'POST', + data, + }); + } + + async patch(endpoint: string, data: unknown) { + return await this.authenticatedRequest(endpoint, { + method: 'PATCH', + data, + }); + } + + async delete(endpoint: string) { + return await this.authenticatedRequest(endpoint, { + method: 'DELETE', + }); + } + + protected async authenticatedRequest(endpoint: string, init: Omit) { + return await this.restApiRequest(endpoint, { + ...init, + headers: { + ...init.headers, + cookie: this.authCookie, + }, + }); + } +} diff --git a/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts b/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts new file mode 100644 index 0000000000..86ca52aff8 --- /dev/null +++ b/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts @@ -0,0 +1,78 @@ +import axios, { AxiosError, AxiosRequestConfig } from 'axios'; + +export class N8nApiClient { + constructor(public readonly apiBaseUrl: string) {} + + async waitForInstanceToBecomeOnline(): Promise { + const HEALTH_ENDPOINT = 'healthz'; + const START_TIME = Date.now(); + const INTERVAL_MS = 1000; + const TIMEOUT_MS = 60_000; + + while (Date.now() - START_TIME < TIMEOUT_MS) { + try { + const response = await axios.request({ + url: `${this.apiBaseUrl}/${HEALTH_ENDPOINT}`, + method: 'GET', + }); + + if (response.status === 200 && response.data.status === 'ok') { + return; + } + } catch {} + + console.log(`n8n instance not online yet, retrying in ${INTERVAL_MS / 1000} seconds...`); + await this.delay(INTERVAL_MS); + } + + throw new Error(`n8n instance did not come online within ${TIMEOUT_MS / 1000} seconds`); + } + + async setupOwnerIfNeeded(loginDetails: { email: string; password: string }) { + const response = await this.restApiRequest<{ message: string }>('/owner/setup', { + method: 'POST', + data: { + email: loginDetails.email, + password: loginDetails.password, + firstName: 'Test', + lastName: 'User', + }, + // Don't throw on non-2xx responses + validateStatus: () => true, + }); + + const responsePayload = response.data; + + if (response.status === 200) { + console.log('Owner setup successful'); + } else if (response.status === 400) { + if (responsePayload.message === 'Instance owner already setup') + console.log('Owner already set up'); + } else { + throw new Error( + `Owner setup failed with status ${response.status}: ${responsePayload.message}`, + ); + } + } + + async restApiRequest(endpoint: string, init: Omit) { + try { + return await axios.request({ + ...init, + url: this.getRestEndpointUrl(endpoint), + }); + } catch (e) { + const error = e as AxiosError; + console.error(`[ERROR] Request failed ${init.method} ${endpoint}`, error?.response?.data); + throw error; + } + } + + protected getRestEndpointUrl(endpoint: string) { + return `${this.apiBaseUrl}/rest${endpoint}`; + } + + private delay(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); + } +} diff --git a/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.types.ts b/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.types.ts new file mode 100644 index 0000000000..ff6aa6930b --- /dev/null +++ b/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.types.ts @@ -0,0 +1,8 @@ +/** + * n8n workflow. This is a simplified version of the actual workflow object. + */ +export type Workflow = { + id: string; + name: string; + tags?: string[]; +}; diff --git a/packages/@n8n/benchmark/src/n8nApiClient/workflowsApiClient.ts b/packages/@n8n/benchmark/src/n8nApiClient/workflowsApiClient.ts new file mode 100644 index 0000000000..18f2ecbcda --- /dev/null +++ b/packages/@n8n/benchmark/src/n8nApiClient/workflowsApiClient.ts @@ -0,0 +1,31 @@ +import { Workflow } from '@/n8nApiClient/n8nApiClient.types'; +import { AuthenticatedN8nApiClient } from './authenticatedN8nApiClient'; + +export class WorkflowApiClient { + constructor(private readonly apiClient: AuthenticatedN8nApiClient) {} + + async getAllWorkflows(): Promise { + const response = await this.apiClient.get<{ count: number; data: Workflow[] }>('/workflows'); + + return response.data.data; + } + + async createWorkflow(workflow: unknown): Promise { + const response = await this.apiClient.post<{ data: Workflow }>('/workflows', workflow); + + return response.data.data; + } + + async activateWorkflow(workflow: Workflow): Promise { + const response = await this.apiClient.patch<{ data: Workflow }>(`/workflows/${workflow.id}`, { + ...workflow, + active: true, + }); + + return response.data.data; + } + + async deleteWorkflow(workflowId: Workflow['id']): Promise { + await this.apiClient.delete(`/workflows/${workflowId}`); + } +} diff --git a/packages/@n8n/benchmark/src/scenario/scenarioDataLoader.ts b/packages/@n8n/benchmark/src/scenario/scenarioDataLoader.ts new file mode 100644 index 0000000000..43638a2e00 --- /dev/null +++ b/packages/@n8n/benchmark/src/scenario/scenarioDataLoader.ts @@ -0,0 +1,35 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { Scenario } from '@/types/scenario'; +import { Workflow } from '@/n8nApiClient/n8nApiClient.types'; + +/** + * Loads scenario data files from FS + */ +export class ScenarioDataFileLoader { + async loadDataForScenario(scenario: Scenario): Promise<{ + workflows: Workflow[]; + }> { + const workflows = await Promise.all( + scenario.scenarioData.workflowFiles?.map((workflowFilePath) => + this.loadSingleWorkflowFromFile(path.join(scenario.scenarioDirPath, workflowFilePath)), + ) ?? [], + ); + + return { + workflows, + }; + } + + private loadSingleWorkflowFromFile(workflowFilePath: string): Workflow { + const fileContent = fs.readFileSync(workflowFilePath, 'utf8'); + + try { + return JSON.parse(fileContent); + } catch (error) { + throw new Error( + `Failed to parse workflow file ${workflowFilePath}: ${error instanceof Error ? error.message : error}`, + ); + } + } +} diff --git a/packages/@n8n/benchmark/src/scenario/scenarioLoader.ts b/packages/@n8n/benchmark/src/scenario/scenarioLoader.ts new file mode 100644 index 0000000000..475ce495ac --- /dev/null +++ b/packages/@n8n/benchmark/src/scenario/scenarioLoader.ts @@ -0,0 +1,67 @@ +import * as fs from 'node:fs'; +import * as path from 'path'; +import { createHash } from 'node:crypto'; +import type { Scenario, ScenarioManifest } from '@/types/scenario'; + +export class ScenarioLoader { + /** + * Loads all scenarios from the given path + */ + loadAll(pathToScenarios: string): Scenario[] { + pathToScenarios = path.resolve(pathToScenarios); + const scenarioFolders = fs + .readdirSync(pathToScenarios, { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name); + + const scenarios: Scenario[] = []; + + for (const folder of scenarioFolders) { + const scenarioPath = path.join(pathToScenarios, folder); + const manifestFileName = `${folder}.manifest.json`; + const scenarioManifestPath = path.join(pathToScenarios, folder, manifestFileName); + if (!fs.existsSync(scenarioManifestPath)) { + console.warn(`Scenario at ${scenarioPath} is missing the ${manifestFileName} file`); + continue; + } + + // Load the scenario manifest file + const [scenario, validationErrors] = + this.loadAndValidateScenarioManifest(scenarioManifestPath); + if (validationErrors) { + console.warn( + `Scenario at ${scenarioPath} has the following validation errors: ${validationErrors.join(', ')}`, + ); + continue; + } + + scenarios.push({ + ...scenario, + id: this.formScenarioId(scenarioPath), + scenarioDirPath: scenarioPath, + }); + } + + return scenarios; + } + + private loadAndValidateScenarioManifest( + scenarioManifestPath: string, + ): [ScenarioManifest, null] | [null, string[]] { + const scenario = JSON.parse(fs.readFileSync(scenarioManifestPath, 'utf8')); + const validationErrors: string[] = []; + + if (!scenario.name) { + validationErrors.push(`Scenario at ${scenarioManifestPath} is missing a name`); + } + if (!scenario.description) { + validationErrors.push(`Scenario at ${scenarioManifestPath} is missing a description`); + } + + return validationErrors.length === 0 ? [scenario, null] : [null, validationErrors]; + } + + private formScenarioId(scenarioPath: string): string { + return createHash('sha256').update(scenarioPath).digest('hex'); + } +} diff --git a/packages/@n8n/benchmark/src/testExecution/k6Executor.ts b/packages/@n8n/benchmark/src/testExecution/k6Executor.ts new file mode 100644 index 0000000000..903d06ca74 --- /dev/null +++ b/packages/@n8n/benchmark/src/testExecution/k6Executor.ts @@ -0,0 +1,28 @@ +import { $ } from 'zx'; +import { Scenario } from '@/types/scenario'; + +/** + * Executes test scenarios using k6 + */ +export class K6Executor { + constructor( + private readonly k6ExecutablePath: string, + private readonly n8nApiBaseUrl: string, + ) {} + + async executeTestScenario(scenario: Scenario) { + // For 1 min with 5 virtual users + const stage = '1m:5'; + + const processPromise = $({ + cwd: scenario.scenarioDirPath, + env: { + API_BASE_URL: this.n8nApiBaseUrl, + }, + })`${this.k6ExecutablePath} run --quiet --stage ${stage} ${scenario.scriptPath}`; + + for await (const chunk of processPromise.stdout) { + console.log(chunk.toString()); + } + } +} diff --git a/packages/@n8n/benchmark/src/testExecution/scenarioDataImporter.ts b/packages/@n8n/benchmark/src/testExecution/scenarioDataImporter.ts new file mode 100644 index 0000000000..1c1ec3777e --- /dev/null +++ b/packages/@n8n/benchmark/src/testExecution/scenarioDataImporter.ts @@ -0,0 +1,56 @@ +import { AuthenticatedN8nApiClient } from '@/n8nApiClient/authenticatedN8nApiClient'; +import { Workflow } from '@/n8nApiClient/n8nApiClient.types'; +import { WorkflowApiClient } from '@/n8nApiClient/workflowsApiClient'; + +/** + * Imports scenario data into an n8n instance + */ +export class ScenarioDataImporter { + private readonly workflowApiClient: WorkflowApiClient; + + constructor(n8nApiClient: AuthenticatedN8nApiClient) { + this.workflowApiClient = new WorkflowApiClient(n8nApiClient); + } + + async importTestScenarioData(workflows: Workflow[]) { + const existingWorkflows = await this.workflowApiClient.getAllWorkflows(); + + for (const workflow of workflows) { + await this.importWorkflow({ existingWorkflows, workflow }); + } + } + + /** + * Imports a single workflow into n8n removing any existing workflows with the same name + */ + private async importWorkflow(opts: { existingWorkflows: Workflow[]; workflow: Workflow }) { + const existingWorkflows = this.findExistingWorkflows(opts.existingWorkflows, opts.workflow); + if (existingWorkflows.length > 0) { + for (const toDelete of existingWorkflows) { + await this.workflowApiClient.deleteWorkflow(toDelete.id); + } + } + + const createdWorkflow = await this.workflowApiClient.createWorkflow({ + ...opts.workflow, + name: this.getBenchmarkWorkflowName(opts.workflow), + }); + + return await this.workflowApiClient.activateWorkflow(createdWorkflow); + } + + private findExistingWorkflows( + existingWorkflows: Workflow[], + workflowToImport: Workflow, + ): Workflow[] { + const benchmarkWorkflowName = this.getBenchmarkWorkflowName(workflowToImport); + + return existingWorkflows.filter( + (existingWorkflow) => existingWorkflow.name === benchmarkWorkflowName, + ); + } + + private getBenchmarkWorkflowName(workflow: Workflow) { + return `[BENCHMARK] ${workflow.name}`; + } +} diff --git a/packages/@n8n/benchmark/src/testExecution/scenarioRunner.ts b/packages/@n8n/benchmark/src/testExecution/scenarioRunner.ts new file mode 100644 index 0000000000..83e1077680 --- /dev/null +++ b/packages/@n8n/benchmark/src/testExecution/scenarioRunner.ts @@ -0,0 +1,50 @@ +import { Scenario } from '@/types/scenario'; +import { N8nApiClient } from '@/n8nApiClient/n8nApiClient'; +import { ScenarioDataFileLoader } from '@/scenario/scenarioDataLoader'; +import { K6Executor } from './k6Executor'; +import { ScenarioDataImporter } from '@/testExecution/scenarioDataImporter'; +import { AuthenticatedN8nApiClient } from '@/n8nApiClient/authenticatedN8nApiClient'; + +/** + * Runs scenarios + */ +export class ScenarioRunner { + constructor( + private readonly n8nClient: N8nApiClient, + private readonly dataLoader: ScenarioDataFileLoader, + private readonly k6Executor: K6Executor, + private readonly ownerConfig: { + email: string; + password: string; + }, + ) {} + + async runManyScenarios(scenarios: Scenario[]) { + console.log(`Waiting for n8n ${this.n8nClient.apiBaseUrl} to become online`); + await this.n8nClient.waitForInstanceToBecomeOnline(); + + console.log('Setting up owner'); + await this.n8nClient.setupOwnerIfNeeded(this.ownerConfig); + + const authenticatedN8nClient = await AuthenticatedN8nApiClient.createUsingUsernameAndPassword( + this.n8nClient, + this.ownerConfig, + ); + const testDataImporter = new ScenarioDataImporter(authenticatedN8nClient); + + for (const scenario of scenarios) { + await this.runSingleTestScenario(testDataImporter, scenario); + } + } + + private async runSingleTestScenario(testDataImporter: ScenarioDataImporter, scenario: Scenario) { + console.log('Running scenario:', scenario.name); + + console.log('Loading and importing data'); + const testData = await this.dataLoader.loadDataForScenario(scenario); + await testDataImporter.importTestScenarioData(testData.workflows); + + console.log('Executing scenario script'); + await this.k6Executor.executeTestScenario(scenario); + } +} diff --git a/packages/@n8n/benchmark/src/types/scenario.ts b/packages/@n8n/benchmark/src/types/scenario.ts new file mode 100644 index 0000000000..19c52fd45b --- /dev/null +++ b/packages/@n8n/benchmark/src/types/scenario.ts @@ -0,0 +1,27 @@ +export type ScenarioData = { + /** Relative paths to the workflow files */ + workflowFiles?: string[]; +}; + +/** + * Configuration that defines the benchmark scenario + */ +export type ScenarioManifest = { + /** The name of the scenario */ + name: string; + /** A longer description of the scenario */ + description: string; + /** Relative path to the k6 script */ + scriptPath: string; + /** Data to import before running the scenario */ + scenarioData: ScenarioData; +}; + +/** + * Scenario with additional metadata + */ +export type Scenario = ScenarioManifest & { + id: string; + /** Path to the directory containing the scenario */ + scenarioDirPath: string; +}; diff --git a/packages/@n8n/benchmark/tsconfig.build.json b/packages/@n8n/benchmark/tsconfig.build.json new file mode 100644 index 0000000000..b91db37a4a --- /dev/null +++ b/packages/@n8n/benchmark/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": ["./tsconfig.json", "../../../tsconfig.build.json"], + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "tsBuildInfoFile": "dist/build.tsbuildinfo" + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/@n8n/benchmark/tsconfig.json b/packages/@n8n/benchmark/tsconfig.json new file mode 100644 index 0000000000..58a1b48f65 --- /dev/null +++ b/packages/@n8n/benchmark/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": ["../../../tsconfig.json", "../../../tsconfig.backend.json"], + "compilerOptions": { + "rootDir": ".", + "baseUrl": "src", + "paths": { + "@/*": ["./*"] + } + }, + "include": ["src/**/*.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f77ec66a97..b562d950ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,7 +125,7 @@ importers: version: 6.0.2 jest: specifier: ^29.6.2 - version: 29.6.2(@types/node@18.16.16) + version: 29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) jest-environment-jsdom: specifier: ^29.6.2 version: 29.6.2 @@ -137,7 +137,7 @@ importers: version: 29.6.2 jest-mock-extended: specifier: ^3.0.4 - version: 3.0.4(jest@29.6.2(@types/node@18.16.16))(typescript@5.5.2) + version: 3.0.4(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(typescript@5.5.2) nock: specifier: ^13.3.2 version: 13.3.2 @@ -158,7 +158,7 @@ importers: version: 7.0.0 ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.24.0)(@jest/types@29.6.1)(babel-jest@29.6.2(@babel/core@7.24.0))(jest@29.6.2(@types/node@18.16.16))(typescript@5.5.2) + version: 29.1.1(@babel/core@7.24.0)(@jest/types@29.6.1)(babel-jest@29.6.2(@babel/core@7.24.0))(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(typescript@5.5.2) tsc-alias: specifier: ^1.8.7 version: 1.8.7 @@ -209,6 +209,40 @@ importers: specifier: workspace:* version: link:../packages/workflow + packages/@n8n/benchmark: + dependencies: + '@oclif/core': + specifier: 4.0.7 + version: 4.0.7 + axios: + specifier: 'catalog:' + version: 1.7.4(debug@4.3.6) + convict: + specifier: 6.2.4 + version: 6.2.4 + dotenv: + specifier: 8.6.0 + version: 8.6.0 + zx: + specifier: ^8.1.4 + version: 8.1.4 + devDependencies: + '@types/convict': + specifier: ^6.1.1 + version: 6.1.1 + '@types/k6': + specifier: ^0.52.0 + version: 0.52.0 + '@types/node': + specifier: ^18.16.16 + version: 18.16.16 + tsc-alias: + specifier: ^1.8.7 + version: 1.8.7 + typescript: + specifier: ^5.5.2 + version: 5.5.2 + packages/@n8n/chat: dependencies: '@vueuse/core': @@ -390,7 +424,7 @@ importers: version: 0.5.0 '@n8n/typeorm': specifier: 0.3.20-10 - version: 0.3.20-10(@sentry/node@7.87.0)(ioredis@5.3.2)(mssql@10.0.2)(mysql2@3.11.0)(pg@8.12.0)(redis@4.6.12)(sqlite3@5.1.7) + version: 0.3.20-10(@sentry/node@7.87.0)(ioredis@5.3.2)(mssql@10.0.2)(mysql2@3.11.0)(pg@8.12.0)(redis@4.6.12)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) '@n8n/vm2': specifier: 3.9.25 version: 3.9.25 @@ -522,7 +556,7 @@ importers: version: 8.1.4(@types/react@18.0.27)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-interactions': specifier: ^8.1.4 - version: 8.1.4(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1)) + version: 8.1.4(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1)) '@storybook/addon-links': specifier: ^8.1.4 version: 8.1.4(react@18.2.0) @@ -534,7 +568,7 @@ importers: version: 8.1.4(@types/react@18.0.27)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/test': specifier: ^8.1.4 - version: 8.1.4(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1)) + version: 8.1.4(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1)) '@storybook/vue3': specifier: ^8.1.4 version: 8.1.4(encoding@0.1.13)(prettier@3.2.5)(vue@3.4.21(typescript@5.5.2)) @@ -630,7 +664,7 @@ importers: version: link:../@n8n/permissions '@n8n/typeorm': specifier: 0.3.20-10 - version: 0.3.20-10(@sentry/node@7.87.0)(ioredis@5.3.2)(mssql@10.0.2)(mysql2@3.11.0)(pg@8.12.0)(redis@4.6.14)(sqlite3@5.1.7) + version: 0.3.20-10(@sentry/node@7.87.0)(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.5.2)) '@n8n_io/ai-assistant-sdk': specifier: 1.9.4 version: 1.9.4 @@ -1107,7 +1141,7 @@ importers: version: link:../@n8n/storybook '@testing-library/jest-dom': specifier: ^6.1.5 - version: 6.1.5(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16))(vitest@1.6.0(@types/node@18.16.16)(jsdom@23.0.1)(sass@1.64.1)(terser@5.16.1)) + version: 6.1.5(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(vitest@1.6.0(@types/node@18.16.16)(jsdom@23.0.1)(sass@1.64.1)(terser@5.16.1)) '@testing-library/user-event': specifier: ^14.5.1 version: 14.5.1(@testing-library/dom@9.3.4) @@ -1146,7 +1180,7 @@ importers: version: 1.64.1 tailwindcss: specifier: ^3.4.3 - version: 3.4.3 + version: 3.4.3(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) unplugin-icons: specifier: ^0.19.0 version: 0.19.0(@vue/compiler-sfc@3.4.21)(vue-template-compiler@2.7.14) @@ -2398,10 +2432,6 @@ packages: resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.23.4': - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.6': resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} engines: {node: '>=6.9.0'} @@ -3007,10 +3037,6 @@ packages: resolution: {integrity: sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==} engines: {node: '>=6.9.0'} - '@babel/types@7.23.6': - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} - engines: {node: '>=6.9.0'} - '@babel/types@7.24.0': resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} @@ -3078,6 +3104,10 @@ packages: resolution: {integrity: sha512-dkk7FX8L/JLia5pi+IQ11lCw2D6FTmbWL2iWTHgCbP40/deeXgknlkEQcQ/rOkjwQbqp8RZ4ey/anR17K66sqw==} engines: {node: '>=16'} + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@ctrl/tinycolor@3.6.0': resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==} engines: {node: '>=10'} @@ -3548,10 +3578,6 @@ packages: resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.2': - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} - engines: {node: '>=6.0.0'} - '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -3560,10 +3586,6 @@ packages: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} @@ -3577,6 +3599,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-joda/core@5.6.1': resolution: {integrity: sha512-Xla/d7ZMMR6+zRd6lTio0wRZECfcfFJP7GGe9A9L4tDOlD5CX4YcZ4YZle9w58bBYzssojVapI84RraKWDQZRg==} @@ -5282,6 +5307,18 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/amqplib@0.10.1': resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} @@ -5399,6 +5436,9 @@ packages: '@types/formidable@3.4.5': resolution: {integrity: sha512-s7YPsNVfnsng5L8sKnG/Gbb2tiwwJTY1conOkJzTMRvJAlLFW1nEua+ADsJQu8N1c0oTHx9+d5nqg10WuT9gHQ==} + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/ftp@0.3.33': resolution: {integrity: sha512-L7wFlX3t9GsGgNS0oxLt6zbAZZGgsdptMmciL4cdxHmbL3Hz4Lysh8YqAR34eHsJ1uacJITcZBBDl5XpQlxPpQ==} @@ -5456,12 +5496,18 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/jsonpath@0.2.0': resolution: {integrity: sha512-v7qlPA0VpKUlEdhghbDqRoKMxFB3h3Ch688TApBJ6v+XLDdvWCGLJIYiPKGZnS6MAOie+IorCfNYVHOPIHSWwQ==} '@types/jsonwebtoken@9.0.6': resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} + '@types/k6@0.52.0': + resolution: {integrity: sha512-yaw2wg61nKQtToDML+nngzgXVjZ6wNA4R0Q3jKDTeadG5EqfZgis5a1Q2hwY7kjuGuXmu8eM6gHg3tgnOj4vNw==} + '@types/linkify-it@3.0.5': resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} @@ -6168,6 +6214,9 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -6732,10 +6781,6 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} - engines: {node: '>=6'} - cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} @@ -6975,6 +7020,9 @@ packages: resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} engines: {node: '>=10.0.0'} + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + crelt@1.0.5: resolution: {integrity: sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==} @@ -7344,6 +7392,10 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} @@ -9631,10 +9683,6 @@ packages: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} @@ -10007,10 +10055,6 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -11008,10 +11052,6 @@ packages: resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-format@29.6.2: - resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -12377,6 +12417,20 @@ packages: ts-map@1.0.3: resolution: {integrity: sha512-vDWbsl26LIcPGmDpoVzjEP6+hvHZkBkLW7JpvwbCv/5IYPJlsbzCVXY3wsCeAxAUeTclNOUZxnLdGh3VBD/J6w==} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': ^18.16.16 + typescript: ^5.5.2 + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + ts-toolbelt@9.6.0: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} @@ -12777,6 +12831,9 @@ packages: v3-infinite-loading@1.2.2: resolution: {integrity: sha512-MWJc6yChnqeUasBFJ3Enu8IGPcQgRMSTrAEtT1MsHBEx+QjwvNTaY8o+8V9DgVt1MVhQSl3MC55hsaWLJmpRMw==} + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-to-istanbul@9.1.0: resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} engines: {node: '>=10.12.0'} @@ -13288,6 +13345,10 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -13316,6 +13377,11 @@ packages: zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zx@8.1.4: + resolution: {integrity: sha512-QFDYYpnzdpRiJ3dL2102Cw26FpXpWshW4QLTGxiYfIcwdAqg084jRCkK/kuP/NOSkxOjydRwNFG81qzA5r1a6w==} + engines: {node: '>= 12.17.0'} + hasBin: true + snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} @@ -13323,7 +13389,7 @@ snapshots: '@acuminous/bitsyntax@0.1.2': dependencies: buffer-more-ints: 1.0.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) safe-buffer: 5.1.2 transitivePeerDependencies: - supports-color @@ -14432,7 +14498,7 @@ snapshots: '@babel/traverse': 7.24.0 '@babel/types': 7.24.6 convert-source-map: 2.0.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 7.6.0 @@ -14452,7 +14518,7 @@ snapshots: '@babel/traverse': 7.24.6 '@babel/types': 7.24.6 convert-source-map: 2.0.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 7.6.0 @@ -14553,7 +14619,7 @@ snapshots: '@babel/core': 7.24.6 '@babel/helper-compilation-targets': 7.24.6 '@babel/helper-plugin-utils': 7.24.6 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -14564,7 +14630,7 @@ snapshots: '@babel/core': 7.24.6 '@babel/helper-compilation-targets': 7.24.6 '@babel/helper-plugin-utils': 7.24.6 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -14694,8 +14760,6 @@ snapshots: dependencies: '@babel/types': 7.24.6 - '@babel/helper-string-parser@7.23.4': {} - '@babel/helper-string-parser@7.24.6': {} '@babel/helper-validator-identifier@7.22.20': {} @@ -14733,7 +14797,7 @@ snapshots: '@babel/highlight@7.23.4': dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.6 chalk: 2.4.2 js-tokens: 4.0.0 @@ -14746,7 +14810,7 @@ snapshots: '@babel/parser@7.24.0': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.6 '@babel/parser@7.24.6': dependencies: @@ -15448,7 +15512,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.24.6 '@babel/types': 7.24.6 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -15463,21 +15527,15 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.6 '@babel/parser': 7.24.6 '@babel/types': 7.24.6 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.23.6': - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - '@babel/types@7.24.0': dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 to-fast-properties: 2.0.0 '@babel/types@7.24.6': @@ -15600,6 +15658,11 @@ snapshots: '@common.js/is-network-error@1.0.1': {} + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + optional: true + '@ctrl/tinycolor@3.6.0': {} '@curlconverter/yargs-parser@0.0.1': {} @@ -15745,7 +15808,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) espree: 9.6.1 globals: 13.20.0 ignore: 5.2.4 @@ -15903,7 +15966,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -15933,7 +15996,7 @@ snapshots: '@antfu/install-pkg': 0.1.1 '@antfu/utils': 0.7.10 '@iconify/types': 2.0.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) kolorist: 1.8.0 local-pkg: 0.5.0 mlly: 1.7.1 @@ -15995,7 +16058,7 @@ snapshots: jest-util: 29.6.2 slash: 3.0.0 - '@jest/core@29.6.2': + '@jest/core@29.6.2(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2))': dependencies: '@jest/console': 29.6.2 '@jest/reporters': 29.6.2 @@ -16009,7 +16072,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.6.2(@types/node@18.16.16) + jest-config: 29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) jest-haste-map: 29.6.2 jest-message-util: 29.6.2 jest-regex-util: 29.4.3 @@ -16022,7 +16085,7 @@ snapshots: jest-validate: 29.6.2 jest-watcher: 29.6.2 micromatch: 4.0.5 - pretty-format: 29.6.2 + pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: @@ -16156,12 +16219,6 @@ snapshots: '@types/yargs': 17.0.19 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.2': - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -16170,8 +16227,6 @@ snapshots: '@jridgewell/resolve-uri@3.1.0': {} - '@jridgewell/set-array@1.1.2': {} - '@jridgewell/set-array@1.2.1': {} '@jridgewell/source-map@0.3.2': @@ -16187,6 +16242,12 @@ snapshots: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.15 + optional: true + '@js-joda/core@5.6.1': {} '@js-sdsl/ordered-map@4.4.2': {} @@ -16227,7 +16288,7 @@ snapshots: '@kwsites/file-exists@1.1.1': dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16639,7 +16700,7 @@ snapshots: '@n8n/localtunnel@3.0.0': dependencies: axios: 1.7.4(debug@4.3.6) - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16656,7 +16717,7 @@ snapshots: esprima-next: 5.8.4 recast: 0.22.0 - '@n8n/typeorm@0.3.20-10(@sentry/node@7.87.0)(ioredis@5.3.2)(mssql@10.0.2)(mysql2@3.11.0)(pg@8.12.0)(redis@4.6.12)(sqlite3@5.1.7)': + '@n8n/typeorm@0.3.20-10(@sentry/node@7.87.0)(ioredis@5.3.2)(mssql@10.0.2)(mysql2@3.11.0)(pg@8.12.0)(redis@4.6.12)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2))': dependencies: '@n8n/p-retry': 6.2.0-2 '@sqltools/formatter': 1.2.5 @@ -16665,7 +16726,7 @@ snapshots: buffer: 6.0.3 chalk: 4.1.2 dayjs: 1.11.10 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) dotenv: 16.3.1 glob: 10.3.10 mkdirp: 2.1.3 @@ -16683,10 +16744,11 @@ snapshots: pg: 8.12.0 redis: 4.6.12 sqlite3: 5.1.7 + ts-node: 10.9.2(@types/node@18.16.16)(typescript@5.5.2) transitivePeerDependencies: - supports-color - '@n8n/typeorm@0.3.20-10(@sentry/node@7.87.0)(ioredis@5.3.2)(mssql@10.0.2)(mysql2@3.11.0)(pg@8.12.0)(redis@4.6.14)(sqlite3@5.1.7)': + '@n8n/typeorm@0.3.20-10(@sentry/node@7.87.0)(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.5.2))': dependencies: '@n8n/p-retry': 6.2.0-2 '@sqltools/formatter': 1.2.5 @@ -16695,7 +16757,7 @@ snapshots: buffer: 6.0.3 chalk: 4.1.2 dayjs: 1.11.10 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) dotenv: 16.3.1 glob: 10.3.10 mkdirp: 2.1.3 @@ -16713,6 +16775,7 @@ snapshots: pg: 8.12.0 redis: 4.6.14 sqlite3: 5.1.7 + ts-node: 10.9.2(@types/node@18.16.16)(typescript@5.5.2) transitivePeerDependencies: - supports-color @@ -16781,14 +16844,14 @@ snapshots: ansis: 3.2.0 clean-stack: 3.0.1 cli-spinners: 2.9.2 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) ejs: 3.1.10 get-package-type: 0.1.0 globby: 11.1.0 indent-string: 4.0.0 is-wsl: 2.2.0 lilconfig: 3.1.2 - minimatch: 9.0.4 + minimatch: 9.0.5 string-width: 4.2.3 supports-color: 8.1.1 widest-line: 3.1.0 @@ -17805,11 +17868,11 @@ snapshots: dependencies: '@storybook/global': 5.0.0 - '@storybook/addon-interactions@8.1.4(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1))': + '@storybook/addon-interactions@8.1.4(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1))': dependencies: '@storybook/global': 5.0.0 '@storybook/instrumenter': 8.1.4 - '@storybook/test': 8.1.4(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1)) + '@storybook/test': 8.1.4(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1)) '@storybook/types': 8.1.4 polished: 4.2.2 ts-dedent: 2.2.0 @@ -17995,7 +18058,7 @@ snapshots: dependencies: '@babel/core': 7.24.6 '@babel/preset-env': 7.24.6(@babel/core@7.24.6) - '@babel/types': 7.24.0 + '@babel/types': 7.24.6 '@storybook/csf': 0.1.7 '@storybook/csf-tools': 8.1.4 '@storybook/node-logger': 8.1.4 @@ -18257,14 +18320,14 @@ snapshots: - prettier - supports-color - '@storybook/test@8.1.4(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1))': + '@storybook/test@8.1.4(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1))': dependencies: '@storybook/client-logger': 8.1.4 '@storybook/core-events': 8.1.4 '@storybook/instrumenter': 8.1.4 '@storybook/preview-api': 8.1.4 '@testing-library/dom': 9.3.4 - '@testing-library/jest-dom': 6.4.2(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1)) + '@testing-library/jest-dom': 6.4.2(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1)) '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4) '@vitest/expect': 1.3.1 '@vitest/spy': 1.3.1 @@ -18411,7 +18474,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.1.5(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16))(vitest@1.6.0(@types/node@18.16.16)(jsdom@23.0.1)(sass@1.64.1)(terser@5.16.1))': + '@testing-library/jest-dom@6.1.5(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(vitest@1.6.0(@types/node@18.16.16)(jsdom@23.0.1)(sass@1.64.1)(terser@5.16.1))': dependencies: '@adobe/css-tools': 4.3.2 '@babel/runtime': 7.22.6 @@ -18424,10 +18487,10 @@ snapshots: optionalDependencies: '@jest/globals': 29.6.2 '@types/jest': 29.5.3 - jest: 29.6.2(@types/node@18.16.16) + jest: 29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) vitest: 1.6.0(@types/node@18.16.16)(jsdom@23.0.1)(sass@1.64.1)(terser@5.16.1) - '@testing-library/jest-dom@6.4.2(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1))': + '@testing-library/jest-dom@6.4.2(@jest/globals@29.6.2)(@types/jest@29.5.3)(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(vitest@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1))': dependencies: '@adobe/css-tools': 4.3.2 '@babel/runtime': 7.23.6 @@ -18440,7 +18503,7 @@ snapshots: optionalDependencies: '@jest/globals': 29.6.2 '@types/jest': 29.5.3 - jest: 29.6.2(@types/node@18.16.16) + jest: 29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) vitest: 1.6.0(@types/node@18.16.16)(jsdom@23.0.1)(sass@1.64.1)(terser@5.16.1) '@testing-library/user-event@14.5.1(@testing-library/dom@9.3.4)': @@ -18468,6 +18531,18 @@ snapshots: '@tootallnate/once@2.0.0': {} + '@tsconfig/node10@1.0.11': + optional: true + + '@tsconfig/node12@1.0.11': + optional: true + + '@tsconfig/node14@1.0.3': + optional: true + + '@tsconfig/node16@1.0.4': + optional: true + '@types/amqplib@0.10.1': dependencies: '@types/node': 18.16.16 @@ -18599,6 +18674,12 @@ snapshots: dependencies: '@types/node': 18.16.16 + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 18.16.16 + optional: true + '@types/ftp@0.3.33': dependencies: '@types/node': 18.16.16 @@ -18668,12 +18749,19 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 18.16.16 + optional: true + '@types/jsonpath@0.2.0': {} '@types/jsonwebtoken@9.0.6': dependencies: '@types/node': 18.16.16 + '@types/k6@0.52.0': {} + '@types/linkify-it@3.0.5': {} '@types/lodash-es@4.17.6': @@ -18989,7 +19077,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.2) '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.5.2) - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 ts-api-utils: 1.0.1(typescript@5.5.2) optionalDependencies: @@ -19005,7 +19093,7 @@ snapshots: dependencies: '@typescript-eslint/types': 6.7.5 '@typescript-eslint/visitor-keys': 6.7.5 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.0 @@ -19019,7 +19107,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -19079,7 +19167,7 @@ snapshots: dependencies: '@ampproject/remapping': 2.2.1 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.4 @@ -19202,7 +19290,7 @@ snapshots: '@vue/compiler-core@3.4.21': dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.6 '@vue/shared': 3.4.21 entities: 4.5.0 estree-walker: 2.0.2 @@ -19262,7 +19350,7 @@ snapshots: '@vue/compiler-dom': 3.4.21 '@vue/shared': 3.4.21 computeds: 0.0.1 - minimatch: 9.0.4 + minimatch: 9.0.5 muggle-string: 0.3.1 path-browserify: 1.0.1 vue-template-compiler: 2.7.14 @@ -19418,19 +19506,19 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color agent-base@7.1.0: dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color agentkeepalive@4.2.1: dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) depd: 1.1.2 humanize-ms: 1.2.1 transitivePeerDependencies: @@ -19527,6 +19615,9 @@ snapshots: readable-stream: 3.6.0 optional: true + arg@4.1.3: + optional: true + arg@5.0.2: {} argparse@1.0.10: @@ -20207,8 +20298,6 @@ snapshots: dependencies: restore-cursor: 3.1.0 - cli-spinners@2.9.0: {} - cli-spinners@2.9.2: {} cli-table3@0.6.3: @@ -20461,6 +20550,9 @@ snapshots: nan: 2.20.0 optional: true + create-require@1.1.1: + optional: true + crelt@1.0.5: {} crlf-normalize@1.0.19(ts-toolbelt@9.6.0): @@ -20730,16 +20822,16 @@ snapshots: optionalDependencies: supports-color: 8.1.1 - debug@4.3.5(supports-color@8.1.1): + debug@4.3.5: + dependencies: + ms: 2.1.2 + + debug@4.3.6(supports-color@8.1.1): dependencies: ms: 2.1.2 optionalDependencies: supports-color: 8.1.1 - debug@4.3.6: - dependencies: - ms: 2.1.2 - decamelize@1.2.0: {} decimal.js@10.4.3: {} @@ -20859,7 +20951,7 @@ snapshots: detect-port@1.5.1: dependencies: address: 1.2.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -20872,6 +20964,9 @@ snapshots: diff-sequences@29.6.3: {} + diff@4.0.2: + optional: true + diff@5.2.0: {} digest-fetch@1.3.0: @@ -21238,7 +21333,7 @@ snapshots: esbuild-register@3.5.0(esbuild@0.20.2): dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) esbuild: 0.20.2 transitivePeerDependencies: - supports-color @@ -21720,7 +21815,7 @@ snapshots: extract-zip@2.0.1(supports-color@8.1.1): dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -21901,7 +21996,7 @@ snapshots: follow-redirects@1.15.6(debug@4.3.6): optionalDependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) for-each@0.3.3: dependencies: @@ -22173,7 +22268,7 @@ snapshots: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 + minimatch: 9.0.5 minipass: 7.0.2 path-scurry: 1.10.1 @@ -22476,7 +22571,7 @@ snapshots: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color optional: true @@ -22485,14 +22580,14 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.0: dependencies: agent-base: 7.1.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -22507,14 +22602,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.2: dependencies: agent-base: 7.1.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -22651,7 +22746,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -22886,7 +22981,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -22895,7 +22990,7 @@ snapshots: istanbul-lib-source-maps@5.0.4: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -22949,16 +23044,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.6.2(@types/node@18.16.16): + jest-cli@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)): dependencies: - '@jest/core': 29.6.2 + '@jest/core': 29.6.2(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) '@jest/test-result': 29.6.2 '@jest/types': 29.6.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.6.2(@types/node@18.16.16) + jest-config: 29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) jest-util: 29.6.2 jest-validate: 29.6.2 prompts: 2.4.2 @@ -22969,7 +23064,7 @@ snapshots: - supports-color - ts-node - jest-config@29.6.2(@types/node@18.16.16): + jest-config@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)): dependencies: '@babel/core': 7.24.0 '@jest/test-sequencer': 29.6.2 @@ -22995,6 +23090,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.16.16 + ts-node: 10.9.2(@types/node@18.16.16)(typescript@5.5.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -23112,9 +23208,9 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-mock-extended@3.0.4(jest@29.6.2(@types/node@18.16.16))(typescript@5.5.2): + jest-mock-extended@3.0.4(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(typescript@5.5.2): dependencies: - jest: 29.6.2(@types/node@18.16.16) + jest: 29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) ts-essentials: 7.0.3(typescript@5.5.2) typescript: 5.5.2 @@ -23272,12 +23368,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.6.2(@types/node@18.16.16): + jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)): dependencies: - '@jest/core': 29.6.2 + '@jest/core': 29.6.2(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) '@jest/types': 29.6.1 import-local: 3.1.0 - jest-cli: 29.6.2(@types/node@18.16.16) + jest-cli: 29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -23749,8 +23845,6 @@ snapshots: lilconfig@2.1.0: {} - lilconfig@3.0.0: {} - lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -24121,10 +24215,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -24267,7 +24357,7 @@ snapshots: mqtt-packet@9.0.0: dependencies: bl: 6.0.12 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) process-nextick-args: 2.0.1 transitivePeerDependencies: - supports-color @@ -24323,7 +24413,7 @@ snapshots: dependencies: '@tediousjs/connection-string': 0.5.0 commander: 11.1.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) rfdc: 1.3.0 tarn: 3.0.2 tedious: 16.7.1 @@ -24562,7 +24652,7 @@ snapshots: number-allocator@1.0.14: dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) js-sdsl: 4.3.0 transitivePeerDependencies: - supports-color @@ -24755,7 +24845,7 @@ snapshots: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.9.0 + cli-spinners: 2.9.2 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -25075,12 +25165,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.38 - postcss-load-config@4.0.2(postcss@8.4.38): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)): dependencies: - lilconfig: 3.0.0 + lilconfig: 3.1.2 yaml: 2.3.4 optionalDependencies: postcss: 8.4.38 + ts-node: 10.9.2(@types/node@18.16.16)(typescript@5.5.2) postcss-nested@6.0.1(postcss@8.4.38): dependencies: @@ -25179,12 +25270,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.2.0 - pretty-format@29.6.2: - dependencies: - '@jest/schemas': 29.6.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 @@ -26130,7 +26215,7 @@ snapshots: simple-websocket@9.1.0: dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) queue-microtask: 1.2.3 randombytes: 2.1.0 readable-stream: 3.6.0 @@ -26210,7 +26295,7 @@ snapshots: socks-proxy-agent@6.2.1: dependencies: agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) socks: 2.7.1 transitivePeerDependencies: - supports-color @@ -26336,7 +26421,7 @@ snapshots: arg: 5.0.2 bluebird: 3.7.2 check-more-types: 2.24.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) execa: 5.1.1 lazy-ass: 1.6.0 ps-tree: 1.2.0 @@ -26524,7 +26609,7 @@ snapshots: sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 glob: 10.3.10 lines-and-columns: 1.2.4 @@ -26536,7 +26621,7 @@ snapshots: dependencies: component-emitter: 1.3.0 cookiejar: 2.1.4 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) fast-safe-stringify: 2.1.1 form-data: 4.0.0 formidable: 3.5.1 @@ -26599,7 +26684,7 @@ snapshots: syslog-client@1.1.1: {} - tailwindcss@3.4.3: + tailwindcss@3.4.3(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -26618,7 +26703,7 @@ snapshots: postcss: 8.4.38 postcss-import: 15.1.0(postcss@8.4.38) postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) postcss-nested: 6.0.1(postcss@8.4.38) postcss-selector-parser: 6.0.16 resolve: 1.22.8 @@ -26852,11 +26937,11 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.1.1(@babel/core@7.24.0)(@jest/types@29.6.1)(babel-jest@29.6.2(@babel/core@7.24.0))(jest@29.6.2(@types/node@18.16.16))(typescript@5.5.2): + ts-jest@29.1.1(@babel/core@7.24.0)(@jest/types@29.6.1)(babel-jest@29.6.2(@babel/core@7.24.0))(jest@29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)))(typescript@5.5.2): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.6.2(@types/node@18.16.16) + jest: 29.6.2(@types/node@18.16.16)(ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2)) jest-util: 29.5.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -26871,6 +26956,25 @@ snapshots: ts-map@1.0.3: {} + ts-node@10.9.2(@types/node@18.16.16)(typescript@5.5.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.16.16 + acorn: 8.12.1 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + ts-toolbelt@9.6.0: {} ts-type@3.0.1(ts-toolbelt@9.6.0): @@ -27133,7 +27237,7 @@ snapshots: '@antfu/install-pkg': 0.3.3 '@antfu/utils': 0.7.10 '@iconify/utils': 2.1.25 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5 kolorist: 1.8.0 local-pkg: 0.5.0 unplugin: 1.11.0 @@ -27148,7 +27252,7 @@ snapshots: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) chokidar: 3.5.2 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5 fast-glob: 3.3.2 local-pkg: 0.5.0 magic-string: 0.30.10 @@ -27259,6 +27363,9 @@ snapshots: v3-infinite-loading@1.2.2: {} + v8-compile-cache-lib@3.0.1: + optional: true + v8-to-istanbul@9.1.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -27283,7 +27390,7 @@ snapshots: vite-node@1.6.0(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1): dependencies: cac: 6.7.14 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) pathe: 1.1.2 picocolors: 1.0.1 vite: 5.2.12(@types/node@18.16.16)(sass@1.64.1)(terser@5.16.1) @@ -27302,7 +27409,7 @@ snapshots: '@microsoft/api-extractor': 7.43.0(@types/node@18.16.16) '@rollup/pluginutils': 5.1.0(rollup@4.18.0) '@vue/language-core': 1.8.27(typescript@5.5.2) - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5 kolorist: 1.8.0 magic-string: 0.30.8 typescript: 5.5.2 @@ -27340,7 +27447,7 @@ snapshots: '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.3.10 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.10 @@ -27817,6 +27924,9 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 + yn@3.1.1: + optional: true + yocto-queue@0.1.0: {} yocto-queue@1.0.0: {} @@ -27846,3 +27956,8 @@ snapshots: zod@3.22.4: {} zod@3.23.8: {} + + zx@8.1.4: + optionalDependencies: + '@types/fs-extra': 11.0.4 + '@types/node': 18.16.16 From 5c7cc36c23e58a47a1e71911e7303a1bd54f167e Mon Sep 17 00:00:00 2001 From: oleg Date: Thu, 22 Aug 2024 10:49:01 +0200 Subject: [PATCH 010/233] feat(AI Agent Node): Add tutorial link to agent node (#10493) --- .../nodes-langchain/nodes/agents/Agent/Agent.node.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/@n8n/nodes-langchain/nodes/agents/Agent/Agent.node.ts b/packages/@n8n/nodes-langchain/nodes/agents/Agent/Agent.node.ts index b7bd13e870..b20b4838cf 100644 --- a/packages/@n8n/nodes-langchain/nodes/agents/Agent/Agent.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/agents/Agent/Agent.node.ts @@ -9,7 +9,6 @@ import type { INodeTypeDescription, INodeProperties, } from 'n8n-workflow'; -import { getTemplateNoticeField } from '../../../utils/sharedFields'; import { promptTypeOptions, textInput } from '../../../utils/descriptions'; import { conversationalAgentProperties } from './agents/ConversationalAgent/description'; import { conversationalAgentExecute } from './agents/ConversationalAgent/execute'; @@ -305,10 +304,14 @@ export class Agent implements INodeType { ], properties: [ { - ...getTemplateNoticeField(1954), + displayName: + 'Tip: Get a feel for agents with our quick tutorial or see an example of how this node works', + name: 'notice_tip', + type: 'notice', + default: '', displayOptions: { show: { - agent: ['conversationalAgent'], + agent: ['conversationalAgent', 'toolsAgent'], }, }, }, From bdcc657965af5f604aac1eaff7d937f69a08ce1c Mon Sep 17 00:00:00 2001 From: oleg Date: Thu, 22 Aug 2024 10:49:08 +0200 Subject: [PATCH 011/233] fix(AI Agent Node): Allow AWS Bedrock Chat to be used with conversational agent (#10489) --- packages/@n8n/nodes-langchain/nodes/agents/Agent/Agent.node.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@n8n/nodes-langchain/nodes/agents/Agent/Agent.node.ts b/packages/@n8n/nodes-langchain/nodes/agents/Agent/Agent.node.ts index b20b4838cf..62761742b0 100644 --- a/packages/@n8n/nodes-langchain/nodes/agents/Agent/Agent.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/agents/Agent/Agent.node.ts @@ -82,6 +82,7 @@ function getInputs( filter: { nodes: [ '@n8n/n8n-nodes-langchain.lmChatAnthropic', + '@n8n/n8n-nodes-langchain.lmChatAwsBedrock', '@n8n/n8n-nodes-langchain.lmChatGroq', '@n8n/n8n-nodes-langchain.lmChatOllama', '@n8n/n8n-nodes-langchain.lmChatOpenAi', From f667b384c9b210f72307b1ee5306271b7262e3b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Thu, 22 Aug 2024 11:10:37 +0200 Subject: [PATCH 012/233] refactor(core): Standardize filenames in `cli` (no-changelog) (#10484) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ --- packages/cli/scripts/build.mjs | 4 +-- packages/cli/src/Interfaces.ts | 4 +-- packages/cli/src/PublicApi/index.ts | 2 +- .../v1/handlers/audit/audit.handler.ts | 2 +- .../credentials/credentials.handler.ts | 4 +-- .../credentials/credentials.middleware.ts | 4 +-- .../credentials/credentials.service.ts | 2 +- .../handlers/executions/executions.handler.ts | 2 +- .../handlers/workflows/workflows.handler.ts | 8 +++--- .../handlers/workflows/workflows.service.ts | 4 +-- .../shared/middlewares/global.middleware.ts | 4 +-- .../cli/src/UserManagement/email/index.ts | 3 -- packages/cli/src/__tests__/License.test.ts | 4 +-- ...ions.test.ts => active-executions.test.ts} | 2 +- ...Types.test.ts => credential-types.test.ts} | 4 +-- ...per.test.ts => credentials-helper.test.ts} | 6 ++-- ...itTracker.test.ts => wait-tracker.test.ts} | 2 +- ... workflow-execute-additional-data.test.ts} | 6 ++-- ...lpers.test.ts => workflow-helpers.test.ts} | 2 +- ...Runner.test.ts => workflow-runner.test.ts} | 2 +- .../{AbstractServer.ts => abstract-server.ts} | 18 ++++++------ ...ervice.ts => activation-errors.service.ts} | 0 ...tiveExecutions.ts => active-executions.ts} | 2 +- ...wManager.ts => active-workflow-manager.ts} | 20 ++++++------- packages/cli/src/auth/auth.service.ts | 4 +-- packages/cli/src/auth/methods/email.ts | 2 +- packages/cli/src/auth/methods/ldap.ts | 4 +-- packages/cli/src/commands/audit.ts | 4 +-- .../{BaseCommand.ts => base-command.ts} | 26 ++++++++--------- .../src/commands/db/__tests__/revert.test.ts | 2 +- packages/cli/src/commands/db/revert.ts | 2 +- packages/cli/src/commands/execute.ts | 6 ++-- packages/cli/src/commands/executeBatch.ts | 6 ++-- .../cli/src/commands/export/credentials.ts | 2 +- packages/cli/src/commands/export/workflow.ts | 2 +- .../cli/src/commands/import/credentials.ts | 2 +- packages/cli/src/commands/import/workflow.ts | 2 +- packages/cli/src/commands/ldap/reset.ts | 4 +-- packages/cli/src/commands/license/clear.ts | 4 +-- packages/cli/src/commands/license/info.ts | 4 +-- packages/cli/src/commands/list/workflow.ts | 2 +- packages/cli/src/commands/mfa/disable.ts | 2 +- packages/cli/src/commands/start.ts | 14 +++++----- packages/cli/src/commands/update/workflow.ts | 2 +- .../cli/src/commands/user-management/reset.ts | 2 +- packages/cli/src/commands/webhook.ts | 6 ++-- packages/cli/src/commands/worker.ts | 6 ++-- .../concurrency-control.service.test.ts | 2 +- .../concurrency-control.service.ts | 2 +- ...dynamic-node-parameters.controller.test.ts | 2 +- .../__tests__/me.controller.test.ts | 15 +++++----- .../__tests__/owner.controller.test.ts | 2 +- .../__tests__/translation.controller.test.ts | 2 +- .../cli/src/controllers/auth.controller.ts | 8 +++--- .../cli/src/controllers/debug.controller.ts | 2 +- .../dynamicNodeParameters.controller.ts | 2 +- .../cli/src/controllers/e2e.controller.ts | 8 +++--- .../src/controllers/invitation.controller.ts | 8 +++--- packages/cli/src/controllers/me.controller.ts | 10 +++---- .../cli/src/controllers/mfa.controller.ts | 2 +- .../src/controllers/nodeTypes.controller.ts | 2 +- .../oAuth1Credential.controller.test.ts | 8 +++--- .../oAuth2Credential.controller.test.ts | 8 +++--- .../oauth/abstractOAuth.controller.ts | 8 +++--- .../oauth/oAuth1Credential.controller.ts | 2 +- .../controllers/orchestration.controller.ts | 2 +- .../cli/src/controllers/owner.controller.ts | 4 +-- .../controllers/passwordReset.controller.ts | 12 ++++---- .../src/controllers/translation.controller.ts | 2 +- .../cli/src/controllers/users.controller.ts | 6 ++-- .../workflowStatistics.controller.ts | 2 +- .../src/{CrashJournal.ts => crash-journal.ts} | 2 +- ...CredentialTypes.ts => credential-types.ts} | 2 +- ...entialsHelper.ts => credentials-helper.ts} | 4 +-- ...verwrites.ts => credentials-overwrites.ts} | 4 +-- .../__tests__/credentials.service.test.ts | 2 +- .../src/credentials/credentials.controller.ts | 6 ++-- .../src/credentials/credentials.service.ts | 12 ++++---- .../1674509946020-CreateLdapEntities.ts | 2 +- .../repositories/execution.repository.ts | 2 +- .../repositories/settings.repository.ts | 2 +- .../databases/subscribers/UserSubscriber.ts | 2 +- packages/cli/src/databases/types.ts | 2 +- .../src/databases/utils/migrationHelpers.ts | 4 +-- .../__tests__/controller.registry.test.ts | 2 +- ...OnShutdown.test.ts => on-shutdown.test.ts} | 4 +-- .../cli/src/decorators/controller.registry.ts | 6 ++-- packages/cli/src/decorators/index.ts | 10 +++---- .../decorators/{Licensed.ts => licensed.ts} | 0 .../{Middleware.ts => middleware.ts} | 0 .../{OnShutdown.ts => on-shutdown.ts} | 2 +- .../{Redactable.ts => redactable.ts} | 0 .../{RestController.ts => rest-controller.ts} | 0 .../cli/src/decorators/{Route.ts => route.ts} | 0 .../src/decorators/{Scoped.ts => scoped.ts} | 0 .../__tests__/sourceControlHelper.ee.test.ts | 2 +- .../sourceControl/sourceControl.service.ee.ts | 2 +- .../sourceControlExport.service.ee.ts | 2 +- .../sourceControlGit.service.ee.ts | 2 +- .../sourceControl/sourceControlHelper.ee.ts | 4 +-- .../sourceControlImport.service.ee.ts | 6 ++-- .../sourceControlPreferences.service.ee.ts | 2 +- .../variables/environmentHelpers.ts | 2 +- .../{ErrorReporting.ts => error-reporting.ts} | 0 .../MessageEventBus/MessageEventBus.ts | 4 +-- .../MessageEventBusDestination.ee.ts | 4 +-- .../MessageEventBusDestinationFromDb.ts | 2 +- .../MessageEventBusDestinationSyslog.ee.ts | 2 +- .../MessageEventBusDestinationWebhook.ee.ts | 4 +-- .../MessageEventBusLogWriter.ts | 2 +- .../__tests__/telemetry-event-relay.test.ts | 4 +-- .../src/events/log-streaming-event-relay.ts | 2 +- .../cli/src/events/telemetry-event-relay.ts | 6 ++-- .../__tests__/restore-binary-data-id.test.ts} | 2 +- .../save-execution-progress.test.ts} | 6 ++-- .../__tests__/to-save-settings.test.ts} | 2 +- .../restore-binary-data-id.ts} | 2 +- .../save-execution-progress.ts} | 4 +-- .../shared/shared-hook-functions.ts} | 2 +- .../to-save-settings.ts} | 0 .../__tests__/execution.service.test.ts | 4 +-- .../__tests__/executions.controller.test.ts | 2 +- .../executions/execution-recovery.service.ts | 4 +-- .../cli/src/executions/execution.service.ts | 14 +++++----- .../src/executions/executions.controller.ts | 4 +-- .../parse-range-query.middleware.ts | 2 +- ...onEvaluator.ts => expression-evaluator.ts} | 0 .../{ExternalHooks.ts => external-hooks.ts} | 0 .../external-secrets-manager.ee.test.ts} | 6 ++-- .../constants.ts | 0 .../external-secrets-helper.ee.ts} | 2 +- .../external-secrets-manager.ee.ts} | 8 +++--- .../external-secrets-providers.ee.ts} | 0 .../external-secrets.controller.ee.ts} | 2 +- .../external-secrets.service.ee.ts} | 2 +- .../__tests__/azure-key-vault.test.ts | 0 .../__tests__/gcp-secrets-manager.test.ts | 0 .../aws-secrets/aws-secrets-client.ts | 0 .../aws-secrets/aws-secrets-manager.ts | 2 +- .../providers/aws-secrets/types.ts | 0 .../azure-key-vault/azure-key-vault.ts | 2 +- .../providers/azure-key-vault/types.ts | 0 .../gcp-secrets-manager.ts | 2 +- .../providers/gcp-secrets-manager/types.ts | 0 .../providers/infisical.ts | 0 .../providers/vault.ts | 4 +-- .../{GenericHelpers.ts => generic-helpers.ts} | 0 .../{InternalHooks.ts => internal-hooks.ts} | 0 .../{Ldap => ldap}/__tests__/helpers.test.ts | 2 +- packages/cli/src/{Ldap => ldap}/constants.ts | 0 packages/cli/src/{Ldap => ldap}/helpers.ee.ts | 2 +- .../src/{Ldap => ldap}/ldap.controller.ee.ts | 0 .../cli/src/{Ldap => ldap}/ldap.service.ee.ts | 4 +-- packages/cli/src/{Ldap => ldap}/types.ts | 0 packages/cli/src/{License.ts => license.ts} | 4 +-- .../license/__tests__/license.service.test.ts | 2 +- packages/cli/src/license/license.service.ts | 4 +-- ...tials.ts => load-nodes-and-credentials.ts} | 2 +- packages/cli/src/{Logger.ts => logger.ts} | 0 packages/cli/src/{Mfa => mfa}/constants.ts | 0 packages/cli/src/{Mfa => mfa}/helpers.ts | 0 packages/cli/src/{Mfa => mfa}/mfa.service.ts | 0 packages/cli/src/{Mfa => mfa}/totp.service.ts | 0 .../{bodyParser.ts => body-parser.ts} | 0 packages/cli/src/middlewares/index.ts | 4 +-- .../__tests__/listQuery.test.ts | 8 +++--- .../dtos/base.filter.dto.ts | 0 .../dtos/base.select.dto.ts | 0 .../dtos/credentials.filter.dto.ts | 0 .../dtos/credentials.select.dto.ts | 0 .../dtos/pagination.dto.ts | 0 .../dtos/user.filter.dto.ts | 0 .../dtos/user.select.dto.ts | 0 .../dtos/workflow.filter.dto.ts | 0 .../dtos/workflow.select.dto.ts | 0 .../{listQuery => list-query}/filter.ts | 2 +- .../{listQuery => list-query}/index.ts | 0 .../{listQuery => list-query}/pagination.ts | 2 +- .../{listQuery => list-query}/select.ts | 2 +- .../cli/src/{NodeTypes.ts => node-types.ts} | 2 +- .../{checkAccess.ts => check-access.ts} | 0 .../src/push/__tests__/websocket.push.test.ts | 2 +- packages/cli/src/push/abstract.push.ts | 2 +- packages/cli/src/push/index.ts | 2 +- packages/cli/src/push/sse.push.ts | 2 +- packages/cli/src/push/websocket.push.ts | 2 +- .../{ResponseHelper.ts => response-helper.ts} | 2 +- packages/cli/src/scaling/job-processor.ts | 6 ++-- packages/cli/src/scaling/scaling.service.ts | 6 ++-- .../{SecretsHelpers.ts => secrets-helpers.ts} | 2 +- ...porter.ts => credentials-risk-reporter.ts} | 0 ...kReporter.ts => database-risk-reporter.ts} | 0 ...eporter.ts => filesystem-risk-reporter.ts} | 0 ...kReporter.ts => instance-risk-reporter.ts} | 2 +- ...RiskReporter.ts => nodes-risk-reporter.ts} | 2 +- ...t.service.ts => security-audit.service.ts} | 10 ++++++- packages/cli/src/{Server.ts => server.ts} | 20 ++++++------- .../__tests__/activeWorkflows.service.test.ts | 2 +- .../communityPackages.service.test.ts | 4 +-- .../credentials-tester.service.test.ts | 4 +-- .../__tests__/orchestration.service.test.ts | 6 ++-- .../services/__tests__/redis.service.test.ts | 2 +- .../src/services/activeWorkflows.service.ts | 4 +-- .../cli/src/services/aiAsisstant.service.ts | 2 +- .../src/services/communityPackages.service.ts | 6 ++-- .../services/credentials-tester.service.ts | 10 +++---- .../services/dynamicNodeParameters.service.ts | 2 +- packages/cli/src/services/frontend.service.ts | 20 ++++++------- packages/cli/src/services/import.service.ts | 4 +-- .../cli/src/services/orchestration.service.ts | 2 +- .../cli/src/services/orchestration/helpers.ts | 2 +- .../orchestration/main/MultiMainSetup.ee.ts | 2 +- .../main/handleCommandMessageMain.ts | 10 +++---- .../main/handleWorkerResponseMessageMain.ts | 2 +- .../webhook/handleCommandMessageWebhook.ts | 4 +-- .../worker/handleCommandMessageWorker.ts | 6 ++-- packages/cli/src/services/project.service.ts | 2 +- packages/cli/src/services/pruning.service.ts | 4 +-- .../services/redis/RedisServiceBaseClasses.ts | 2 +- .../services/redis/redis-client.service.ts | 4 +-- packages/cli/src/services/role.service.ts | 2 +- packages/cli/src/services/tag.service.ts | 4 +-- packages/cli/src/services/user.service.ts | 4 +-- .../services/workflow-statistics.service.ts | 2 +- .../__tests__/Shutdown.service.test.ts | 4 +-- ...hutdown.service.ts => shutdown.service.ts} | 2 +- .../saml/__tests__/saml.service.ee.test.ts | 4 +-- .../sso/saml/__tests__/samlHelpers.test.ts | 4 +-- ...ddleware.ts => saml-enabled-middleware.ts} | 2 +- .../src/sso/saml/routes/saml.controller.ee.ts | 12 ++++---- .../saml/{samlHelpers.ts => saml-helpers.ts} | 12 ++++---- .../{samlValidator.ts => saml-validator.ts} | 2 +- packages/cli/src/sso/saml/saml.service.ee.ts | 14 +++++----- ...eProvider.ee.ts => service-provider.ee.ts} | 2 +- packages/cli/src/sso/saml/types/requests.ts | 2 +- ...teMapping.ts => saml-attribute-mapping.ts} | 0 ...samlPreferences.ts => saml-preferences.ts} | 2 +- ...rAttributes.ts => saml-user-attributes.ts} | 0 .../{initSsoPost.ts => init-sso-post.ts} | 0 ...iled.ts => saml-connection-test-failed.ts} | 2 +- ...ess.ts => saml-connection-test-success.ts} | 2 +- .../src/sso/{ssoHelpers.ts => sso-helpers.ts} | 0 .../subworkflow-policy-checker.test.ts | 2 +- .../subworkflow-policy-checker.service.ts | 4 +-- packages/cli/src/telemetry/index.ts | 6 ++-- .../email/Interfaces.ts | 0 .../__tests__/user-management-mailer.test.ts} | 6 ++-- .../cli/src/user-management/email/index.ts | 3 ++ .../email/node-mailer.ts} | 2 +- .../email/templates/credentialsShared.html | 0 .../email/templates/instanceSetup.html | 0 .../email/templates/invite.html | 0 .../email/templates/passwordReset.html | 0 .../email/templates/workflowShared.html | 0 .../email/user-management-mailer.ts} | 4 +-- .../permission-checker.ts} | 0 .../src/{WaitTracker.ts => wait-tracker.ts} | 4 +-- .../src/{WaitingForms.ts => waiting-forms.ts} | 2 +- .../webhooks/__tests__/TestWebhooks.test.ts | 8 +++--- .../__tests__/WebhookRequestHandler.test.ts | 2 +- .../__tests__/waiting-webhooks.test.ts | 2 +- .../{LiveWebhooks.ts => live-webhooks.ts} | 10 +++---- .../{TestWebhooks.ts => test-webhooks.ts} | 6 ++-- ...WaitingWebhooks.ts => waiting-webhooks.ts} | 8 +++--- .../{WebhookHelpers.ts => webhook-helpers.ts} | 10 +++---- ...tHandler.ts => webhook-request-handler.ts} | 2 +- .../{WebhookServer.ts => webhook-server.ts} | 2 +- ...ts => workflow-execute-additional-data.ts} | 28 +++++++++---------- ...WorkflowHelpers.ts => workflow-helpers.ts} | 0 .../{WorkflowRunner.ts => workflow-runner.ts} | 18 ++++++------ .../workflow-execution.service.test.ts | 4 +-- ...rvice.ts => workflow-execution.service.ts} | 12 ++++---- .../workflow-history-helper.ee.test.ts} | 4 +-- .../workflow-history.service.ee.test.ts} | 6 ++-- .../constants.ts | 0 .../workflow-history-helper.ee.ts} | 2 +- .../workflow-history-manager.ee.ts} | 5 +++- .../workflow-history.controller.ee.ts} | 6 ++-- .../workflow-history.service.ee.ts} | 4 +-- ...service.ts => workflow-sharing.service.ts} | 0 ...ice.ts => workflow-static-data.service.ts} | 2 +- .../cli/src/workflows/workflow.service.ee.ts | 4 +-- .../cli/src/workflows/workflow.service.ts | 14 +++++----- .../cli/src/workflows/workflows.controller.ts | 18 ++++++------ .../integration/CredentialsHelper.test.ts | 2 +- .../externalSecrets.api.test.ts | 6 ++-- .../activation-errors.service.test.ts | 2 +- .../active-workflow-manager.test.ts | 16 +++++------ .../cli/test/integration/auth.api.test.ts | 2 +- packages/cli/test/integration/auth.mw.test.ts | 2 +- .../commands/credentials.cmd.test.ts | 2 +- .../integration/commands/import.cmd.test.ts | 2 +- .../integration/commands/ldap/reset.test.ts | 6 ++-- .../integration/commands/license.cmd.test.ts | 4 +-- .../integration/commands/reset.cmd.test.ts | 4 +-- .../commands/update/workflow.test.ts | 2 +- .../integration/commands/worker.cmd.test.ts | 8 +++--- .../community-packages.api.test.ts | 2 +- ...dynamic-node-parameters.controller.test.ts | 2 +- .../invitation.controller.integration.test.ts | 4 +-- .../controllers/oauth/oauth2.api.test.ts | 2 +- .../credentials/credentials.api.ee.test.ts | 2 +- .../test/integration/debug.controller.test.ts | 2 +- .../integration/executions.controller.test.ts | 2 +- .../test/integration/ldap/ldap.api.test.ts | 8 +++--- .../cli/test/integration/license.api.test.ts | 2 +- .../cli/test/integration/mfa/mfa.api.test.ts | 2 +- .../middlewares/bodyParser.test.ts | 2 +- .../integration/passwordReset.api.test.ts | 8 +++--- ...ker.test.ts => permission-checker.test.ts} | 16 +++++------ .../cli/test/integration/project.api.test.ts | 2 +- .../test/integration/pruning.service.test.ts | 2 +- .../integration/publicApi/executions.test.ts | 2 +- .../integration/publicApi/users.ee.test.ts | 2 +- .../integration/publicApi/workflows.test.ts | 2 +- .../test/integration/saml/saml.api.test.ts | 4 +-- .../test/integration/saml/samlHelpers.test.ts | 4 +-- .../CredentialsRiskReporter.test.ts | 2 +- .../DatabaseRiskReporter.test.ts | 2 +- .../FilesystemRiskReporter.test.ts | 2 +- .../InstanceRiskReporter.test.ts | 2 +- .../security-audit/NodesRiskReporter.test.ts | 6 ++-- .../workflowStaticData.service.test.ts | 4 +-- .../test/integration/shared/db/credentials.ts | 2 +- .../cli/test/integration/shared/db/users.ts | 4 +-- packages/cli/test/integration/shared/ldap.ts | 4 +-- .../cli/test/integration/shared/license.ts | 2 +- .../test/integration/shared/utils/index.ts | 4 +-- .../integration/shared/utils/testCommand.ts | 4 +-- .../integration/shared/utils/testServer.ts | 14 +++++----- .../cli/test/integration/webhooks.api.test.ts | 6 ++-- .../cli/test/integration/webhooks.test.ts | 12 ++++---- .../workflowHistoryManager.test.ts | 4 +-- .../workflows/workflow.service.test.ts | 2 +- .../workflows/workflowSharing.service.test.ts | 4 +-- .../workflows/workflows.controller.ee.test.ts | 6 ++-- .../workflows/workflows.controller.test.ts | 4 +-- 337 files changed, 633 insertions(+), 623 deletions(-) delete mode 100644 packages/cli/src/UserManagement/email/index.ts rename packages/cli/src/__tests__/{ActiveExecutions.test.ts => active-executions.test.ts} (99%) rename packages/cli/src/__tests__/{CredentialTypes.test.ts => credential-types.test.ts} (89%) rename packages/cli/src/__tests__/{CredentialsHelper.test.ts => credentials-helper.test.ts} (97%) rename packages/cli/src/__tests__/{WaitTracker.test.ts => wait-tracker.test.ts} (98%) rename packages/cli/src/__tests__/{WorkflowExecuteAdditionalData.test.ts => workflow-execute-additional-data.test.ts} (88%) rename packages/cli/src/__tests__/{WorkflowHelpers.test.ts => workflow-helpers.test.ts} (95%) rename packages/cli/src/__tests__/{WorkflowRunner.test.ts => workflow-runner.test.ts} (97%) rename packages/cli/src/{AbstractServer.ts => abstract-server.ts} (93%) rename packages/cli/src/{ActivationErrors.service.ts => activation-errors.service.ts} (100%) rename packages/cli/src/{ActiveExecutions.ts => active-executions.ts} (99%) rename packages/cli/src/{ActiveWorkflowManager.ts => active-workflow-manager.ts} (97%) rename packages/cli/src/commands/{BaseCommand.ts => base-command.ts} (93%) rename packages/cli/src/{CrashJournal.ts => crash-journal.ts} (96%) rename packages/cli/src/{CredentialTypes.ts => credential-types.ts} (96%) rename packages/cli/src/{CredentialsHelper.ts => credentials-helper.ts} (99%) rename packages/cli/src/{CredentialsOverwrites.ts => credentials-overwrites.ts} (97%) rename packages/cli/src/decorators/__tests__/{OnShutdown.test.ts => on-shutdown.test.ts} (95%) rename packages/cli/src/decorators/{Licensed.ts => licensed.ts} (100%) rename packages/cli/src/decorators/{Middleware.ts => middleware.ts} (100%) rename packages/cli/src/decorators/{OnShutdown.ts => on-shutdown.ts} (95%) rename packages/cli/src/decorators/{Redactable.ts => redactable.ts} (100%) rename packages/cli/src/decorators/{RestController.ts => rest-controller.ts} (100%) rename packages/cli/src/decorators/{Route.ts => route.ts} (100%) rename packages/cli/src/decorators/{Scoped.ts => scoped.ts} (100%) rename packages/cli/src/{ErrorReporting.ts => error-reporting.ts} (100%) rename packages/cli/src/{executionLifecycleHooks/__tests__/restoreBinaryDataId.test.ts => execution-lifecycle-hooks/__tests__/restore-binary-data-id.test.ts} (98%) rename packages/cli/src/{executionLifecycleHooks/__tests__/saveExecutionProgress.test.ts => execution-lifecycle-hooks/__tests__/save-execution-progress.test.ts} (92%) rename packages/cli/src/{executionLifecycleHooks/__tests__/toSaveSettings.test.ts => execution-lifecycle-hooks/__tests__/to-save-settings.test.ts} (98%) rename packages/cli/src/{executionLifecycleHooks/restoreBinaryDataId.ts => execution-lifecycle-hooks/restore-binary-data-id.ts} (98%) rename packages/cli/src/{executionLifecycleHooks/saveExecutionProgress.ts => execution-lifecycle-hooks/save-execution-progress.ts} (96%) rename packages/cli/src/{executionLifecycleHooks/shared/sharedHookFunctions.ts => execution-lifecycle-hooks/shared/shared-hook-functions.ts} (99%) rename packages/cli/src/{executionLifecycleHooks/toSaveSettings.ts => execution-lifecycle-hooks/to-save-settings.ts} (100%) rename packages/cli/src/{ExpressionEvaluator.ts => expression-evaluator.ts} (100%) rename packages/cli/src/{ExternalHooks.ts => external-hooks.ts} (100%) rename packages/cli/src/{ExternalSecrets/__tests__/ExternalSecretsManager.ee.test.ts => external-secrets/__tests__/external-secrets-manager.ee.test.ts} (94%) rename packages/cli/src/{ExternalSecrets => external-secrets}/constants.ts (100%) rename packages/cli/src/{ExternalSecrets/externalSecretsHelper.ee.ts => external-secrets/external-secrets-helper.ee.ts} (91%) rename packages/cli/src/{ExternalSecrets/ExternalSecretsManager.ee.ts => external-secrets/external-secrets-manager.ee.ts} (98%) rename packages/cli/src/{ExternalSecrets/ExternalSecretsProviders.ee.ts => external-secrets/external-secrets-providers.ee.ts} (100%) rename packages/cli/src/{ExternalSecrets/ExternalSecrets.controller.ee.ts => external-secrets/external-secrets.controller.ee.ts} (97%) rename packages/cli/src/{ExternalSecrets/ExternalSecrets.service.ee.ts => external-secrets/external-secrets.service.ee.ts} (98%) rename packages/cli/src/{ExternalSecrets => external-secrets}/providers/__tests__/azure-key-vault.test.ts (100%) rename packages/cli/src/{ExternalSecrets => external-secrets}/providers/__tests__/gcp-secrets-manager.test.ts (100%) rename packages/cli/src/{ExternalSecrets => external-secrets}/providers/aws-secrets/aws-secrets-client.ts (100%) rename packages/cli/src/{ExternalSecrets => external-secrets}/providers/aws-secrets/aws-secrets-manager.ts (99%) rename packages/cli/src/{ExternalSecrets => external-secrets}/providers/aws-secrets/types.ts (100%) rename packages/cli/src/{ExternalSecrets => external-secrets}/providers/azure-key-vault/azure-key-vault.ts (99%) rename packages/cli/src/{ExternalSecrets => external-secrets}/providers/azure-key-vault/types.ts (100%) rename packages/cli/src/{ExternalSecrets => external-secrets}/providers/gcp-secrets-manager/gcp-secrets-manager.ts (99%) rename packages/cli/src/{ExternalSecrets => external-secrets}/providers/gcp-secrets-manager/types.ts (100%) rename packages/cli/src/{ExternalSecrets => external-secrets}/providers/infisical.ts (100%) rename packages/cli/src/{ExternalSecrets => external-secrets}/providers/vault.ts (99%) rename packages/cli/src/{GenericHelpers.ts => generic-helpers.ts} (100%) rename packages/cli/src/{InternalHooks.ts => internal-hooks.ts} (100%) rename packages/cli/src/{Ldap => ldap}/__tests__/helpers.test.ts (96%) rename packages/cli/src/{Ldap => ldap}/constants.ts (100%) rename packages/cli/src/{Ldap => ldap}/helpers.ee.ts (99%) rename packages/cli/src/{Ldap => ldap}/ldap.controller.ee.ts (100%) rename packages/cli/src/{Ldap => ldap}/ldap.service.ee.ts (99%) rename packages/cli/src/{Ldap => ldap}/types.ts (100%) rename packages/cli/src/{License.ts => license.ts} (99%) rename packages/cli/src/{LoadNodesAndCredentials.ts => load-nodes-and-credentials.ts} (99%) rename packages/cli/src/{Logger.ts => logger.ts} (100%) rename packages/cli/src/{Mfa => mfa}/constants.ts (100%) rename packages/cli/src/{Mfa => mfa}/helpers.ts (100%) rename packages/cli/src/{Mfa => mfa}/mfa.service.ts (100%) rename packages/cli/src/{Mfa => mfa}/totp.service.ts (100%) rename packages/cli/src/middlewares/{bodyParser.ts => body-parser.ts} (100%) rename packages/cli/src/middlewares/{listQuery => list-query}/__tests__/listQuery.test.ts (96%) rename packages/cli/src/middlewares/{listQuery => list-query}/dtos/base.filter.dto.ts (100%) rename packages/cli/src/middlewares/{listQuery => list-query}/dtos/base.select.dto.ts (100%) rename packages/cli/src/middlewares/{listQuery => list-query}/dtos/credentials.filter.dto.ts (100%) rename packages/cli/src/middlewares/{listQuery => list-query}/dtos/credentials.select.dto.ts (100%) rename packages/cli/src/middlewares/{listQuery => list-query}/dtos/pagination.dto.ts (100%) rename packages/cli/src/middlewares/{listQuery => list-query}/dtos/user.filter.dto.ts (100%) rename packages/cli/src/middlewares/{listQuery => list-query}/dtos/user.select.dto.ts (100%) rename packages/cli/src/middlewares/{listQuery => list-query}/dtos/workflow.filter.dto.ts (100%) rename packages/cli/src/middlewares/{listQuery => list-query}/dtos/workflow.select.dto.ts (100%) rename packages/cli/src/middlewares/{listQuery => list-query}/filter.ts (95%) rename packages/cli/src/middlewares/{listQuery => list-query}/index.ts (100%) rename packages/cli/src/middlewares/{listQuery => list-query}/pagination.ts (93%) rename packages/cli/src/middlewares/{listQuery => list-query}/select.ts (95%) rename packages/cli/src/{NodeTypes.ts => node-types.ts} (98%) rename packages/cli/src/permissions/{checkAccess.ts => check-access.ts} (100%) rename packages/cli/src/{ResponseHelper.ts => response-helper.ts} (99%) rename packages/cli/src/{SecretsHelpers.ts => secrets-helpers.ts} (91%) rename packages/cli/src/security-audit/risk-reporters/{CredentialsRiskReporter.ts => credentials-risk-reporter.ts} (100%) rename packages/cli/src/security-audit/risk-reporters/{DatabaseRiskReporter.ts => database-risk-reporter.ts} (100%) rename packages/cli/src/security-audit/risk-reporters/{FilesystemRiskReporter.ts => filesystem-risk-reporter.ts} (100%) rename packages/cli/src/security-audit/risk-reporters/{InstanceRiskReporter.ts => instance-risk-reporter.ts} (99%) rename packages/cli/src/security-audit/risk-reporters/{NodesRiskReporter.ts => nodes-risk-reporter.ts} (98%) rename packages/cli/src/security-audit/{SecurityAudit.service.ts => security-audit.service.ts} (83%) rename packages/cli/src/{Server.ts => server.ts} (95%) rename packages/cli/src/shutdown/{Shutdown.service.ts => shutdown.service.ts} (99%) rename packages/cli/src/sso/saml/middleware/{samlEnabledMiddleware.ts => saml-enabled-middleware.ts} (97%) rename packages/cli/src/sso/saml/{samlHelpers.ts => saml-helpers.ts} (95%) rename packages/cli/src/sso/saml/{samlValidator.ts => saml-validator.ts} (99%) rename packages/cli/src/sso/saml/{serviceProvider.ee.ts => service-provider.ee.ts} (96%) rename packages/cli/src/sso/saml/types/{samlAttributeMapping.ts => saml-attribute-mapping.ts} (100%) rename packages/cli/src/sso/saml/types/{samlPreferences.ts => saml-preferences.ts} (94%) rename packages/cli/src/sso/saml/types/{samlUserAttributes.ts => saml-user-attributes.ts} (100%) rename packages/cli/src/sso/saml/views/{initSsoPost.ts => init-sso-post.ts} (100%) rename packages/cli/src/sso/saml/views/{samlConnectionTestFailed.ts => saml-connection-test-failed.ts} (95%) rename packages/cli/src/sso/saml/views/{samlConnectionTestSuccess.ts => saml-connection-test-success.ts} (95%) rename packages/cli/src/sso/{ssoHelpers.ts => sso-helpers.ts} (100%) rename packages/cli/src/{UserManagement => user-management}/email/Interfaces.ts (100%) rename packages/cli/src/{UserManagement/email/__tests__/UserManagementMailer.test.ts => user-management/email/__tests__/user-management-mailer.test.ts} (91%) create mode 100644 packages/cli/src/user-management/email/index.ts rename packages/cli/src/{UserManagement/email/NodeMailer.ts => user-management/email/node-mailer.ts} (98%) rename packages/cli/src/{UserManagement => user-management}/email/templates/credentialsShared.html (100%) rename packages/cli/src/{UserManagement => user-management}/email/templates/instanceSetup.html (100%) rename packages/cli/src/{UserManagement => user-management}/email/templates/invite.html (100%) rename packages/cli/src/{UserManagement => user-management}/email/templates/passwordReset.html (100%) rename packages/cli/src/{UserManagement => user-management}/email/templates/workflowShared.html (100%) rename packages/cli/src/{UserManagement/email/UserManagementMailer.ts => user-management/email/user-management-mailer.ts} (98%) rename packages/cli/src/{UserManagement/PermissionChecker.ts => user-management/permission-checker.ts} (100%) rename packages/cli/src/{WaitTracker.ts => wait-tracker.ts} (98%) rename packages/cli/src/{WaitingForms.ts => waiting-forms.ts} (89%) rename packages/cli/src/webhooks/{LiveWebhooks.ts => live-webhooks.ts} (94%) rename packages/cli/src/webhooks/{TestWebhooks.ts => test-webhooks.ts} (98%) rename packages/cli/src/webhooks/{WaitingWebhooks.ts => waiting-webhooks.ts} (95%) rename packages/cli/src/webhooks/{WebhookHelpers.ts => webhook-helpers.ts} (98%) rename packages/cli/src/webhooks/{WebhookRequestHandler.ts => webhook-request-handler.ts} (98%) rename packages/cli/src/webhooks/{WebhookServer.ts => webhook-server.ts} (72%) rename packages/cli/src/{WorkflowExecuteAdditionalData.ts => workflow-execute-additional-data.ts} (97%) rename packages/cli/src/{WorkflowHelpers.ts => workflow-helpers.ts} (100%) rename packages/cli/src/{WorkflowRunner.ts => workflow-runner.ts} (97%) rename packages/cli/src/workflows/{workflowExecution.service.ts => workflow-execution.service.ts} (96%) rename packages/cli/src/workflows/{workflowHistory/__tests__/workflowHistoryHelper.ee.test.ts => workflow-history/__tests__/workflow-history-helper.ee.test.ts} (94%) rename packages/cli/src/workflows/{workflowHistory/__tests__/workflowHistory.service.ee.test.ts => workflow-history/__tests__/workflow-history.service.ee.test.ts} (94%) rename packages/cli/src/workflows/{workflowHistory => workflow-history}/constants.ts (100%) rename packages/cli/src/workflows/{workflowHistory/workflowHistoryHelper.ee.ts => workflow-history/workflow-history-helper.ee.ts} (96%) rename packages/cli/src/workflows/{workflowHistory/workflowHistoryManager.ee.ts => workflow-history/workflow-history-manager.ee.ts} (90%) rename packages/cli/src/workflows/{workflowHistory/workflowHistory.controller.ee.ts => workflow-history/workflow-history.controller.ee.ts} (94%) rename packages/cli/src/workflows/{workflowHistory/workflowHistory.service.ee.ts => workflow-history/workflow-history.service.ee.ts} (96%) rename packages/cli/src/workflows/{workflowSharing.service.ts => workflow-sharing.service.ts} (100%) rename packages/cli/src/workflows/{workflowStaticData.service.ts => workflow-static-data.service.ts} (98%) rename packages/cli/test/integration/{PermissionChecker.test.ts => permission-checker.test.ts} (92%) diff --git a/packages/cli/scripts/build.mjs b/packages/cli/scripts/build.mjs index b1f5f5bd8f..36076ccfd4 100644 --- a/packages/cli/scripts/build.mjs +++ b/packages/cli/scripts/build.mjs @@ -23,8 +23,8 @@ if (publicApiEnabled) { function copyUserManagementEmailTemplates() { const templates = { - source: path.resolve(ROOT_DIR, 'src', 'UserManagement', 'email', 'templates'), - destination: path.resolve(ROOT_DIR, 'dist', 'UserManagement', 'email'), + source: path.resolve(ROOT_DIR, 'src', 'user-management', 'email', 'templates'), + destination: path.resolve(ROOT_DIR, 'dist', 'user-management', 'email'), }; shell.cp('-r', templates.source, templates.destination); diff --git a/packages/cli/src/Interfaces.ts b/packages/cli/src/Interfaces.ts index 73b1e99ec6..f6c3f4670f 100644 --- a/packages/cli/src/Interfaces.ts +++ b/packages/cli/src/Interfaces.ts @@ -25,7 +25,7 @@ import type { StartNodeData, } from 'n8n-workflow'; -import type { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import type { ActiveWorkflowManager } from '@/active-workflow-manager'; import type { WorkflowExecute } from 'n8n-core'; @@ -39,7 +39,7 @@ import type { CredentialsRepository } from '@db/repositories/credentials.reposit import type { SettingsRepository } from '@db/repositories/settings.repository'; import type { UserRepository } from '@db/repositories/user.repository'; import type { WorkflowRepository } from '@db/repositories/workflow.repository'; -import type { ExternalHooks } from './ExternalHooks'; +import type { ExternalHooks } from './external-hooks'; import type { LICENSE_FEATURES, LICENSE_QUOTAS } from './constants'; import type { WorkflowWithSharingsAndCredentials } from './workflows/workflows.types'; import type { RunningJobSummary } from './scaling/types'; diff --git a/packages/cli/src/PublicApi/index.ts b/packages/cli/src/PublicApi/index.ts index af4fc97fc7..35c6d9862e 100644 --- a/packages/cli/src/PublicApi/index.ts +++ b/packages/cli/src/PublicApi/index.ts @@ -10,7 +10,7 @@ import type { HttpError } from 'express-openapi-validator/dist/framework/types'; import type { OpenAPIV3 } from 'openapi-types'; import type { JsonObject } from 'swagger-ui-express'; -import { License } from '@/License'; +import { License } from '@/license'; import { UserRepository } from '@db/repositories/user.repository'; import { UrlService } from '@/services/url.service'; import type { AuthenticatedRequest } from '@/requests'; diff --git a/packages/cli/src/PublicApi/v1/handlers/audit/audit.handler.ts b/packages/cli/src/PublicApi/v1/handlers/audit/audit.handler.ts index caf3750ad4..8aa09cb902 100644 --- a/packages/cli/src/PublicApi/v1/handlers/audit/audit.handler.ts +++ b/packages/cli/src/PublicApi/v1/handlers/audit/audit.handler.ts @@ -8,7 +8,7 @@ export = { globalScope('securityAudit:generate'), async (req: AuditRequest.Generate, res: Response): Promise => { try { - const { SecurityAuditService } = await import('@/security-audit/SecurityAudit.service'); + const { SecurityAuditService } = await import('@/security-audit/security-audit.service'); const result = await Container.get(SecurityAuditService).run( req.body?.additionalOptions?.categories, req.body?.additionalOptions?.daysAbandonedWorkflow, diff --git a/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.handler.ts b/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.handler.ts index 57b6bd66f6..2c13f6de56 100644 --- a/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.handler.ts +++ b/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.handler.ts @@ -1,8 +1,8 @@ /* eslint-disable @typescript-eslint/no-unsafe-argument */ import type express from 'express'; -import { CredentialsHelper } from '@/CredentialsHelper'; -import { CredentialTypes } from '@/CredentialTypes'; +import { CredentialsHelper } from '@/credentials-helper'; +import { CredentialTypes } from '@/credential-types'; import type { CredentialsEntity } from '@db/entities/CredentialsEntity'; import type { CredentialTypeRequest, CredentialRequest } from '../../../types'; import { projectScope } from '../../shared/middlewares/global.middleware'; diff --git a/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.middleware.ts b/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.middleware.ts index b7c2412923..8583c866b8 100644 --- a/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.middleware.ts +++ b/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.middleware.ts @@ -3,8 +3,8 @@ import type express from 'express'; import { validate } from 'jsonschema'; -import { CredentialsHelper } from '@/CredentialsHelper'; -import { CredentialTypes } from '@/CredentialTypes'; +import { CredentialsHelper } from '@/credentials-helper'; +import { CredentialTypes } from '@/credential-types'; import type { CredentialRequest } from '../../../types'; import { toJsonSchema } from './credentials.service'; import { Container } from 'typedi'; diff --git a/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.service.ts b/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.service.ts index 2c4a35a6aa..075c7fcf11 100644 --- a/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.service.ts +++ b/packages/cli/src/PublicApi/v1/handlers/credentials/credentials.service.ts @@ -10,7 +10,7 @@ import type { ICredentialsDb } from '@/Interfaces'; import { CredentialsEntity } from '@db/entities/CredentialsEntity'; import { SharedCredentials } from '@db/entities/SharedCredentials'; import type { User } from '@db/entities/User'; -import { ExternalHooks } from '@/ExternalHooks'; +import { ExternalHooks } from '@/external-hooks'; import type { IDependency, IJsonSchema } from '../../../types'; import type { CredentialRequest } from '@/requests'; import { Container } from 'typedi'; diff --git a/packages/cli/src/PublicApi/v1/handlers/executions/executions.handler.ts b/packages/cli/src/PublicApi/v1/handlers/executions/executions.handler.ts index ab6927724c..beba4606aa 100644 --- a/packages/cli/src/PublicApi/v1/handlers/executions/executions.handler.ts +++ b/packages/cli/src/PublicApi/v1/handlers/executions/executions.handler.ts @@ -2,7 +2,7 @@ import type express from 'express'; import { Container } from 'typedi'; import { replaceCircularReferences } from 'n8n-workflow'; -import { ActiveExecutions } from '@/ActiveExecutions'; +import { ActiveExecutions } from '@/active-executions'; import { validCursor } from '../../shared/middlewares/global.middleware'; import type { ExecutionRequest } from '../../../types'; import { getSharedWorkflowIds } from '../workflows/workflows.service'; diff --git a/packages/cli/src/PublicApi/v1/handlers/workflows/workflows.handler.ts b/packages/cli/src/PublicApi/v1/handlers/workflows/workflows.handler.ts index 8515548dea..42c3e269ab 100644 --- a/packages/cli/src/PublicApi/v1/handlers/workflows/workflows.handler.ts +++ b/packages/cli/src/PublicApi/v1/handlers/workflows/workflows.handler.ts @@ -7,11 +7,11 @@ import type { FindOptionsWhere } from '@n8n/typeorm'; import { In, Like, QueryFailedError } from '@n8n/typeorm'; import { v4 as uuid } from 'uuid'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import config from '@/config'; import { WorkflowEntity } from '@db/entities/WorkflowEntity'; -import { ExternalHooks } from '@/ExternalHooks'; -import { addNodeIds, replaceInvalidCredentials } from '@/WorkflowHelpers'; +import { ExternalHooks } from '@/external-hooks'; +import { addNodeIds, replaceInvalidCredentials } from '@/workflow-helpers'; import type { WorkflowRequest } from '../../../types'; import { projectScope, validCursor } from '../../shared/middlewares/global.middleware'; import { encodeNextCursor } from '../../shared/services/pagination.service'; @@ -26,7 +26,7 @@ import { updateTags, } from './workflows.service'; import { WorkflowService } from '@/workflows/workflow.service'; -import { WorkflowHistoryService } from '@/workflows/workflowHistory/workflowHistory.service.ee'; +import { WorkflowHistoryService } from '@/workflows/workflow-history/workflow-history.service.ee'; import { SharedWorkflowRepository } from '@/databases/repositories/sharedWorkflow.repository'; import { TagRepository } from '@/databases/repositories/tag.repository'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; diff --git a/packages/cli/src/PublicApi/v1/handlers/workflows/workflows.service.ts b/packages/cli/src/PublicApi/v1/handlers/workflows/workflows.service.ts index 3e3afc078e..5fba88ff16 100644 --- a/packages/cli/src/PublicApi/v1/handlers/workflows/workflows.service.ts +++ b/packages/cli/src/PublicApi/v1/handlers/workflows/workflows.service.ts @@ -8,8 +8,8 @@ import { WorkflowRepository } from '@db/repositories/workflow.repository'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import type { Project } from '@/databases/entities/Project'; import { TagRepository } from '@db/repositories/tag.repository'; -import { License } from '@/License'; -import { WorkflowSharingService } from '@/workflows/workflowSharing.service'; +import { License } from '@/license'; +import { WorkflowSharingService } from '@/workflows/workflow-sharing.service'; import type { Scope } from '@n8n/permissions'; import config from '@/config'; diff --git a/packages/cli/src/PublicApi/v1/shared/middlewares/global.middleware.ts b/packages/cli/src/PublicApi/v1/shared/middlewares/global.middleware.ts index 7e8c39bb91..1b70b9770d 100644 --- a/packages/cli/src/PublicApi/v1/shared/middlewares/global.middleware.ts +++ b/packages/cli/src/PublicApi/v1/shared/middlewares/global.middleware.ts @@ -2,13 +2,13 @@ import type express from 'express'; import { Container } from 'typedi'; -import { License } from '@/License'; +import { License } from '@/license'; import type { AuthenticatedRequest } from '@/requests'; import type { PaginatedRequest } from '../../../types'; import { decodeCursor } from '../services/pagination.service'; import type { Scope } from '@n8n/permissions'; -import { userHasScope } from '@/permissions/checkAccess'; +import { userHasScope } from '@/permissions/check-access'; import type { BooleanLicenseFeature } from '@/Interfaces'; import { FeatureNotLicensedError } from '@/errors/feature-not-licensed.error'; diff --git a/packages/cli/src/UserManagement/email/index.ts b/packages/cli/src/UserManagement/email/index.ts deleted file mode 100644 index 8c94805eb6..0000000000 --- a/packages/cli/src/UserManagement/email/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { UserManagementMailer } from './UserManagementMailer'; - -export { UserManagementMailer }; diff --git a/packages/cli/src/__tests__/License.test.ts b/packages/cli/src/__tests__/License.test.ts index 31effecc0e..712340664f 100644 --- a/packages/cli/src/__tests__/License.test.ts +++ b/packages/cli/src/__tests__/License.test.ts @@ -2,8 +2,8 @@ import { LicenseManager } from '@n8n_io/license-sdk'; import { InstanceSettings } from 'n8n-core'; import { mock } from 'jest-mock-extended'; import config from '@/config'; -import { License } from '@/License'; -import { Logger } from '@/Logger'; +import { License } from '@/license'; +import { Logger } from '@/logger'; import { N8N_VERSION } from '@/constants'; import { mockInstance } from '@test/mocking'; import { OrchestrationService } from '@/services/orchestration.service'; diff --git a/packages/cli/src/__tests__/ActiveExecutions.test.ts b/packages/cli/src/__tests__/active-executions.test.ts similarity index 99% rename from packages/cli/src/__tests__/ActiveExecutions.test.ts rename to packages/cli/src/__tests__/active-executions.test.ts index 0cc70a10a4..539c160700 100644 --- a/packages/cli/src/__tests__/ActiveExecutions.test.ts +++ b/packages/cli/src/__tests__/active-executions.test.ts @@ -1,4 +1,4 @@ -import { ActiveExecutions } from '@/ActiveExecutions'; +import { ActiveExecutions } from '@/active-executions'; import PCancelable from 'p-cancelable'; import { v4 as uuid } from 'uuid'; import type { IExecuteResponsePromiseData, IRun } from 'n8n-workflow'; diff --git a/packages/cli/src/__tests__/CredentialTypes.test.ts b/packages/cli/src/__tests__/credential-types.test.ts similarity index 89% rename from packages/cli/src/__tests__/CredentialTypes.test.ts rename to packages/cli/src/__tests__/credential-types.test.ts index 2a8e6a939a..b65e5a4aa3 100644 --- a/packages/cli/src/__tests__/CredentialTypes.test.ts +++ b/packages/cli/src/__tests__/credential-types.test.ts @@ -1,6 +1,6 @@ -import { CredentialTypes } from '@/CredentialTypes'; +import { CredentialTypes } from '@/credential-types'; import { Container } from 'typedi'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { mockInstance } from '@test/mocking'; describe('CredentialTypes', () => { diff --git a/packages/cli/src/__tests__/CredentialsHelper.test.ts b/packages/cli/src/__tests__/credentials-helper.test.ts similarity index 97% rename from packages/cli/src/__tests__/CredentialsHelper.test.ts rename to packages/cli/src/__tests__/credentials-helper.test.ts index 88cd19ad3d..61c3f93013 100644 --- a/packages/cli/src/__tests__/CredentialsHelper.test.ts +++ b/packages/cli/src/__tests__/credentials-helper.test.ts @@ -9,9 +9,9 @@ import type { } from 'n8n-workflow'; import { deepCopy } from 'n8n-workflow'; import { Workflow } from 'n8n-workflow'; -import { CredentialsHelper } from '@/CredentialsHelper'; -import { NodeTypes } from '@/NodeTypes'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { CredentialsHelper } from '@/credentials-helper'; +import { NodeTypes } from '@/node-types'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { CredentialsRepository } from '@db/repositories/credentials.repository'; import { SharedCredentialsRepository } from '@db/repositories/sharedCredentials.repository'; import { mockInstance } from '@test/mocking'; diff --git a/packages/cli/src/__tests__/WaitTracker.test.ts b/packages/cli/src/__tests__/wait-tracker.test.ts similarity index 98% rename from packages/cli/src/__tests__/WaitTracker.test.ts rename to packages/cli/src/__tests__/wait-tracker.test.ts index fb51d2e25b..ee0697e110 100644 --- a/packages/cli/src/__tests__/WaitTracker.test.ts +++ b/packages/cli/src/__tests__/wait-tracker.test.ts @@ -1,4 +1,4 @@ -import { WaitTracker } from '@/WaitTracker'; +import { WaitTracker } from '@/wait-tracker'; import { mock } from 'jest-mock-extended'; import type { ExecutionRepository } from '@/databases/repositories/execution.repository'; import type { IExecutionResponse } from '@/Interfaces'; diff --git a/packages/cli/src/__tests__/WorkflowExecuteAdditionalData.test.ts b/packages/cli/src/__tests__/workflow-execute-additional-data.test.ts similarity index 88% rename from packages/cli/src/__tests__/WorkflowExecuteAdditionalData.test.ts rename to packages/cli/src/__tests__/workflow-execute-additional-data.test.ts index eca60e56c5..f51d994493 100644 --- a/packages/cli/src/__tests__/WorkflowExecuteAdditionalData.test.ts +++ b/packages/cli/src/__tests__/workflow-execute-additional-data.test.ts @@ -1,10 +1,10 @@ import { VariablesService } from '@/environments/variables/variables.service.ee'; import { mockInstance } from '@test/mocking'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; -import { getBase } from '@/WorkflowExecuteAdditionalData'; +import { getBase } from '@/workflow-execute-additional-data'; import Container from 'typedi'; -import { CredentialsHelper } from '@/CredentialsHelper'; -import { SecretsHelper } from '@/SecretsHelpers'; +import { CredentialsHelper } from '@/credentials-helper'; +import { SecretsHelper } from '@/secrets-helpers'; describe('WorkflowExecuteAdditionalData', () => { const messageEventBus = mockInstance(MessageEventBus); diff --git a/packages/cli/src/__tests__/WorkflowHelpers.test.ts b/packages/cli/src/__tests__/workflow-helpers.test.ts similarity index 95% rename from packages/cli/src/__tests__/WorkflowHelpers.test.ts rename to packages/cli/src/__tests__/workflow-helpers.test.ts index 1b5da0a4de..32f4933349 100644 --- a/packages/cli/src/__tests__/WorkflowHelpers.test.ts +++ b/packages/cli/src/__tests__/workflow-helpers.test.ts @@ -1,5 +1,5 @@ import { type Workflow } from 'n8n-workflow'; -import { getExecutionStartNode } from '@/WorkflowHelpers'; +import { getExecutionStartNode } from '@/workflow-helpers'; import type { IWorkflowExecutionDataProcess } from '@/Interfaces'; describe('WorkflowHelpers', () => { diff --git a/packages/cli/src/__tests__/WorkflowRunner.test.ts b/packages/cli/src/__tests__/workflow-runner.test.ts similarity index 97% rename from packages/cli/src/__tests__/WorkflowRunner.test.ts rename to packages/cli/src/__tests__/workflow-runner.test.ts index 668150092f..56dcf97c7c 100644 --- a/packages/cli/src/__tests__/WorkflowRunner.test.ts +++ b/packages/cli/src/__tests__/workflow-runner.test.ts @@ -1,7 +1,7 @@ import Container from 'typedi'; import { WorkflowHooks, type ExecutionError, type IWorkflowExecuteHooks } from 'n8n-workflow'; import type { User } from '@db/entities/User'; -import { WorkflowRunner } from '@/WorkflowRunner'; +import { WorkflowRunner } from '@/workflow-runner'; import config from '@/config'; import * as testDb from '@test-integration/testDb'; diff --git a/packages/cli/src/AbstractServer.ts b/packages/cli/src/abstract-server.ts similarity index 93% rename from packages/cli/src/AbstractServer.ts rename to packages/cli/src/abstract-server.ts index 93ecb500c6..f9080080d0 100644 --- a/packages/cli/src/AbstractServer.ts +++ b/packages/cli/src/abstract-server.ts @@ -10,18 +10,18 @@ import config from '@/config'; import { N8N_VERSION, TEMPLATES_DIR, inDevelopment, inTest } from '@/constants'; import * as Db from '@/Db'; import { N8nInstanceType } from '@/Interfaces'; -import { ExternalHooks } from '@/ExternalHooks'; -import { send, sendErrorResponse } from '@/ResponseHelper'; +import { ExternalHooks } from '@/external-hooks'; +import { send, sendErrorResponse } from '@/response-helper'; import { rawBodyReader, bodyParser, corsMiddleware } from '@/middlewares'; -import { WaitingForms } from '@/WaitingForms'; -import { TestWebhooks } from '@/webhooks/TestWebhooks'; -import { WaitingWebhooks } from '@/webhooks/WaitingWebhooks'; -import { createWebhookHandlerFor } from '@/webhooks/WebhookRequestHandler'; -import { LiveWebhooks } from '@/webhooks/LiveWebhooks'; +import { WaitingForms } from '@/waiting-forms'; +import { TestWebhooks } from '@/webhooks/test-webhooks'; +import { WaitingWebhooks } from '@/webhooks/waiting-webhooks'; +import { createWebhookHandlerFor } from '@/webhooks/webhook-request-handler'; +import { LiveWebhooks } from '@/webhooks/live-webhooks'; import { generateHostInstanceId } from './databases/utils/generators'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { ServiceUnavailableError } from './errors/response-errors/service-unavailable.error'; -import { OnShutdown } from '@/decorators/OnShutdown'; +import { OnShutdown } from '@/decorators/on-shutdown'; import { GlobalConfig } from '@n8n/config'; @Service() diff --git a/packages/cli/src/ActivationErrors.service.ts b/packages/cli/src/activation-errors.service.ts similarity index 100% rename from packages/cli/src/ActivationErrors.service.ts rename to packages/cli/src/activation-errors.service.ts diff --git a/packages/cli/src/ActiveExecutions.ts b/packages/cli/src/active-executions.ts similarity index 99% rename from packages/cli/src/ActiveExecutions.ts rename to packages/cli/src/active-executions.ts index c1a6e8ffd6..32f8aac0a7 100644 --- a/packages/cli/src/ActiveExecutions.ts +++ b/packages/cli/src/active-executions.ts @@ -23,7 +23,7 @@ import type { } from '@/Interfaces'; import { isWorkflowIdValid } from '@/utils'; import { ExecutionRepository } from '@db/repositories/execution.repository'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { ConcurrencyControlService } from './concurrency/concurrency-control.service'; import config from './config'; diff --git a/packages/cli/src/ActiveWorkflowManager.ts b/packages/cli/src/active-workflow-manager.ts similarity index 97% rename from packages/cli/src/ActiveWorkflowManager.ts rename to packages/cli/src/active-workflow-manager.ts index fac6e9d9fa..0db162a06e 100644 --- a/packages/cli/src/ActiveWorkflowManager.ts +++ b/packages/cli/src/active-workflow-manager.ts @@ -27,28 +27,28 @@ import { } from 'n8n-workflow'; import type { IWorkflowDb } from '@/Interfaces'; -import * as WebhookHelpers from '@/webhooks/WebhookHelpers'; -import * as WorkflowExecuteAdditionalData from '@/WorkflowExecuteAdditionalData'; +import * as WebhookHelpers from '@/webhooks/webhook-helpers'; +import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data'; import type { WorkflowEntity } from '@db/entities/WorkflowEntity'; -import { ActiveExecutions } from '@/ActiveExecutions'; +import { ActiveExecutions } from '@/active-executions'; import { ExecutionService } from './executions/execution.service'; import { STARTING_NODES, WORKFLOW_REACTIVATE_INITIAL_TIMEOUT, WORKFLOW_REACTIVATE_MAX_TIMEOUT, } from '@/constants'; -import { NodeTypes } from '@/NodeTypes'; -import { ExternalHooks } from '@/ExternalHooks'; +import { NodeTypes } from '@/node-types'; +import { ExternalHooks } from '@/external-hooks'; import { WebhookService } from '@/webhooks/webhook.service'; -import { Logger } from './Logger'; +import { Logger } from './logger'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import { OrchestrationService } from '@/services/orchestration.service'; -import { ActivationErrorsService } from '@/ActivationErrors.service'; +import { ActivationErrorsService } from '@/activation-errors.service'; import { ActiveWorkflowsService } from '@/services/activeWorkflows.service'; -import { WorkflowExecutionService } from '@/workflows/workflowExecution.service'; -import { WorkflowStaticDataService } from '@/workflows/workflowStaticData.service'; -import { OnShutdown } from '@/decorators/OnShutdown'; +import { WorkflowExecutionService } from '@/workflows/workflow-execution.service'; +import { WorkflowStaticDataService } from '@/workflows/workflow-static-data.service'; +import { OnShutdown } from '@/decorators/on-shutdown'; interface QueuedActivation { activationMode: WorkflowActivateMode; diff --git a/packages/cli/src/auth/auth.service.ts b/packages/cli/src/auth/auth.service.ts index cb75fa158b..7e83393f27 100644 --- a/packages/cli/src/auth/auth.service.ts +++ b/packages/cli/src/auth/auth.service.ts @@ -10,8 +10,8 @@ import { InvalidAuthTokenRepository } from '@db/repositories/invalidAuthToken.re import { UserRepository } from '@db/repositories/user.repository'; import { AuthError } from '@/errors/response-errors/auth.error'; import { ForbiddenError } from '@/errors/response-errors/forbidden.error'; -import { License } from '@/License'; -import { Logger } from '@/Logger'; +import { License } from '@/license'; +import { Logger } from '@/logger'; import type { AuthenticatedRequest } from '@/requests'; import { JwtService } from '@/services/jwt.service'; import { UrlService } from '@/services/url.service'; diff --git a/packages/cli/src/auth/methods/email.ts b/packages/cli/src/auth/methods/email.ts index f954991974..fb7213ef3b 100644 --- a/packages/cli/src/auth/methods/email.ts +++ b/packages/cli/src/auth/methods/email.ts @@ -1,7 +1,7 @@ import type { User } from '@db/entities/User'; import { PasswordUtility } from '@/services/password.utility'; import { Container } from 'typedi'; -import { isLdapLoginEnabled } from '@/Ldap/helpers.ee'; +import { isLdapLoginEnabled } from '@/ldap/helpers.ee'; import { UserRepository } from '@db/repositories/user.repository'; import { AuthError } from '@/errors/response-errors/auth.error'; import { EventService } from '@/events/event.service'; diff --git a/packages/cli/src/auth/methods/ldap.ts b/packages/cli/src/auth/methods/ldap.ts index 66f6f6dcd9..c3ec2150c7 100644 --- a/packages/cli/src/auth/methods/ldap.ts +++ b/packages/cli/src/auth/methods/ldap.ts @@ -1,6 +1,6 @@ import { Container } from 'typedi'; -import { LdapService } from '@/Ldap/ldap.service.ee'; +import { LdapService } from '@/ldap/ldap.service.ee'; import { createLdapUserOnLocalDb, getUserByEmail, @@ -9,7 +9,7 @@ import { mapLdapAttributesToUser, createLdapAuthIdentity, updateLdapUserOnLocalDb, -} from '@/Ldap/helpers.ee'; +} from '@/ldap/helpers.ee'; import type { User } from '@db/entities/User'; import { EventService } from '@/events/event.service'; diff --git a/packages/cli/src/commands/audit.ts b/packages/cli/src/commands/audit.ts index 4f6b356028..a447204b67 100644 --- a/packages/cli/src/commands/audit.ts +++ b/packages/cli/src/commands/audit.ts @@ -2,11 +2,11 @@ import { Container } from 'typedi'; import { Flags } from '@oclif/core'; import { ApplicationError } from 'n8n-workflow'; -import { SecurityAuditService } from '@/security-audit/SecurityAudit.service'; +import { SecurityAuditService } from '@/security-audit/security-audit.service'; import { RISK_CATEGORIES } from '@/security-audit/constants'; import config from '@/config'; import type { Risk } from '@/security-audit/types'; -import { BaseCommand } from './BaseCommand'; +import { BaseCommand } from './base-command'; export class SecurityAudit extends BaseCommand { static description = 'Generate a security audit report for this n8n instance'; diff --git a/packages/cli/src/commands/BaseCommand.ts b/packages/cli/src/commands/base-command.ts similarity index 93% rename from packages/cli/src/commands/BaseCommand.ts rename to packages/cli/src/commands/base-command.ts index af3958c25a..db6897c252 100644 --- a/packages/cli/src/commands/BaseCommand.ts +++ b/packages/cli/src/commands/base-command.ts @@ -4,25 +4,25 @@ import { Command, Errors } from '@oclif/core'; import { GlobalConfig } from '@n8n/config'; import { ApplicationError, ErrorReporterProxy as ErrorReporter, sleep } from 'n8n-workflow'; import { BinaryDataService, InstanceSettings, ObjectStoreService } from 'n8n-core'; -import type { AbstractServer } from '@/AbstractServer'; -import { Logger } from '@/Logger'; +import type { AbstractServer } from '@/abstract-server'; +import { Logger } from '@/logger'; import config from '@/config'; import * as Db from '@/Db'; -import * as CrashJournal from '@/CrashJournal'; +import * as CrashJournal from '@/crash-journal'; import { LICENSE_FEATURES, inDevelopment, inTest } from '@/constants'; -import { initErrorHandling } from '@/ErrorReporting'; -import { ExternalHooks } from '@/ExternalHooks'; -import { NodeTypes } from '@/NodeTypes'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { initErrorHandling } from '@/error-reporting'; +import { ExternalHooks } from '@/external-hooks'; +import { NodeTypes } from '@/node-types'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import type { N8nInstanceType } from '@/Interfaces'; import { PostHogClient } from '@/posthog'; -import { InternalHooks } from '@/InternalHooks'; -import { License } from '@/License'; -import { ExternalSecretsManager } from '@/ExternalSecrets/ExternalSecretsManager.ee'; -import { initExpressionEvaluator } from '@/ExpressionEvaluator'; +import { InternalHooks } from '@/internal-hooks'; +import { License } from '@/license'; +import { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee'; +import { initExpressionEvaluator } from '@/expression-evaluator'; import { generateHostInstanceId } from '@db/utils/generators'; -import { WorkflowHistoryManager } from '@/workflows/workflowHistory/workflowHistoryManager.ee'; -import { ShutdownService } from '@/shutdown/Shutdown.service'; +import { WorkflowHistoryManager } from '@/workflows/workflow-history/workflow-history-manager.ee'; +import { ShutdownService } from '@/shutdown/shutdown.service'; import { TelemetryEventRelay } from '@/events/telemetry-event-relay'; export abstract class BaseCommand extends Command { diff --git a/packages/cli/src/commands/db/__tests__/revert.test.ts b/packages/cli/src/commands/db/__tests__/revert.test.ts index 13c554a786..1afa8be190 100644 --- a/packages/cli/src/commands/db/__tests__/revert.test.ts +++ b/packages/cli/src/commands/db/__tests__/revert.test.ts @@ -1,6 +1,6 @@ import { main } from '@/commands/db/revert'; import { mockInstance } from '@test/mocking'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import type { IrreversibleMigration, ReversibleMigration } from '@/databases/types'; import type { Migration, MigrationExecutor } from '@n8n/typeorm'; import { type DataSource } from '@n8n/typeorm'; diff --git a/packages/cli/src/commands/db/revert.ts b/packages/cli/src/commands/db/revert.ts index b0a844086c..c52ce8a35c 100644 --- a/packages/cli/src/commands/db/revert.ts +++ b/packages/cli/src/commands/db/revert.ts @@ -4,7 +4,7 @@ import type { DataSourceOptions as ConnectionOptions } from '@n8n/typeorm'; // eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import import { MigrationExecutor, DataSource as Connection } from '@n8n/typeorm'; import { Container } from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { getConnectionOptions } from '@db/config'; import type { Migration } from '@db/types'; import { wrapMigration } from '@db/utils/migrationHelpers'; diff --git a/packages/cli/src/commands/execute.ts b/packages/cli/src/commands/execute.ts index cdf949e87c..0788f4d1db 100644 --- a/packages/cli/src/commands/execute.ts +++ b/packages/cli/src/commands/execute.ts @@ -3,11 +3,11 @@ import { Flags } from '@oclif/core'; import type { IWorkflowBase } from 'n8n-workflow'; import { ApplicationError, ExecutionBaseError } from 'n8n-workflow'; -import { ActiveExecutions } from '@/ActiveExecutions'; -import { WorkflowRunner } from '@/WorkflowRunner'; +import { ActiveExecutions } from '@/active-executions'; +import { WorkflowRunner } from '@/workflow-runner'; import type { IWorkflowExecutionDataProcess } from '@/Interfaces'; import { findCliWorkflowStart, isWorkflowIdValid } from '@/utils'; -import { BaseCommand } from './BaseCommand'; +import { BaseCommand } from './base-command'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import { OwnershipService } from '@/services/ownership.service'; diff --git a/packages/cli/src/commands/executeBatch.ts b/packages/cli/src/commands/executeBatch.ts index 227dd962ef..bd2de6b5ed 100644 --- a/packages/cli/src/commands/executeBatch.ts +++ b/packages/cli/src/commands/executeBatch.ts @@ -9,15 +9,15 @@ import { sep } from 'path'; import { diff } from 'json-diff'; import pick from 'lodash/pick'; -import { ActiveExecutions } from '@/ActiveExecutions'; -import { WorkflowRunner } from '@/WorkflowRunner'; +import { ActiveExecutions } from '@/active-executions'; +import { WorkflowRunner } from '@/workflow-runner'; import type { IWorkflowDb, IWorkflowExecutionDataProcess } from '@/Interfaces'; import type { User } from '@db/entities/User'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import { OwnershipService } from '@/services/ownership.service'; import { findCliWorkflowStart } from '@/utils'; -import { BaseCommand } from './BaseCommand'; +import { BaseCommand } from './base-command'; import type { IExecutionResult, INodeSpecialCase, diff --git a/packages/cli/src/commands/export/credentials.ts b/packages/cli/src/commands/export/credentials.ts index 5fb10dcb2c..4af626c735 100644 --- a/packages/cli/src/commands/export/credentials.ts +++ b/packages/cli/src/commands/export/credentials.ts @@ -3,7 +3,7 @@ import fs from 'fs'; import path from 'path'; import { Credentials } from 'n8n-core'; import type { ICredentialsDb, ICredentialsDecryptedDb } from '@/Interfaces'; -import { BaseCommand } from '../BaseCommand'; +import { BaseCommand } from '../base-command'; import { CredentialsRepository } from '@db/repositories/credentials.repository'; import Container from 'typedi'; import { ApplicationError } from 'n8n-workflow'; diff --git a/packages/cli/src/commands/export/workflow.ts b/packages/cli/src/commands/export/workflow.ts index 19aa2b9e08..b15484c769 100644 --- a/packages/cli/src/commands/export/workflow.ts +++ b/packages/cli/src/commands/export/workflow.ts @@ -1,7 +1,7 @@ import { Flags } from '@oclif/core'; import fs from 'fs'; import path from 'path'; -import { BaseCommand } from '../BaseCommand'; +import { BaseCommand } from '../base-command'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import Container from 'typedi'; import { ApplicationError } from 'n8n-workflow'; diff --git a/packages/cli/src/commands/import/credentials.ts b/packages/cli/src/commands/import/credentials.ts index 16fd1a5fa5..f36d33ba7b 100644 --- a/packages/cli/src/commands/import/credentials.ts +++ b/packages/cli/src/commands/import/credentials.ts @@ -9,7 +9,7 @@ import type { EntityManager } from '@n8n/typeorm'; import * as Db from '@/Db'; import { SharedCredentials } from '@db/entities/SharedCredentials'; import { CredentialsEntity } from '@db/entities/CredentialsEntity'; -import { BaseCommand } from '../BaseCommand'; +import { BaseCommand } from '../base-command'; import type { ICredentialsEncrypted } from 'n8n-workflow'; import { ApplicationError, jsonParse } from 'n8n-workflow'; import { UM_FIX_INSTRUCTION } from '@/constants'; diff --git a/packages/cli/src/commands/import/workflow.ts b/packages/cli/src/commands/import/workflow.ts index dcf72a9c9a..d7173b591a 100644 --- a/packages/cli/src/commands/import/workflow.ts +++ b/packages/cli/src/commands/import/workflow.ts @@ -11,7 +11,7 @@ import { UserRepository } from '@db/repositories/user.repository'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import type { IWorkflowToImport } from '@/Interfaces'; import { ImportService } from '@/services/import.service'; -import { BaseCommand } from '../BaseCommand'; +import { BaseCommand } from '../base-command'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { ProjectRepository } from '@/databases/repositories/project.repository'; diff --git a/packages/cli/src/commands/ldap/reset.ts b/packages/cli/src/commands/ldap/reset.ts index 2f0cc7b305..c91564ead9 100644 --- a/packages/cli/src/commands/ldap/reset.ts +++ b/packages/cli/src/commands/ldap/reset.ts @@ -1,10 +1,10 @@ import Container from 'typedi'; -import { LDAP_DEFAULT_CONFIGURATION, LDAP_FEATURE_NAME } from '@/Ldap/constants'; +import { LDAP_DEFAULT_CONFIGURATION, LDAP_FEATURE_NAME } from '@/ldap/constants'; import { AuthIdentityRepository } from '@db/repositories/authIdentity.repository'; import { AuthProviderSyncHistoryRepository } from '@db/repositories/authProviderSyncHistory.repository'; import { SettingsRepository } from '@db/repositories/settings.repository'; import { UserRepository } from '@db/repositories/user.repository'; -import { BaseCommand } from '../BaseCommand'; +import { BaseCommand } from '../base-command'; import { Flags } from '@oclif/core'; import { ApplicationError } from 'n8n-workflow'; import { ProjectRepository } from '@/databases/repositories/project.repository'; diff --git a/packages/cli/src/commands/license/clear.ts b/packages/cli/src/commands/license/clear.ts index 808784bdfd..8439417471 100644 --- a/packages/cli/src/commands/license/clear.ts +++ b/packages/cli/src/commands/license/clear.ts @@ -1,8 +1,8 @@ import { Container } from 'typedi'; import { SETTINGS_LICENSE_CERT_KEY } from '@/constants'; -import { BaseCommand } from '../BaseCommand'; +import { BaseCommand } from '../base-command'; import { SettingsRepository } from '@db/repositories/settings.repository'; -import { License } from '@/License'; +import { License } from '@/license'; export class ClearLicenseCommand extends BaseCommand { static description = 'Clear license'; diff --git a/packages/cli/src/commands/license/info.ts b/packages/cli/src/commands/license/info.ts index a4e9e42cf2..6789b4ff41 100644 --- a/packages/cli/src/commands/license/info.ts +++ b/packages/cli/src/commands/license/info.ts @@ -1,6 +1,6 @@ import { Container } from 'typedi'; -import { License } from '@/License'; -import { BaseCommand } from '../BaseCommand'; +import { License } from '@/license'; +import { BaseCommand } from '../base-command'; export class LicenseInfoCommand extends BaseCommand { static description = 'Print license information'; diff --git a/packages/cli/src/commands/list/workflow.ts b/packages/cli/src/commands/list/workflow.ts index 2d33de19e3..35fd073f35 100644 --- a/packages/cli/src/commands/list/workflow.ts +++ b/packages/cli/src/commands/list/workflow.ts @@ -1,7 +1,7 @@ import Container from 'typedi'; import { Flags } from '@oclif/core'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; -import { BaseCommand } from '../BaseCommand'; +import { BaseCommand } from '../base-command'; export class ListWorkflowCommand extends BaseCommand { static description = '\nList workflows'; diff --git a/packages/cli/src/commands/mfa/disable.ts b/packages/cli/src/commands/mfa/disable.ts index dceb81b8b9..acc3439e3d 100644 --- a/packages/cli/src/commands/mfa/disable.ts +++ b/packages/cli/src/commands/mfa/disable.ts @@ -1,7 +1,7 @@ import Container from 'typedi'; import { Flags } from '@oclif/core'; import { AuthUserRepository } from '@db/repositories/authUser.repository'; -import { BaseCommand } from '../BaseCommand'; +import { BaseCommand } from '../base-command'; export class DisableMFACommand extends BaseCommand { static description = 'Disable MFA authentication for a user'; diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.ts index 16a227e526..96e3849860 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.ts @@ -11,12 +11,12 @@ import glob from 'fast-glob'; import { jsonParse, randomString } from 'n8n-workflow'; import config from '@/config'; -import { ActiveExecutions } from '@/ActiveExecutions'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; -import { Server } from '@/Server'; +import { ActiveExecutions } from '@/active-executions'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; +import { Server } from '@/server'; import { EDITOR_UI_DIST_DIR, LICENSE_FEATURES } from '@/constants'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; -import { License } from '@/License'; +import { License } from '@/license'; import { OrchestrationService } from '@/services/orchestration.service'; import { OrchestrationHandlerMainService } from '@/services/orchestration/main/orchestration.handler.main.service'; import { PruningService } from '@/services/pruning.service'; @@ -24,12 +24,12 @@ import { UrlService } from '@/services/url.service'; import { SettingsRepository } from '@db/repositories/settings.repository'; import { ExecutionRepository } from '@db/repositories/execution.repository'; import { FeatureNotLicensedError } from '@/errors/feature-not-licensed.error'; -import { WaitTracker } from '@/WaitTracker'; -import { BaseCommand } from './BaseCommand'; +import { WaitTracker } from '@/wait-tracker'; +import { BaseCommand } from './base-command'; import type { IWorkflowExecutionDataProcess } from '@/Interfaces'; import { ExecutionService } from '@/executions/execution.service'; import { OwnershipService } from '@/services/ownership.service'; -import { WorkflowRunner } from '@/WorkflowRunner'; +import { WorkflowRunner } from '@/workflow-runner'; import { EventService } from '@/events/event.service'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-var-requires diff --git a/packages/cli/src/commands/update/workflow.ts b/packages/cli/src/commands/update/workflow.ts index f365db2d98..35a3ac016c 100644 --- a/packages/cli/src/commands/update/workflow.ts +++ b/packages/cli/src/commands/update/workflow.ts @@ -1,7 +1,7 @@ import { Container } from 'typedi'; import { Flags } from '@oclif/core'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; -import { BaseCommand } from '../BaseCommand'; +import { BaseCommand } from '../base-command'; export class UpdateWorkflowCommand extends BaseCommand { static description = 'Update workflows'; diff --git a/packages/cli/src/commands/user-management/reset.ts b/packages/cli/src/commands/user-management/reset.ts index 30f60af0a8..992d367e13 100644 --- a/packages/cli/src/commands/user-management/reset.ts +++ b/packages/cli/src/commands/user-management/reset.ts @@ -6,7 +6,7 @@ import { SettingsRepository } from '@db/repositories/settings.repository'; import { SharedCredentialsRepository } from '@db/repositories/sharedCredentials.repository'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { UserRepository } from '@db/repositories/user.repository'; -import { BaseCommand } from '../BaseCommand'; +import { BaseCommand } from '../base-command'; import { ProjectRepository } from '@/databases/repositories/project.repository'; const defaultUserProps = { diff --git a/packages/cli/src/commands/webhook.ts b/packages/cli/src/commands/webhook.ts index d9c197c850..36e898761c 100644 --- a/packages/cli/src/commands/webhook.ts +++ b/packages/cli/src/commands/webhook.ts @@ -3,9 +3,9 @@ import { Flags, type Config } from '@oclif/core'; import { ApplicationError } from 'n8n-workflow'; import config from '@/config'; -import { ActiveExecutions } from '@/ActiveExecutions'; -import { WebhookServer } from '@/webhooks/WebhookServer'; -import { BaseCommand } from './BaseCommand'; +import { ActiveExecutions } from '@/active-executions'; +import { WebhookServer } from '@/webhooks/webhook-server'; +import { BaseCommand } from './base-command'; import { OrchestrationWebhookService } from '@/services/orchestration/webhook/orchestration.webhook.service'; import { OrchestrationHandlerWebhookService } from '@/services/orchestration/webhook/orchestration.handler.webhook.service'; diff --git a/packages/cli/src/commands/worker.ts b/packages/cli/src/commands/worker.ts index 5e75e4792d..594b2f5668 100644 --- a/packages/cli/src/commands/worker.ts +++ b/packages/cli/src/commands/worker.ts @@ -5,12 +5,12 @@ import http from 'http'; import { ApplicationError } from 'n8n-workflow'; import * as Db from '@/Db'; -import * as ResponseHelper from '@/ResponseHelper'; +import * as ResponseHelper from '@/response-helper'; import config from '@/config'; import type { ScalingService } from '@/scaling/scaling.service'; import { N8N_VERSION, inTest } from '@/constants'; import type { ICredentialsOverwrite } from '@/Interfaces'; -import { CredentialsOverwrites } from '@/CredentialsOverwrites'; +import { CredentialsOverwrites } from '@/credentials-overwrites'; import { rawBodyReader, bodyParser } from '@/middlewares'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; import type { RedisServicePubSubSubscriber } from '@/services/redis/RedisServicePubSubSubscriber'; @@ -18,7 +18,7 @@ import { EventMessageGeneric } from '@/eventbus/EventMessageClasses/EventMessage import { OrchestrationHandlerWorkerService } from '@/services/orchestration/worker/orchestration.handler.worker.service'; import { OrchestrationWorkerService } from '@/services/orchestration/worker/orchestration.worker.service'; import { ServiceUnavailableError } from '@/errors/response-errors/service-unavailable.error'; -import { BaseCommand } from './BaseCommand'; +import { BaseCommand } from './base-command'; import { JobProcessor } from '@/scaling/job-processor'; import { LogStreamingEventRelay } from '@/events/log-streaming-event-relay'; diff --git a/packages/cli/src/concurrency/__tests__/concurrency-control.service.test.ts b/packages/cli/src/concurrency/__tests__/concurrency-control.service.test.ts index 08f58ac600..418ac96709 100644 --- a/packages/cli/src/concurrency/__tests__/concurrency-control.service.test.ts +++ b/packages/cli/src/concurrency/__tests__/concurrency-control.service.test.ts @@ -5,7 +5,7 @@ import { CLOUD_TEMP_REPORTABLE_THRESHOLDS, ConcurrencyControlService, } from '@/concurrency/concurrency-control.service'; -import type { Logger } from '@/Logger'; +import type { Logger } from '@/logger'; import { InvalidConcurrencyLimitError } from '@/errors/invalid-concurrency-limit.error'; import { ConcurrencyQueue } from '../concurrency-queue'; import type { WorkflowExecuteMode as ExecutionMode } from 'n8n-workflow'; diff --git a/packages/cli/src/concurrency/concurrency-control.service.ts b/packages/cli/src/concurrency/concurrency-control.service.ts index 6e62e9b78d..b2b94a5d6e 100644 --- a/packages/cli/src/concurrency/concurrency-control.service.ts +++ b/packages/cli/src/concurrency/concurrency-control.service.ts @@ -1,4 +1,4 @@ -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import config from '@/config'; import { Service } from 'typedi'; import { ConcurrencyQueue } from './concurrency-queue'; diff --git a/packages/cli/src/controllers/__tests__/dynamic-node-parameters.controller.test.ts b/packages/cli/src/controllers/__tests__/dynamic-node-parameters.controller.test.ts index fe1313a4ec..0a129eb821 100644 --- a/packages/cli/src/controllers/__tests__/dynamic-node-parameters.controller.test.ts +++ b/packages/cli/src/controllers/__tests__/dynamic-node-parameters.controller.test.ts @@ -2,7 +2,7 @@ import { DynamicNodeParametersController } from '@/controllers/dynamicNodeParame import type { DynamicNodeParametersRequest } from '@/requests'; import type { DynamicNodeParametersService } from '@/services/dynamicNodeParameters.service'; import { mock } from 'jest-mock-extended'; -import * as AdditionalData from '@/WorkflowExecuteAdditionalData'; +import * as AdditionalData from '@/workflow-execute-additional-data'; import type { ILoadOptions, IWorkflowExecuteAdditionalData } from 'n8n-workflow'; describe('DynamicNodeParametersController', () => { diff --git a/packages/cli/src/controllers/__tests__/me.controller.test.ts b/packages/cli/src/controllers/__tests__/me.controller.test.ts index 54a0f39a7c..99f4714023 100644 --- a/packages/cli/src/controllers/__tests__/me.controller.test.ts +++ b/packages/cli/src/controllers/__tests__/me.controller.test.ts @@ -9,18 +9,17 @@ import { API_KEY_PREFIX, MeController } from '@/controllers/me.controller'; import { AUTH_COOKIE_NAME } from '@/constants'; import type { AuthenticatedRequest, MeRequest } from '@/requests'; import { UserService } from '@/services/user.service'; -import { ExternalHooks } from '@/ExternalHooks'; -import { License } from '@/License'; +import { ExternalHooks } from '@/external-hooks'; +import { License } from '@/license'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { EventService } from '@/events/event.service'; -import { AuthUserRepository } from '@db/repositories/authUser.repository'; -import { InvalidAuthTokenRepository } from '@db/repositories/invalidAuthToken.repository'; -import { UserRepository } from '@db/repositories/user.repository'; -import { MfaService } from '@/Mfa/mfa.service'; -import { InvalidMfaCodeError } from '@/errors/response-errors/invalid-mfa-code.error'; - import { badPasswords } from '@test/testData'; import { mockInstance } from '@test/mocking'; +import { AuthUserRepository } from '@/databases/repositories/authUser.repository'; +import { InvalidAuthTokenRepository } from '@db/repositories/invalidAuthToken.repository'; +import { UserRepository } from '@db/repositories/user.repository'; +import { MfaService } from '@/mfa/mfa.service'; +import { InvalidMfaCodeError } from '@/errors/response-errors/invalid-mfa-code.error'; const browserId = 'test-browser-id'; diff --git a/packages/cli/src/controllers/__tests__/owner.controller.test.ts b/packages/cli/src/controllers/__tests__/owner.controller.test.ts index 8c4f00abee..0170333e8a 100644 --- a/packages/cli/src/controllers/__tests__/owner.controller.test.ts +++ b/packages/cli/src/controllers/__tests__/owner.controller.test.ts @@ -10,7 +10,7 @@ import type { User } from '@db/entities/User'; import type { SettingsRepository } from '@db/repositories/settings.repository'; import type { UserRepository } from '@db/repositories/user.repository'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; -import { License } from '@/License'; +import { License } from '@/license'; import type { OwnerRequest } from '@/requests'; import type { UserService } from '@/services/user.service'; import { PasswordUtility } from '@/services/password.utility'; diff --git a/packages/cli/src/controllers/__tests__/translation.controller.test.ts b/packages/cli/src/controllers/__tests__/translation.controller.test.ts index e34237cd69..129a2f91a6 100644 --- a/packages/cli/src/controllers/__tests__/translation.controller.test.ts +++ b/packages/cli/src/controllers/__tests__/translation.controller.test.ts @@ -6,7 +6,7 @@ import { CREDENTIAL_TRANSLATIONS_DIR, } from '@/controllers/translation.controller'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; -import type { CredentialTypes } from '@/CredentialTypes'; +import type { CredentialTypes } from '@/credential-types'; describe('TranslationController', () => { const configGetSpy = jest.spyOn(config, 'getEnv'); diff --git a/packages/cli/src/controllers/auth.controller.ts b/packages/cli/src/controllers/auth.controller.ts index bf4ce5a388..fe48530831 100644 --- a/packages/cli/src/controllers/auth.controller.ts +++ b/packages/cli/src/controllers/auth.controller.ts @@ -13,11 +13,11 @@ import { getCurrentAuthenticationMethod, isLdapCurrentAuthenticationMethod, isSamlCurrentAuthenticationMethod, -} from '@/sso/ssoHelpers'; -import { License } from '@/License'; +} from '@/sso/sso-helpers'; +import { License } from '@/license'; import { UserService } from '@/services/user.service'; -import { MfaService } from '@/Mfa/mfa.service'; -import { Logger } from '@/Logger'; +import { MfaService } from '@/mfa/mfa.service'; +import { Logger } from '@/logger'; import { AuthError } from '@/errors/response-errors/auth.error'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { ForbiddenError } from '@/errors/response-errors/forbidden.error'; diff --git a/packages/cli/src/controllers/debug.controller.ts b/packages/cli/src/controllers/debug.controller.ts index 663c375611..3b340aad7e 100644 --- a/packages/cli/src/controllers/debug.controller.ts +++ b/packages/cli/src/controllers/debug.controller.ts @@ -1,5 +1,5 @@ import { Get, RestController } from '@/decorators'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import { OrchestrationService } from '@/services/orchestration.service'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; diff --git a/packages/cli/src/controllers/dynamicNodeParameters.controller.ts b/packages/cli/src/controllers/dynamicNodeParameters.controller.ts index bfd1cf651b..cff338e437 100644 --- a/packages/cli/src/controllers/dynamicNodeParameters.controller.ts +++ b/packages/cli/src/controllers/dynamicNodeParameters.controller.ts @@ -1,7 +1,7 @@ import type { INodePropertyOptions, NodeParameterValueType } from 'n8n-workflow'; import { Post, RestController } from '@/decorators'; -import { getBase } from '@/WorkflowExecuteAdditionalData'; +import { getBase } from '@/workflow-execute-additional-data'; import { DynamicNodeParametersService } from '@/services/dynamicNodeParameters.service'; import { DynamicNodeParametersRequest } from '@/requests'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; diff --git a/packages/cli/src/controllers/e2e.controller.ts b/packages/cli/src/controllers/e2e.controller.ts index 2a93fe8eda..6d8eb88fed 100644 --- a/packages/cli/src/controllers/e2e.controller.ts +++ b/packages/cli/src/controllers/e2e.controller.ts @@ -3,19 +3,19 @@ import { v4 as uuid } from 'uuid'; import config from '@/config'; import { SettingsRepository } from '@db/repositories/settings.repository'; import { UserRepository } from '@db/repositories/user.repository'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; -import { License } from '@/License'; +import { License } from '@/license'; import { LICENSE_FEATURES, LICENSE_QUOTAS, UNLIMITED_LICENSE_QUOTA, inE2ETests } from '@/constants'; import { Patch, Post, RestController } from '@/decorators'; import type { UserSetupPayload } from '@/requests'; import type { BooleanLicenseFeature, IPushDataType, NumericLicenseFeature } from '@/Interfaces'; -import { MfaService } from '@/Mfa/mfa.service'; +import { MfaService } from '@/mfa/mfa.service'; import { Push } from '@/push'; import { CacheService } from '@/services/cache/cache.service'; import { PasswordUtility } from '@/services/password.utility'; import Container from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { AuthUserRepository } from '@/databases/repositories/authUser.repository'; if (!inE2ETests) { diff --git a/packages/cli/src/controllers/invitation.controller.ts b/packages/cli/src/controllers/invitation.controller.ts index 19bd803c5e..624cc9b3f0 100644 --- a/packages/cli/src/controllers/invitation.controller.ts +++ b/packages/cli/src/controllers/invitation.controller.ts @@ -6,17 +6,17 @@ import config from '@/config'; import { Post, GlobalScope, RestController } from '@/decorators'; import { RESPONSE_ERROR_MESSAGES } from '@/constants'; import { UserRequest } from '@/requests'; -import { License } from '@/License'; +import { License } from '@/license'; import { UserService } from '@/services/user.service'; -import { Logger } from '@/Logger'; -import { isSamlLicensedAndEnabled } from '@/sso/saml/samlHelpers'; +import { Logger } from '@/logger'; +import { isSamlLicensedAndEnabled } from '@/sso/saml/saml-helpers'; import { PasswordUtility } from '@/services/password.utility'; import { PostHogClient } from '@/posthog'; import type { User } from '@/databases/entities/User'; import { UserRepository } from '@db/repositories/user.repository'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { ForbiddenError } from '@/errors/response-errors/forbidden.error'; -import { ExternalHooks } from '@/ExternalHooks'; +import { ExternalHooks } from '@/external-hooks'; import { EventService } from '@/events/event.service'; @RestController('/invitations') diff --git a/packages/cli/src/controllers/me.controller.ts b/packages/cli/src/controllers/me.controller.ts index f931feecef..6cad9dcef5 100644 --- a/packages/cli/src/controllers/me.controller.ts +++ b/packages/cli/src/controllers/me.controller.ts @@ -6,7 +6,7 @@ import { randomBytes } from 'crypto'; import { AuthService } from '@/auth/auth.service'; import { Delete, Get, Patch, Post, RestController } from '@/decorators'; import { PasswordUtility } from '@/services/password.utility'; -import { validateEntity } from '@/GenericHelpers'; +import { validateEntity } from '@/generic-helpers'; import type { User } from '@db/entities/User'; import { AuthenticatedRequest, @@ -15,15 +15,15 @@ import { UserUpdatePayload, } from '@/requests'; import type { PublicUser } from '@/Interfaces'; -import { isSamlLicensedAndEnabled } from '@/sso/saml/samlHelpers'; +import { isSamlLicensedAndEnabled } from '@/sso/saml/saml-helpers'; import { UserService } from '@/services/user.service'; -import { Logger } from '@/Logger'; -import { ExternalHooks } from '@/ExternalHooks'; +import { Logger } from '@/logger'; +import { ExternalHooks } from '@/external-hooks'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { UserRepository } from '@/databases/repositories/user.repository'; import { isApiEnabled } from '@/PublicApi'; import { EventService } from '@/events/event.service'; -import { MfaService } from '@/Mfa/mfa.service'; +import { MfaService } from '@/mfa/mfa.service'; import { InvalidMfaCodeError } from '@/errors/response-errors/invalid-mfa-code.error'; import { PersonalizationSurveyAnswersV4 } from './survey-answers.dto'; diff --git a/packages/cli/src/controllers/mfa.controller.ts b/packages/cli/src/controllers/mfa.controller.ts index 6c228df47e..3d10736a1a 100644 --- a/packages/cli/src/controllers/mfa.controller.ts +++ b/packages/cli/src/controllers/mfa.controller.ts @@ -1,6 +1,6 @@ import { Get, Post, RestController } from '@/decorators'; import { AuthenticatedRequest, MFA } from '@/requests'; -import { MfaService } from '@/Mfa/mfa.service'; +import { MfaService } from '@/mfa/mfa.service'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; @RestController('/mfa') diff --git a/packages/cli/src/controllers/nodeTypes.controller.ts b/packages/cli/src/controllers/nodeTypes.controller.ts index fddefb7e10..122b9f1fbd 100644 --- a/packages/cli/src/controllers/nodeTypes.controller.ts +++ b/packages/cli/src/controllers/nodeTypes.controller.ts @@ -4,7 +4,7 @@ import { Request } from 'express'; import type { INodeTypeDescription, INodeTypeNameVersion } from 'n8n-workflow'; import { Post, RestController } from '@/decorators'; import config from '@/config'; -import { NodeTypes } from '@/NodeTypes'; +import { NodeTypes } from '@/node-types'; @RestController('/node-types') export class NodeTypesController { diff --git a/packages/cli/src/controllers/oauth/__tests__/oAuth1Credential.controller.test.ts b/packages/cli/src/controllers/oauth/__tests__/oAuth1Credential.controller.test.ts index fae443b4ce..d0031186f7 100644 --- a/packages/cli/src/controllers/oauth/__tests__/oAuth1Credential.controller.test.ts +++ b/packages/cli/src/controllers/oauth/__tests__/oAuth1Credential.controller.test.ts @@ -11,11 +11,11 @@ import type { User } from '@db/entities/User'; import type { OAuthRequest } from '@/requests'; import { CredentialsRepository } from '@db/repositories/credentials.repository'; import { SharedCredentialsRepository } from '@db/repositories/sharedCredentials.repository'; -import { ExternalHooks } from '@/ExternalHooks'; -import { Logger } from '@/Logger'; +import { ExternalHooks } from '@/external-hooks'; +import { Logger } from '@/logger'; import { VariablesService } from '@/environments/variables/variables.service.ee'; -import { SecretsHelper } from '@/SecretsHelpers'; -import { CredentialsHelper } from '@/CredentialsHelper'; +import { SecretsHelper } from '@/secrets-helpers'; +import { CredentialsHelper } from '@/credentials-helper'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; diff --git a/packages/cli/src/controllers/oauth/__tests__/oAuth2Credential.controller.test.ts b/packages/cli/src/controllers/oauth/__tests__/oAuth2Credential.controller.test.ts index f354a1ec02..c81a0c1559 100644 --- a/packages/cli/src/controllers/oauth/__tests__/oAuth2Credential.controller.test.ts +++ b/packages/cli/src/controllers/oauth/__tests__/oAuth2Credential.controller.test.ts @@ -11,11 +11,11 @@ import type { User } from '@db/entities/User'; import type { OAuthRequest } from '@/requests'; import { CredentialsRepository } from '@db/repositories/credentials.repository'; import { SharedCredentialsRepository } from '@db/repositories/sharedCredentials.repository'; -import { ExternalHooks } from '@/ExternalHooks'; -import { Logger } from '@/Logger'; +import { ExternalHooks } from '@/external-hooks'; +import { Logger } from '@/logger'; import { VariablesService } from '@/environments/variables/variables.service.ee'; -import { SecretsHelper } from '@/SecretsHelpers'; -import { CredentialsHelper } from '@/CredentialsHelper'; +import { SecretsHelper } from '@/secrets-helpers'; +import { CredentialsHelper } from '@/credentials-helper'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; diff --git a/packages/cli/src/controllers/oauth/abstractOAuth.controller.ts b/packages/cli/src/controllers/oauth/abstractOAuth.controller.ts index b9f0d64446..0d14b222d4 100644 --- a/packages/cli/src/controllers/oauth/abstractOAuth.controller.ts +++ b/packages/cli/src/controllers/oauth/abstractOAuth.controller.ts @@ -11,10 +11,10 @@ import { SharedCredentialsRepository } from '@db/repositories/sharedCredentials. import type { ICredentialsDb } from '@/Interfaces'; import type { OAuthRequest } from '@/requests'; import { RESPONSE_ERROR_MESSAGES } from '@/constants'; -import { CredentialsHelper } from '@/CredentialsHelper'; -import * as WorkflowExecuteAdditionalData from '@/WorkflowExecuteAdditionalData'; -import { Logger } from '@/Logger'; -import { ExternalHooks } from '@/ExternalHooks'; +import { CredentialsHelper } from '@/credentials-helper'; +import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data'; +import { Logger } from '@/logger'; +import { ExternalHooks } from '@/external-hooks'; import { UrlService } from '@/services/url.service'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; diff --git a/packages/cli/src/controllers/oauth/oAuth1Credential.controller.ts b/packages/cli/src/controllers/oauth/oAuth1Credential.controller.ts index 2a50b00bf9..21bbe83f99 100644 --- a/packages/cli/src/controllers/oauth/oAuth1Credential.controller.ts +++ b/packages/cli/src/controllers/oauth/oAuth1Credential.controller.ts @@ -6,7 +6,7 @@ import clientOAuth1 from 'oauth-1.0a'; import { createHmac } from 'crypto'; import { Get, RestController } from '@/decorators'; import { OAuthRequest } from '@/requests'; -import { sendErrorResponse } from '@/ResponseHelper'; +import { sendErrorResponse } from '@/response-helper'; import { AbstractOAuthController, type CsrfStateParam } from './abstractOAuth.controller'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; diff --git a/packages/cli/src/controllers/orchestration.controller.ts b/packages/cli/src/controllers/orchestration.controller.ts index 74a9665e1e..852d6f7cc3 100644 --- a/packages/cli/src/controllers/orchestration.controller.ts +++ b/packages/cli/src/controllers/orchestration.controller.ts @@ -1,7 +1,7 @@ import { Post, RestController, GlobalScope } from '@/decorators'; import { OrchestrationRequest } from '@/requests'; import { OrchestrationService } from '@/services/orchestration.service'; -import { License } from '@/License'; +import { License } from '@/license'; @RestController('/orchestration') export class OrchestrationController { diff --git a/packages/cli/src/controllers/owner.controller.ts b/packages/cli/src/controllers/owner.controller.ts index c0c2e7308d..826bbc2fa7 100644 --- a/packages/cli/src/controllers/owner.controller.ts +++ b/packages/cli/src/controllers/owner.controller.ts @@ -3,7 +3,7 @@ import { Response } from 'express'; import { AuthService } from '@/auth/auth.service'; import config from '@/config'; -import { validateEntity } from '@/GenericHelpers'; +import { validateEntity } from '@/generic-helpers'; import { GlobalScope, Post, RestController } from '@/decorators'; import { PasswordUtility } from '@/services/password.utility'; import { OwnerRequest } from '@/requests'; @@ -11,7 +11,7 @@ import { SettingsRepository } from '@db/repositories/settings.repository'; import { UserRepository } from '@db/repositories/user.repository'; import { PostHogClient } from '@/posthog'; import { UserService } from '@/services/user.service'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { EventService } from '@/events/event.service'; diff --git a/packages/cli/src/controllers/passwordReset.controller.ts b/packages/cli/src/controllers/passwordReset.controller.ts index 0cfe7cac19..3f93ee08e9 100644 --- a/packages/cli/src/controllers/passwordReset.controller.ts +++ b/packages/cli/src/controllers/passwordReset.controller.ts @@ -4,15 +4,15 @@ import validator from 'validator'; import { AuthService } from '@/auth/auth.service'; import { Get, Post, RestController } from '@/decorators'; import { PasswordUtility } from '@/services/password.utility'; -import { UserManagementMailer } from '@/UserManagement/email'; +import { UserManagementMailer } from '@/user-management/email'; import { PasswordResetRequest } from '@/requests'; -import { isSamlCurrentAuthenticationMethod } from '@/sso/ssoHelpers'; +import { isSamlCurrentAuthenticationMethod } from '@/sso/sso-helpers'; import { UserService } from '@/services/user.service'; -import { License } from '@/License'; +import { License } from '@/license'; import { RESPONSE_ERROR_MESSAGES } from '@/constants'; -import { MfaService } from '@/Mfa/mfa.service'; -import { Logger } from '@/Logger'; -import { ExternalHooks } from '@/ExternalHooks'; +import { MfaService } from '@/mfa/mfa.service'; +import { Logger } from '@/logger'; +import { ExternalHooks } from '@/external-hooks'; import { UrlService } from '@/services/url.service'; import { InternalServerError } from '@/errors/response-errors/internal-server.error'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; diff --git a/packages/cli/src/controllers/translation.controller.ts b/packages/cli/src/controllers/translation.controller.ts index f359ec2b3a..03a8c3b035 100644 --- a/packages/cli/src/controllers/translation.controller.ts +++ b/packages/cli/src/controllers/translation.controller.ts @@ -6,7 +6,7 @@ import config from '@/config'; import { NODES_BASE_DIR } from '@/constants'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { InternalServerError } from '@/errors/response-errors/internal-server.error'; -import { CredentialTypes } from '@/CredentialTypes'; +import { CredentialTypes } from '@/credential-types'; export const CREDENTIAL_TRANSLATIONS_DIR = 'n8n-nodes-base/dist/credentials/translations'; export const NODE_HEADERS_PATH = join(NODES_BASE_DIR, 'dist/nodes/headers'); diff --git a/packages/cli/src/controllers/users.controller.ts b/packages/cli/src/controllers/users.controller.ts index f3055ee4dc..43916903fe 100644 --- a/packages/cli/src/controllers/users.controller.ts +++ b/packages/cli/src/controllers/users.controller.ts @@ -16,12 +16,12 @@ import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.reposi import { UserRepository } from '@db/repositories/user.repository'; import { UserService } from '@/services/user.service'; import { listQueryMiddleware } from '@/middlewares'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { ForbiddenError } from '@/errors/response-errors/forbidden.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; -import { ExternalHooks } from '@/ExternalHooks'; -import { validateEntity } from '@/GenericHelpers'; +import { ExternalHooks } from '@/external-hooks'; +import { validateEntity } from '@/generic-helpers'; import { ProjectRepository } from '@/databases/repositories/project.repository'; import { Project } from '@/databases/entities/Project'; import { WorkflowService } from '@/workflows/workflow.service'; diff --git a/packages/cli/src/controllers/workflowStatistics.controller.ts b/packages/cli/src/controllers/workflowStatistics.controller.ts index 0c86786129..2cae52e8cc 100644 --- a/packages/cli/src/controllers/workflowStatistics.controller.ts +++ b/packages/cli/src/controllers/workflowStatistics.controller.ts @@ -5,7 +5,7 @@ import { StatisticsNames } from '@db/entities/WorkflowStatistics'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { WorkflowStatisticsRepository } from '@db/repositories/workflowStatistics.repository'; import type { IWorkflowStatisticsDataLoaded } from '@/Interfaces'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { StatisticsRequest } from './workflow-statistics.types'; diff --git a/packages/cli/src/CrashJournal.ts b/packages/cli/src/crash-journal.ts similarity index 96% rename from packages/cli/src/CrashJournal.ts rename to packages/cli/src/crash-journal.ts index ab13f2cb12..dcba654a3d 100644 --- a/packages/cli/src/CrashJournal.ts +++ b/packages/cli/src/crash-journal.ts @@ -5,7 +5,7 @@ import { Container } from 'typedi'; import { InstanceSettings } from 'n8n-core'; import { sleep } from 'n8n-workflow'; import { inProduction } from '@/constants'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; export const touchFile = async (filePath: string): Promise => { await mkdir(dirname(filePath), { recursive: true }); diff --git a/packages/cli/src/CredentialTypes.ts b/packages/cli/src/credential-types.ts similarity index 96% rename from packages/cli/src/CredentialTypes.ts rename to packages/cli/src/credential-types.ts index d97825a672..8d665c7592 100644 --- a/packages/cli/src/CredentialTypes.ts +++ b/packages/cli/src/credential-types.ts @@ -7,7 +7,7 @@ import { type LoadedClass, } from 'n8n-workflow'; import { RESPONSE_ERROR_MESSAGES } from '@/constants'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; @Service() export class CredentialTypes implements ICredentialTypes { diff --git a/packages/cli/src/CredentialsHelper.ts b/packages/cli/src/credentials-helper.ts similarity index 99% rename from packages/cli/src/CredentialsHelper.ts rename to packages/cli/src/credentials-helper.ts index 43ccf970e0..aa0491955c 100644 --- a/packages/cli/src/CredentialsHelper.ts +++ b/packages/cli/src/credentials-helper.ts @@ -30,8 +30,8 @@ import { ICredentialsHelper, NodeHelpers, Workflow, ApplicationError } from 'n8n import type { ICredentialsDb } from '@/Interfaces'; import type { CredentialsEntity } from '@db/entities/CredentialsEntity'; -import { CredentialTypes } from '@/CredentialTypes'; -import { CredentialsOverwrites } from '@/CredentialsOverwrites'; +import { CredentialTypes } from '@/credential-types'; +import { CredentialsOverwrites } from '@/credentials-overwrites'; import { RESPONSE_ERROR_MESSAGES } from './constants'; import { CredentialsRepository } from '@db/repositories/credentials.repository'; diff --git a/packages/cli/src/CredentialsOverwrites.ts b/packages/cli/src/credentials-overwrites.ts similarity index 97% rename from packages/cli/src/CredentialsOverwrites.ts rename to packages/cli/src/credentials-overwrites.ts index b80a31d9ce..b8df1a848c 100644 --- a/packages/cli/src/CredentialsOverwrites.ts +++ b/packages/cli/src/credentials-overwrites.ts @@ -3,8 +3,8 @@ import { GlobalConfig } from '@n8n/config'; import type { ICredentialDataDecryptedObject } from 'n8n-workflow'; import { deepCopy, jsonParse } from 'n8n-workflow'; import type { ICredentialsOverwrite } from '@/Interfaces'; -import { CredentialTypes } from '@/CredentialTypes'; -import { Logger } from '@/Logger'; +import { CredentialTypes } from '@/credential-types'; +import { Logger } from '@/logger'; @Service() export class CredentialsOverwrites { diff --git a/packages/cli/src/credentials/__tests__/credentials.service.test.ts b/packages/cli/src/credentials/__tests__/credentials.service.test.ts index a5fa3ca183..8a5ce77e15 100644 --- a/packages/cli/src/credentials/__tests__/credentials.service.test.ts +++ b/packages/cli/src/credentials/__tests__/credentials.service.test.ts @@ -2,7 +2,7 @@ import { CREDENTIAL_EMPTY_VALUE, type ICredentialType } from 'n8n-workflow'; import { mock } from 'jest-mock-extended'; import { CREDENTIAL_BLANKING_VALUE } from '@/constants'; import type { CredentialsEntity } from '@db/entities/CredentialsEntity'; -import type { CredentialTypes } from '@/CredentialTypes'; +import type { CredentialTypes } from '@/credential-types'; import { CredentialsService } from '@/credentials/credentials.service'; describe('CredentialsService', () => { diff --git a/packages/cli/src/credentials/credentials.controller.ts b/packages/cli/src/credentials/credentials.controller.ts index ba965a1add..b8dacf445f 100644 --- a/packages/cli/src/credentials/credentials.controller.ts +++ b/packages/cli/src/credentials/credentials.controller.ts @@ -5,11 +5,11 @@ import { In } from '@n8n/typeorm'; import { CredentialsService } from './credentials.service'; import { CredentialRequest } from '@/requests'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { ForbiddenError } from '@/errors/response-errors/forbidden.error'; import { NamingService } from '@/services/naming.service'; -import { License } from '@/License'; +import { License } from '@/license'; import { EnterpriseCredentialsService } from './credentials.service.ee'; import { Delete, @@ -22,7 +22,7 @@ import { ProjectScope, } from '@/decorators'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; -import { UserManagementMailer } from '@/UserManagement/email'; +import { UserManagementMailer } from '@/user-management/email'; import * as Db from '@/Db'; import * as utils from '@/utils'; import { listQueryMiddleware } from '@/middlewares'; diff --git a/packages/cli/src/credentials/credentials.service.ts b/packages/cli/src/credentials/credentials.service.ts index 03ea13efe1..e5d1a53252 100644 --- a/packages/cli/src/credentials/credentials.service.ts +++ b/packages/cli/src/credentials/credentials.service.ts @@ -16,17 +16,17 @@ import { import type { Scope } from '@n8n/permissions'; import * as Db from '@/Db'; import type { ICredentialsDb } from '@/Interfaces'; -import { createCredentialsFromCredentialsEntity } from '@/CredentialsHelper'; +import { createCredentialsFromCredentialsEntity } from '@/credentials-helper'; import { CREDENTIAL_BLANKING_VALUE } from '@/constants'; import { CredentialsEntity } from '@db/entities/CredentialsEntity'; import { SharedCredentials } from '@db/entities/SharedCredentials'; -import { validateEntity } from '@/GenericHelpers'; -import { ExternalHooks } from '@/ExternalHooks'; +import { validateEntity } from '@/generic-helpers'; +import { ExternalHooks } from '@/external-hooks'; import type { User } from '@db/entities/User'; import type { CredentialRequest, ListQuery } from '@/requests'; -import { CredentialTypes } from '@/CredentialTypes'; +import { CredentialTypes } from '@/credential-types'; import { OwnershipService } from '@/services/ownership.service'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { CredentialsRepository } from '@db/repositories/credentials.repository'; import { SharedCredentialsRepository } from '@db/repositories/sharedCredentials.repository'; import { Service } from 'typedi'; @@ -38,7 +38,7 @@ import { NotFoundError } from '@/errors/response-errors/not-found.error'; import type { ProjectRelation } from '@/databases/entities/ProjectRelation'; import { RoleService } from '@/services/role.service'; import { UserRepository } from '@/databases/repositories/user.repository'; -import { userHasScope } from '@/permissions/checkAccess'; +import { userHasScope } from '@/permissions/check-access'; export type CredentialsGetSharedOptions = | { allowGlobalScope: true; globalScope: Scope } diff --git a/packages/cli/src/databases/migrations/common/1674509946020-CreateLdapEntities.ts b/packages/cli/src/databases/migrations/common/1674509946020-CreateLdapEntities.ts index 2115cbeffd..1d915a5576 100644 --- a/packages/cli/src/databases/migrations/common/1674509946020-CreateLdapEntities.ts +++ b/packages/cli/src/databases/migrations/common/1674509946020-CreateLdapEntities.ts @@ -1,5 +1,5 @@ import type { MigrationContext, ReversibleMigration } from '@db/types'; -import { LDAP_DEFAULT_CONFIGURATION, LDAP_FEATURE_NAME } from '@/Ldap/constants'; +import { LDAP_DEFAULT_CONFIGURATION, LDAP_FEATURE_NAME } from '@/ldap/constants'; export class CreateLdapEntities1674509946020 implements ReversibleMigration { async up({ escape, dbType, isMysql, runQuery }: MigrationContext) { diff --git a/packages/cli/src/databases/repositories/execution.repository.ts b/packages/cli/src/databases/repositories/execution.repository.ts index 5b4e515af6..364619fab6 100644 --- a/packages/cli/src/databases/repositories/execution.repository.ts +++ b/packages/cli/src/databases/repositories/execution.repository.ts @@ -42,7 +42,7 @@ import type { ExecutionData } from '../entities/ExecutionData'; import { ExecutionEntity } from '../entities/ExecutionEntity'; import { ExecutionMetadata } from '../entities/ExecutionMetadata'; import { ExecutionDataRepository } from './executionData.repository'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import type { ExecutionSummaries } from '@/executions/execution.types'; import { PostgresLiveRowsRetrievalError } from '@/errors/postgres-live-rows-retrieval.error'; import { separate } from '@/utils'; diff --git a/packages/cli/src/databases/repositories/settings.repository.ts b/packages/cli/src/databases/repositories/settings.repository.ts index 94cb32305a..6a745a8a70 100644 --- a/packages/cli/src/databases/repositories/settings.repository.ts +++ b/packages/cli/src/databases/repositories/settings.repository.ts @@ -1,4 +1,4 @@ -import { EXTERNAL_SECRETS_DB_KEY } from '@/ExternalSecrets/constants'; +import { EXTERNAL_SECRETS_DB_KEY } from '@/external-secrets/constants'; import { Service } from 'typedi'; import { DataSource, Repository } from '@n8n/typeorm'; import { ErrorReporterProxy as ErrorReporter } from 'n8n-workflow'; diff --git a/packages/cli/src/databases/subscribers/UserSubscriber.ts b/packages/cli/src/databases/subscribers/UserSubscriber.ts index b925965a0c..52ef95871e 100644 --- a/packages/cli/src/databases/subscribers/UserSubscriber.ts +++ b/packages/cli/src/databases/subscribers/UserSubscriber.ts @@ -2,7 +2,7 @@ import { Container } from 'typedi'; import type { EntitySubscriberInterface, UpdateEvent } from '@n8n/typeorm'; import { EventSubscriber } from '@n8n/typeorm'; import { ApplicationError, ErrorReporterProxy } from 'n8n-workflow'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { Project } from '../entities/Project'; import { User } from '../entities/User'; diff --git a/packages/cli/src/databases/types.ts b/packages/cli/src/databases/types.ts index e1dc8f20e9..f4c3db0452 100644 --- a/packages/cli/src/databases/types.ts +++ b/packages/cli/src/databases/types.ts @@ -1,6 +1,6 @@ import type { INodeTypes } from 'n8n-workflow'; import type { QueryRunner, ObjectLiteral } from '@n8n/typeorm'; -import type { Logger } from '@/Logger'; +import type { Logger } from '@/logger'; import type { createSchemaBuilder } from './dsl'; export type DatabaseType = 'mariadb' | 'postgresdb' | 'mysqldb' | 'sqlite'; diff --git a/packages/cli/src/databases/utils/migrationHelpers.ts b/packages/cli/src/databases/utils/migrationHelpers.ts index b3187c44e5..0f116590ee 100644 --- a/packages/cli/src/databases/utils/migrationHelpers.ts +++ b/packages/cli/src/databases/utils/migrationHelpers.ts @@ -9,8 +9,8 @@ import { ApplicationError, jsonParse } from 'n8n-workflow'; import { inTest } from '@/constants'; import type { BaseMigration, Migration, MigrationContext, MigrationFn } from '@db/types'; import { createSchemaBuilder } from '@db/dsl'; -import { NodeTypes } from '@/NodeTypes'; -import { Logger } from '@/Logger'; +import { NodeTypes } from '@/node-types'; +import { Logger } from '@/logger'; const PERSONALIZATION_SURVEY_FILENAME = 'personalizationSurvey.json'; diff --git a/packages/cli/src/decorators/__tests__/controller.registry.test.ts b/packages/cli/src/decorators/__tests__/controller.registry.test.ts index 05a97aab53..3a0f0b91d2 100644 --- a/packages/cli/src/decorators/__tests__/controller.registry.test.ts +++ b/packages/cli/src/decorators/__tests__/controller.registry.test.ts @@ -8,7 +8,7 @@ import { mock } from 'jest-mock-extended'; import { ControllerRegistry, Get, Licensed, RestController } from '@/decorators'; import type { AuthService } from '@/auth/auth.service'; -import type { License } from '@/License'; +import type { License } from '@/license'; import type { SuperAgentTest } from '@test-integration/types'; import type { GlobalConfig } from '@n8n/config'; diff --git a/packages/cli/src/decorators/__tests__/OnShutdown.test.ts b/packages/cli/src/decorators/__tests__/on-shutdown.test.ts similarity index 95% rename from packages/cli/src/decorators/__tests__/OnShutdown.test.ts rename to packages/cli/src/decorators/__tests__/on-shutdown.test.ts index 833915f4cb..f8d11140cf 100644 --- a/packages/cli/src/decorators/__tests__/OnShutdown.test.ts +++ b/packages/cli/src/decorators/__tests__/on-shutdown.test.ts @@ -1,6 +1,6 @@ import Container, { Service } from 'typedi'; -import { OnShutdown } from '@/decorators/OnShutdown'; -import { ShutdownService } from '@/shutdown/Shutdown.service'; +import { OnShutdown } from '@/decorators/on-shutdown'; +import { ShutdownService } from '@/shutdown/shutdown.service'; import { mock } from 'jest-mock-extended'; describe('OnShutdown', () => { diff --git a/packages/cli/src/decorators/controller.registry.ts b/packages/cli/src/decorators/controller.registry.ts index 4173f9309e..6ab4e9191d 100644 --- a/packages/cli/src/decorators/controller.registry.ts +++ b/packages/cli/src/decorators/controller.registry.ts @@ -7,10 +7,10 @@ import { AuthService } from '@/auth/auth.service'; import { UnauthenticatedError } from '@/errors/response-errors/unauthenticated.error'; import { inProduction, RESPONSE_ERROR_MESSAGES } from '@/constants'; import type { BooleanLicenseFeature } from '@/Interfaces'; -import { License } from '@/License'; +import { License } from '@/license'; import type { AuthenticatedRequest } from '@/requests'; -import { send } from '@/ResponseHelper'; // TODO: move `ResponseHelper.send` to this file -import { userHasScope } from '@/permissions/checkAccess'; +import { send } from '@/response-helper'; // TODO: move `ResponseHelper.send` to this file +import { userHasScope } from '@/permissions/check-access'; import { GlobalConfig } from '@n8n/config'; import type { AccessScope, diff --git a/packages/cli/src/decorators/index.ts b/packages/cli/src/decorators/index.ts index 61edd6d9d9..5ef6c15f52 100644 --- a/packages/cli/src/decorators/index.ts +++ b/packages/cli/src/decorators/index.ts @@ -1,6 +1,6 @@ -export { RestController } from './RestController'; -export { Get, Post, Put, Patch, Delete } from './Route'; -export { Middleware } from './Middleware'; +export { RestController } from './rest-controller'; +export { Get, Post, Put, Patch, Delete } from './route'; +export { Middleware } from './middleware'; export { ControllerRegistry } from './controller.registry'; -export { Licensed } from './Licensed'; -export { GlobalScope, ProjectScope } from './Scoped'; +export { Licensed } from './licensed'; +export { GlobalScope, ProjectScope } from './scoped'; diff --git a/packages/cli/src/decorators/Licensed.ts b/packages/cli/src/decorators/licensed.ts similarity index 100% rename from packages/cli/src/decorators/Licensed.ts rename to packages/cli/src/decorators/licensed.ts diff --git a/packages/cli/src/decorators/Middleware.ts b/packages/cli/src/decorators/middleware.ts similarity index 100% rename from packages/cli/src/decorators/Middleware.ts rename to packages/cli/src/decorators/middleware.ts diff --git a/packages/cli/src/decorators/OnShutdown.ts b/packages/cli/src/decorators/on-shutdown.ts similarity index 95% rename from packages/cli/src/decorators/OnShutdown.ts rename to packages/cli/src/decorators/on-shutdown.ts index 68b3cbb4ca..ec2d955fe6 100644 --- a/packages/cli/src/decorators/OnShutdown.ts +++ b/packages/cli/src/decorators/on-shutdown.ts @@ -1,6 +1,6 @@ import { Container } from 'typedi'; import { ApplicationError } from 'n8n-workflow'; -import { type ServiceClass, ShutdownService } from '@/shutdown/Shutdown.service'; +import { type ServiceClass, ShutdownService } from '@/shutdown/shutdown.service'; import { DEFAULT_SHUTDOWN_PRIORITY } from '@/constants'; /** diff --git a/packages/cli/src/decorators/Redactable.ts b/packages/cli/src/decorators/redactable.ts similarity index 100% rename from packages/cli/src/decorators/Redactable.ts rename to packages/cli/src/decorators/redactable.ts diff --git a/packages/cli/src/decorators/RestController.ts b/packages/cli/src/decorators/rest-controller.ts similarity index 100% rename from packages/cli/src/decorators/RestController.ts rename to packages/cli/src/decorators/rest-controller.ts diff --git a/packages/cli/src/decorators/Route.ts b/packages/cli/src/decorators/route.ts similarity index 100% rename from packages/cli/src/decorators/Route.ts rename to packages/cli/src/decorators/route.ts diff --git a/packages/cli/src/decorators/Scoped.ts b/packages/cli/src/decorators/scoped.ts similarity index 100% rename from packages/cli/src/decorators/Scoped.ts rename to packages/cli/src/decorators/scoped.ts diff --git a/packages/cli/src/environments/sourceControl/__tests__/sourceControlHelper.ee.test.ts b/packages/cli/src/environments/sourceControl/__tests__/sourceControlHelper.ee.test.ts index 5141d36f2f..8b81bec7b2 100644 --- a/packages/cli/src/environments/sourceControl/__tests__/sourceControlHelper.ee.test.ts +++ b/packages/cli/src/environments/sourceControl/__tests__/sourceControlHelper.ee.test.ts @@ -7,7 +7,7 @@ import { getTrackingInformationFromPullResult, sourceControlFoldersExistCheck, } from '@/environments/sourceControl/sourceControlHelper.ee'; -import { License } from '@/License'; +import { License } from '@/license'; import { SourceControlPreferencesService } from '@/environments/sourceControl/sourceControlPreferences.service.ee'; import { InstanceSettings } from 'n8n-core'; import path from 'path'; diff --git a/packages/cli/src/environments/sourceControl/sourceControl.service.ee.ts b/packages/cli/src/environments/sourceControl/sourceControl.service.ee.ts index 0c9279ffbe..375352e4cc 100644 --- a/packages/cli/src/environments/sourceControl/sourceControl.service.ee.ts +++ b/packages/cli/src/environments/sourceControl/sourceControl.service.ee.ts @@ -32,7 +32,7 @@ import type { SourceControlWorkflowVersionId } from './types/sourceControlWorkfl import type { ExportableCredential } from './types/exportableCredential'; import { EventService } from '@/events/event.service'; import { TagRepository } from '@db/repositories/tag.repository'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { ApplicationError } from 'n8n-workflow'; diff --git a/packages/cli/src/environments/sourceControl/sourceControlExport.service.ee.ts b/packages/cli/src/environments/sourceControl/sourceControlExport.service.ee.ts index 65886a6d6d..6d2d468e30 100644 --- a/packages/cli/src/environments/sourceControl/sourceControlExport.service.ee.ts +++ b/packages/cli/src/environments/sourceControl/sourceControlExport.service.ee.ts @@ -25,7 +25,7 @@ import type { SourceControlledFile } from './types/sourceControlledFile'; import { VariablesService } from '../variables/variables.service.ee'; import { TagRepository } from '@db/repositories/tag.repository'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { SharedCredentialsRepository } from '@db/repositories/sharedCredentials.repository'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { WorkflowTagMappingRepository } from '@db/repositories/workflowTagMapping.repository'; diff --git a/packages/cli/src/environments/sourceControl/sourceControlGit.service.ee.ts b/packages/cli/src/environments/sourceControl/sourceControlGit.service.ee.ts index 1904761996..91220340b7 100644 --- a/packages/cli/src/environments/sourceControl/sourceControlGit.service.ee.ts +++ b/packages/cli/src/environments/sourceControl/sourceControlGit.service.ee.ts @@ -20,7 +20,7 @@ import { } from './constants'; import { sourceControlFoldersExistCheck } from './sourceControlHelper.ee'; import type { User } from '@db/entities/User'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { ApplicationError } from 'n8n-workflow'; import { OwnershipService } from '@/services/ownership.service'; import { SourceControlPreferencesService } from './sourceControlPreferences.service.ee'; diff --git a/packages/cli/src/environments/sourceControl/sourceControlHelper.ee.ts b/packages/cli/src/environments/sourceControl/sourceControlHelper.ee.ts index 8610f03015..65cd88bfa5 100644 --- a/packages/cli/src/environments/sourceControl/sourceControlHelper.ee.ts +++ b/packages/cli/src/environments/sourceControl/sourceControlHelper.ee.ts @@ -1,5 +1,5 @@ import { Container } from 'typedi'; -import { License } from '@/License'; +import { License } from '@/license'; import { generateKeyPairSync } from 'crypto'; import type { KeyPair } from './types/keyPair'; import { constants as fsConstants, mkdirSync, accessSync } from 'fs'; @@ -11,7 +11,7 @@ import { import type { SourceControlledFile } from './types/sourceControlledFile'; import path from 'path'; import type { KeyPairType } from './types/keyPairType'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; export function stringContainsExpression(testString: string): boolean { return /^=.*\{\{.*\}\}/.test(testString); diff --git a/packages/cli/src/environments/sourceControl/sourceControlImport.service.ee.ts b/packages/cli/src/environments/sourceControl/sourceControlImport.service.ee.ts index 7ff77ca7f8..bd04937bc1 100644 --- a/packages/cli/src/environments/sourceControl/sourceControlImport.service.ee.ts +++ b/packages/cli/src/environments/sourceControl/sourceControlImport.service.ee.ts @@ -17,17 +17,17 @@ import type { Variables } from '@db/entities/Variables'; import { SharedCredentials } from '@db/entities/SharedCredentials'; import type { WorkflowTagMapping } from '@db/entities/WorkflowTagMapping'; import type { TagEntity } from '@db/entities/TagEntity'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; // eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import import { In } from '@n8n/typeorm'; -import { isUniqueConstraintError } from '@/ResponseHelper'; +import { isUniqueConstraintError } from '@/response-helper'; import type { SourceControlWorkflowVersionId } from './types/sourceControlWorkflowVersionId'; import { getCredentialExportPath, getWorkflowExportPath } from './sourceControlHelper.ee'; import type { SourceControlledFile } from './types/sourceControlledFile'; import { VariablesService } from '../variables/variables.service.ee'; import { TagRepository } from '@db/repositories/tag.repository'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { CredentialsRepository } from '@db/repositories/credentials.repository'; import { SharedCredentialsRepository } from '@db/repositories/sharedCredentials.repository'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; diff --git a/packages/cli/src/environments/sourceControl/sourceControlPreferences.service.ee.ts b/packages/cli/src/environments/sourceControl/sourceControlPreferences.service.ee.ts index f33cfc2dc6..52a2f6192d 100644 --- a/packages/cli/src/environments/sourceControl/sourceControlPreferences.service.ee.ts +++ b/packages/cli/src/environments/sourceControl/sourceControlPreferences.service.ee.ts @@ -16,7 +16,7 @@ import { import path from 'path'; import type { KeyPairType } from './types/keyPairType'; import config from '@/config'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { SettingsRepository } from '@db/repositories/settings.repository'; @Service() diff --git a/packages/cli/src/environments/variables/environmentHelpers.ts b/packages/cli/src/environments/variables/environmentHelpers.ts index 7868f22715..9a3f2362f8 100644 --- a/packages/cli/src/environments/variables/environmentHelpers.ts +++ b/packages/cli/src/environments/variables/environmentHelpers.ts @@ -1,5 +1,5 @@ import { Container } from 'typedi'; -import { License } from '@/License'; +import { License } from '@/license'; export function isVariablesEnabled(): boolean { const license = Container.get(License); diff --git a/packages/cli/src/ErrorReporting.ts b/packages/cli/src/error-reporting.ts similarity index 100% rename from packages/cli/src/ErrorReporting.ts rename to packages/cli/src/error-reporting.ts diff --git a/packages/cli/src/eventbus/MessageEventBus/MessageEventBus.ts b/packages/cli/src/eventbus/MessageEventBus/MessageEventBus.ts index eeb868798b..38ec4e8dc7 100644 --- a/packages/cli/src/eventbus/MessageEventBus/MessageEventBus.ts +++ b/packages/cli/src/eventbus/MessageEventBus/MessageEventBus.ts @@ -12,7 +12,7 @@ import { EventDestinationsRepository } from '@db/repositories/eventDestinations. import { ExecutionRepository } from '@db/repositories/execution.repository'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import { OrchestrationService } from '@/services/orchestration.service'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import type { EventMessageTypes } from '../EventMessageClasses/'; import type { MessageEventBusDestination } from '../MessageEventBusDestination/MessageEventBusDestination.ee'; @@ -34,7 +34,7 @@ import { EventMessageAiNode, type EventMessageAiNodeOptions, } from '../EventMessageClasses/EventMessageAiNode'; -import { License } from '@/License'; +import { License } from '@/license'; import type { EventMessageExecutionOptions } from '../EventMessageClasses/EventMessageExecution'; import { EventMessageExecution } from '../EventMessageClasses/EventMessageExecution'; import { GlobalConfig } from '@n8n/config'; diff --git a/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestination.ee.ts b/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestination.ee.ts index 6a7fef6d6e..3cd86f4368 100644 --- a/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestination.ee.ts +++ b/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestination.ee.ts @@ -2,13 +2,13 @@ import { v4 as uuid } from 'uuid'; import { Container } from 'typedi'; import type { INodeCredentials, MessageEventBusDestinationOptions } from 'n8n-workflow'; import { MessageEventBusDestinationTypeNames } from 'n8n-workflow'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import type { AbstractEventMessage } from '../EventMessageClasses/AbstractEventMessage'; import type { EventMessageTypes } from '../EventMessageClasses'; import type { EventMessageConfirmSource } from '../EventMessageClasses/EventMessageConfirm'; import type { MessageEventBus, MessageWithCallback } from '../MessageEventBus/MessageEventBus'; import { EventDestinationsRepository } from '@db/repositories/eventDestinations.repository'; -import { License } from '@/License'; +import { License } from '@/license'; export abstract class MessageEventBusDestination implements MessageEventBusDestinationOptions { // Since you can't have static abstract functions - this just serves as a reminder that you need to implement these. Please. diff --git a/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationFromDb.ts b/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationFromDb.ts index 27951448ce..886d1e35dd 100644 --- a/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationFromDb.ts +++ b/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationFromDb.ts @@ -6,7 +6,7 @@ import { MessageEventBusDestinationSentry } from './MessageEventBusDestinationSe import { MessageEventBusDestinationSyslog } from './MessageEventBusDestinationSyslog.ee'; import { MessageEventBusDestinationWebhook } from './MessageEventBusDestinationWebhook.ee'; import { Container } from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; export function messageEventBusDestinationFromDb( eventBusInstance: MessageEventBus, diff --git a/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationSyslog.ee.ts b/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationSyslog.ee.ts index f57705319c..8d9b743829 100644 --- a/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationSyslog.ee.ts +++ b/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationSyslog.ee.ts @@ -10,7 +10,7 @@ import { MessageEventBusDestination } from './MessageEventBusDestination.ee'; import { eventMessageGenericDestinationTestEvent } from '../EventMessageClasses/EventMessageGeneric'; import type { MessageEventBus, MessageWithCallback } from '../MessageEventBus/MessageEventBus'; import Container from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; export const isMessageEventBusDestinationSyslogOptions = ( candidate: unknown, ): candidate is MessageEventBusDestinationSyslogOptions => { diff --git a/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationWebhook.ee.ts b/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationWebhook.ee.ts index 20f7dbb411..5521854952 100644 --- a/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationWebhook.ee.ts +++ b/packages/cli/src/eventbus/MessageEventBusDestination/MessageEventBusDestinationWebhook.ee.ts @@ -11,11 +11,11 @@ import type { IWorkflowExecuteAdditionalData, MessageEventBusDestinationWebhookOptions, } from 'n8n-workflow'; -import { CredentialsHelper } from '@/CredentialsHelper'; +import { CredentialsHelper } from '@/credentials-helper'; import { Agent as HTTPSAgent } from 'https'; import { eventMessageGenericDestinationTestEvent } from '../EventMessageClasses/EventMessageGeneric'; import type { MessageEventBus, MessageWithCallback } from '../MessageEventBus/MessageEventBus'; -import * as SecretsHelpers from '@/ExternalSecrets/externalSecretsHelper.ee'; +import * as SecretsHelpers from '@/external-secrets/external-secrets-helper.ee'; import Container from 'typedi'; export const isMessageEventBusDestinationWebhookOptions = ( diff --git a/packages/cli/src/eventbus/MessageEventBusWriter/MessageEventBusLogWriter.ts b/packages/cli/src/eventbus/MessageEventBusWriter/MessageEventBusLogWriter.ts index 0e49ff3fb7..617dacd283 100644 --- a/packages/cli/src/eventbus/MessageEventBusWriter/MessageEventBusLogWriter.ts +++ b/packages/cli/src/eventbus/MessageEventBusWriter/MessageEventBusLogWriter.ts @@ -26,7 +26,7 @@ import { } from '../EventMessageClasses/EventMessageConfirm'; import { once as eventOnce } from 'events'; import { inTest } from '@/constants'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import Container from 'typedi'; import { GlobalConfig } from '@n8n/config'; diff --git a/packages/cli/src/events/__tests__/telemetry-event-relay.test.ts b/packages/cli/src/events/__tests__/telemetry-event-relay.test.ts index 8e4fb444c6..87d89841ad 100644 --- a/packages/cli/src/events/__tests__/telemetry-event-relay.test.ts +++ b/packages/cli/src/events/__tests__/telemetry-event-relay.test.ts @@ -5,10 +5,10 @@ import config from '@/config'; import type { IWorkflowBase } from 'n8n-workflow'; import type { IWorkflowDb } from '@/Interfaces'; import type { Telemetry } from '@/telemetry'; -import type { License } from '@/License'; +import type { License } from '@/license'; import type { GlobalConfig } from '@n8n/config'; import type { WorkflowRepository } from '@/databases/repositories/workflow.repository'; -import type { NodeTypes } from '@/NodeTypes'; +import type { NodeTypes } from '@/node-types'; import type { SharedWorkflowRepository } from '@/databases/repositories/sharedWorkflow.repository'; import type { ProjectRelationRepository } from '@/databases/repositories/projectRelation.repository'; import type { RelayEventMap } from '@/events/relay-event-map'; diff --git a/packages/cli/src/events/log-streaming-event-relay.ts b/packages/cli/src/events/log-streaming-event-relay.ts index 2d79408d4a..2012775d91 100644 --- a/packages/cli/src/events/log-streaming-event-relay.ts +++ b/packages/cli/src/events/log-streaming-event-relay.ts @@ -1,6 +1,6 @@ import { Service } from 'typedi'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; -import { Redactable } from '@/decorators/Redactable'; +import { Redactable } from '@/decorators/redactable'; import { EventRelay } from '@/events/event-relay'; import type { RelayEventMap } from '@/events/relay-event-map'; import type { IWorkflowBase } from 'n8n-workflow'; diff --git a/packages/cli/src/events/telemetry-event-relay.ts b/packages/cli/src/events/telemetry-event-relay.ts index 3389e24b3f..dc1dae08a0 100644 --- a/packages/cli/src/events/telemetry-event-relay.ts +++ b/packages/cli/src/events/telemetry-event-relay.ts @@ -4,18 +4,18 @@ import type { RelayEventMap } from '@/events/relay-event-map'; import { Telemetry } from '../telemetry'; import config from '@/config'; import os from 'node:os'; -import { License } from '@/License'; +import { License } from '@/license'; import { GlobalConfig } from '@n8n/config'; import { N8N_VERSION } from '@/constants'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; import type { ExecutionStatus, INodesGraphResult, ITelemetryTrackProperties } from 'n8n-workflow'; import { get as pslGet } from 'psl'; import { TelemetryHelpers } from 'n8n-workflow'; -import { NodeTypes } from '@/NodeTypes'; +import { NodeTypes } from '@/node-types'; import { SharedWorkflowRepository } from '@/databases/repositories/sharedWorkflow.repository'; import { ProjectRelationRepository } from '@/databases/repositories/projectRelation.repository'; import type { IExecutionTrackProperties } from '@/Interfaces'; -import { determineFinalExecutionStatus } from '@/executionLifecycleHooks/shared/sharedHookFunctions'; +import { determineFinalExecutionStatus } from '@/execution-lifecycle-hooks/shared/shared-hook-functions'; import { EventRelay } from './event-relay'; import { snakeCase } from 'change-case'; diff --git a/packages/cli/src/executionLifecycleHooks/__tests__/restoreBinaryDataId.test.ts b/packages/cli/src/execution-lifecycle-hooks/__tests__/restore-binary-data-id.test.ts similarity index 98% rename from packages/cli/src/executionLifecycleHooks/__tests__/restoreBinaryDataId.test.ts rename to packages/cli/src/execution-lifecycle-hooks/__tests__/restore-binary-data-id.test.ts index ea962882bd..58f0825ef7 100644 --- a/packages/cli/src/executionLifecycleHooks/__tests__/restoreBinaryDataId.test.ts +++ b/packages/cli/src/execution-lifecycle-hooks/__tests__/restore-binary-data-id.test.ts @@ -1,4 +1,4 @@ -import { restoreBinaryDataId } from '@/executionLifecycleHooks/restoreBinaryDataId'; +import { restoreBinaryDataId } from '@/execution-lifecycle-hooks/restore-binary-data-id'; import { BinaryDataService } from 'n8n-core'; import { mockInstance } from '@test/mocking'; diff --git a/packages/cli/src/executionLifecycleHooks/__tests__/saveExecutionProgress.test.ts b/packages/cli/src/execution-lifecycle-hooks/__tests__/save-execution-progress.test.ts similarity index 92% rename from packages/cli/src/executionLifecycleHooks/__tests__/saveExecutionProgress.test.ts rename to packages/cli/src/execution-lifecycle-hooks/__tests__/save-execution-progress.test.ts index 9b1faa7f60..5dc7172659 100644 --- a/packages/cli/src/executionLifecycleHooks/__tests__/saveExecutionProgress.test.ts +++ b/packages/cli/src/execution-lifecycle-hooks/__tests__/save-execution-progress.test.ts @@ -1,8 +1,8 @@ import { ExecutionRepository } from '@/databases/repositories/execution.repository'; import { mockInstance } from '@test/mocking'; -import { Logger } from '@/Logger'; -import { saveExecutionProgress } from '@/executionLifecycleHooks/saveExecutionProgress'; -import * as fnModule from '@/executionLifecycleHooks/toSaveSettings'; +import { Logger } from '@/logger'; +import { saveExecutionProgress } from '@/execution-lifecycle-hooks/save-execution-progress'; +import * as fnModule from '@/execution-lifecycle-hooks/to-save-settings'; import { ErrorReporterProxy, type IRunExecutionData, diff --git a/packages/cli/src/executionLifecycleHooks/__tests__/toSaveSettings.test.ts b/packages/cli/src/execution-lifecycle-hooks/__tests__/to-save-settings.test.ts similarity index 98% rename from packages/cli/src/executionLifecycleHooks/__tests__/toSaveSettings.test.ts rename to packages/cli/src/execution-lifecycle-hooks/__tests__/to-save-settings.test.ts index 57379e0e73..f12c209827 100644 --- a/packages/cli/src/executionLifecycleHooks/__tests__/toSaveSettings.test.ts +++ b/packages/cli/src/execution-lifecycle-hooks/__tests__/to-save-settings.test.ts @@ -1,5 +1,5 @@ import config from '@/config'; -import { toSaveSettings } from '@/executionLifecycleHooks/toSaveSettings'; +import { toSaveSettings } from '@/execution-lifecycle-hooks/to-save-settings'; afterEach(() => { config.load(config.default); diff --git a/packages/cli/src/executionLifecycleHooks/restoreBinaryDataId.ts b/packages/cli/src/execution-lifecycle-hooks/restore-binary-data-id.ts similarity index 98% rename from packages/cli/src/executionLifecycleHooks/restoreBinaryDataId.ts rename to packages/cli/src/execution-lifecycle-hooks/restore-binary-data-id.ts index 84780a785e..d19a6e22a4 100644 --- a/packages/cli/src/executionLifecycleHooks/restoreBinaryDataId.ts +++ b/packages/cli/src/execution-lifecycle-hooks/restore-binary-data-id.ts @@ -3,7 +3,7 @@ import { BinaryDataService } from 'n8n-core'; import type { IRun, WorkflowExecuteMode } from 'n8n-workflow'; import type { BinaryData } from 'n8n-core'; import config from '@/config'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; /** * Whenever the execution ID is not available to the binary data service at the diff --git a/packages/cli/src/executionLifecycleHooks/saveExecutionProgress.ts b/packages/cli/src/execution-lifecycle-hooks/save-execution-progress.ts similarity index 96% rename from packages/cli/src/executionLifecycleHooks/saveExecutionProgress.ts rename to packages/cli/src/execution-lifecycle-hooks/save-execution-progress.ts index 933b81f788..33b1d9308e 100644 --- a/packages/cli/src/executionLifecycleHooks/saveExecutionProgress.ts +++ b/packages/cli/src/execution-lifecycle-hooks/save-execution-progress.ts @@ -3,9 +3,9 @@ import { Container } from 'typedi'; import type { IRunExecutionData, ITaskData, IWorkflowBase } from 'n8n-workflow'; import { ErrorReporterProxy as ErrorReporter } from 'n8n-workflow'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { ExecutionRepository } from '@/databases/repositories/execution.repository'; -import { toSaveSettings } from '@/executionLifecycleHooks/toSaveSettings'; +import { toSaveSettings } from '@/execution-lifecycle-hooks/to-save-settings'; export async function saveExecutionProgress( workflowData: IWorkflowBase, diff --git a/packages/cli/src/executionLifecycleHooks/shared/sharedHookFunctions.ts b/packages/cli/src/execution-lifecycle-hooks/shared/shared-hook-functions.ts similarity index 99% rename from packages/cli/src/executionLifecycleHooks/shared/sharedHookFunctions.ts rename to packages/cli/src/execution-lifecycle-hooks/shared/shared-hook-functions.ts index 7a2e401919..2e5436758f 100644 --- a/packages/cli/src/executionLifecycleHooks/shared/sharedHookFunctions.ts +++ b/packages/cli/src/execution-lifecycle-hooks/shared/shared-hook-functions.ts @@ -5,7 +5,7 @@ import pick from 'lodash/pick'; import { isWorkflowIdValid } from '@/utils'; import { ExecutionRepository } from '@db/repositories/execution.repository'; import { ExecutionMetadataService } from '@/services/executionMetadata.service'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; export function determineFinalExecutionStatus(runData: IRun): ExecutionStatus { const workflowHasCrashed = runData.status === 'crashed'; diff --git a/packages/cli/src/executionLifecycleHooks/toSaveSettings.ts b/packages/cli/src/execution-lifecycle-hooks/to-save-settings.ts similarity index 100% rename from packages/cli/src/executionLifecycleHooks/toSaveSettings.ts rename to packages/cli/src/execution-lifecycle-hooks/to-save-settings.ts diff --git a/packages/cli/src/executions/__tests__/execution.service.test.ts b/packages/cli/src/executions/__tests__/execution.service.test.ts index 28c76e1c58..99370c1e1b 100644 --- a/packages/cli/src/executions/__tests__/execution.service.test.ts +++ b/packages/cli/src/executions/__tests__/execution.service.test.ts @@ -4,10 +4,10 @@ import config from '@/config'; import { ExecutionService } from '@/executions/execution.service'; import { AbortedExecutionRetryError } from '@/errors/aborted-execution-retry.error'; import { MissingExecutionStopError } from '@/errors/missing-execution-stop.error'; -import type { ActiveExecutions } from '@/ActiveExecutions'; +import type { ActiveExecutions } from '@/active-executions'; import type { IExecutionResponse } from '@/Interfaces'; import { ScalingService } from '@/scaling/scaling.service'; -import type { WaitTracker } from '@/WaitTracker'; +import type { WaitTracker } from '@/wait-tracker'; import type { ExecutionRepository } from '@/databases/repositories/execution.repository'; import type { ExecutionRequest } from '@/executions/execution.types'; import type { ConcurrencyControlService } from '@/concurrency/concurrency-control.service'; diff --git a/packages/cli/src/executions/__tests__/executions.controller.test.ts b/packages/cli/src/executions/__tests__/executions.controller.test.ts index decb88d598..acf619a9ea 100644 --- a/packages/cli/src/executions/__tests__/executions.controller.test.ts +++ b/packages/cli/src/executions/__tests__/executions.controller.test.ts @@ -3,7 +3,7 @@ import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { ExecutionsController } from '@/executions/executions.controller'; import type { ExecutionRequest, ExecutionSummaries } from '@/executions/execution.types'; import type { ExecutionService } from '@/executions/execution.service'; -import type { WorkflowSharingService } from '@/workflows/workflowSharing.service'; +import type { WorkflowSharingService } from '@/workflows/workflow-sharing.service'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; describe('ExecutionsController', () => { diff --git a/packages/cli/src/executions/execution-recovery.service.ts b/packages/cli/src/executions/execution-recovery.service.ts index 8e29127737..ffe4e04a45 100644 --- a/packages/cli/src/executions/execution-recovery.service.ts +++ b/packages/cli/src/executions/execution-recovery.service.ts @@ -2,7 +2,7 @@ import { Service } from 'typedi'; import { Push } from '@/push'; import { sleep } from 'n8n-workflow'; import { ExecutionRepository } from '@db/repositories/execution.repository'; -import { getWorkflowHooksMain } from '@/WorkflowExecuteAdditionalData'; // @TODO: Dependency cycle +import { getWorkflowHooksMain } from '@/workflow-execute-additional-data'; // @TODO: Dependency cycle import type { DateTime } from 'luxon'; import type { IRun, ITaskData } from 'n8n-workflow'; import { InstanceSettings } from 'n8n-core'; @@ -11,7 +11,7 @@ import type { IExecutionResponse } from '@/Interfaces'; import { NodeCrashedError } from '@/errors/node-crashed.error'; import { WorkflowCrashedError } from '@/errors/workflow-crashed.error'; import { ARTIFICIAL_TASK_DATA } from '@/constants'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { EventService } from '@/events/event.service'; /** diff --git a/packages/cli/src/executions/execution.service.ts b/packages/cli/src/executions/execution.service.ts index b4e8b33573..61a1dc0db1 100644 --- a/packages/cli/src/executions/execution.service.ts +++ b/packages/cli/src/executions/execution.service.ts @@ -15,7 +15,7 @@ import { Workflow, WorkflowOperationError, } from 'n8n-workflow'; -import { ActiveExecutions } from '@/ActiveExecutions'; +import { ActiveExecutions } from '@/active-executions'; import type { ExecutionPayload, IExecutionFlattedResponse, @@ -23,24 +23,24 @@ import type { IWorkflowDb, IWorkflowExecutionDataProcess, } from '@/Interfaces'; -import { NodeTypes } from '@/NodeTypes'; +import { NodeTypes } from '@/node-types'; import type { ExecutionRequest, ExecutionSummaries, StopResult } from './execution.types'; -import { WorkflowRunner } from '@/WorkflowRunner'; +import { WorkflowRunner } from '@/workflow-runner'; import type { IGetExecutionsQueryFilter } from '@db/repositories/execution.repository'; import { ExecutionRepository } from '@db/repositories/execution.repository'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { InternalServerError } from '@/errors/response-errors/internal-server.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import config from '@/config'; -import { WaitTracker } from '@/WaitTracker'; +import { WaitTracker } from '@/wait-tracker'; import { MissingExecutionStopError } from '@/errors/missing-execution-stop.error'; import { QueuedExecutionRetryError } from '@/errors/queued-execution-retry.error'; import { ConcurrencyControlService } from '@/concurrency/concurrency-control.service'; import { AbortedExecutionRetryError } from '@/errors/aborted-execution-retry.error'; -import { License } from '@/License'; +import { License } from '@/license'; import type { User } from '@/databases/entities/User'; -import { WorkflowSharingService } from '@/workflows/workflowSharing.service'; +import { WorkflowSharingService } from '@/workflows/workflow-sharing.service'; export const schemaGetExecutionsQueryFilter = { $id: '/IGetExecutionsQueryFilter', diff --git a/packages/cli/src/executions/executions.controller.ts b/packages/cli/src/executions/executions.controller.ts index c68c8cb7d5..23e51efda9 100644 --- a/packages/cli/src/executions/executions.controller.ts +++ b/packages/cli/src/executions/executions.controller.ts @@ -2,8 +2,8 @@ import { ExecutionRequest, type ExecutionSummaries } from './execution.types'; import { ExecutionService } from './execution.service'; import { Get, Post, RestController } from '@/decorators'; import { EnterpriseExecutionsService } from './execution.service.ee'; -import { License } from '@/License'; -import { WorkflowSharingService } from '@/workflows/workflowSharing.service'; +import { License } from '@/license'; +import { WorkflowSharingService } from '@/workflows/workflow-sharing.service'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { parseRangeQuery } from './parse-range-query.middleware'; import type { User } from '@/databases/entities/User'; diff --git a/packages/cli/src/executions/parse-range-query.middleware.ts b/packages/cli/src/executions/parse-range-query.middleware.ts index 528c00f676..b02b012c24 100644 --- a/packages/cli/src/executions/parse-range-query.middleware.ts +++ b/packages/cli/src/executions/parse-range-query.middleware.ts @@ -1,4 +1,4 @@ -import * as ResponseHelper from '@/ResponseHelper'; +import * as ResponseHelper from '@/response-helper'; import type { NextFunction, Response } from 'express'; import type { ExecutionRequest } from './execution.types'; import type { JsonObject } from 'n8n-workflow'; diff --git a/packages/cli/src/ExpressionEvaluator.ts b/packages/cli/src/expression-evaluator.ts similarity index 100% rename from packages/cli/src/ExpressionEvaluator.ts rename to packages/cli/src/expression-evaluator.ts diff --git a/packages/cli/src/ExternalHooks.ts b/packages/cli/src/external-hooks.ts similarity index 100% rename from packages/cli/src/ExternalHooks.ts rename to packages/cli/src/external-hooks.ts diff --git a/packages/cli/src/ExternalSecrets/__tests__/ExternalSecretsManager.ee.test.ts b/packages/cli/src/external-secrets/__tests__/external-secrets-manager.ee.test.ts similarity index 94% rename from packages/cli/src/ExternalSecrets/__tests__/ExternalSecretsManager.ee.test.ts rename to packages/cli/src/external-secrets/__tests__/external-secrets-manager.ee.test.ts index 7df8d6d323..6a0d1cc23e 100644 --- a/packages/cli/src/ExternalSecrets/__tests__/ExternalSecretsManager.ee.test.ts +++ b/packages/cli/src/external-secrets/__tests__/external-secrets-manager.ee.test.ts @@ -2,9 +2,9 @@ import { Container } from 'typedi'; import { Cipher } from 'n8n-core'; import { SettingsRepository } from '@db/repositories/settings.repository'; import type { ExternalSecretsSettings } from '@/Interfaces'; -import { License } from '@/License'; -import { ExternalSecretsManager } from '@/ExternalSecrets/ExternalSecretsManager.ee'; -import { ExternalSecretsProviders } from '@/ExternalSecrets/ExternalSecretsProviders.ee'; +import { License } from '@/license'; +import { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee'; +import { ExternalSecretsProviders } from '@/external-secrets/external-secrets-providers.ee'; import { mockInstance } from '@test/mocking'; import { DummyProvider, diff --git a/packages/cli/src/ExternalSecrets/constants.ts b/packages/cli/src/external-secrets/constants.ts similarity index 100% rename from packages/cli/src/ExternalSecrets/constants.ts rename to packages/cli/src/external-secrets/constants.ts diff --git a/packages/cli/src/ExternalSecrets/externalSecretsHelper.ee.ts b/packages/cli/src/external-secrets/external-secrets-helper.ee.ts similarity index 91% rename from packages/cli/src/ExternalSecrets/externalSecretsHelper.ee.ts rename to packages/cli/src/external-secrets/external-secrets-helper.ee.ts index 40ca21b937..85997d805e 100644 --- a/packages/cli/src/ExternalSecrets/externalSecretsHelper.ee.ts +++ b/packages/cli/src/external-secrets/external-secrets-helper.ee.ts @@ -1,4 +1,4 @@ -import { License } from '@/License'; +import { License } from '@/license'; import { GlobalConfig } from '@n8n/config'; import Container from 'typedi'; diff --git a/packages/cli/src/ExternalSecrets/ExternalSecretsManager.ee.ts b/packages/cli/src/external-secrets/external-secrets-manager.ee.ts similarity index 98% rename from packages/cli/src/ExternalSecrets/ExternalSecretsManager.ee.ts rename to packages/cli/src/external-secrets/external-secrets-manager.ee.ts index 2ae33be62a..2281f03538 100644 --- a/packages/cli/src/ExternalSecrets/ExternalSecretsManager.ee.ts +++ b/packages/cli/src/external-secrets/external-secrets-manager.ee.ts @@ -8,14 +8,14 @@ import type { import { Cipher } from 'n8n-core'; import Container, { Service } from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { jsonParse, type IDataObject, ApplicationError } from 'n8n-workflow'; import { EXTERNAL_SECRETS_INITIAL_BACKOFF, EXTERNAL_SECRETS_MAX_BACKOFF } from './constants'; -import { License } from '@/License'; +import { License } from '@/license'; import { EventService } from '@/events/event.service'; -import { updateIntervalTime } from './externalSecretsHelper.ee'; -import { ExternalSecretsProviders } from './ExternalSecretsProviders.ee'; +import { updateIntervalTime } from './external-secrets-helper.ee'; +import { ExternalSecretsProviders } from './external-secrets-providers.ee'; import { OrchestrationService } from '@/services/orchestration.service'; @Service() diff --git a/packages/cli/src/ExternalSecrets/ExternalSecretsProviders.ee.ts b/packages/cli/src/external-secrets/external-secrets-providers.ee.ts similarity index 100% rename from packages/cli/src/ExternalSecrets/ExternalSecretsProviders.ee.ts rename to packages/cli/src/external-secrets/external-secrets-providers.ee.ts diff --git a/packages/cli/src/ExternalSecrets/ExternalSecrets.controller.ee.ts b/packages/cli/src/external-secrets/external-secrets.controller.ee.ts similarity index 97% rename from packages/cli/src/ExternalSecrets/ExternalSecrets.controller.ee.ts rename to packages/cli/src/external-secrets/external-secrets.controller.ee.ts index 86a61b75a0..0b27d856dc 100644 --- a/packages/cli/src/ExternalSecrets/ExternalSecrets.controller.ee.ts +++ b/packages/cli/src/external-secrets/external-secrets.controller.ee.ts @@ -1,7 +1,7 @@ import { Get, Post, RestController, GlobalScope } from '@/decorators'; import { ExternalSecretsRequest } from '@/requests'; import { Response } from 'express'; -import { ExternalSecretsService } from './ExternalSecrets.service.ee'; +import { ExternalSecretsService } from './external-secrets.service.ee'; import { ExternalSecretsProviderNotFoundError } from '@/errors/external-secrets-provider-not-found.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; diff --git a/packages/cli/src/ExternalSecrets/ExternalSecrets.service.ee.ts b/packages/cli/src/external-secrets/external-secrets.service.ee.ts similarity index 98% rename from packages/cli/src/ExternalSecrets/ExternalSecrets.service.ee.ts rename to packages/cli/src/external-secrets/external-secrets.service.ee.ts index 0c378540ac..ea9f4ed170 100644 --- a/packages/cli/src/ExternalSecrets/ExternalSecrets.service.ee.ts +++ b/packages/cli/src/external-secrets/external-secrets.service.ee.ts @@ -4,7 +4,7 @@ import type { ExternalSecretsRequest } from '@/requests'; import type { IDataObject } from 'n8n-workflow'; import { deepCopy } from 'n8n-workflow'; import Container, { Service } from 'typedi'; -import { ExternalSecretsManager } from './ExternalSecretsManager.ee'; +import { ExternalSecretsManager } from './external-secrets-manager.ee'; import { ExternalSecretsProviderNotFoundError } from '@/errors/external-secrets-provider-not-found.error'; @Service() diff --git a/packages/cli/src/ExternalSecrets/providers/__tests__/azure-key-vault.test.ts b/packages/cli/src/external-secrets/providers/__tests__/azure-key-vault.test.ts similarity index 100% rename from packages/cli/src/ExternalSecrets/providers/__tests__/azure-key-vault.test.ts rename to packages/cli/src/external-secrets/providers/__tests__/azure-key-vault.test.ts diff --git a/packages/cli/src/ExternalSecrets/providers/__tests__/gcp-secrets-manager.test.ts b/packages/cli/src/external-secrets/providers/__tests__/gcp-secrets-manager.test.ts similarity index 100% rename from packages/cli/src/ExternalSecrets/providers/__tests__/gcp-secrets-manager.test.ts rename to packages/cli/src/external-secrets/providers/__tests__/gcp-secrets-manager.test.ts diff --git a/packages/cli/src/ExternalSecrets/providers/aws-secrets/aws-secrets-client.ts b/packages/cli/src/external-secrets/providers/aws-secrets/aws-secrets-client.ts similarity index 100% rename from packages/cli/src/ExternalSecrets/providers/aws-secrets/aws-secrets-client.ts rename to packages/cli/src/external-secrets/providers/aws-secrets/aws-secrets-client.ts diff --git a/packages/cli/src/ExternalSecrets/providers/aws-secrets/aws-secrets-manager.ts b/packages/cli/src/external-secrets/providers/aws-secrets/aws-secrets-manager.ts similarity index 99% rename from packages/cli/src/ExternalSecrets/providers/aws-secrets/aws-secrets-manager.ts rename to packages/cli/src/external-secrets/providers/aws-secrets/aws-secrets-manager.ts index b7b5f52d7b..a4de7d164c 100644 --- a/packages/cli/src/ExternalSecrets/providers/aws-secrets/aws-secrets-manager.ts +++ b/packages/cli/src/external-secrets/providers/aws-secrets/aws-secrets-manager.ts @@ -1,6 +1,6 @@ import { AwsSecretsClient } from './aws-secrets-client'; import { UnknownAuthTypeError } from '@/errors/unknown-auth-type.error'; -import { DOCS_HELP_NOTICE, EXTERNAL_SECRETS_NAME_REGEX } from '@/ExternalSecrets/constants'; +import { DOCS_HELP_NOTICE, EXTERNAL_SECRETS_NAME_REGEX } from '@/external-secrets/constants'; import type { SecretsProvider, SecretsProviderState } from '@/Interfaces'; import type { INodeProperties } from 'n8n-workflow'; import type { AwsSecretsManagerContext } from './types'; diff --git a/packages/cli/src/ExternalSecrets/providers/aws-secrets/types.ts b/packages/cli/src/external-secrets/providers/aws-secrets/types.ts similarity index 100% rename from packages/cli/src/ExternalSecrets/providers/aws-secrets/types.ts rename to packages/cli/src/external-secrets/providers/aws-secrets/types.ts diff --git a/packages/cli/src/ExternalSecrets/providers/azure-key-vault/azure-key-vault.ts b/packages/cli/src/external-secrets/providers/azure-key-vault/azure-key-vault.ts similarity index 99% rename from packages/cli/src/ExternalSecrets/providers/azure-key-vault/azure-key-vault.ts rename to packages/cli/src/external-secrets/providers/azure-key-vault/azure-key-vault.ts index 7df196bdf9..ad272abe54 100644 --- a/packages/cli/src/ExternalSecrets/providers/azure-key-vault/azure-key-vault.ts +++ b/packages/cli/src/external-secrets/providers/azure-key-vault/azure-key-vault.ts @@ -3,7 +3,7 @@ import { SecretClient } from '@azure/keyvault-secrets'; import type { SecretsProvider, SecretsProviderState } from '@/Interfaces'; import type { INodeProperties } from 'n8n-workflow'; import type { AzureKeyVaultContext } from './types'; -import { DOCS_HELP_NOTICE, EXTERNAL_SECRETS_NAME_REGEX } from '@/ExternalSecrets/constants'; +import { DOCS_HELP_NOTICE, EXTERNAL_SECRETS_NAME_REGEX } from '@/external-secrets/constants'; export class AzureKeyVault implements SecretsProvider { name = 'azureKeyVault'; diff --git a/packages/cli/src/ExternalSecrets/providers/azure-key-vault/types.ts b/packages/cli/src/external-secrets/providers/azure-key-vault/types.ts similarity index 100% rename from packages/cli/src/ExternalSecrets/providers/azure-key-vault/types.ts rename to packages/cli/src/external-secrets/providers/azure-key-vault/types.ts diff --git a/packages/cli/src/ExternalSecrets/providers/gcp-secrets-manager/gcp-secrets-manager.ts b/packages/cli/src/external-secrets/providers/gcp-secrets-manager/gcp-secrets-manager.ts similarity index 99% rename from packages/cli/src/ExternalSecrets/providers/gcp-secrets-manager/gcp-secrets-manager.ts rename to packages/cli/src/external-secrets/providers/gcp-secrets-manager/gcp-secrets-manager.ts index 64ed49f05c..ac00245c58 100644 --- a/packages/cli/src/ExternalSecrets/providers/gcp-secrets-manager/gcp-secrets-manager.ts +++ b/packages/cli/src/external-secrets/providers/gcp-secrets-manager/gcp-secrets-manager.ts @@ -1,5 +1,5 @@ import { SecretManagerServiceClient as GcpClient } from '@google-cloud/secret-manager'; -import { DOCS_HELP_NOTICE, EXTERNAL_SECRETS_NAME_REGEX } from '@/ExternalSecrets/constants'; +import { DOCS_HELP_NOTICE, EXTERNAL_SECRETS_NAME_REGEX } from '@/external-secrets/constants'; import type { SecretsProvider, SecretsProviderState } from '@/Interfaces'; import { jsonParse, type INodeProperties } from 'n8n-workflow'; import type { diff --git a/packages/cli/src/ExternalSecrets/providers/gcp-secrets-manager/types.ts b/packages/cli/src/external-secrets/providers/gcp-secrets-manager/types.ts similarity index 100% rename from packages/cli/src/ExternalSecrets/providers/gcp-secrets-manager/types.ts rename to packages/cli/src/external-secrets/providers/gcp-secrets-manager/types.ts diff --git a/packages/cli/src/ExternalSecrets/providers/infisical.ts b/packages/cli/src/external-secrets/providers/infisical.ts similarity index 100% rename from packages/cli/src/ExternalSecrets/providers/infisical.ts rename to packages/cli/src/external-secrets/providers/infisical.ts diff --git a/packages/cli/src/ExternalSecrets/providers/vault.ts b/packages/cli/src/external-secrets/providers/vault.ts similarity index 99% rename from packages/cli/src/ExternalSecrets/providers/vault.ts rename to packages/cli/src/external-secrets/providers/vault.ts index 6735d26d6d..e69a909481 100644 --- a/packages/cli/src/ExternalSecrets/providers/vault.ts +++ b/packages/cli/src/external-secrets/providers/vault.ts @@ -3,9 +3,9 @@ import { SecretsProvider } from '@/Interfaces'; import type { IDataObject, INodeProperties } from 'n8n-workflow'; import type { AxiosInstance, AxiosResponse } from 'axios'; import axios from 'axios'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { DOCS_HELP_NOTICE, EXTERNAL_SECRETS_NAME_REGEX } from '../constants'; -import { preferGet } from '../externalSecretsHelper.ee'; +import { preferGet } from '../external-secrets-helper.ee'; import { Container } from 'typedi'; type VaultAuthMethod = 'token' | 'usernameAndPassword' | 'appRole'; diff --git a/packages/cli/src/GenericHelpers.ts b/packages/cli/src/generic-helpers.ts similarity index 100% rename from packages/cli/src/GenericHelpers.ts rename to packages/cli/src/generic-helpers.ts diff --git a/packages/cli/src/InternalHooks.ts b/packages/cli/src/internal-hooks.ts similarity index 100% rename from packages/cli/src/InternalHooks.ts rename to packages/cli/src/internal-hooks.ts diff --git a/packages/cli/src/Ldap/__tests__/helpers.test.ts b/packages/cli/src/ldap/__tests__/helpers.test.ts similarity index 96% rename from packages/cli/src/Ldap/__tests__/helpers.test.ts rename to packages/cli/src/ldap/__tests__/helpers.test.ts index 719adea76c..876a330520 100644 --- a/packages/cli/src/Ldap/__tests__/helpers.test.ts +++ b/packages/cli/src/ldap/__tests__/helpers.test.ts @@ -1,6 +1,6 @@ import { UserRepository } from '@/databases/repositories/user.repository'; import { mockInstance } from '@test/mocking'; -import * as helpers from '@/Ldap/helpers.ee'; +import * as helpers from '@/ldap/helpers.ee'; import { AuthIdentity } from '@/databases/entities/AuthIdentity'; import { User } from '@/databases/entities/User'; import { generateNanoId } from '@/databases/utils/generators'; diff --git a/packages/cli/src/Ldap/constants.ts b/packages/cli/src/ldap/constants.ts similarity index 100% rename from packages/cli/src/Ldap/constants.ts rename to packages/cli/src/ldap/constants.ts diff --git a/packages/cli/src/Ldap/helpers.ee.ts b/packages/cli/src/ldap/helpers.ee.ts similarity index 99% rename from packages/cli/src/Ldap/helpers.ee.ts rename to packages/cli/src/ldap/helpers.ee.ts index bf91bb83db..d705fb66fa 100644 --- a/packages/cli/src/Ldap/helpers.ee.ts +++ b/packages/cli/src/ldap/helpers.ee.ts @@ -17,7 +17,7 @@ import { LDAP_LOGIN_LABEL, } from './constants'; import type { ConnectionSecurity, LdapConfig } from './types'; -import { License } from '@/License'; +import { License } from '@/license'; import { UserRepository } from '@db/repositories/user.repository'; import { AuthProviderSyncHistoryRepository } from '@db/repositories/authProviderSyncHistory.repository'; import { AuthIdentityRepository } from '@db/repositories/authIdentity.repository'; diff --git a/packages/cli/src/Ldap/ldap.controller.ee.ts b/packages/cli/src/ldap/ldap.controller.ee.ts similarity index 100% rename from packages/cli/src/Ldap/ldap.controller.ee.ts rename to packages/cli/src/ldap/ldap.controller.ee.ts diff --git a/packages/cli/src/Ldap/ldap.service.ee.ts b/packages/cli/src/ldap/ldap.service.ee.ts similarity index 99% rename from packages/cli/src/Ldap/ldap.service.ee.ts rename to packages/cli/src/ldap/ldap.service.ee.ts index 32c3152fb5..c24cade682 100644 --- a/packages/cli/src/Ldap/ldap.service.ee.ts +++ b/packages/cli/src/ldap/ldap.service.ee.ts @@ -11,7 +11,7 @@ import config from '@/config'; import type { User } from '@db/entities/User'; import type { RunningMode, SyncStatus } from '@db/entities/AuthProviderSyncHistory'; import { SettingsRepository } from '@db/repositories/settings.repository'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { InternalServerError } from '@/errors/response-errors/internal-server.error'; @@ -20,7 +20,7 @@ import { isEmailCurrentAuthenticationMethod, isLdapCurrentAuthenticationMethod, setCurrentAuthenticationMethod, -} from '@/sso/ssoHelpers'; +} from '@/sso/sso-helpers'; import type { LdapConfig } from './types'; import { diff --git a/packages/cli/src/Ldap/types.ts b/packages/cli/src/ldap/types.ts similarity index 100% rename from packages/cli/src/Ldap/types.ts rename to packages/cli/src/ldap/types.ts diff --git a/packages/cli/src/License.ts b/packages/cli/src/license.ts similarity index 99% rename from packages/cli/src/License.ts rename to packages/cli/src/license.ts index 8a5ed18e58..57f576c5a3 100644 --- a/packages/cli/src/License.ts +++ b/packages/cli/src/license.ts @@ -2,7 +2,7 @@ import type { TEntitlement, TFeatures, TLicenseBlock } from '@n8n_io/license-sdk import { LicenseManager } from '@n8n_io/license-sdk'; import { InstanceSettings, ObjectStoreService } from 'n8n-core'; import Container, { Service } from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import config from '@/config'; import { LICENSE_FEATURES, @@ -16,7 +16,7 @@ import type { BooleanLicenseFeature, N8nInstanceType, NumericLicenseFeature } fr import type { RedisServicePubSubPublisher } from './services/redis/RedisServicePubSubPublisher'; import { RedisService } from './services/redis.service'; import { OrchestrationService } from '@/services/orchestration.service'; -import { OnShutdown } from '@/decorators/OnShutdown'; +import { OnShutdown } from '@/decorators/on-shutdown'; import { LicenseMetricsService } from '@/metrics/license-metrics.service'; type FeatureReturnType = Partial< diff --git a/packages/cli/src/license/__tests__/license.service.test.ts b/packages/cli/src/license/__tests__/license.service.test.ts index fb75c6a27d..9db929ec71 100644 --- a/packages/cli/src/license/__tests__/license.service.test.ts +++ b/packages/cli/src/license/__tests__/license.service.test.ts @@ -1,5 +1,5 @@ import { LicenseErrors, LicenseService } from '@/license/license.service'; -import type { License } from '@/License'; +import type { License } from '@/license'; import type { EventService } from '@/events/event.service'; import type { WorkflowRepository } from '@db/repositories/workflow.repository'; import type { TEntitlement } from '@n8n_io/license-sdk'; diff --git a/packages/cli/src/license/license.service.ts b/packages/cli/src/license/license.service.ts index 0555597a9d..6125ed813b 100644 --- a/packages/cli/src/license/license.service.ts +++ b/packages/cli/src/license/license.service.ts @@ -1,8 +1,8 @@ import { Service } from 'typedi'; import axios from 'axios'; -import { Logger } from '@/Logger'; -import { License } from '@/License'; +import { Logger } from '@/logger'; +import { License } from '@/license'; import { EventService } from '@/events/event.service'; import type { User } from '@db/entities/User'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; diff --git a/packages/cli/src/LoadNodesAndCredentials.ts b/packages/cli/src/load-nodes-and-credentials.ts similarity index 99% rename from packages/cli/src/LoadNodesAndCredentials.ts rename to packages/cli/src/load-nodes-and-credentials.ts index a1f7b0578d..5b2cc284e9 100644 --- a/packages/cli/src/LoadNodesAndCredentials.ts +++ b/packages/cli/src/load-nodes-and-credentials.ts @@ -26,7 +26,7 @@ import { CLI_DIR, inE2ETests, } from '@/constants'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { GlobalConfig } from '@n8n/config'; interface LoadedNodesAndCredentials { diff --git a/packages/cli/src/Logger.ts b/packages/cli/src/logger.ts similarity index 100% rename from packages/cli/src/Logger.ts rename to packages/cli/src/logger.ts diff --git a/packages/cli/src/Mfa/constants.ts b/packages/cli/src/mfa/constants.ts similarity index 100% rename from packages/cli/src/Mfa/constants.ts rename to packages/cli/src/mfa/constants.ts diff --git a/packages/cli/src/Mfa/helpers.ts b/packages/cli/src/mfa/helpers.ts similarity index 100% rename from packages/cli/src/Mfa/helpers.ts rename to packages/cli/src/mfa/helpers.ts diff --git a/packages/cli/src/Mfa/mfa.service.ts b/packages/cli/src/mfa/mfa.service.ts similarity index 100% rename from packages/cli/src/Mfa/mfa.service.ts rename to packages/cli/src/mfa/mfa.service.ts diff --git a/packages/cli/src/Mfa/totp.service.ts b/packages/cli/src/mfa/totp.service.ts similarity index 100% rename from packages/cli/src/Mfa/totp.service.ts rename to packages/cli/src/mfa/totp.service.ts diff --git a/packages/cli/src/middlewares/bodyParser.ts b/packages/cli/src/middlewares/body-parser.ts similarity index 100% rename from packages/cli/src/middlewares/bodyParser.ts rename to packages/cli/src/middlewares/body-parser.ts diff --git a/packages/cli/src/middlewares/index.ts b/packages/cli/src/middlewares/index.ts index 75ebae01c6..07ca0b2a36 100644 --- a/packages/cli/src/middlewares/index.ts +++ b/packages/cli/src/middlewares/index.ts @@ -1,3 +1,3 @@ -export * from './bodyParser'; +export * from './body-parser'; export * from './cors'; -export * from './listQuery'; +export * from './list-query'; diff --git a/packages/cli/src/middlewares/listQuery/__tests__/listQuery.test.ts b/packages/cli/src/middlewares/list-query/__tests__/listQuery.test.ts similarity index 96% rename from packages/cli/src/middlewares/listQuery/__tests__/listQuery.test.ts rename to packages/cli/src/middlewares/list-query/__tests__/listQuery.test.ts index 6da542de38..b6ee124dfa 100644 --- a/packages/cli/src/middlewares/listQuery/__tests__/listQuery.test.ts +++ b/packages/cli/src/middlewares/list-query/__tests__/listQuery.test.ts @@ -1,7 +1,7 @@ -import { filterListQueryMiddleware } from '@/middlewares/listQuery/filter'; -import { selectListQueryMiddleware } from '@/middlewares/listQuery/select'; -import { paginationListQueryMiddleware } from '@/middlewares/listQuery/pagination'; -import * as ResponseHelper from '@/ResponseHelper'; +import { filterListQueryMiddleware } from '@/middlewares/list-query/filter'; +import { selectListQueryMiddleware } from '@/middlewares/list-query/select'; +import { paginationListQueryMiddleware } from '@/middlewares/list-query/pagination'; +import * as ResponseHelper from '@/response-helper'; import type { ListQuery } from '@/requests'; import type { Response, NextFunction } from 'express'; diff --git a/packages/cli/src/middlewares/listQuery/dtos/base.filter.dto.ts b/packages/cli/src/middlewares/list-query/dtos/base.filter.dto.ts similarity index 100% rename from packages/cli/src/middlewares/listQuery/dtos/base.filter.dto.ts rename to packages/cli/src/middlewares/list-query/dtos/base.filter.dto.ts diff --git a/packages/cli/src/middlewares/listQuery/dtos/base.select.dto.ts b/packages/cli/src/middlewares/list-query/dtos/base.select.dto.ts similarity index 100% rename from packages/cli/src/middlewares/listQuery/dtos/base.select.dto.ts rename to packages/cli/src/middlewares/list-query/dtos/base.select.dto.ts diff --git a/packages/cli/src/middlewares/listQuery/dtos/credentials.filter.dto.ts b/packages/cli/src/middlewares/list-query/dtos/credentials.filter.dto.ts similarity index 100% rename from packages/cli/src/middlewares/listQuery/dtos/credentials.filter.dto.ts rename to packages/cli/src/middlewares/list-query/dtos/credentials.filter.dto.ts diff --git a/packages/cli/src/middlewares/listQuery/dtos/credentials.select.dto.ts b/packages/cli/src/middlewares/list-query/dtos/credentials.select.dto.ts similarity index 100% rename from packages/cli/src/middlewares/listQuery/dtos/credentials.select.dto.ts rename to packages/cli/src/middlewares/list-query/dtos/credentials.select.dto.ts diff --git a/packages/cli/src/middlewares/listQuery/dtos/pagination.dto.ts b/packages/cli/src/middlewares/list-query/dtos/pagination.dto.ts similarity index 100% rename from packages/cli/src/middlewares/listQuery/dtos/pagination.dto.ts rename to packages/cli/src/middlewares/list-query/dtos/pagination.dto.ts diff --git a/packages/cli/src/middlewares/listQuery/dtos/user.filter.dto.ts b/packages/cli/src/middlewares/list-query/dtos/user.filter.dto.ts similarity index 100% rename from packages/cli/src/middlewares/listQuery/dtos/user.filter.dto.ts rename to packages/cli/src/middlewares/list-query/dtos/user.filter.dto.ts diff --git a/packages/cli/src/middlewares/listQuery/dtos/user.select.dto.ts b/packages/cli/src/middlewares/list-query/dtos/user.select.dto.ts similarity index 100% rename from packages/cli/src/middlewares/listQuery/dtos/user.select.dto.ts rename to packages/cli/src/middlewares/list-query/dtos/user.select.dto.ts diff --git a/packages/cli/src/middlewares/listQuery/dtos/workflow.filter.dto.ts b/packages/cli/src/middlewares/list-query/dtos/workflow.filter.dto.ts similarity index 100% rename from packages/cli/src/middlewares/listQuery/dtos/workflow.filter.dto.ts rename to packages/cli/src/middlewares/list-query/dtos/workflow.filter.dto.ts diff --git a/packages/cli/src/middlewares/listQuery/dtos/workflow.select.dto.ts b/packages/cli/src/middlewares/list-query/dtos/workflow.select.dto.ts similarity index 100% rename from packages/cli/src/middlewares/listQuery/dtos/workflow.select.dto.ts rename to packages/cli/src/middlewares/list-query/dtos/workflow.select.dto.ts diff --git a/packages/cli/src/middlewares/listQuery/filter.ts b/packages/cli/src/middlewares/list-query/filter.ts similarity index 95% rename from packages/cli/src/middlewares/listQuery/filter.ts rename to packages/cli/src/middlewares/list-query/filter.ts index 9db1d85cd8..b3216308ea 100644 --- a/packages/cli/src/middlewares/listQuery/filter.ts +++ b/packages/cli/src/middlewares/list-query/filter.ts @@ -1,4 +1,4 @@ -import * as ResponseHelper from '@/ResponseHelper'; +import * as ResponseHelper from '@/response-helper'; import { WorkflowFilter } from './dtos/workflow.filter.dto'; import { CredentialsFilter } from './dtos/credentials.filter.dto'; import { UserFilter } from './dtos/user.filter.dto'; diff --git a/packages/cli/src/middlewares/listQuery/index.ts b/packages/cli/src/middlewares/list-query/index.ts similarity index 100% rename from packages/cli/src/middlewares/listQuery/index.ts rename to packages/cli/src/middlewares/list-query/index.ts diff --git a/packages/cli/src/middlewares/listQuery/pagination.ts b/packages/cli/src/middlewares/list-query/pagination.ts similarity index 93% rename from packages/cli/src/middlewares/listQuery/pagination.ts rename to packages/cli/src/middlewares/list-query/pagination.ts index cb101af8c1..e9595a24c4 100644 --- a/packages/cli/src/middlewares/listQuery/pagination.ts +++ b/packages/cli/src/middlewares/list-query/pagination.ts @@ -1,5 +1,5 @@ import { toError } from '@/utils'; -import * as ResponseHelper from '@/ResponseHelper'; +import * as ResponseHelper from '@/response-helper'; import { Pagination } from './dtos/pagination.dto'; import type { ListQuery } from '@/requests'; import type { RequestHandler } from 'express'; diff --git a/packages/cli/src/middlewares/listQuery/select.ts b/packages/cli/src/middlewares/list-query/select.ts similarity index 95% rename from packages/cli/src/middlewares/listQuery/select.ts rename to packages/cli/src/middlewares/list-query/select.ts index 6511410a8c..35e6f17cd9 100644 --- a/packages/cli/src/middlewares/listQuery/select.ts +++ b/packages/cli/src/middlewares/list-query/select.ts @@ -1,7 +1,7 @@ import { WorkflowSelect } from './dtos/workflow.select.dto'; import { UserSelect } from './dtos/user.select.dto'; import { CredentialsSelect } from './dtos/credentials.select.dto'; -import * as ResponseHelper from '@/ResponseHelper'; +import * as ResponseHelper from '@/response-helper'; import { toError } from '@/utils'; import type { RequestHandler } from 'express'; diff --git a/packages/cli/src/NodeTypes.ts b/packages/cli/src/node-types.ts similarity index 98% rename from packages/cli/src/NodeTypes.ts rename to packages/cli/src/node-types.ts index 4d9e773167..dc8ea2860c 100644 --- a/packages/cli/src/NodeTypes.ts +++ b/packages/cli/src/node-types.ts @@ -8,7 +8,7 @@ import type { } from 'n8n-workflow'; import { ApplicationError, NodeHelpers } from 'n8n-workflow'; import { Service } from 'typedi'; -import { LoadNodesAndCredentials } from './LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from './load-nodes-and-credentials'; import { join, dirname } from 'path'; import { readdir } from 'fs/promises'; import type { Dirent } from 'fs'; diff --git a/packages/cli/src/permissions/checkAccess.ts b/packages/cli/src/permissions/check-access.ts similarity index 100% rename from packages/cli/src/permissions/checkAccess.ts rename to packages/cli/src/permissions/check-access.ts diff --git a/packages/cli/src/push/__tests__/websocket.push.test.ts b/packages/cli/src/push/__tests__/websocket.push.test.ts index f1a0e577f9..81d4fda0fb 100644 --- a/packages/cli/src/push/__tests__/websocket.push.test.ts +++ b/packages/cli/src/push/__tests__/websocket.push.test.ts @@ -3,7 +3,7 @@ import { EventEmitter } from 'events'; import type WebSocket from 'ws'; import { WebSocketPush } from '@/push/websocket.push'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import type { PushDataExecutionRecovered } from '@/Interfaces'; import { mockInstance } from '@test/mocking'; diff --git a/packages/cli/src/push/abstract.push.ts b/packages/cli/src/push/abstract.push.ts index e9ada3c4bb..67beb7f30a 100644 --- a/packages/cli/src/push/abstract.push.ts +++ b/packages/cli/src/push/abstract.push.ts @@ -1,6 +1,6 @@ import { assert, jsonStringify } from 'n8n-workflow'; import type { IPushDataType } from '@/Interfaces'; -import type { Logger } from '@/Logger'; +import type { Logger } from '@/logger'; /** * Abstract class for two-way push communication. diff --git a/packages/cli/src/push/index.ts b/packages/cli/src/push/index.ts index a946348430..2336862eb7 100644 --- a/packages/cli/src/push/index.ts +++ b/packages/cli/src/push/index.ts @@ -7,7 +7,7 @@ import { parse as parseUrl } from 'url'; import { Container, Service } from 'typedi'; import config from '@/config'; -import { OnShutdown } from '@/decorators/OnShutdown'; +import { OnShutdown } from '@/decorators/on-shutdown'; import { AuthService } from '@/auth/auth.service'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import type { IPushDataType } from '@/Interfaces'; diff --git a/packages/cli/src/push/sse.push.ts b/packages/cli/src/push/sse.push.ts index 8367c74507..38779ed730 100644 --- a/packages/cli/src/push/sse.push.ts +++ b/packages/cli/src/push/sse.push.ts @@ -1,7 +1,7 @@ import SSEChannel from 'sse-channel'; import { Service } from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { AbstractPush } from './abstract.push'; import type { PushRequest, PushResponse } from './types'; diff --git a/packages/cli/src/push/websocket.push.ts b/packages/cli/src/push/websocket.push.ts index 04815038ce..733eebdc60 100644 --- a/packages/cli/src/push/websocket.push.ts +++ b/packages/cli/src/push/websocket.push.ts @@ -1,6 +1,6 @@ import type WebSocket from 'ws'; import { Service } from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { AbstractPush } from './abstract.push'; function heartbeat(this: WebSocket) { diff --git a/packages/cli/src/ResponseHelper.ts b/packages/cli/src/response-helper.ts similarity index 99% rename from packages/cli/src/ResponseHelper.ts rename to packages/cli/src/response-helper.ts index 3d172521d9..aebef56f0c 100644 --- a/packages/cli/src/ResponseHelper.ts +++ b/packages/cli/src/response-helper.ts @@ -11,7 +11,7 @@ import { Readable } from 'node:stream'; import { inDevelopment } from '@/constants'; import { ResponseError } from './errors/response-errors/abstract/response.error'; import Container from 'typedi'; -import { Logger } from './Logger'; +import { Logger } from './logger'; export function sendSuccessResponse( res: Response, diff --git a/packages/cli/src/scaling/job-processor.ts b/packages/cli/src/scaling/job-processor.ts index 693c9e3a74..8618424e35 100644 --- a/packages/cli/src/scaling/job-processor.ts +++ b/packages/cli/src/scaling/job-processor.ts @@ -1,12 +1,12 @@ import { Service } from 'typedi'; import { BINARY_ENCODING, ApplicationError, Workflow } from 'n8n-workflow'; import { WorkflowExecute } from 'n8n-core'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import config from '@/config'; import { ExecutionRepository } from '@/databases/repositories/execution.repository'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; -import * as WorkflowExecuteAdditionalData from '@/WorkflowExecuteAdditionalData'; -import { NodeTypes } from '@/NodeTypes'; +import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data'; +import { NodeTypes } from '@/node-types'; import type { ExecutionStatus, IExecuteResponsePromiseData, IRun } from 'n8n-workflow'; import type { Job, JobId, JobResult, RunningJob, RunningJobSummary } from './types'; import type PCancelable from 'p-cancelable'; diff --git a/packages/cli/src/scaling/scaling.service.ts b/packages/cli/src/scaling/scaling.service.ts index 1a8bc9e173..4dbdce1aac 100644 --- a/packages/cli/src/scaling/scaling.service.ts +++ b/packages/cli/src/scaling/scaling.service.ts @@ -1,11 +1,11 @@ import Container, { Service } from 'typedi'; import { ApplicationError, BINARY_ENCODING, sleep, jsonStringify } from 'n8n-workflow'; -import { ActiveExecutions } from '@/ActiveExecutions'; +import { ActiveExecutions } from '@/active-executions'; import config from '@/config'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { MaxStalledCountError } from '@/errors/max-stalled-count.error'; import { HIGHEST_SHUTDOWN_PRIORITY, Time } from '@/constants'; -import { OnShutdown } from '@/decorators/OnShutdown'; +import { OnShutdown } from '@/decorators/on-shutdown'; import { JOB_TYPE_NAME, QUEUE_NAME } from './constants'; import { JobProcessor } from './job-processor'; import type { diff --git a/packages/cli/src/SecretsHelpers.ts b/packages/cli/src/secrets-helpers.ts similarity index 91% rename from packages/cli/src/SecretsHelpers.ts rename to packages/cli/src/secrets-helpers.ts index 8555adb36e..082c3ea97d 100644 --- a/packages/cli/src/SecretsHelpers.ts +++ b/packages/cli/src/secrets-helpers.ts @@ -1,6 +1,6 @@ import type { SecretsHelpersBase } from 'n8n-workflow'; import { Service } from 'typedi'; -import { ExternalSecretsManager } from './ExternalSecrets/ExternalSecretsManager.ee'; +import { ExternalSecretsManager } from './external-secrets/external-secrets-manager.ee'; @Service() export class SecretsHelper implements SecretsHelpersBase { diff --git a/packages/cli/src/security-audit/risk-reporters/CredentialsRiskReporter.ts b/packages/cli/src/security-audit/risk-reporters/credentials-risk-reporter.ts similarity index 100% rename from packages/cli/src/security-audit/risk-reporters/CredentialsRiskReporter.ts rename to packages/cli/src/security-audit/risk-reporters/credentials-risk-reporter.ts diff --git a/packages/cli/src/security-audit/risk-reporters/DatabaseRiskReporter.ts b/packages/cli/src/security-audit/risk-reporters/database-risk-reporter.ts similarity index 100% rename from packages/cli/src/security-audit/risk-reporters/DatabaseRiskReporter.ts rename to packages/cli/src/security-audit/risk-reporters/database-risk-reporter.ts diff --git a/packages/cli/src/security-audit/risk-reporters/FilesystemRiskReporter.ts b/packages/cli/src/security-audit/risk-reporters/filesystem-risk-reporter.ts similarity index 100% rename from packages/cli/src/security-audit/risk-reporters/FilesystemRiskReporter.ts rename to packages/cli/src/security-audit/risk-reporters/filesystem-risk-reporter.ts diff --git a/packages/cli/src/security-audit/risk-reporters/InstanceRiskReporter.ts b/packages/cli/src/security-audit/risk-reporters/instance-risk-reporter.ts similarity index 99% rename from packages/cli/src/security-audit/risk-reporters/InstanceRiskReporter.ts rename to packages/cli/src/security-audit/risk-reporters/instance-risk-reporter.ts index 16e53b400c..323d1173f0 100644 --- a/packages/cli/src/security-audit/risk-reporters/InstanceRiskReporter.ts +++ b/packages/cli/src/security-audit/risk-reporters/instance-risk-reporter.ts @@ -14,7 +14,7 @@ import { getN8nPackageJson, inDevelopment } from '@/constants'; import type { WorkflowEntity } from '@db/entities/WorkflowEntity'; import type { RiskReporter, Risk, n8n } from '@/security-audit/types'; import { isApiEnabled } from '@/PublicApi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { GlobalConfig } from '@n8n/config'; @Service() diff --git a/packages/cli/src/security-audit/risk-reporters/NodesRiskReporter.ts b/packages/cli/src/security-audit/risk-reporters/nodes-risk-reporter.ts similarity index 98% rename from packages/cli/src/security-audit/risk-reporters/NodesRiskReporter.ts rename to packages/cli/src/security-audit/risk-reporters/nodes-risk-reporter.ts index 55fe0a8c0c..9bd7b58466 100644 --- a/packages/cli/src/security-audit/risk-reporters/NodesRiskReporter.ts +++ b/packages/cli/src/security-audit/risk-reporters/nodes-risk-reporter.ts @@ -1,7 +1,7 @@ import * as path from 'path'; import glob from 'fast-glob'; import { Service } from 'typedi'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { getNodeTypes } from '@/security-audit/utils'; import { OFFICIAL_RISKY_NODE_TYPES, diff --git a/packages/cli/src/security-audit/SecurityAudit.service.ts b/packages/cli/src/security-audit/security-audit.service.ts similarity index 83% rename from packages/cli/src/security-audit/SecurityAudit.service.ts rename to packages/cli/src/security-audit/security-audit.service.ts index afec146065..3c27f647bc 100644 --- a/packages/cli/src/security-audit/SecurityAudit.service.ts +++ b/packages/cli/src/security-audit/security-audit.service.ts @@ -51,8 +51,16 @@ export class SecurityAuditService { for (const category of categories) { const className = category.charAt(0).toUpperCase() + category.slice(1) + 'RiskReporter'; + const toFilename: Record = { + CredentialsRiskReporter: 'credentials-risk-reporter', + DatabaseRiskReporter: 'database-risk-reporter', + FilesystemRiskReporter: 'filesystem-risk-reporter', + InstanceRiskReporter: 'instance-risk-reporter', + NodesRiskReporter: 'nodes-risk-reporter', + }; + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const RiskReporterModule = await import(`./risk-reporters/${className}`); + const RiskReporterModule = await import(`./risk-reporters/${toFilename[className]}`); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access const RiskReporterClass = RiskReporterModule[className] as { new (): RiskReporter }; diff --git a/packages/cli/src/Server.ts b/packages/cli/src/server.ts similarity index 95% rename from packages/cli/src/Server.ts rename to packages/cli/src/server.ts index 49b358f0f2..30de80295a 100644 --- a/packages/cli/src/Server.ts +++ b/packages/cli/src/server.ts @@ -24,15 +24,15 @@ import type { APIRequest } from '@/requests'; import { ControllerRegistry } from '@/decorators'; import { isApiEnabled, loadPublicApiVersions } from '@/PublicApi'; import type { ICredentialsOverwrite } from '@/Interfaces'; -import { CredentialsOverwrites } from '@/CredentialsOverwrites'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; -import * as ResponseHelper from '@/ResponseHelper'; +import { CredentialsOverwrites } from '@/credentials-overwrites'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; +import * as ResponseHelper from '@/response-helper'; import { setupPushServer, setupPushHandler } from '@/push'; -import { isLdapEnabled } from '@/Ldap/helpers.ee'; -import { AbstractServer } from '@/AbstractServer'; +import { isLdapEnabled } from '@/ldap/helpers.ee'; +import { AbstractServer } from '@/abstract-server'; import { PostHogClient } from '@/posthog'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; -import { handleMfaDisable, isMfaFeatureEnabled } from '@/Mfa/helpers'; +import { handleMfaDisable, isMfaFeatureEnabled } from '@/mfa/helpers'; import type { FrontendService } from '@/services/frontend.service'; import { OrchestrationService } from '@/services/orchestration.service'; import { LogStreamingEventRelay } from '@/events/log-streaming-event-relay'; @@ -61,9 +61,9 @@ import '@/controllers/workflowStatistics.controller'; import '@/credentials/credentials.controller'; import '@/eventbus/eventBus.controller'; import '@/executions/executions.controller'; -import '@/ExternalSecrets/ExternalSecrets.controller.ee'; +import '@/external-secrets/external-secrets.controller.ee'; import '@/license/license.controller'; -import '@/workflows/workflowHistory/workflowHistory.controller.ee'; +import '@/workflows/workflow-history/workflow-history.controller.ee'; import '@/workflows/workflows.controller'; import { EventService } from './events/event.service'; @@ -115,8 +115,8 @@ export class Server extends AbstractServer { } if (isLdapEnabled()) { - const { LdapService } = await import('@/Ldap/ldap.service.ee'); - await import('@/Ldap/ldap.controller.ee'); + const { LdapService } = await import('@/ldap/ldap.service.ee'); + await import('@/ldap/ldap.controller.ee'); await Container.get(LdapService).init(); } diff --git a/packages/cli/src/services/__tests__/activeWorkflows.service.test.ts b/packages/cli/src/services/__tests__/activeWorkflows.service.test.ts index 2089c94690..6b008e281b 100644 --- a/packages/cli/src/services/__tests__/activeWorkflows.service.test.ts +++ b/packages/cli/src/services/__tests__/activeWorkflows.service.test.ts @@ -1,4 +1,4 @@ -import type { ActivationErrorsService } from '@/ActivationErrors.service'; +import type { ActivationErrorsService } from '@/activation-errors.service'; import type { User } from '@db/entities/User'; import type { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import type { WorkflowRepository } from '@db/repositories/workflow.repository'; diff --git a/packages/cli/src/services/__tests__/communityPackages.service.test.ts b/packages/cli/src/services/__tests__/communityPackages.service.test.ts index ec7ce61ba9..7b2431c172 100644 --- a/packages/cli/src/services/__tests__/communityPackages.service.test.ts +++ b/packages/cli/src/services/__tests__/communityPackages.service.test.ts @@ -19,8 +19,8 @@ import { CommunityPackagesService } from '@/services/communityPackages.service'; import { InstalledNodesRepository } from '@db/repositories/installedNodes.repository'; import { InstalledPackagesRepository } from '@db/repositories/installedPackages.repository'; import { InstalledNodes } from '@db/entities/InstalledNodes'; -import type { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; -import type { License } from '@/License'; +import type { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; +import type { License } from '@/license'; import { mockInstance } from '@test/mocking'; import { COMMUNITY_NODE_VERSION, COMMUNITY_PACKAGE_VERSION } from '@test-integration/constants'; diff --git a/packages/cli/src/services/__tests__/credentials-tester.service.test.ts b/packages/cli/src/services/__tests__/credentials-tester.service.test.ts index e2987f5c84..e9f98c7a8b 100644 --- a/packages/cli/src/services/__tests__/credentials-tester.service.test.ts +++ b/packages/cli/src/services/__tests__/credentials-tester.service.test.ts @@ -1,8 +1,8 @@ import { CredentialsTester } from '@/services/credentials-tester.service'; import mock from 'jest-mock-extended/lib/Mock'; -import type { CredentialTypes } from '@/CredentialTypes'; +import type { CredentialTypes } from '@/credential-types'; import type { ICredentialType, INodeType } from 'n8n-workflow'; -import type { NodeTypes } from '@/NodeTypes'; +import type { NodeTypes } from '@/node-types'; describe('CredentialsTester', () => { const credentialTypes = mock(); diff --git a/packages/cli/src/services/__tests__/orchestration.service.test.ts b/packages/cli/src/services/__tests__/orchestration.service.test.ts index ed4883768c..99c92ad070 100644 --- a/packages/cli/src/services/__tests__/orchestration.service.test.ts +++ b/packages/cli/src/services/__tests__/orchestration.service.test.ts @@ -13,10 +13,10 @@ import { handleWorkerResponseMessageMain } from '@/services/orchestration/main/h import { handleCommandMessageMain } from '@/services/orchestration/main/handleCommandMessageMain'; import { OrchestrationHandlerMainService } from '@/services/orchestration/main/orchestration.handler.main.service'; import * as helpers from '@/services/orchestration/helpers'; -import { ExternalSecretsManager } from '@/ExternalSecrets/ExternalSecretsManager.ee'; -import { Logger } from '@/Logger'; +import { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee'; +import { Logger } from '@/logger'; import { Push } from '@/push'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import { mockInstance } from '@test/mocking'; import { RedisClientService } from '@/services/redis/redis-client.service'; import type { MainResponseReceivedHandlerOptions } from '../orchestration/main/types'; diff --git a/packages/cli/src/services/__tests__/redis.service.test.ts b/packages/cli/src/services/__tests__/redis.service.test.ts index 1d96529837..1e282e6df1 100644 --- a/packages/cli/src/services/__tests__/redis.service.test.ts +++ b/packages/cli/src/services/__tests__/redis.service.test.ts @@ -1,5 +1,5 @@ import Container from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import config from '@/config'; import { RedisService } from '@/services/redis.service'; import { mockInstance } from '@test/mocking'; diff --git a/packages/cli/src/services/activeWorkflows.service.ts b/packages/cli/src/services/activeWorkflows.service.ts index ae2c083d72..c900795a3a 100644 --- a/packages/cli/src/services/activeWorkflows.service.ts +++ b/packages/cli/src/services/activeWorkflows.service.ts @@ -3,9 +3,9 @@ import { Service } from 'typedi'; import type { User } from '@db/entities/User'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; -import { ActivationErrorsService } from '@/ActivationErrors.service'; +import { ActivationErrorsService } from '@/activation-errors.service'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; @Service() export class ActiveWorkflowsService { diff --git a/packages/cli/src/services/aiAsisstant.service.ts b/packages/cli/src/services/aiAsisstant.service.ts index 39a2d950ef..62c4778cfb 100644 --- a/packages/cli/src/services/aiAsisstant.service.ts +++ b/packages/cli/src/services/aiAsisstant.service.ts @@ -2,7 +2,7 @@ import { Service } from 'typedi'; import type { AiAssistantSDK } from '@n8n_io/ai-assistant-sdk'; import { AiAssistantClient } from '@n8n_io/ai-assistant-sdk'; import { assert, type IUser } from 'n8n-workflow'; -import { License } from '../License'; +import { License } from '../license'; import { N8N_VERSION } from '../constants'; import config from '@/config'; import type { AiAssistantRequest } from '@/requests'; diff --git a/packages/cli/src/services/communityPackages.service.ts b/packages/cli/src/services/communityPackages.service.ts index 985fb44fab..bfe7f6fef8 100644 --- a/packages/cli/src/services/communityPackages.service.ts +++ b/packages/cli/src/services/communityPackages.service.ts @@ -23,10 +23,10 @@ import { } from '@/constants'; import { FeatureNotLicensedError } from '@/errors/feature-not-licensed.error'; import type { CommunityPackages } from '@/Interfaces'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; -import { Logger } from '@/Logger'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; +import { Logger } from '@/logger'; import { OrchestrationService } from './orchestration.service'; -import { License } from '@/License'; +import { License } from '@/license'; const DEFAULT_REGISTRY = 'https://registry.npmjs.org'; diff --git a/packages/cli/src/services/credentials-tester.service.ts b/packages/cli/src/services/credentials-tester.service.ts index c9ddc7b15e..4f3475d303 100644 --- a/packages/cli/src/services/credentials-tester.service.ts +++ b/packages/cli/src/services/credentials-tester.service.ts @@ -34,14 +34,14 @@ import { ApplicationError, } from 'n8n-workflow'; -import * as WorkflowExecuteAdditionalData from '@/WorkflowExecuteAdditionalData'; +import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data'; import type { User } from '@db/entities/User'; -import { NodeTypes } from '@/NodeTypes'; -import { CredentialTypes } from '@/CredentialTypes'; +import { NodeTypes } from '@/node-types'; +import { CredentialTypes } from '@/credential-types'; import { RESPONSE_ERROR_MESSAGES } from '../constants'; import { isObjectLiteral } from '../utils'; -import { Logger } from '@/Logger'; -import { CredentialsHelper } from '../CredentialsHelper'; +import { Logger } from '@/logger'; +import { CredentialsHelper } from '../credentials-helper'; const { OAUTH2_CREDENTIAL_TEST_SUCCEEDED, OAUTH2_CREDENTIAL_TEST_FAILED } = RESPONSE_ERROR_MESSAGES; diff --git a/packages/cli/src/services/dynamicNodeParameters.service.ts b/packages/cli/src/services/dynamicNodeParameters.service.ts index f3b0f7e192..d69f789373 100644 --- a/packages/cli/src/services/dynamicNodeParameters.service.ts +++ b/packages/cli/src/services/dynamicNodeParameters.service.ts @@ -20,7 +20,7 @@ import type { } from 'n8n-workflow'; import { Workflow, RoutingNode, ApplicationError } from 'n8n-workflow'; import { NodeExecuteFunctions } from 'n8n-core'; -import { NodeTypes } from '@/NodeTypes'; +import { NodeTypes } from '@/node-types'; @Service() export class DynamicNodeParametersService { diff --git a/packages/cli/src/services/frontend.service.ts b/packages/cli/src/services/frontend.service.ts index de0abdbfbb..24f8a3505b 100644 --- a/packages/cli/src/services/frontend.service.ts +++ b/packages/cli/src/services/frontend.service.ts @@ -15,21 +15,21 @@ import { InstanceSettings } from 'n8n-core'; import config from '@/config'; import { LICENSE_FEATURES } from '@/constants'; -import { CredentialsOverwrites } from '@/CredentialsOverwrites'; -import { CredentialTypes } from '@/CredentialTypes'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; -import { License } from '@/License'; -import { getCurrentAuthenticationMethod } from '@/sso/ssoHelpers'; -import { getLdapLoginLabel } from '@/Ldap/helpers.ee'; -import { getSamlLoginLabel } from '@/sso/saml/samlHelpers'; +import { CredentialsOverwrites } from '@/credentials-overwrites'; +import { CredentialTypes } from '@/credential-types'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; +import { License } from '@/license'; +import { getCurrentAuthenticationMethod } from '@/sso/sso-helpers'; +import { getLdapLoginLabel } from '@/ldap/helpers.ee'; +import { getSamlLoginLabel } from '@/sso/saml/saml-helpers'; import { getVariablesLimit } from '@/environments/variables/environmentHelpers'; import { getWorkflowHistoryLicensePruneTime, getWorkflowHistoryPruneTime, -} from '@/workflows/workflowHistory/workflowHistoryHelper.ee'; -import { UserManagementMailer } from '@/UserManagement/email'; +} from '@/workflows/workflow-history/workflow-history-helper.ee'; +import { UserManagementMailer } from '@/user-management/email'; import type { CommunityPackagesService } from '@/services/communityPackages.service'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { UrlService } from './url.service'; import { EventService } from '@/events/event.service'; import { isApiEnabled } from '@/PublicApi'; diff --git a/packages/cli/src/services/import.service.ts b/packages/cli/src/services/import.service.ts index 96892e2745..7cf4a6493c 100644 --- a/packages/cli/src/services/import.service.ts +++ b/packages/cli/src/services/import.service.ts @@ -2,12 +2,12 @@ import { Service } from 'typedi'; import { v4 as uuid } from 'uuid'; import { type INode, type INodeCredentialsDetails } from 'n8n-workflow'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import * as Db from '@/Db'; import { CredentialsRepository } from '@db/repositories/credentials.repository'; import { TagRepository } from '@db/repositories/tag.repository'; import { SharedWorkflow } from '@db/entities/SharedWorkflow'; -import { replaceInvalidCredentials } from '@/WorkflowHelpers'; +import { replaceInvalidCredentials } from '@/workflow-helpers'; import { Project } from '@db/entities/Project'; import { WorkflowEntity } from '@db/entities/WorkflowEntity'; import { WorkflowTagMapping } from '@db/entities/WorkflowTagMapping'; diff --git a/packages/cli/src/services/orchestration.service.ts b/packages/cli/src/services/orchestration.service.ts index 283470f4d2..f9bfc13728 100644 --- a/packages/cli/src/services/orchestration.service.ts +++ b/packages/cli/src/services/orchestration.service.ts @@ -1,5 +1,5 @@ import { Service } from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import config from '@/config'; import type { RedisServicePubSubPublisher } from './redis/RedisServicePubSubPublisher'; import type { RedisServiceBaseCommand, RedisServiceCommand } from './redis/RedisServiceCommands'; diff --git a/packages/cli/src/services/orchestration/helpers.ts b/packages/cli/src/services/orchestration/helpers.ts index c5ccd43636..262c36ccee 100644 --- a/packages/cli/src/services/orchestration/helpers.ts +++ b/packages/cli/src/services/orchestration/helpers.ts @@ -1,6 +1,6 @@ import { Container } from 'typedi'; import { jsonParse } from 'n8n-workflow'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import type { RedisServiceCommandObject } from '../redis/RedisServiceCommands'; import { COMMAND_REDIS_CHANNEL } from '../redis/RedisConstants'; import * as os from 'os'; diff --git a/packages/cli/src/services/orchestration/main/MultiMainSetup.ee.ts b/packages/cli/src/services/orchestration/main/MultiMainSetup.ee.ts index 89c6ef725a..82c28d61f3 100644 --- a/packages/cli/src/services/orchestration/main/MultiMainSetup.ee.ts +++ b/packages/cli/src/services/orchestration/main/MultiMainSetup.ee.ts @@ -3,7 +3,7 @@ import { Service } from 'typedi'; import { TIME } from '@/constants'; import { InstanceSettings } from 'n8n-core'; import { ErrorReporterProxy as EventReporter } from 'n8n-workflow'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { RedisServicePubSubPublisher } from '@/services/redis/RedisServicePubSubPublisher'; import { RedisClientService } from '@/services/redis/redis-client.service'; import { TypedEmitter } from '@/TypedEmitter'; diff --git a/packages/cli/src/services/orchestration/main/handleCommandMessageMain.ts b/packages/cli/src/services/orchestration/main/handleCommandMessageMain.ts index 9a7b6b5640..1cdb3cf7f1 100644 --- a/packages/cli/src/services/orchestration/main/handleCommandMessageMain.ts +++ b/packages/cli/src/services/orchestration/main/handleCommandMessageMain.ts @@ -2,12 +2,12 @@ import { Container } from 'typedi'; import { debounceMessageReceiver, messageToRedisServiceCommandObject } from '../helpers'; import config from '@/config'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; -import { ExternalSecretsManager } from '@/ExternalSecrets/ExternalSecretsManager.ee'; -import { License } from '@/License'; -import { Logger } from '@/Logger'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee'; +import { License } from '@/license'; +import { Logger } from '@/logger'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import { Push } from '@/push'; -import { TestWebhooks } from '@/webhooks/TestWebhooks'; +import { TestWebhooks } from '@/webhooks/test-webhooks'; import { OrchestrationService } from '@/services/orchestration.service'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; import { CommunityPackagesService } from '@/services/communityPackages.service'; diff --git a/packages/cli/src/services/orchestration/main/handleWorkerResponseMessageMain.ts b/packages/cli/src/services/orchestration/main/handleWorkerResponseMessageMain.ts index 4e60d53741..b623f0b4f2 100644 --- a/packages/cli/src/services/orchestration/main/handleWorkerResponseMessageMain.ts +++ b/packages/cli/src/services/orchestration/main/handleWorkerResponseMessageMain.ts @@ -1,6 +1,6 @@ import { jsonParse } from 'n8n-workflow'; import Container from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { Push } from '../../../push'; import type { RedisServiceWorkerResponseObject } from '../../redis/RedisServiceCommands'; import { WORKER_RESPONSE_REDIS_CHANNEL } from '@/services/redis/RedisConstants'; diff --git a/packages/cli/src/services/orchestration/webhook/handleCommandMessageWebhook.ts b/packages/cli/src/services/orchestration/webhook/handleCommandMessageWebhook.ts index e6f6e65628..c6f746db63 100644 --- a/packages/cli/src/services/orchestration/webhook/handleCommandMessageWebhook.ts +++ b/packages/cli/src/services/orchestration/webhook/handleCommandMessageWebhook.ts @@ -1,5 +1,5 @@ -import { ExternalSecretsManager } from '@/ExternalSecrets/ExternalSecretsManager.ee'; -import { License } from '@/License'; +import { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee'; +import { License } from '@/license'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; import Container from 'typedi'; import { Logger } from 'winston'; diff --git a/packages/cli/src/services/orchestration/worker/handleCommandMessageWorker.ts b/packages/cli/src/services/orchestration/worker/handleCommandMessageWorker.ts index 23c96e1a41..52727c37e1 100644 --- a/packages/cli/src/services/orchestration/worker/handleCommandMessageWorker.ts +++ b/packages/cli/src/services/orchestration/worker/handleCommandMessageWorker.ts @@ -3,12 +3,12 @@ import Container from 'typedi'; import type { RedisServiceCommandObject } from '@/services/redis/RedisServiceCommands'; import { COMMAND_REDIS_CHANNEL } from '@/services/redis/RedisConstants'; import * as os from 'os'; -import { License } from '@/License'; +import { License } from '@/license'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; -import { ExternalSecretsManager } from '@/ExternalSecrets/ExternalSecretsManager.ee'; +import { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee'; import { debounceMessageReceiver, getOsCpuString } from '../helpers'; import type { WorkerCommandReceivedHandlerOptions } from './types'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { N8N_VERSION } from '@/constants'; import { CommunityPackagesService } from '@/services/communityPackages.service'; diff --git a/packages/cli/src/services/project.service.ts b/packages/cli/src/services/project.service.ts index 8df30da1e9..6905019017 100644 --- a/packages/cli/src/services/project.service.ts +++ b/packages/cli/src/services/project.service.ts @@ -17,7 +17,7 @@ import { SharedWorkflowRepository } from '@/databases/repositories/sharedWorkflo import { SharedCredentialsRepository } from '@/databases/repositories/sharedCredentials.repository'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { CacheService } from './cache/cache.service'; -import { License } from '@/License'; +import { License } from '@/license'; import { UNLIMITED_LICENSE_QUOTA } from '@/constants'; import { ApplicationError } from 'n8n-workflow'; diff --git a/packages/cli/src/services/pruning.service.ts b/packages/cli/src/services/pruning.service.ts index 7f824836ae..dab4bbf8e8 100644 --- a/packages/cli/src/services/pruning.service.ts +++ b/packages/cli/src/services/pruning.service.ts @@ -3,9 +3,9 @@ import { BinaryDataService, InstanceSettings } from 'n8n-core'; import { inTest, TIME } from '@/constants'; import config from '@/config'; import { ExecutionRepository } from '@db/repositories/execution.repository'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { jsonStringify } from 'n8n-workflow'; -import { OnShutdown } from '@/decorators/OnShutdown'; +import { OnShutdown } from '@/decorators/on-shutdown'; import { OrchestrationService } from './orchestration.service'; @Service() diff --git a/packages/cli/src/services/redis/RedisServiceBaseClasses.ts b/packages/cli/src/services/redis/RedisServiceBaseClasses.ts index b9db6125b0..d31044bb5c 100644 --- a/packages/cli/src/services/redis/RedisServiceBaseClasses.ts +++ b/packages/cli/src/services/redis/RedisServiceBaseClasses.ts @@ -2,7 +2,7 @@ import type Redis from 'ioredis'; import type { Cluster } from 'ioredis'; import { Service } from 'typedi'; import config from '@/config'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { RedisClientService } from './redis-client.service'; import type { RedisClientType } from './redis.types'; diff --git a/packages/cli/src/services/redis/redis-client.service.ts b/packages/cli/src/services/redis/redis-client.service.ts index 21f74bf074..bf70d8114d 100644 --- a/packages/cli/src/services/redis/redis-client.service.ts +++ b/packages/cli/src/services/redis/redis-client.service.ts @@ -1,10 +1,10 @@ import { Service } from 'typedi'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import ioRedis from 'ioredis'; import type { Cluster, RedisOptions } from 'ioredis'; import type { RedisClientType } from './redis.types'; -import { OnShutdown } from '@/decorators/OnShutdown'; +import { OnShutdown } from '@/decorators/on-shutdown'; import { LOWEST_SHUTDOWN_PRIORITY } from '@/constants'; import { GlobalConfig } from '@n8n/config'; diff --git a/packages/cli/src/services/role.service.ts b/packages/cli/src/services/role.service.ts index 292db6dfa3..02631b20f0 100644 --- a/packages/cli/src/services/role.service.ts +++ b/packages/cli/src/services/role.service.ts @@ -26,7 +26,7 @@ import type { ListQuery } from '@/requests'; import { combineScopes, type Resource, type Scope } from '@n8n/permissions'; import { Service } from 'typedi'; import { ApplicationError } from 'n8n-workflow'; -import { License } from '@/License'; +import { License } from '@/license'; import type { CredentialsEntity } from '@/databases/entities/CredentialsEntity'; export type RoleNamespace = 'global' | 'project' | 'credential' | 'workflow'; diff --git a/packages/cli/src/services/tag.service.ts b/packages/cli/src/services/tag.service.ts index 27f4ebd0f2..141749cbf8 100644 --- a/packages/cli/src/services/tag.service.ts +++ b/packages/cli/src/services/tag.service.ts @@ -1,9 +1,9 @@ import { TagRepository } from '@db/repositories/tag.repository'; import { Service } from 'typedi'; -import { validateEntity } from '@/GenericHelpers'; +import { validateEntity } from '@/generic-helpers'; import type { ITagWithCountDb } from '@/Interfaces'; import type { TagEntity } from '@db/entities/TagEntity'; -import { ExternalHooks } from '@/ExternalHooks'; +import { ExternalHooks } from '@/external-hooks'; type GetAllResult = T extends { withUsageCount: true } ? ITagWithCountDb[] : TagEntity[]; diff --git a/packages/cli/src/services/user.service.ts b/packages/cli/src/services/user.service.ts index 19b49fdb19..28bbe3d8a2 100644 --- a/packages/cli/src/services/user.service.ts +++ b/packages/cli/src/services/user.service.ts @@ -6,8 +6,8 @@ import type { User, AssignableRole } from '@db/entities/User'; import { UserRepository } from '@db/repositories/user.repository'; import type { Invitation, PublicUser } from '@/Interfaces'; import type { PostHogClient } from '@/posthog'; -import { Logger } from '@/Logger'; -import { UserManagementMailer } from '@/UserManagement/email'; +import { Logger } from '@/logger'; +import { UserManagementMailer } from '@/user-management/email'; import { UrlService } from '@/services/url.service'; import type { UserRequest } from '@/requests'; import { InternalServerError } from '@/errors/response-errors/internal-server.error'; diff --git a/packages/cli/src/services/workflow-statistics.service.ts b/packages/cli/src/services/workflow-statistics.service.ts index 262dae4f1c..a58b6ffbbf 100644 --- a/packages/cli/src/services/workflow-statistics.service.ts +++ b/packages/cli/src/services/workflow-statistics.service.ts @@ -3,7 +3,7 @@ import type { INode, IRun, IWorkflowBase } from 'n8n-workflow'; import { StatisticsNames } from '@db/entities/WorkflowStatistics'; import { WorkflowStatisticsRepository } from '@db/repositories/workflowStatistics.repository'; import { UserService } from '@/services/user.service'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { OwnershipService } from './ownership.service'; import { TypedEmitter } from '@/TypedEmitter'; import { EventService } from '@/events/event.service'; diff --git a/packages/cli/src/shutdown/__tests__/Shutdown.service.test.ts b/packages/cli/src/shutdown/__tests__/Shutdown.service.test.ts index ca85f78564..16f37b3828 100644 --- a/packages/cli/src/shutdown/__tests__/Shutdown.service.test.ts +++ b/packages/cli/src/shutdown/__tests__/Shutdown.service.test.ts @@ -1,7 +1,7 @@ import { ApplicationError, ErrorReporterProxy } from 'n8n-workflow'; import { mock } from 'jest-mock-extended'; -import type { ServiceClass } from '@/shutdown/Shutdown.service'; -import { ShutdownService } from '@/shutdown/Shutdown.service'; +import type { ServiceClass } from '@/shutdown/shutdown.service'; +import { ShutdownService } from '@/shutdown/shutdown.service'; import Container from 'typedi'; class MockComponent { diff --git a/packages/cli/src/shutdown/Shutdown.service.ts b/packages/cli/src/shutdown/shutdown.service.ts similarity index 99% rename from packages/cli/src/shutdown/Shutdown.service.ts rename to packages/cli/src/shutdown/shutdown.service.ts index 772463f23a..f3927ec309 100644 --- a/packages/cli/src/shutdown/Shutdown.service.ts +++ b/packages/cli/src/shutdown/shutdown.service.ts @@ -1,7 +1,7 @@ import { Container, Service } from 'typedi'; import { ApplicationError, ErrorReporterProxy, assert } from 'n8n-workflow'; import type { Class } from 'n8n-core'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { LOWEST_SHUTDOWN_PRIORITY, HIGHEST_SHUTDOWN_PRIORITY } from '@/constants'; type HandlerFn = () => Promise | void; diff --git a/packages/cli/src/sso/saml/__tests__/saml.service.ee.test.ts b/packages/cli/src/sso/saml/__tests__/saml.service.ee.test.ts index 89d693fc98..9821c89637 100644 --- a/packages/cli/src/sso/saml/__tests__/saml.service.ee.test.ts +++ b/packages/cli/src/sso/saml/__tests__/saml.service.ee.test.ts @@ -3,9 +3,9 @@ import type express from 'express'; import { SamlService } from '@/sso/saml/saml.service.ee'; import { mockInstance } from '@test/mocking'; import { UrlService } from '@/services/url.service'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import type { IdentityProviderInstance, ServiceProviderInstance } from 'samlify'; -import * as samlHelpers from '@/sso/saml/samlHelpers'; +import * as samlHelpers from '@/sso/saml/saml-helpers'; describe('SamlService', () => { const logger = mockInstance(Logger); diff --git a/packages/cli/src/sso/saml/__tests__/samlHelpers.test.ts b/packages/cli/src/sso/saml/__tests__/samlHelpers.test.ts index 778b1a0857..17355524d3 100644 --- a/packages/cli/src/sso/saml/__tests__/samlHelpers.test.ts +++ b/packages/cli/src/sso/saml/__tests__/samlHelpers.test.ts @@ -1,7 +1,7 @@ import { User } from '@/databases/entities/User'; import { generateNanoId } from '@/databases/utils/generators'; -import * as helpers from '@/sso/saml/samlHelpers'; -import type { SamlUserAttributes } from '@/sso/saml/types/samlUserAttributes'; +import * as helpers from '@/sso/saml/saml-helpers'; +import type { SamlUserAttributes } from '@/sso/saml/types/saml-user-attributes'; import { mockInstance } from '@test/mocking'; import { UserRepository } from '@/databases/repositories/user.repository'; import type { AuthIdentity } from '@/databases/entities/AuthIdentity'; diff --git a/packages/cli/src/sso/saml/middleware/samlEnabledMiddleware.ts b/packages/cli/src/sso/saml/middleware/saml-enabled-middleware.ts similarity index 97% rename from packages/cli/src/sso/saml/middleware/samlEnabledMiddleware.ts rename to packages/cli/src/sso/saml/middleware/saml-enabled-middleware.ts index e386541de0..e0bf2b1b01 100644 --- a/packages/cli/src/sso/saml/middleware/samlEnabledMiddleware.ts +++ b/packages/cli/src/sso/saml/middleware/saml-enabled-middleware.ts @@ -1,5 +1,5 @@ import type { RequestHandler } from 'express'; -import { isSamlLicensed, isSamlLicensedAndEnabled } from '../samlHelpers'; +import { isSamlLicensed, isSamlLicensedAndEnabled } from '../saml-helpers'; export const samlLicensedAndEnabledMiddleware: RequestHandler = (_, res, next) => { if (isSamlLicensedAndEnabled()) { diff --git a/packages/cli/src/sso/saml/routes/saml.controller.ee.ts b/packages/cli/src/sso/saml/routes/saml.controller.ee.ts index 8169ee317b..621d03bec1 100644 --- a/packages/cli/src/sso/saml/routes/saml.controller.ee.ts +++ b/packages/cli/src/sso/saml/routes/saml.controller.ee.ts @@ -15,18 +15,18 @@ import { getServiceProviderConfigTestReturnUrl, getServiceProviderEntityId, getServiceProviderReturnUrl, -} from '../serviceProvider.ee'; -import { getSamlConnectionTestSuccessView } from '../views/samlConnectionTestSuccess'; -import { getSamlConnectionTestFailedView } from '../views/samlConnectionTestFailed'; -import { isConnectionTestRequest, isSamlLicensedAndEnabled } from '../samlHelpers'; +} from '../service-provider.ee'; +import { getSamlConnectionTestSuccessView } from '../views/saml-connection-test-success'; +import { getSamlConnectionTestFailedView } from '../views/saml-connection-test-failed'; +import { isConnectionTestRequest, isSamlLicensedAndEnabled } from '../saml-helpers'; import type { SamlLoginBinding } from '../types'; import { samlLicensedAndEnabledMiddleware, samlLicensedMiddleware, -} from '../middleware/samlEnabledMiddleware'; +} from '../middleware/saml-enabled-middleware'; import { SamlService } from '../saml.service.ee'; import { SamlConfiguration } from '../types/requests'; -import { getInitSSOFormView } from '../views/initSsoPost'; +import { getInitSSOFormView } from '../views/init-sso-post'; import { EventService } from '@/events/event.service'; @RestController('/sso/saml') diff --git a/packages/cli/src/sso/saml/samlHelpers.ts b/packages/cli/src/sso/saml/saml-helpers.ts similarity index 95% rename from packages/cli/src/sso/saml/samlHelpers.ts rename to packages/cli/src/sso/saml/saml-helpers.ts index d7f53900e5..c2dec7637f 100644 --- a/packages/cli/src/sso/saml/samlHelpers.ts +++ b/packages/cli/src/sso/saml/saml-helpers.ts @@ -9,20 +9,20 @@ import { UserRepository } from '@db/repositories/user.repository'; import { AuthIdentityRepository } from '@db/repositories/authIdentity.repository'; import { InternalServerError } from '@/errors/response-errors/internal-server.error'; import { AuthError } from '@/errors/response-errors/auth.error'; -import { License } from '@/License'; +import { License } from '@/license'; import { PasswordUtility } from '@/services/password.utility'; -import type { SamlPreferences } from './types/samlPreferences'; -import type { SamlUserAttributes } from './types/samlUserAttributes'; -import type { SamlAttributeMapping } from './types/samlAttributeMapping'; +import type { SamlPreferences } from './types/saml-preferences'; +import type { SamlUserAttributes } from './types/saml-user-attributes'; +import type { SamlAttributeMapping } from './types/saml-attribute-mapping'; import { SAML_LOGIN_ENABLED, SAML_LOGIN_LABEL } from './constants'; import { getCurrentAuthenticationMethod, isEmailCurrentAuthenticationMethod, isSamlCurrentAuthenticationMethod, setCurrentAuthenticationMethod, -} from '../ssoHelpers'; -import { getServiceProviderConfigTestReturnUrl } from './serviceProvider.ee'; +} from '../sso-helpers'; +import { getServiceProviderConfigTestReturnUrl } from './service-provider.ee'; import type { SamlConfiguration } from './types/requests'; /** diff --git a/packages/cli/src/sso/saml/samlValidator.ts b/packages/cli/src/sso/saml/saml-validator.ts similarity index 99% rename from packages/cli/src/sso/saml/samlValidator.ts rename to packages/cli/src/sso/saml/saml-validator.ts index 66be4c98e0..8e1e9dc328 100644 --- a/packages/cli/src/sso/saml/samlValidator.ts +++ b/packages/cli/src/sso/saml/saml-validator.ts @@ -1,6 +1,6 @@ import { Container } from 'typedi'; import type { XMLFileInfo } from 'xmllint-wasm'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; let xml: XMLFileInfo; let xmldsigCore: XMLFileInfo; diff --git a/packages/cli/src/sso/saml/saml.service.ee.ts b/packages/cli/src/sso/saml/saml.service.ee.ts index 1103bf73d9..a9411535cc 100644 --- a/packages/cli/src/sso/saml/saml.service.ee.ts +++ b/packages/cli/src/sso/saml/saml.service.ee.ts @@ -2,10 +2,10 @@ import type express from 'express'; import Container, { Service } from 'typedi'; import type { User } from '@db/entities/User'; import { ApplicationError, jsonParse } from 'n8n-workflow'; -import { getServiceProviderInstance } from './serviceProvider.ee'; -import type { SamlUserAttributes } from './types/samlUserAttributes'; -import { isSsoJustInTimeProvisioningEnabled } from '../ssoHelpers'; -import type { SamlPreferences } from './types/samlPreferences'; +import { getServiceProviderInstance } from './service-provider.ee'; +import type { SamlUserAttributes } from './types/saml-user-attributes'; +import { isSsoJustInTimeProvisioningEnabled } from '../sso-helpers'; +import type { SamlPreferences } from './types/saml-preferences'; import { SAML_PREFERENCES_DB_KEY } from './constants'; import type { IdentityProviderInstance, ServiceProviderInstance } from 'samlify'; import type { BindingContext, PostBindingContext } from 'samlify/types/src/entity'; @@ -18,13 +18,13 @@ import { setSamlLoginEnabled, setSamlLoginLabel, updateUserFromSamlAttributes, -} from './samlHelpers'; +} from './saml-helpers'; import type { Settings } from '@db/entities/Settings'; import axios from 'axios'; import https from 'https'; import type { SamlLoginBinding } from './types'; -import { validateMetadata, validateResponse } from './samlValidator'; -import { Logger } from '@/Logger'; +import { validateMetadata, validateResponse } from './saml-validator'; +import { Logger } from '@/logger'; import { UserRepository } from '@db/repositories/user.repository'; import { SettingsRepository } from '@db/repositories/settings.repository'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; diff --git a/packages/cli/src/sso/saml/serviceProvider.ee.ts b/packages/cli/src/sso/saml/service-provider.ee.ts similarity index 96% rename from packages/cli/src/sso/saml/serviceProvider.ee.ts rename to packages/cli/src/sso/saml/service-provider.ee.ts index 088457ca9c..4630f7c01a 100644 --- a/packages/cli/src/sso/saml/serviceProvider.ee.ts +++ b/packages/cli/src/sso/saml/service-provider.ee.ts @@ -1,7 +1,7 @@ import { Container } from 'typedi'; import type { ServiceProviderInstance } from 'samlify'; import { UrlService } from '@/services/url.service'; -import type { SamlPreferences } from './types/samlPreferences'; +import type { SamlPreferences } from './types/saml-preferences'; let serviceProviderInstance: ServiceProviderInstance | undefined; diff --git a/packages/cli/src/sso/saml/types/requests.ts b/packages/cli/src/sso/saml/types/requests.ts index 66bdc553d3..c333c8c361 100644 --- a/packages/cli/src/sso/saml/types/requests.ts +++ b/packages/cli/src/sso/saml/types/requests.ts @@ -1,5 +1,5 @@ import type { AuthenticatedRequest, AuthlessRequest } from '@/requests'; -import type { SamlPreferences } from './samlPreferences'; +import type { SamlPreferences } from './saml-preferences'; export declare namespace SamlConfiguration { type Update = AuthenticatedRequest<{}, {}, SamlPreferences, {}>; diff --git a/packages/cli/src/sso/saml/types/samlAttributeMapping.ts b/packages/cli/src/sso/saml/types/saml-attribute-mapping.ts similarity index 100% rename from packages/cli/src/sso/saml/types/samlAttributeMapping.ts rename to packages/cli/src/sso/saml/types/saml-attribute-mapping.ts diff --git a/packages/cli/src/sso/saml/types/samlPreferences.ts b/packages/cli/src/sso/saml/types/saml-preferences.ts similarity index 94% rename from packages/cli/src/sso/saml/types/samlPreferences.ts rename to packages/cli/src/sso/saml/types/saml-preferences.ts index da02f1ebc4..6f4fc696ca 100644 --- a/packages/cli/src/sso/saml/types/samlPreferences.ts +++ b/packages/cli/src/sso/saml/types/saml-preferences.ts @@ -1,7 +1,7 @@ import { IsBoolean, IsObject, IsOptional, IsString } from 'class-validator'; import { SignatureConfig } from 'samlify/types/src/types'; import { SamlLoginBinding } from '.'; -import { SamlAttributeMapping } from './samlAttributeMapping'; +import { SamlAttributeMapping } from './saml-attribute-mapping'; export class SamlPreferences { @IsObject() diff --git a/packages/cli/src/sso/saml/types/samlUserAttributes.ts b/packages/cli/src/sso/saml/types/saml-user-attributes.ts similarity index 100% rename from packages/cli/src/sso/saml/types/samlUserAttributes.ts rename to packages/cli/src/sso/saml/types/saml-user-attributes.ts diff --git a/packages/cli/src/sso/saml/views/initSsoPost.ts b/packages/cli/src/sso/saml/views/init-sso-post.ts similarity index 100% rename from packages/cli/src/sso/saml/views/initSsoPost.ts rename to packages/cli/src/sso/saml/views/init-sso-post.ts diff --git a/packages/cli/src/sso/saml/views/samlConnectionTestFailed.ts b/packages/cli/src/sso/saml/views/saml-connection-test-failed.ts similarity index 95% rename from packages/cli/src/sso/saml/views/samlConnectionTestFailed.ts rename to packages/cli/src/sso/saml/views/saml-connection-test-failed.ts index 8d9a3578f0..4ce2a3e3ac 100644 --- a/packages/cli/src/sso/saml/views/samlConnectionTestFailed.ts +++ b/packages/cli/src/sso/saml/views/saml-connection-test-failed.ts @@ -1,4 +1,4 @@ -import type { SamlUserAttributes } from '../types/samlUserAttributes'; +import type { SamlUserAttributes } from '../types/saml-user-attributes'; export function getSamlConnectionTestFailedView( message: string, diff --git a/packages/cli/src/sso/saml/views/samlConnectionTestSuccess.ts b/packages/cli/src/sso/saml/views/saml-connection-test-success.ts similarity index 95% rename from packages/cli/src/sso/saml/views/samlConnectionTestSuccess.ts rename to packages/cli/src/sso/saml/views/saml-connection-test-success.ts index 59e6aed263..f647527cd0 100644 --- a/packages/cli/src/sso/saml/views/samlConnectionTestSuccess.ts +++ b/packages/cli/src/sso/saml/views/saml-connection-test-success.ts @@ -1,4 +1,4 @@ -import type { SamlUserAttributes } from '../types/samlUserAttributes'; +import type { SamlUserAttributes } from '../types/saml-user-attributes'; export function getSamlConnectionTestSuccessView(attributes: SamlUserAttributes): string { return ` diff --git a/packages/cli/src/sso/ssoHelpers.ts b/packages/cli/src/sso/sso-helpers.ts similarity index 100% rename from packages/cli/src/sso/ssoHelpers.ts rename to packages/cli/src/sso/sso-helpers.ts diff --git a/packages/cli/src/subworkflows/__tests__/subworkflow-policy-checker.test.ts b/packages/cli/src/subworkflows/__tests__/subworkflow-policy-checker.test.ts index c20d8fdb2c..d4d58051a0 100644 --- a/packages/cli/src/subworkflows/__tests__/subworkflow-policy-checker.test.ts +++ b/packages/cli/src/subworkflows/__tests__/subworkflow-policy-checker.test.ts @@ -9,7 +9,7 @@ import { mock } from 'jest-mock-extended'; import { SubworkflowPolicyChecker } from '../subworkflow-policy-checker.service'; import type { WorkflowEntity } from '@/databases/entities/WorkflowEntity'; -import type { License } from '@/License'; +import type { License } from '@/license'; import type { GlobalConfig } from '@n8n/config'; const toTargetCallErrorMsg = (subworkflowId: string) => diff --git a/packages/cli/src/subworkflows/subworkflow-policy-checker.service.ts b/packages/cli/src/subworkflows/subworkflow-policy-checker.service.ts index dd5b254ce5..09f46eadf0 100644 --- a/packages/cli/src/subworkflows/subworkflow-policy-checker.service.ts +++ b/packages/cli/src/subworkflows/subworkflow-policy-checker.service.ts @@ -1,7 +1,7 @@ import { Service } from 'typedi'; import { GlobalConfig } from '@n8n/config'; -import { Logger } from '@/Logger'; -import { License } from '@/License'; +import { Logger } from '@/logger'; +import { License } from '@/license'; import { OwnershipService } from '@/services/ownership.service'; import type { Workflow, INode, WorkflowSettings } from 'n8n-workflow'; import { SubworkflowPolicyDenialError } from '@/errors/subworkflow-policy-denial.error'; diff --git a/packages/cli/src/telemetry/index.ts b/packages/cli/src/telemetry/index.ts index e2b93cdd0d..2aec0f07d2 100644 --- a/packages/cli/src/telemetry/index.ts +++ b/packages/cli/src/telemetry/index.ts @@ -7,15 +7,15 @@ import { InstanceSettings } from 'n8n-core'; import config from '@/config'; import type { IExecutionTrackProperties } from '@/Interfaces'; -import { Logger } from '@/Logger'; -import { License } from '@/License'; +import { Logger } from '@/logger'; +import { License } from '@/license'; import { LOWEST_SHUTDOWN_PRIORITY, N8N_VERSION } from '@/constants'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import { SourceControlPreferencesService } from '../environments/sourceControl/sourceControlPreferences.service.ee'; import { UserRepository } from '@db/repositories/user.repository'; import { ProjectRepository } from '@/databases/repositories/project.repository'; import { ProjectRelationRepository } from '@/databases/repositories/projectRelation.repository'; -import { OnShutdown } from '@/decorators/OnShutdown'; +import { OnShutdown } from '@/decorators/on-shutdown'; type ExecutionTrackDataKey = 'manual_error' | 'manual_success' | 'prod_error' | 'prod_success'; diff --git a/packages/cli/src/UserManagement/email/Interfaces.ts b/packages/cli/src/user-management/email/Interfaces.ts similarity index 100% rename from packages/cli/src/UserManagement/email/Interfaces.ts rename to packages/cli/src/user-management/email/Interfaces.ts diff --git a/packages/cli/src/UserManagement/email/__tests__/UserManagementMailer.test.ts b/packages/cli/src/user-management/email/__tests__/user-management-mailer.test.ts similarity index 91% rename from packages/cli/src/UserManagement/email/__tests__/UserManagementMailer.test.ts rename to packages/cli/src/user-management/email/__tests__/user-management-mailer.test.ts index d39b27435a..a52a240bc4 100644 --- a/packages/cli/src/UserManagement/email/__tests__/UserManagementMailer.test.ts +++ b/packages/cli/src/user-management/email/__tests__/user-management-mailer.test.ts @@ -1,9 +1,9 @@ import type { GlobalConfig } from '@n8n/config'; import { mock } from 'jest-mock-extended'; -import type { InviteEmailData, PasswordResetData } from '@/UserManagement/email/Interfaces'; -import { NodeMailer } from '@/UserManagement/email/NodeMailer'; -import { UserManagementMailer } from '@/UserManagement/email/UserManagementMailer'; +import type { InviteEmailData, PasswordResetData } from '@/user-management/email/Interfaces'; +import { NodeMailer } from '@/user-management/email/node-mailer'; +import { UserManagementMailer } from '@/user-management/email/user-management-mailer'; import { mockInstance } from '@test/mocking'; describe('UserManagementMailer', () => { diff --git a/packages/cli/src/user-management/email/index.ts b/packages/cli/src/user-management/email/index.ts new file mode 100644 index 0000000000..4b2a714fb7 --- /dev/null +++ b/packages/cli/src/user-management/email/index.ts @@ -0,0 +1,3 @@ +import { UserManagementMailer } from './user-management-mailer'; + +export { UserManagementMailer }; diff --git a/packages/cli/src/UserManagement/email/NodeMailer.ts b/packages/cli/src/user-management/email/node-mailer.ts similarity index 98% rename from packages/cli/src/UserManagement/email/NodeMailer.ts rename to packages/cli/src/user-management/email/node-mailer.ts index 8d27e2181b..d8834f9aae 100644 --- a/packages/cli/src/UserManagement/email/NodeMailer.ts +++ b/packages/cli/src/user-management/email/node-mailer.ts @@ -6,7 +6,7 @@ import type SMTPConnection from 'nodemailer/lib/smtp-connection'; import { GlobalConfig } from '@n8n/config'; import { ErrorReporterProxy as ErrorReporter } from 'n8n-workflow'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import type { MailData, SendEmailResult } from './Interfaces'; @Service() diff --git a/packages/cli/src/UserManagement/email/templates/credentialsShared.html b/packages/cli/src/user-management/email/templates/credentialsShared.html similarity index 100% rename from packages/cli/src/UserManagement/email/templates/credentialsShared.html rename to packages/cli/src/user-management/email/templates/credentialsShared.html diff --git a/packages/cli/src/UserManagement/email/templates/instanceSetup.html b/packages/cli/src/user-management/email/templates/instanceSetup.html similarity index 100% rename from packages/cli/src/UserManagement/email/templates/instanceSetup.html rename to packages/cli/src/user-management/email/templates/instanceSetup.html diff --git a/packages/cli/src/UserManagement/email/templates/invite.html b/packages/cli/src/user-management/email/templates/invite.html similarity index 100% rename from packages/cli/src/UserManagement/email/templates/invite.html rename to packages/cli/src/user-management/email/templates/invite.html diff --git a/packages/cli/src/UserManagement/email/templates/passwordReset.html b/packages/cli/src/user-management/email/templates/passwordReset.html similarity index 100% rename from packages/cli/src/UserManagement/email/templates/passwordReset.html rename to packages/cli/src/user-management/email/templates/passwordReset.html diff --git a/packages/cli/src/UserManagement/email/templates/workflowShared.html b/packages/cli/src/user-management/email/templates/workflowShared.html similarity index 100% rename from packages/cli/src/UserManagement/email/templates/workflowShared.html rename to packages/cli/src/user-management/email/templates/workflowShared.html diff --git a/packages/cli/src/UserManagement/email/UserManagementMailer.ts b/packages/cli/src/user-management/email/user-management-mailer.ts similarity index 98% rename from packages/cli/src/UserManagement/email/UserManagementMailer.ts rename to packages/cli/src/user-management/email/user-management-mailer.ts index 7d5e8d2548..0c5e021d94 100644 --- a/packages/cli/src/UserManagement/email/UserManagementMailer.ts +++ b/packages/cli/src/user-management/email/user-management-mailer.ts @@ -8,13 +8,13 @@ import { GlobalConfig } from '@n8n/config'; import type { User } from '@db/entities/User'; import type { WorkflowEntity } from '@db/entities/WorkflowEntity'; import { UserRepository } from '@db/repositories/user.repository'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { UrlService } from '@/services/url.service'; import { InternalServerError } from '@/errors/response-errors/internal-server.error'; import { toError } from '@/utils'; import type { InviteEmailData, PasswordResetData, SendEmailResult } from './Interfaces'; -import { NodeMailer } from './NodeMailer'; +import { NodeMailer } from './node-mailer'; import { EventService } from '@/events/event.service'; type Template = HandlebarsTemplateDelegate; diff --git a/packages/cli/src/UserManagement/PermissionChecker.ts b/packages/cli/src/user-management/permission-checker.ts similarity index 100% rename from packages/cli/src/UserManagement/PermissionChecker.ts rename to packages/cli/src/user-management/permission-checker.ts diff --git a/packages/cli/src/WaitTracker.ts b/packages/cli/src/wait-tracker.ts similarity index 98% rename from packages/cli/src/WaitTracker.ts rename to packages/cli/src/wait-tracker.ts index 5050d80ba9..eec9cb64b1 100644 --- a/packages/cli/src/WaitTracker.ts +++ b/packages/cli/src/wait-tracker.ts @@ -1,10 +1,10 @@ import { ApplicationError, ErrorReporterProxy as ErrorReporter } from 'n8n-workflow'; import { Service } from 'typedi'; import type { IWorkflowExecutionDataProcess } from '@/Interfaces'; -import { WorkflowRunner } from '@/WorkflowRunner'; +import { WorkflowRunner } from '@/workflow-runner'; import { ExecutionRepository } from '@db/repositories/execution.repository'; import { OwnershipService } from '@/services/ownership.service'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { OrchestrationService } from '@/services/orchestration.service'; @Service() diff --git a/packages/cli/src/WaitingForms.ts b/packages/cli/src/waiting-forms.ts similarity index 89% rename from packages/cli/src/WaitingForms.ts rename to packages/cli/src/waiting-forms.ts index bf0ab7dedb..2fc1655594 100644 --- a/packages/cli/src/WaitingForms.ts +++ b/packages/cli/src/waiting-forms.ts @@ -1,7 +1,7 @@ import { Service } from 'typedi'; import type { IExecutionResponse } from '@/Interfaces'; -import { WaitingWebhooks } from '@/webhooks/WaitingWebhooks'; +import { WaitingWebhooks } from '@/webhooks/waiting-webhooks'; @Service() export class WaitingForms extends WaitingWebhooks { diff --git a/packages/cli/src/webhooks/__tests__/TestWebhooks.test.ts b/packages/cli/src/webhooks/__tests__/TestWebhooks.test.ts index deb6930b96..292b20e1bd 100644 --- a/packages/cli/src/webhooks/__tests__/TestWebhooks.test.ts +++ b/packages/cli/src/webhooks/__tests__/TestWebhooks.test.ts @@ -1,10 +1,10 @@ import { mock } from 'jest-mock-extended'; -import { TestWebhooks } from '@/webhooks/TestWebhooks'; +import { TestWebhooks } from '@/webhooks/test-webhooks'; import { WebhookNotFoundError } from '@/errors/response-errors/webhook-not-found.error'; import { v4 as uuid } from 'uuid'; import { generateNanoId } from '@/databases/utils/generators'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; -import * as WebhookHelpers from '@/webhooks/WebhookHelpers'; +import * as WebhookHelpers from '@/webhooks/webhook-helpers'; import type * as express from 'express'; import type { IWorkflowDb } from '@/Interfaces'; @@ -14,10 +14,10 @@ import type { TestWebhookRegistration, } from '@/webhooks/test-webhook-registrations.service'; -import * as AdditionalData from '@/WorkflowExecuteAdditionalData'; +import * as AdditionalData from '@/workflow-execute-additional-data'; import type { WebhookRequest } from '@/webhooks/webhook.types'; -jest.mock('@/WorkflowExecuteAdditionalData'); +jest.mock('@/workflow-execute-additional-data'); const mockedAdditionalData = AdditionalData as jest.Mocked; diff --git a/packages/cli/src/webhooks/__tests__/WebhookRequestHandler.test.ts b/packages/cli/src/webhooks/__tests__/WebhookRequestHandler.test.ts index aff3102419..c807c6c4d9 100644 --- a/packages/cli/src/webhooks/__tests__/WebhookRequestHandler.test.ts +++ b/packages/cli/src/webhooks/__tests__/WebhookRequestHandler.test.ts @@ -9,7 +9,7 @@ import type { WebhookOptionsRequest, WebhookRequest, } from '@/webhooks/webhook.types'; -import { createWebhookHandlerFor } from '@/webhooks/WebhookRequestHandler'; +import { createWebhookHandlerFor } from '@/webhooks/webhook-request-handler'; import { ResponseError } from '@/errors/response-errors/abstract/response.error'; describe('WebhookRequestHandler', () => { diff --git a/packages/cli/src/webhooks/__tests__/waiting-webhooks.test.ts b/packages/cli/src/webhooks/__tests__/waiting-webhooks.test.ts index 31f64eb198..5cb8e005ad 100644 --- a/packages/cli/src/webhooks/__tests__/waiting-webhooks.test.ts +++ b/packages/cli/src/webhooks/__tests__/waiting-webhooks.test.ts @@ -1,5 +1,5 @@ import { mock } from 'jest-mock-extended'; -import { WaitingWebhooks } from '@/webhooks/WaitingWebhooks'; +import { WaitingWebhooks } from '@/webhooks/waiting-webhooks'; import { ConflictError } from '@/errors/response-errors/conflict.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import type { IExecutionResponse } from '@/Interfaces'; diff --git a/packages/cli/src/webhooks/LiveWebhooks.ts b/packages/cli/src/webhooks/live-webhooks.ts similarity index 94% rename from packages/cli/src/webhooks/LiveWebhooks.ts rename to packages/cli/src/webhooks/live-webhooks.ts index 3d66b7ee7f..1db85e2315 100644 --- a/packages/cli/src/webhooks/LiveWebhooks.ts +++ b/packages/cli/src/webhooks/live-webhooks.ts @@ -10,14 +10,14 @@ import type { WebhookAccessControlOptions, WebhookRequest, } from './webhook.types'; -import { Logger } from '@/Logger'; -import { NodeTypes } from '@/NodeTypes'; +import { Logger } from '@/logger'; +import { NodeTypes } from '@/node-types'; import { WebhookService } from '@/webhooks/webhook.service'; import { WebhookNotFoundError } from '@/errors/response-errors/webhook-not-found.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; -import * as WorkflowExecuteAdditionalData from '@/WorkflowExecuteAdditionalData'; -import * as WebhookHelpers from '@/webhooks/WebhookHelpers'; -import { WorkflowStaticDataService } from '@/workflows/workflowStaticData.service'; +import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data'; +import * as WebhookHelpers from '@/webhooks/webhook-helpers'; +import { WorkflowStaticDataService } from '@/workflows/workflow-static-data.service'; /** * Service for handling the execution of live webhooks, i.e. webhooks diff --git a/packages/cli/src/webhooks/TestWebhooks.ts b/packages/cli/src/webhooks/test-webhooks.ts similarity index 98% rename from packages/cli/src/webhooks/TestWebhooks.ts rename to packages/cli/src/webhooks/test-webhooks.ts index 8cf1b42929..e10b77aa24 100644 --- a/packages/cli/src/webhooks/TestWebhooks.ts +++ b/packages/cli/src/webhooks/test-webhooks.ts @@ -14,8 +14,8 @@ import type { WebhookRequest, } from './webhook.types'; import { Push } from '@/push'; -import { NodeTypes } from '@/NodeTypes'; -import * as WebhookHelpers from '@/webhooks/WebhookHelpers'; +import { NodeTypes } from '@/node-types'; +import * as WebhookHelpers from '@/webhooks/webhook-helpers'; import { TEST_WEBHOOK_TIMEOUT } from '@/constants'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { WorkflowMissingIdError } from '@/errors/workflow-missing-id.error'; @@ -25,7 +25,7 @@ import { removeTrailingSlash } from '@/utils'; import type { TestWebhookRegistration } from '@/webhooks/test-webhook-registrations.service'; import { TestWebhookRegistrationsService } from '@/webhooks/test-webhook-registrations.service'; import { OrchestrationService } from '@/services/orchestration.service'; -import * as WorkflowExecuteAdditionalData from '@/WorkflowExecuteAdditionalData'; +import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data'; import type { IWorkflowDb } from '@/Interfaces'; /** diff --git a/packages/cli/src/webhooks/WaitingWebhooks.ts b/packages/cli/src/webhooks/waiting-webhooks.ts similarity index 95% rename from packages/cli/src/webhooks/WaitingWebhooks.ts rename to packages/cli/src/webhooks/waiting-webhooks.ts index 367635c45e..f2c5706817 100644 --- a/packages/cli/src/webhooks/WaitingWebhooks.ts +++ b/packages/cli/src/webhooks/waiting-webhooks.ts @@ -2,16 +2,16 @@ import { NodeHelpers, Workflow } from 'n8n-workflow'; import { Service } from 'typedi'; import type express from 'express'; -import * as WebhookHelpers from '@/webhooks/WebhookHelpers'; -import { NodeTypes } from '@/NodeTypes'; +import * as WebhookHelpers from '@/webhooks/webhook-helpers'; +import { NodeTypes } from '@/node-types'; import type { IWebhookResponseCallbackData, IWebhookManager, WaitingWebhookRequest, } from './webhook.types'; -import * as WorkflowExecuteAdditionalData from '@/WorkflowExecuteAdditionalData'; +import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data'; import { ExecutionRepository } from '@db/repositories/execution.repository'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { ConflictError } from '@/errors/response-errors/conflict.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import type { IExecutionResponse, IWorkflowDb } from '@/Interfaces'; diff --git a/packages/cli/src/webhooks/WebhookHelpers.ts b/packages/cli/src/webhooks/webhook-helpers.ts similarity index 98% rename from packages/cli/src/webhooks/WebhookHelpers.ts rename to packages/cli/src/webhooks/webhook-helpers.ts index 1b8bc2b7e9..725f0339a1 100644 --- a/packages/cli/src/webhooks/WebhookHelpers.ts +++ b/packages/cli/src/webhooks/webhook-helpers.ts @@ -41,14 +41,14 @@ import { } from 'n8n-workflow'; import type { IWebhookResponseCallbackData, WebhookRequest } from './webhook.types'; -import * as WorkflowHelpers from '@/WorkflowHelpers'; -import { WorkflowRunner } from '@/WorkflowRunner'; -import * as WorkflowExecuteAdditionalData from '@/WorkflowExecuteAdditionalData'; -import { ActiveExecutions } from '@/ActiveExecutions'; +import * as WorkflowHelpers from '@/workflow-helpers'; +import { WorkflowRunner } from '@/workflow-runner'; +import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data'; +import { ActiveExecutions } from '@/active-executions'; import { WorkflowStatisticsService } from '@/services/workflow-statistics.service'; import { OwnershipService } from '@/services/ownership.service'; import { parseBody } from '@/middlewares'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { InternalServerError } from '@/errors/response-errors/internal-server.error'; import { UnprocessableRequestError } from '@/errors/response-errors/unprocessable.error'; diff --git a/packages/cli/src/webhooks/WebhookRequestHandler.ts b/packages/cli/src/webhooks/webhook-request-handler.ts similarity index 98% rename from packages/cli/src/webhooks/WebhookRequestHandler.ts rename to packages/cli/src/webhooks/webhook-request-handler.ts index 289175ac05..a495873a68 100644 --- a/packages/cli/src/webhooks/WebhookRequestHandler.ts +++ b/packages/cli/src/webhooks/webhook-request-handler.ts @@ -5,7 +5,7 @@ import type { WebhookOptionsRequest, WebhookRequest, } from '@/webhooks/webhook.types'; -import * as ResponseHelper from '@/ResponseHelper'; +import * as ResponseHelper from '@/response-helper'; const WEBHOOK_METHODS: IHttpRequestMethods[] = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT']; diff --git a/packages/cli/src/webhooks/WebhookServer.ts b/packages/cli/src/webhooks/webhook-server.ts similarity index 72% rename from packages/cli/src/webhooks/WebhookServer.ts rename to packages/cli/src/webhooks/webhook-server.ts index 60f59f606d..bb00510e56 100644 --- a/packages/cli/src/webhooks/WebhookServer.ts +++ b/packages/cli/src/webhooks/webhook-server.ts @@ -1,5 +1,5 @@ import { Service } from 'typedi'; -import { AbstractServer } from '@/AbstractServer'; +import { AbstractServer } from '@/abstract-server'; @Service() export class WebhookServer extends AbstractServer { diff --git a/packages/cli/src/WorkflowExecuteAdditionalData.ts b/packages/cli/src/workflow-execute-additional-data.ts similarity index 97% rename from packages/cli/src/WorkflowExecuteAdditionalData.ts rename to packages/cli/src/workflow-execute-additional-data.ts index 127e0cc817..459c946926 100644 --- a/packages/cli/src/WorkflowExecuteAdditionalData.ts +++ b/packages/cli/src/workflow-execute-additional-data.ts @@ -36,9 +36,9 @@ import { import { Container } from 'typedi'; import config from '@/config'; -import { ActiveExecutions } from '@/ActiveExecutions'; -import { CredentialsHelper } from '@/CredentialsHelper'; -import { ExternalHooks } from '@/ExternalHooks'; +import { ActiveExecutions } from '@/active-executions'; +import { CredentialsHelper } from '@/credentials-helper'; +import { ExternalHooks } from '@/external-hooks'; import type { IPushDataExecutionFinished, IWorkflowExecuteProcess, @@ -47,28 +47,28 @@ import type { IPushDataType, ExecutionPayload, } from '@/Interfaces'; -import { NodeTypes } from '@/NodeTypes'; +import { NodeTypes } from '@/node-types'; import { Push } from '@/push'; -import * as WorkflowHelpers from '@/WorkflowHelpers'; +import * as WorkflowHelpers from '@/workflow-helpers'; import { findSubworkflowStart, isWorkflowIdValid } from '@/utils'; -import { PermissionChecker } from './UserManagement/PermissionChecker'; +import { PermissionChecker } from './user-management/permission-checker'; import { ExecutionRepository } from '@db/repositories/execution.repository'; import { WorkflowStatisticsService } from '@/services/workflow-statistics.service'; -import { SecretsHelper } from './SecretsHelpers'; +import { SecretsHelper } from './secrets-helpers'; import { OwnershipService } from './services/ownership.service'; import { determineFinalExecutionStatus, prepareExecutionDataForDbUpdate, updateExistingExecution, -} from './executionLifecycleHooks/shared/sharedHookFunctions'; -import { restoreBinaryDataId } from './executionLifecycleHooks/restoreBinaryDataId'; -import { toSaveSettings } from './executionLifecycleHooks/toSaveSettings'; -import { Logger } from './Logger'; -import { saveExecutionProgress } from './executionLifecycleHooks/saveExecutionProgress'; -import { WorkflowStaticDataService } from './workflows/workflowStaticData.service'; +} from './execution-lifecycle-hooks/shared/shared-hook-functions'; +import { restoreBinaryDataId } from './execution-lifecycle-hooks/restore-binary-data-id'; +import { toSaveSettings } from './execution-lifecycle-hooks/to-save-settings'; +import { Logger } from './logger'; +import { saveExecutionProgress } from './execution-lifecycle-hooks/save-execution-progress'; +import { WorkflowStaticDataService } from './workflows/workflow-static-data.service'; import { WorkflowRepository } from './databases/repositories/workflow.repository'; import { UrlService } from './services/url.service'; -import { WorkflowExecutionService } from './workflows/workflowExecution.service'; +import { WorkflowExecutionService } from './workflows/workflow-execution.service'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; import { EventService } from './events/event.service'; import { GlobalConfig } from '@n8n/config'; diff --git a/packages/cli/src/WorkflowHelpers.ts b/packages/cli/src/workflow-helpers.ts similarity index 100% rename from packages/cli/src/WorkflowHelpers.ts rename to packages/cli/src/workflow-helpers.ts diff --git a/packages/cli/src/WorkflowRunner.ts b/packages/cli/src/workflow-runner.ts similarity index 97% rename from packages/cli/src/WorkflowRunner.ts rename to packages/cli/src/workflow-runner.ts index 9ff1de8f35..b8012b3d4f 100644 --- a/packages/cli/src/WorkflowRunner.ts +++ b/packages/cli/src/workflow-runner.ts @@ -22,20 +22,20 @@ import { import PCancelable from 'p-cancelable'; -import { ActiveExecutions } from '@/ActiveExecutions'; +import { ActiveExecutions } from '@/active-executions'; import config from '@/config'; import { ExecutionRepository } from '@db/repositories/execution.repository'; -import { ExternalHooks } from '@/ExternalHooks'; +import { ExternalHooks } from '@/external-hooks'; import type { IExecutionResponse, IWorkflowExecutionDataProcess } from '@/Interfaces'; -import { NodeTypes } from '@/NodeTypes'; +import { NodeTypes } from '@/node-types'; import type { Job, JobData, JobResult } from '@/scaling/types'; import type { ScalingService } from '@/scaling/scaling.service'; -import * as WorkflowHelpers from '@/WorkflowHelpers'; -import * as WorkflowExecuteAdditionalData from '@/WorkflowExecuteAdditionalData'; -import { generateFailedExecutionFromError } from '@/WorkflowHelpers'; -import { PermissionChecker } from '@/UserManagement/PermissionChecker'; -import { Logger } from '@/Logger'; -import { WorkflowStaticDataService } from '@/workflows/workflowStaticData.service'; +import * as WorkflowHelpers from '@/workflow-helpers'; +import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data'; +import { generateFailedExecutionFromError } from '@/workflow-helpers'; +import { PermissionChecker } from '@/user-management/permission-checker'; +import { Logger } from '@/logger'; +import { WorkflowStaticDataService } from '@/workflows/workflow-static-data.service'; import { EventService } from './events/event.service'; import { GlobalConfig } from '@n8n/config'; diff --git a/packages/cli/src/workflows/__tests__/workflow-execution.service.test.ts b/packages/cli/src/workflows/__tests__/workflow-execution.service.test.ts index d06dde35e2..b56cbffbbd 100644 --- a/packages/cli/src/workflows/__tests__/workflow-execution.service.test.ts +++ b/packages/cli/src/workflows/__tests__/workflow-execution.service.test.ts @@ -3,8 +3,8 @@ import { mock } from 'jest-mock-extended'; import type { WorkflowEntity } from '@db/entities/WorkflowEntity'; import type { IWorkflowDb } from '@/Interfaces'; -import { WorkflowExecutionService } from '@/workflows/workflowExecution.service'; -import type { WorkflowRunner } from '@/WorkflowRunner'; +import { WorkflowExecutionService } from '@/workflows/workflow-execution.service'; +import type { WorkflowRunner } from '@/workflow-runner'; const webhookNode: INode = { name: 'Webhook', diff --git a/packages/cli/src/workflows/workflowExecution.service.ts b/packages/cli/src/workflows/workflow-execution.service.ts similarity index 96% rename from packages/cli/src/workflows/workflowExecution.service.ts rename to packages/cli/src/workflows/workflow-execution.service.ts index 9ddce37d2f..3611684ef1 100644 --- a/packages/cli/src/workflows/workflowExecution.service.ts +++ b/packages/cli/src/workflows/workflow-execution.service.ts @@ -19,7 +19,7 @@ import { import type { User } from '@db/entities/User'; import { ExecutionRepository } from '@db/repositories/execution.repository'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; -import * as WorkflowHelpers from '@/WorkflowHelpers'; +import * as WorkflowHelpers from '@/workflow-helpers'; import type { WorkflowRequest } from '@/workflows/workflow.request'; import type { ExecutionPayload, @@ -27,11 +27,11 @@ import type { IWorkflowErrorData, IWorkflowExecutionDataProcess, } from '@/Interfaces'; -import { NodeTypes } from '@/NodeTypes'; -import { WorkflowRunner } from '@/WorkflowRunner'; -import * as WorkflowExecuteAdditionalData from '@/WorkflowExecuteAdditionalData'; -import { TestWebhooks } from '@/webhooks/TestWebhooks'; -import { Logger } from '@/Logger'; +import { NodeTypes } from '@/node-types'; +import { WorkflowRunner } from '@/workflow-runner'; +import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data'; +import { TestWebhooks } from '@/webhooks/test-webhooks'; +import { Logger } from '@/logger'; import type { Project } from '@/databases/entities/Project'; import { GlobalConfig } from '@n8n/config'; import { SubworkflowPolicyChecker } from '@/subworkflows/subworkflow-policy-checker.service'; diff --git a/packages/cli/src/workflows/workflowHistory/__tests__/workflowHistoryHelper.ee.test.ts b/packages/cli/src/workflows/workflow-history/__tests__/workflow-history-helper.ee.test.ts similarity index 94% rename from packages/cli/src/workflows/workflowHistory/__tests__/workflowHistoryHelper.ee.test.ts rename to packages/cli/src/workflows/workflow-history/__tests__/workflow-history-helper.ee.test.ts index 427f981884..a4b7a70abf 100644 --- a/packages/cli/src/workflows/workflowHistory/__tests__/workflowHistoryHelper.ee.test.ts +++ b/packages/cli/src/workflows/workflow-history/__tests__/workflow-history-helper.ee.test.ts @@ -1,6 +1,6 @@ -import { License } from '@/License'; +import { License } from '@/license'; import config from '@/config'; -import { getWorkflowHistoryPruneTime } from '@/workflows/workflowHistory/workflowHistoryHelper.ee'; +import { getWorkflowHistoryPruneTime } from '@/workflows/workflow-history/workflow-history-helper.ee'; import { mockInstance } from '@test/mocking'; let licensePruneTime = -1; diff --git a/packages/cli/src/workflows/workflowHistory/__tests__/workflowHistory.service.ee.test.ts b/packages/cli/src/workflows/workflow-history/__tests__/workflow-history.service.ee.test.ts similarity index 94% rename from packages/cli/src/workflows/workflowHistory/__tests__/workflowHistory.service.ee.test.ts rename to packages/cli/src/workflows/workflow-history/__tests__/workflow-history.service.ee.test.ts index 5b28b8d171..0417908d1c 100644 --- a/packages/cli/src/workflows/workflowHistory/__tests__/workflowHistory.service.ee.test.ts +++ b/packages/cli/src/workflows/workflow-history/__tests__/workflow-history.service.ee.test.ts @@ -2,8 +2,8 @@ import { mockClear } from 'jest-mock-extended'; import { User } from '@db/entities/User'; import { WorkflowHistoryRepository } from '@db/repositories/workflowHistory.repository'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; -import { WorkflowHistoryService } from '@/workflows/workflowHistory/workflowHistory.service.ee'; -import { Logger } from '@/Logger'; +import { WorkflowHistoryService } from '@/workflows/workflow-history/workflow-history.service.ee'; +import { Logger } from '@/logger'; import { mockInstance } from '@test/mocking'; import { getWorkflow } from '@test-integration/workflow'; @@ -24,7 +24,7 @@ const testUser = Object.assign(new User(), { }); let isWorkflowHistoryEnabled = true; -jest.mock('@/workflows/workflowHistory/workflowHistoryHelper.ee', () => { +jest.mock('@/workflows/workflow-history/workflow-history-helper.ee', () => { return { isWorkflowHistoryEnabled: jest.fn(() => isWorkflowHistoryEnabled), }; diff --git a/packages/cli/src/workflows/workflowHistory/constants.ts b/packages/cli/src/workflows/workflow-history/constants.ts similarity index 100% rename from packages/cli/src/workflows/workflowHistory/constants.ts rename to packages/cli/src/workflows/workflow-history/constants.ts diff --git a/packages/cli/src/workflows/workflowHistory/workflowHistoryHelper.ee.ts b/packages/cli/src/workflows/workflow-history/workflow-history-helper.ee.ts similarity index 96% rename from packages/cli/src/workflows/workflowHistory/workflowHistoryHelper.ee.ts rename to packages/cli/src/workflows/workflow-history/workflow-history-helper.ee.ts index bf784c5aba..27da19b7da 100644 --- a/packages/cli/src/workflows/workflowHistory/workflowHistoryHelper.ee.ts +++ b/packages/cli/src/workflows/workflow-history/workflow-history-helper.ee.ts @@ -1,4 +1,4 @@ -import { License } from '@/License'; +import { License } from '@/license'; import config from '@/config'; import Container from 'typedi'; diff --git a/packages/cli/src/workflows/workflowHistory/workflowHistoryManager.ee.ts b/packages/cli/src/workflows/workflow-history/workflow-history-manager.ee.ts similarity index 90% rename from packages/cli/src/workflows/workflowHistory/workflowHistoryManager.ee.ts rename to packages/cli/src/workflows/workflow-history/workflow-history-manager.ee.ts index 4898666c88..d6eb214d8c 100644 --- a/packages/cli/src/workflows/workflowHistory/workflowHistoryManager.ee.ts +++ b/packages/cli/src/workflows/workflow-history/workflow-history-manager.ee.ts @@ -2,7 +2,10 @@ import { Service } from 'typedi'; import { DateTime } from 'luxon'; import { WorkflowHistoryRepository } from '@db/repositories/workflowHistory.repository'; import { WORKFLOW_HISTORY_PRUNE_INTERVAL } from './constants'; -import { getWorkflowHistoryPruneTime, isWorkflowHistoryEnabled } from './workflowHistoryHelper.ee'; +import { + getWorkflowHistoryPruneTime, + isWorkflowHistoryEnabled, +} from './workflow-history-helper.ee'; @Service() export class WorkflowHistoryManager { diff --git a/packages/cli/src/workflows/workflowHistory/workflowHistory.controller.ee.ts b/packages/cli/src/workflows/workflow-history/workflow-history.controller.ee.ts similarity index 94% rename from packages/cli/src/workflows/workflowHistory/workflowHistory.controller.ee.ts rename to packages/cli/src/workflows/workflow-history/workflow-history.controller.ee.ts index c57e3cb0b5..dd90037554 100644 --- a/packages/cli/src/workflows/workflowHistory/workflowHistory.controller.ee.ts +++ b/packages/cli/src/workflows/workflow-history/workflow-history.controller.ee.ts @@ -1,10 +1,10 @@ import { RestController, Get, Middleware } from '@/decorators'; import { WorkflowHistoryRequest } from '@/requests'; -import { WorkflowHistoryService } from './workflowHistory.service.ee'; +import { WorkflowHistoryService } from './workflow-history.service.ee'; import { Request, Response, NextFunction } from 'express'; -import { isWorkflowHistoryEnabled, isWorkflowHistoryLicensed } from './workflowHistoryHelper.ee'; +import { isWorkflowHistoryEnabled, isWorkflowHistoryLicensed } from './workflow-history-helper.ee'; -import { paginationListQueryMiddleware } from '@/middlewares/listQuery/pagination'; +import { paginationListQueryMiddleware } from '@/middlewares/list-query/pagination'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { SharedWorkflowNotFoundError } from '@/errors/shared-workflow-not-found.error'; import { WorkflowHistoryVersionNotFoundError } from '@/errors/workflow-history-version-not-found.error'; diff --git a/packages/cli/src/workflows/workflowHistory/workflowHistory.service.ee.ts b/packages/cli/src/workflows/workflow-history/workflow-history.service.ee.ts similarity index 96% rename from packages/cli/src/workflows/workflowHistory/workflowHistory.service.ee.ts rename to packages/cli/src/workflows/workflow-history/workflow-history.service.ee.ts index b92fc440cc..55cb085f42 100644 --- a/packages/cli/src/workflows/workflowHistory/workflowHistory.service.ee.ts +++ b/packages/cli/src/workflows/workflow-history/workflow-history.service.ee.ts @@ -4,8 +4,8 @@ import type { WorkflowHistory } from '@db/entities/WorkflowHistory'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { WorkflowHistoryRepository } from '@db/repositories/workflowHistory.repository'; import { Service } from 'typedi'; -import { isWorkflowHistoryEnabled } from './workflowHistoryHelper.ee'; -import { Logger } from '@/Logger'; +import { isWorkflowHistoryEnabled } from './workflow-history-helper.ee'; +import { Logger } from '@/logger'; import { SharedWorkflowNotFoundError } from '@/errors/shared-workflow-not-found.error'; import { WorkflowHistoryVersionNotFoundError } from '@/errors/workflow-history-version-not-found.error'; diff --git a/packages/cli/src/workflows/workflowSharing.service.ts b/packages/cli/src/workflows/workflow-sharing.service.ts similarity index 100% rename from packages/cli/src/workflows/workflowSharing.service.ts rename to packages/cli/src/workflows/workflow-sharing.service.ts diff --git a/packages/cli/src/workflows/workflowStaticData.service.ts b/packages/cli/src/workflows/workflow-static-data.service.ts similarity index 98% rename from packages/cli/src/workflows/workflowStaticData.service.ts rename to packages/cli/src/workflows/workflow-static-data.service.ts index 4c981acb87..d9c3564b26 100644 --- a/packages/cli/src/workflows/workflowStaticData.service.ts +++ b/packages/cli/src/workflows/workflow-static-data.service.ts @@ -1,7 +1,7 @@ import { Service } from 'typedi'; import { GlobalConfig } from '@n8n/config'; import { type IDataObject, type Workflow, ErrorReporterProxy as ErrorReporter } from 'n8n-workflow'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import { isWorkflowIdValid } from '@/utils'; diff --git a/packages/cli/src/workflows/workflow.service.ee.ts b/packages/cli/src/workflows/workflow.service.ee.ts index 31029464f6..e3aae3a4e9 100644 --- a/packages/cli/src/workflows/workflow.service.ee.ts +++ b/packages/cli/src/workflows/workflow.service.ee.ts @@ -11,7 +11,7 @@ import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.reposi import { CredentialsService } from '@/credentials/credentials.service'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import type { WorkflowWithSharingsAndCredentials, WorkflowWithSharingsMetaDataAndCredentials, @@ -21,7 +21,7 @@ import { OwnershipService } from '@/services/ownership.service'; import { In, type EntityManager } from '@n8n/typeorm'; import { Project } from '@/databases/entities/Project'; import { ProjectService } from '@/services/project.service'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import { TransferWorkflowError } from '@/errors/response-errors/transfer-workflow.error'; import { SharedWorkflow } from '@/databases/entities/SharedWorkflow'; diff --git a/packages/cli/src/workflows/workflow.service.ts b/packages/cli/src/workflows/workflow.service.ts index 20917e60cb..fb0619726f 100644 --- a/packages/cli/src/workflows/workflow.service.ts +++ b/packages/cli/src/workflows/workflow.service.ts @@ -11,20 +11,20 @@ import type { WorkflowEntity } from '@db/entities/WorkflowEntity'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { WorkflowTagMappingRepository } from '@db/repositories/workflowTagMapping.repository'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; -import * as WorkflowHelpers from '@/WorkflowHelpers'; -import { validateEntity } from '@/GenericHelpers'; -import { ExternalHooks } from '@/ExternalHooks'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; +import * as WorkflowHelpers from '@/workflow-helpers'; +import { validateEntity } from '@/generic-helpers'; +import { ExternalHooks } from '@/external-hooks'; import { hasSharing, type ListQuery } from '@/requests'; import { TagService } from '@/services/tag.service'; import { OwnershipService } from '@/services/ownership.service'; -import { WorkflowHistoryService } from './workflowHistory/workflowHistory.service.ee'; -import { Logger } from '@/Logger'; +import { WorkflowHistoryService } from './workflow-history/workflow-history.service.ee'; +import { Logger } from '@/logger'; import { OrchestrationService } from '@/services/orchestration.service'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { RoleService } from '@/services/role.service'; -import { WorkflowSharingService } from './workflowSharing.service'; +import { WorkflowSharingService } from './workflow-sharing.service'; import { ProjectService } from '@/services/project.service'; import { ExecutionRepository } from '@/databases/repositories/execution.repository'; import type { Scope } from '@n8n/permissions'; diff --git a/packages/cli/src/workflows/workflows.controller.ts b/packages/cli/src/workflows/workflows.controller.ts index 4c03dd9e24..821bddd295 100644 --- a/packages/cli/src/workflows/workflows.controller.ts +++ b/packages/cli/src/workflows/workflows.controller.ts @@ -3,8 +3,8 @@ import { v4 as uuid } from 'uuid'; import axios from 'axios'; import * as Db from '@/Db'; -import * as ResponseHelper from '@/ResponseHelper'; -import * as WorkflowHelpers from '@/WorkflowHelpers'; +import * as ResponseHelper from '@/response-helper'; +import * as WorkflowHelpers from '@/workflow-helpers'; import type { IWorkflowResponse } from '@/Interfaces'; import config from '@/config'; import { Delete, Get, Patch, Post, ProjectScope, Put, RestController } from '@/decorators'; @@ -13,15 +13,15 @@ import { WorkflowEntity } from '@db/entities/WorkflowEntity'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { TagRepository } from '@db/repositories/tag.repository'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; -import { validateEntity } from '@/GenericHelpers'; -import { ExternalHooks } from '@/ExternalHooks'; +import { validateEntity } from '@/generic-helpers'; +import { ExternalHooks } from '@/external-hooks'; import { WorkflowService } from './workflow.service'; -import { License } from '@/License'; +import { License } from '@/license'; import * as utils from '@/utils'; import { listQueryMiddleware } from '@/middlewares'; import { TagService } from '@/services/tag.service'; -import { WorkflowHistoryService } from './workflowHistory/workflowHistory.service.ee'; -import { Logger } from '@/Logger'; +import { WorkflowHistoryService } from './workflow-history/workflow-history.service.ee'; +import { Logger } from '@/logger'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { InternalServerError } from '@/errors/response-errors/internal-server.error'; @@ -31,8 +31,8 @@ import { UserOnboardingService } from '@/services/userOnboarding.service'; import { CredentialsService } from '../credentials/credentials.service'; import { WorkflowRequest } from './workflow.request'; import { EnterpriseWorkflowService } from './workflow.service.ee'; -import { WorkflowExecutionService } from './workflowExecution.service'; -import { UserManagementMailer } from '@/UserManagement/email'; +import { WorkflowExecutionService } from './workflow-execution.service'; +import { UserManagementMailer } from '@/user-management/email'; import { ProjectRepository } from '@/databases/repositories/project.repository'; import { ProjectService } from '@/services/project.service'; import { ApplicationError } from 'n8n-workflow'; diff --git a/packages/cli/test/integration/CredentialsHelper.test.ts b/packages/cli/test/integration/CredentialsHelper.test.ts index 88738c3c26..df6c079960 100644 --- a/packages/cli/test/integration/CredentialsHelper.test.ts +++ b/packages/cli/test/integration/CredentialsHelper.test.ts @@ -1,7 +1,7 @@ import Container from 'typedi'; import * as testDb from '../integration/shared/testDb'; -import { CredentialsHelper } from '@/CredentialsHelper'; +import { CredentialsHelper } from '@/credentials-helper'; import { createOwner, createAdmin, createMember } from './shared/db/users'; import type { User } from '@/databases/entities/User'; import { saveCredential } from './shared/db/credentials'; diff --git a/packages/cli/test/integration/ExternalSecrets/externalSecrets.api.test.ts b/packages/cli/test/integration/ExternalSecrets/externalSecrets.api.test.ts index 190ab437fa..f6f448bf16 100644 --- a/packages/cli/test/integration/ExternalSecrets/externalSecrets.api.test.ts +++ b/packages/cli/test/integration/ExternalSecrets/externalSecrets.api.test.ts @@ -3,12 +3,12 @@ import { Cipher } from 'n8n-core'; import { jsonParse, type IDataObject } from 'n8n-workflow'; import { mock } from 'jest-mock-extended'; -import { License } from '@/License'; +import { License } from '@/license'; import type { ExternalSecretsSettings, SecretsProviderState } from '@/Interfaces'; import { SettingsRepository } from '@db/repositories/settings.repository'; -import { ExternalSecretsProviders } from '@/ExternalSecrets/ExternalSecretsProviders.ee'; +import { ExternalSecretsProviders } from '@/external-secrets/external-secrets-providers.ee'; import config from '@/config'; -import { ExternalSecretsManager } from '@/ExternalSecrets/ExternalSecretsManager.ee'; +import { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee'; import { CREDENTIAL_BLANKING_VALUE } from '@/constants'; import { mockInstance } from '../../shared/mocking'; diff --git a/packages/cli/test/integration/activation-errors.service.test.ts b/packages/cli/test/integration/activation-errors.service.test.ts index 5d56f0dc90..37dfcc2e08 100644 --- a/packages/cli/test/integration/activation-errors.service.test.ts +++ b/packages/cli/test/integration/activation-errors.service.test.ts @@ -1,4 +1,4 @@ -import { ActivationErrorsService } from '@/ActivationErrors.service'; +import { ActivationErrorsService } from '@/activation-errors.service'; import { CacheService } from '@/services/cache/cache.service'; import { GlobalConfig } from '@n8n/config'; import { mockInstance } from '@test/mocking'; diff --git a/packages/cli/test/integration/active-workflow-manager.test.ts b/packages/cli/test/integration/active-workflow-manager.test.ts index de586b643a..39d6c3b272 100644 --- a/packages/cli/test/integration/active-workflow-manager.test.ts +++ b/packages/cli/test/integration/active-workflow-manager.test.ts @@ -3,16 +3,16 @@ import { mock } from 'jest-mock-extended'; import { NodeApiError, NodeOperationError, Workflow } from 'n8n-workflow'; import type { IWebhookData, WorkflowActivateMode } from 'n8n-workflow'; -import { ActiveExecutions } from '@/ActiveExecutions'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; -import { ExternalHooks } from '@/ExternalHooks'; +import { ActiveExecutions } from '@/active-executions'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; +import { ExternalHooks } from '@/external-hooks'; import { Push } from '@/push'; -import { SecretsHelper } from '@/SecretsHelpers'; +import { SecretsHelper } from '@/secrets-helpers'; import { WebhookService } from '@/webhooks/webhook.service'; -import * as WebhookHelpers from '@/webhooks/WebhookHelpers'; -import * as AdditionalData from '@/WorkflowExecuteAdditionalData'; +import * as WebhookHelpers from '@/webhooks/webhook-helpers'; +import * as AdditionalData from '@/workflow-execute-additional-data'; import type { WebhookEntity } from '@db/entities/WebhookEntity'; -import { NodeTypes } from '@/NodeTypes'; +import { NodeTypes } from '@/node-types'; import { ExecutionService } from '@/executions/execution.service'; import { WorkflowService } from '@/workflows/workflow.service'; @@ -20,7 +20,7 @@ import { mockInstance } from '../shared/mocking'; import * as testDb from './shared/testDb'; import { createOwner } from './shared/db/users'; import { createWorkflow } from './shared/db/workflows'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import type { WorkflowEntity } from '@/databases/entities/WorkflowEntity'; mockInstance(ActiveExecutions); diff --git a/packages/cli/test/integration/auth.api.test.ts b/packages/cli/test/integration/auth.api.test.ts index 887cba4a04..d56a1004ed 100644 --- a/packages/cli/test/integration/auth.api.test.ts +++ b/packages/cli/test/integration/auth.api.test.ts @@ -5,7 +5,7 @@ import config from '@/config'; import { AUTH_COOKIE_NAME } from '@/constants'; import type { User } from '@db/entities/User'; import { UserRepository } from '@db/repositories/user.repository'; -import { MfaService } from '@/Mfa/mfa.service'; +import { MfaService } from '@/mfa/mfa.service'; import { LOGGED_OUT_RESPONSE_BODY } from './shared/constants'; import { randomValidPassword } from './shared/random'; diff --git a/packages/cli/test/integration/auth.mw.test.ts b/packages/cli/test/integration/auth.mw.test.ts index b4a47667fe..262bea38fe 100644 --- a/packages/cli/test/integration/auth.mw.test.ts +++ b/packages/cli/test/integration/auth.mw.test.ts @@ -1,4 +1,4 @@ -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import * as utils from './shared/utils/'; import { createUser } from './shared/db/users'; diff --git a/packages/cli/test/integration/commands/credentials.cmd.test.ts b/packages/cli/test/integration/commands/credentials.cmd.test.ts index bcb6f0173b..61b4169712 100644 --- a/packages/cli/test/integration/commands/credentials.cmd.test.ts +++ b/packages/cli/test/integration/commands/credentials.cmd.test.ts @@ -1,7 +1,7 @@ import { nanoid } from 'nanoid'; import { ImportCredentialsCommand } from '@/commands/import/credentials'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { setupTestCommand } from '@test-integration/utils/testCommand'; import { mockInstance } from '../../shared/mocking'; diff --git a/packages/cli/test/integration/commands/import.cmd.test.ts b/packages/cli/test/integration/commands/import.cmd.test.ts index ba72d64d77..7a000ca9c6 100644 --- a/packages/cli/test/integration/commands/import.cmd.test.ts +++ b/packages/cli/test/integration/commands/import.cmd.test.ts @@ -1,7 +1,7 @@ import { nanoid } from 'nanoid'; import { ImportWorkflowsCommand } from '@/commands/import/workflow'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { setupTestCommand } from '@test-integration/utils/testCommand'; import { mockInstance } from '../../shared/mocking'; diff --git a/packages/cli/test/integration/commands/ldap/reset.test.ts b/packages/cli/test/integration/commands/ldap/reset.test.ts index 720c98c401..52350733ca 100644 --- a/packages/cli/test/integration/commands/ldap/reset.test.ts +++ b/packages/cli/test/integration/commands/ldap/reset.test.ts @@ -3,13 +3,13 @@ import { v4 as uuid } from 'uuid'; import { EntityNotFoundError } from '@n8n/typeorm'; import { Reset } from '@/commands/ldap/reset'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import { CredentialsRepository } from '@db/repositories/credentials.repository'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { SharedCredentialsRepository } from '@db/repositories/sharedCredentials.repository'; -import { getLdapSynchronizations, saveLdapSynchronization } from '@/Ldap/helpers.ee'; -import { LdapService } from '@/Ldap/ldap.service.ee'; +import { getLdapSynchronizations, saveLdapSynchronization } from '@/ldap/helpers.ee'; +import { LdapService } from '@/ldap/ldap.service.ee'; import { Push } from '@/push'; import { Telemetry } from '@/telemetry'; diff --git a/packages/cli/test/integration/commands/license.cmd.test.ts b/packages/cli/test/integration/commands/license.cmd.test.ts index 1717e1a5ff..bdca192201 100644 --- a/packages/cli/test/integration/commands/license.cmd.test.ts +++ b/packages/cli/test/integration/commands/license.cmd.test.ts @@ -1,5 +1,5 @@ -import { License } from '@/License'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { License } from '@/license'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { ClearLicenseCommand } from '@/commands/license/clear'; import { setupTestCommand } from '@test-integration/utils/testCommand'; diff --git a/packages/cli/test/integration/commands/reset.cmd.test.ts b/packages/cli/test/integration/commands/reset.cmd.test.ts index 573e85043e..73bb7877fe 100644 --- a/packages/cli/test/integration/commands/reset.cmd.test.ts +++ b/packages/cli/test/integration/commands/reset.cmd.test.ts @@ -1,8 +1,8 @@ import { Container } from 'typedi'; import { Reset } from '@/commands/user-management/reset'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; -import { NodeTypes } from '@/NodeTypes'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; +import { NodeTypes } from '@/node-types'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { SharedCredentialsRepository } from '@db/repositories/sharedCredentials.repository'; import { CredentialsRepository } from '@db/repositories/credentials.repository'; diff --git a/packages/cli/test/integration/commands/update/workflow.test.ts b/packages/cli/test/integration/commands/update/workflow.test.ts index 95a25bc4f6..1119536a8a 100644 --- a/packages/cli/test/integration/commands/update/workflow.test.ts +++ b/packages/cli/test/integration/commands/update/workflow.test.ts @@ -1,4 +1,4 @@ -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { UpdateWorkflowCommand } from '@/commands/update/workflow'; import { setupTestCommand } from '@test-integration/utils/testCommand'; diff --git a/packages/cli/test/integration/commands/worker.cmd.test.ts b/packages/cli/test/integration/commands/worker.cmd.test.ts index e7f783bf94..aad419d23b 100644 --- a/packages/cli/test/integration/commands/worker.cmd.test.ts +++ b/packages/cli/test/integration/commands/worker.cmd.test.ts @@ -2,13 +2,13 @@ import { BinaryDataService } from 'n8n-core'; import { Worker } from '@/commands/worker'; import config from '@/config'; -import { ExternalSecretsManager } from '@/ExternalSecrets/ExternalSecretsManager.ee'; +import { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { OrchestrationHandlerWorkerService } from '@/services/orchestration/worker/orchestration.handler.worker.service'; import { OrchestrationWorkerService } from '@/services/orchestration/worker/orchestration.worker.service'; -import { License } from '@/License'; -import { ExternalHooks } from '@/ExternalHooks'; +import { License } from '@/license'; +import { ExternalHooks } from '@/external-hooks'; import { ScalingService } from '@/scaling/scaling.service'; import { setupTestCommand } from '@test-integration/utils/testCommand'; diff --git a/packages/cli/test/integration/community-packages.api.test.ts b/packages/cli/test/integration/community-packages.api.test.ts index 46c7efad03..ff935a2c5b 100644 --- a/packages/cli/test/integration/community-packages.api.test.ts +++ b/packages/cli/test/integration/community-packages.api.test.ts @@ -2,7 +2,7 @@ import path from 'path'; import type { InstalledPackages } from '@db/entities/InstalledPackages'; import type { InstalledNodes } from '@db/entities/InstalledNodes'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { CommunityPackagesService } from '@/services/communityPackages.service'; import { mockInstance } from '../shared/mocking'; diff --git a/packages/cli/test/integration/controllers/dynamic-node-parameters.controller.test.ts b/packages/cli/test/integration/controllers/dynamic-node-parameters.controller.test.ts index fd66cbf5fd..6488fb3450 100644 --- a/packages/cli/test/integration/controllers/dynamic-node-parameters.controller.test.ts +++ b/packages/cli/test/integration/controllers/dynamic-node-parameters.controller.test.ts @@ -6,7 +6,7 @@ import type { import { mock } from 'jest-mock-extended'; import { DynamicNodeParametersService } from '@/services/dynamicNodeParameters.service'; -import * as AdditionalData from '@/WorkflowExecuteAdditionalData'; +import * as AdditionalData from '@/workflow-execute-additional-data'; import { createOwner } from '../shared/db/users'; import { setupTestServer } from '../shared/utils'; diff --git a/packages/cli/test/integration/controllers/invitation/invitation.controller.integration.test.ts b/packages/cli/test/integration/controllers/invitation/invitation.controller.integration.test.ts index 8b1048267d..3f7e55f866 100644 --- a/packages/cli/test/integration/controllers/invitation/invitation.controller.integration.test.ts +++ b/packages/cli/test/integration/controllers/invitation/invitation.controller.integration.test.ts @@ -1,8 +1,8 @@ import Container from 'typedi'; import { Not } from '@n8n/typeorm'; import { EventService } from '@/events/event.service'; -import { ExternalHooks } from '@/ExternalHooks'; -import { UserManagementMailer } from '@/UserManagement/email'; +import { ExternalHooks } from '@/external-hooks'; +import { UserManagementMailer } from '@/user-management/email'; import { UserRepository } from '@/databases/repositories/user.repository'; import { PasswordUtility } from '@/services/password.utility'; diff --git a/packages/cli/test/integration/controllers/oauth/oauth2.api.test.ts b/packages/cli/test/integration/controllers/oauth/oauth2.api.test.ts index 970727c2c8..46ce3b89a9 100644 --- a/packages/cli/test/integration/controllers/oauth/oauth2.api.test.ts +++ b/packages/cli/test/integration/controllers/oauth/oauth2.api.test.ts @@ -5,7 +5,7 @@ import { parse as parseQs } from 'querystring'; import type { CredentialsEntity } from '@db/entities/CredentialsEntity'; import type { User } from '@db/entities/User'; -import { CredentialsHelper } from '@/CredentialsHelper'; +import { CredentialsHelper } from '@/credentials-helper'; import { OAuth2CredentialController } from '@/controllers/oauth/oAuth2Credential.controller'; import { createOwner } from '@test-integration/db/users'; 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 6b74dd843c..18f45a518b 100644 --- a/packages/cli/test/integration/credentials/credentials.api.ee.test.ts +++ b/packages/cli/test/integration/credentials/credentials.api.ee.test.ts @@ -8,7 +8,7 @@ import { SharedCredentialsRepository } from '@db/repositories/sharedCredentials. import { ProjectRepository } from '@db/repositories/project.repository'; import type { Project } from '@db/entities/Project'; import { ProjectService } from '@/services/project.service'; -import { UserManagementMailer } from '@/UserManagement/email'; +import { UserManagementMailer } from '@/user-management/email'; import { randomCredentialPayload } from '../shared/random'; import * as testDb from '../shared/testDb'; diff --git a/packages/cli/test/integration/debug.controller.test.ts b/packages/cli/test/integration/debug.controller.test.ts index c44a4fd477..a85eb57705 100644 --- a/packages/cli/test/integration/debug.controller.test.ts +++ b/packages/cli/test/integration/debug.controller.test.ts @@ -1,5 +1,5 @@ import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import { generateNanoId } from '@/databases/utils/generators'; import type { WorkflowEntity } from '@/databases/entities/WorkflowEntity'; import { OrchestrationService } from '@/services/orchestration.service'; diff --git a/packages/cli/test/integration/executions.controller.test.ts b/packages/cli/test/integration/executions.controller.test.ts index 94faa32351..4c20f7244c 100644 --- a/packages/cli/test/integration/executions.controller.test.ts +++ b/packages/cli/test/integration/executions.controller.test.ts @@ -8,7 +8,7 @@ import { setupTestServer } from './shared/utils'; import { mockInstance } from '../shared/mocking'; import { ConcurrencyControlService } from '@/concurrency/concurrency-control.service'; -import { WaitTracker } from '@/WaitTracker'; +import { WaitTracker } from '@/wait-tracker'; import { createTeamProject, linkUserToProject } from './shared/db/projects'; mockInstance(WaitTracker); diff --git a/packages/cli/test/integration/ldap/ldap.api.test.ts b/packages/cli/test/integration/ldap/ldap.api.test.ts index 25dbbd3b9d..e3805674f3 100644 --- a/packages/cli/test/integration/ldap/ldap.api.test.ts +++ b/packages/cli/test/integration/ldap/ldap.api.test.ts @@ -7,10 +7,10 @@ import config from '@/config'; import type { User } from '@db/entities/User'; import { UserRepository } from '@db/repositories/user.repository'; import { AuthProviderSyncHistoryRepository } from '@db/repositories/authProviderSyncHistory.repository'; -import { LDAP_DEFAULT_CONFIGURATION } from '@/Ldap/constants'; -import { LdapService } from '@/Ldap/ldap.service.ee'; -import { saveLdapSynchronization } from '@/Ldap/helpers.ee'; -import { getCurrentAuthenticationMethod, setCurrentAuthenticationMethod } from '@/sso/ssoHelpers'; +import { LDAP_DEFAULT_CONFIGURATION } from '@/ldap/constants'; +import { LdapService } from '@/ldap/ldap.service.ee'; +import { saveLdapSynchronization } from '@/ldap/helpers.ee'; +import { getCurrentAuthenticationMethod, setCurrentAuthenticationMethod } from '@/sso/sso-helpers'; import { randomEmail, randomName, uniqueId } from './../shared/random'; import * as testDb from './../shared/testDb'; diff --git a/packages/cli/test/integration/license.api.test.ts b/packages/cli/test/integration/license.api.test.ts index d5e434b3c8..1428de8663 100644 --- a/packages/cli/test/integration/license.api.test.ts +++ b/packages/cli/test/integration/license.api.test.ts @@ -3,7 +3,7 @@ import config from '@/config'; import { RESPONSE_ERROR_MESSAGES } from '@/constants'; import type { User } from '@db/entities/User'; import type { ILicensePostResponse, ILicenseReadResponse } from '@/Interfaces'; -import { License } from '@/License'; +import { License } from '@/license'; import * as testDb from './shared/testDb'; import * as utils from './shared/utils/'; diff --git a/packages/cli/test/integration/mfa/mfa.api.test.ts b/packages/cli/test/integration/mfa/mfa.api.test.ts index 792ad1cb88..7bfdc01477 100644 --- a/packages/cli/test/integration/mfa/mfa.api.test.ts +++ b/packages/cli/test/integration/mfa/mfa.api.test.ts @@ -5,7 +5,7 @@ import { AuthService } from '@/auth/auth.service'; import config from '@/config'; import type { User } from '@db/entities/User'; import { AuthUserRepository } from '@db/repositories/authUser.repository'; -import { TOTPService } from '@/Mfa/totp.service'; +import { TOTPService } from '@/mfa/totp.service'; import * as testDb from '../shared/testDb'; import * as utils from '../shared/utils'; diff --git a/packages/cli/test/integration/middlewares/bodyParser.test.ts b/packages/cli/test/integration/middlewares/bodyParser.test.ts index d17c3fcb11..00163e05bb 100644 --- a/packages/cli/test/integration/middlewares/bodyParser.test.ts +++ b/packages/cli/test/integration/middlewares/bodyParser.test.ts @@ -2,7 +2,7 @@ import { createServer } from 'http'; import { gzipSync, deflateSync } from 'zlib'; import type { Request, Response } from 'express'; import request from 'supertest'; -import { rawBodyReader, bodyParser } from '@/middlewares/bodyParser'; +import { rawBodyReader, bodyParser } from '@/middlewares/body-parser'; describe('bodyParser', () => { const server = createServer((req: Request, res: Response) => { diff --git a/packages/cli/test/integration/passwordReset.api.test.ts b/packages/cli/test/integration/passwordReset.api.test.ts index 3b46fd476f..bfc5c2b35e 100644 --- a/packages/cli/test/integration/passwordReset.api.test.ts +++ b/packages/cli/test/integration/passwordReset.api.test.ts @@ -5,13 +5,13 @@ import { mock } from 'jest-mock-extended'; import { randomString } from 'n8n-workflow'; import { AuthService } from '@/auth/auth.service'; -import { License } from '@/License'; +import { License } from '@/license'; import config from '@/config'; import type { User } from '@db/entities/User'; -import { setCurrentAuthenticationMethod } from '@/sso/ssoHelpers'; -import { ExternalHooks } from '@/ExternalHooks'; +import { setCurrentAuthenticationMethod } from '@/sso/sso-helpers'; +import { ExternalHooks } from '@/external-hooks'; import { JwtService } from '@/services/jwt.service'; -import { UserManagementMailer } from '@/UserManagement/email'; +import { UserManagementMailer } from '@/user-management/email'; import { UserRepository } from '@db/repositories/user.repository'; import { PasswordUtility } from '@/services/password.utility'; diff --git a/packages/cli/test/integration/PermissionChecker.test.ts b/packages/cli/test/integration/permission-checker.test.ts similarity index 92% rename from packages/cli/test/integration/PermissionChecker.test.ts rename to packages/cli/test/integration/permission-checker.test.ts index ff10d04974..f35603a1b6 100644 --- a/packages/cli/test/integration/PermissionChecker.test.ts +++ b/packages/cli/test/integration/permission-checker.test.ts @@ -5,17 +5,17 @@ import { randomInt } from 'n8n-workflow'; import type { User } from '@db/entities/User'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; -import { NodeTypes } from '@/NodeTypes'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; +import { NodeTypes } from '@/node-types'; import { OwnershipService } from '@/services/ownership.service'; -import { PermissionChecker } from '@/UserManagement/PermissionChecker'; +import { PermissionChecker } from '@/user-management/permission-checker'; import { mockInstance } from '../shared/mocking'; -import { randomCredentialPayload as randomCred } from '../integration/shared/random'; -import * as testDb from '../integration/shared/testDb'; -import type { SaveCredentialFunction } from '../integration/shared/types'; -import { affixRoleToSaveCredential } from '../integration/shared/db/credentials'; -import { createOwner, createUser } from '../integration/shared/db/users'; +import { randomCredentialPayload as randomCred } from './shared/random'; +import * as testDb from './shared/testDb'; +import type { SaveCredentialFunction } from './shared/types'; +import { affixRoleToSaveCredential } from './shared/db/credentials'; +import { createOwner, createUser } from './shared/db/users'; import { SharedCredentialsRepository } from '@/databases/repositories/sharedCredentials.repository'; import { getPersonalProject } from './shared/db/projects'; import type { WorkflowEntity } from '@/databases/entities/WorkflowEntity'; diff --git a/packages/cli/test/integration/project.api.test.ts b/packages/cli/test/integration/project.api.test.ts index 0d24912710..4fb7f08a02 100644 --- a/packages/cli/test/integration/project.api.test.ts +++ b/packages/cli/test/integration/project.api.test.ts @@ -27,7 +27,7 @@ import type { GlobalRole } from '@/databases/entities/User'; import type { Scope } from '@n8n/permissions'; import { CacheService } from '@/services/cache/cache.service'; import { mockInstance } from '../shared/mocking'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import { ProjectRepository } from '@/databases/repositories/project.repository'; import { RoleService } from '@/services/role.service'; diff --git a/packages/cli/test/integration/pruning.service.test.ts b/packages/cli/test/integration/pruning.service.test.ts index 37d218c09d..f5deabf756 100644 --- a/packages/cli/test/integration/pruning.service.test.ts +++ b/packages/cli/test/integration/pruning.service.test.ts @@ -9,7 +9,7 @@ import type { WorkflowEntity } from '@db/entities/WorkflowEntity'; import { ExecutionRepository } from '@db/repositories/execution.repository'; import { TIME } from '@/constants'; import { PruningService } from '@/services/pruning.service'; -import { Logger } from '@/Logger'; +import { Logger } from '@/logger'; import { mockInstance } from '../shared/mocking'; import { createWorkflow } from './shared/db/workflows'; diff --git a/packages/cli/test/integration/publicApi/executions.test.ts b/packages/cli/test/integration/publicApi/executions.test.ts index 8dac97fc22..9994dc8a85 100644 --- a/packages/cli/test/integration/publicApi/executions.test.ts +++ b/packages/cli/test/integration/publicApi/executions.test.ts @@ -1,5 +1,5 @@ import type { User } from '@db/entities/User'; -import type { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import type { ActiveWorkflowManager } from '@/active-workflow-manager'; import { randomApiKey } from '../shared/random'; import * as utils from '../shared/utils/'; diff --git a/packages/cli/test/integration/publicApi/users.ee.test.ts b/packages/cli/test/integration/publicApi/users.ee.test.ts index be23d8f45a..4874fab4f5 100644 --- a/packages/cli/test/integration/publicApi/users.ee.test.ts +++ b/packages/cli/test/integration/publicApi/users.ee.test.ts @@ -1,7 +1,7 @@ import validator from 'validator'; import { v4 as uuid } from 'uuid'; -import { License } from '@/License'; +import { License } from '@/license'; import { mockInstance } from '../../shared/mocking'; import { randomApiKey } from '../shared/random'; diff --git a/packages/cli/test/integration/publicApi/workflows.test.ts b/packages/cli/test/integration/publicApi/workflows.test.ts index 5185f3862d..66736aa03d 100644 --- a/packages/cli/test/integration/publicApi/workflows.test.ts +++ b/packages/cli/test/integration/publicApi/workflows.test.ts @@ -9,7 +9,7 @@ import type { Project } from '@db/entities/Project'; import { ProjectRepository } from '@db/repositories/project.repository'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { WorkflowHistoryRepository } from '@db/repositories/workflowHistory.repository'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import { ExecutionService } from '@/executions/execution.service'; import { randomApiKey } from '../shared/random'; diff --git a/packages/cli/test/integration/saml/saml.api.test.ts b/packages/cli/test/integration/saml/saml.api.test.ts index 23dc49607f..eef02fcfe2 100644 --- a/packages/cli/test/integration/saml/saml.api.test.ts +++ b/packages/cli/test/integration/saml/saml.api.test.ts @@ -1,6 +1,6 @@ import type { User } from '@db/entities/User'; -import { setSamlLoginEnabled } from '@/sso/saml/samlHelpers'; -import { getCurrentAuthenticationMethod, setCurrentAuthenticationMethod } from '@/sso/ssoHelpers'; +import { setSamlLoginEnabled } from '@/sso/saml/saml-helpers'; +import { getCurrentAuthenticationMethod, setCurrentAuthenticationMethod } from '@/sso/sso-helpers'; import { randomEmail, randomName, randomValidPassword } from '../shared/random'; import * as utils from '../shared/utils/'; diff --git a/packages/cli/test/integration/saml/samlHelpers.test.ts b/packages/cli/test/integration/saml/samlHelpers.test.ts index 7941efada1..ac43f57a1b 100644 --- a/packages/cli/test/integration/saml/samlHelpers.test.ts +++ b/packages/cli/test/integration/saml/samlHelpers.test.ts @@ -1,5 +1,5 @@ -import * as helpers from '@/sso/saml/samlHelpers'; -import type { SamlUserAttributes } from '@/sso/saml/types/samlUserAttributes'; +import * as helpers from '@/sso/saml/saml-helpers'; +import type { SamlUserAttributes } from '@/sso/saml/types/saml-user-attributes'; import { getPersonalProject } from '../../integration/shared/db/projects'; import * as testDb from '../shared/testDb'; diff --git a/packages/cli/test/integration/security-audit/CredentialsRiskReporter.test.ts b/packages/cli/test/integration/security-audit/CredentialsRiskReporter.test.ts index 4fdc54dbc1..bd9cd124ed 100644 --- a/packages/cli/test/integration/security-audit/CredentialsRiskReporter.test.ts +++ b/packages/cli/test/integration/security-audit/CredentialsRiskReporter.test.ts @@ -1,6 +1,6 @@ import { v4 as uuid } from 'uuid'; import config from '@/config'; -import { SecurityAuditService } from '@/security-audit/SecurityAudit.service'; +import { SecurityAuditService } from '@/security-audit/security-audit.service'; import { CREDENTIALS_REPORT } from '@/security-audit/constants'; import { getRiskSection } from './utils'; import * as testDb from '../shared/testDb'; diff --git a/packages/cli/test/integration/security-audit/DatabaseRiskReporter.test.ts b/packages/cli/test/integration/security-audit/DatabaseRiskReporter.test.ts index e7ae638d97..bfa8ff0aaf 100644 --- a/packages/cli/test/integration/security-audit/DatabaseRiskReporter.test.ts +++ b/packages/cli/test/integration/security-audit/DatabaseRiskReporter.test.ts @@ -1,5 +1,5 @@ import { v4 as uuid } from 'uuid'; -import { SecurityAuditService } from '@/security-audit/SecurityAudit.service'; +import { SecurityAuditService } from '@/security-audit/security-audit.service'; import { DATABASE_REPORT, SQL_NODE_TYPES, diff --git a/packages/cli/test/integration/security-audit/FilesystemRiskReporter.test.ts b/packages/cli/test/integration/security-audit/FilesystemRiskReporter.test.ts index f6d8537c0d..5ec1f0c4d4 100644 --- a/packages/cli/test/integration/security-audit/FilesystemRiskReporter.test.ts +++ b/packages/cli/test/integration/security-audit/FilesystemRiskReporter.test.ts @@ -1,5 +1,5 @@ import { v4 as uuid } from 'uuid'; -import { SecurityAuditService } from '@/security-audit/SecurityAudit.service'; +import { SecurityAuditService } from '@/security-audit/security-audit.service'; import { FILESYSTEM_INTERACTION_NODE_TYPES, FILESYSTEM_REPORT } from '@/security-audit/constants'; import { getRiskSection, saveManualTriggerWorkflow } from './utils'; import * as testDb from '../shared/testDb'; diff --git a/packages/cli/test/integration/security-audit/InstanceRiskReporter.test.ts b/packages/cli/test/integration/security-audit/InstanceRiskReporter.test.ts index 5f59206426..d6dc020d4f 100644 --- a/packages/cli/test/integration/security-audit/InstanceRiskReporter.test.ts +++ b/packages/cli/test/integration/security-audit/InstanceRiskReporter.test.ts @@ -1,5 +1,5 @@ import { v4 as uuid } from 'uuid'; -import { SecurityAuditService } from '@/security-audit/SecurityAudit.service'; +import { SecurityAuditService } from '@/security-audit/security-audit.service'; import { INSTANCE_REPORT, WEBHOOK_VALIDATOR_NODE_TYPES } from '@/security-audit/constants'; import { getRiskSection, diff --git a/packages/cli/test/integration/security-audit/NodesRiskReporter.test.ts b/packages/cli/test/integration/security-audit/NodesRiskReporter.test.ts index 03386bef00..e61027b356 100644 --- a/packages/cli/test/integration/security-audit/NodesRiskReporter.test.ts +++ b/packages/cli/test/integration/security-audit/NodesRiskReporter.test.ts @@ -1,10 +1,10 @@ import { v4 as uuid } from 'uuid'; import { Container } from 'typedi'; -import { SecurityAuditService } from '@/security-audit/SecurityAudit.service'; +import { SecurityAuditService } from '@/security-audit/security-audit.service'; import { OFFICIAL_RISKY_NODE_TYPES, NODES_REPORT } from '@/security-audit/constants'; import { toReportTitle } from '@/security-audit/utils'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; -import { NodeTypes } from '@/NodeTypes'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; +import { NodeTypes } from '@/node-types'; import { CommunityPackagesService } from '@/services/communityPackages.service'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; diff --git a/packages/cli/test/integration/services/workflowStaticData.service.test.ts b/packages/cli/test/integration/services/workflowStaticData.service.test.ts index 353639bcc2..0ce2665001 100644 --- a/packages/cli/test/integration/services/workflowStaticData.service.test.ts +++ b/packages/cli/test/integration/services/workflowStaticData.service.test.ts @@ -1,10 +1,10 @@ -import { WorkflowStaticDataService } from '@/workflows/workflowStaticData.service'; +import { WorkflowStaticDataService } from '@/workflows/workflow-static-data.service'; import * as testDb from '@test-integration/testDb'; import Container from 'typedi'; import { createWorkflow } from '@test-integration/db/workflows'; import { Workflow } from 'n8n-workflow'; import { mockInstance } from '@test/mocking'; -import { NodeTypes } from '@/NodeTypes'; +import { NodeTypes } from '@/node-types'; import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; const nodeTypes = mockInstance(NodeTypes); diff --git a/packages/cli/test/integration/shared/db/credentials.ts b/packages/cli/test/integration/shared/db/credentials.ts index 588fee6b51..4aedb09324 100644 --- a/packages/cli/test/integration/shared/db/credentials.ts +++ b/packages/cli/test/integration/shared/db/credentials.ts @@ -12,7 +12,7 @@ import type { Project } from '@/databases/entities/Project'; export async function encryptCredentialData( credential: CredentialsEntity, ): Promise { - const { createCredentialsFromCredentialsEntity } = await import('@/CredentialsHelper'); + const { createCredentialsFromCredentialsEntity } = await import('@/credentials-helper'); const coreCredential = createCredentialsFromCredentialsEntity(credential, true); // @ts-ignore diff --git a/packages/cli/test/integration/shared/db/users.ts b/packages/cli/test/integration/shared/db/users.ts index 98626bc549..a939ce7b74 100644 --- a/packages/cli/test/integration/shared/db/users.ts +++ b/packages/cli/test/integration/shared/db/users.ts @@ -4,8 +4,8 @@ import { AuthIdentity } from '@db/entities/AuthIdentity'; import { type GlobalRole, type User } from '@db/entities/User'; import { AuthIdentityRepository } from '@db/repositories/authIdentity.repository'; import { UserRepository } from '@db/repositories/user.repository'; -import { TOTPService } from '@/Mfa/totp.service'; -import { MfaService } from '@/Mfa/mfa.service'; +import { TOTPService } from '@/mfa/totp.service'; +import { MfaService } from '@/mfa/mfa.service'; import { randomApiKey, randomEmail, randomName, randomValidPassword } from '../random'; import { AuthUserRepository } from '@/databases/repositories/authUser.repository'; diff --git a/packages/cli/test/integration/shared/ldap.ts b/packages/cli/test/integration/shared/ldap.ts index 1223bd0f07..147b01f4c6 100644 --- a/packages/cli/test/integration/shared/ldap.ts +++ b/packages/cli/test/integration/shared/ldap.ts @@ -1,5 +1,5 @@ -import { LDAP_DEFAULT_CONFIGURATION, LDAP_FEATURE_NAME } from '@/Ldap/constants'; -import type { LdapConfig } from '@/Ldap/types'; +import { LDAP_DEFAULT_CONFIGURATION, LDAP_FEATURE_NAME } from '@/ldap/constants'; +import type { LdapConfig } from '@/ldap/types'; import { SettingsRepository } from '@/databases/repositories/settings.repository'; import { jsonParse } from 'n8n-workflow'; import Container from 'typedi'; diff --git a/packages/cli/test/integration/shared/license.ts b/packages/cli/test/integration/shared/license.ts index 3f9e736153..701cc36eab 100644 --- a/packages/cli/test/integration/shared/license.ts +++ b/packages/cli/test/integration/shared/license.ts @@ -1,5 +1,5 @@ import type { BooleanLicenseFeature, NumericLicenseFeature } from '@/Interfaces'; -import type { License } from '@/License'; +import type { License } from '@/license'; export interface LicenseMockDefaults { features?: BooleanLicenseFeature[]; diff --git a/packages/cli/test/integration/shared/utils/index.ts b/packages/cli/test/integration/shared/utils/index.ts index 7abdb1a8e8..329b9d7b8a 100644 --- a/packages/cli/test/integration/shared/utils/index.ts +++ b/packages/cli/test/integration/shared/utils/index.ts @@ -14,7 +14,7 @@ import { WorkflowEntity } from '@db/entities/WorkflowEntity'; import { SettingsRepository } from '@db/repositories/settings.repository'; import { AUTH_COOKIE_NAME } from '@/constants'; import { ExecutionService } from '@/executions/execution.service'; -import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials'; +import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { Push } from '@/push'; import { OrchestrationService } from '@/services/orchestration.service'; @@ -37,7 +37,7 @@ export async function initActiveWorkflowManager() { mockInstance(Push); mockInstance(ExecutionService); - const { ActiveWorkflowManager } = await import('@/ActiveWorkflowManager'); + const { ActiveWorkflowManager } = await import('@/active-workflow-manager'); const activeWorkflowManager = Container.get(ActiveWorkflowManager); await activeWorkflowManager.init(); return activeWorkflowManager; diff --git a/packages/cli/test/integration/shared/utils/testCommand.ts b/packages/cli/test/integration/shared/utils/testCommand.ts index 9592b806c3..4e796316bb 100644 --- a/packages/cli/test/integration/shared/utils/testCommand.ts +++ b/packages/cli/test/integration/shared/utils/testCommand.ts @@ -2,11 +2,11 @@ import type { Config } from '@oclif/core'; import type { Class } from 'n8n-core'; import { mock } from 'jest-mock-extended'; -import type { BaseCommand } from '@/commands/BaseCommand'; +import type { BaseCommand } from '@/commands/base-command'; import * as testDb from '../testDb'; import { TelemetryEventRelay } from '@/events/telemetry-event-relay'; import { mockInstance } from '@test/mocking'; -import { InternalHooks } from '@/InternalHooks'; +import { InternalHooks } from '@/internal-hooks'; mockInstance(InternalHooks); diff --git a/packages/cli/test/integration/shared/utils/testServer.ts b/packages/cli/test/integration/shared/utils/testServer.ts index 319c4e2b58..c40285829e 100644 --- a/packages/cli/test/integration/shared/utils/testServer.ts +++ b/packages/cli/test/integration/shared/utils/testServer.ts @@ -12,8 +12,8 @@ import { ControllerRegistry } from '@/decorators'; import { rawBodyReader, bodyParser } from '@/middlewares'; import { PostHogClient } from '@/posthog'; import { Push } from '@/push'; -import { License } from '@/License'; -import { Logger } from '@/Logger'; +import { License } from '@/license'; +import { Logger } from '@/logger'; import { AuthService } from '@/auth/auth.service'; import type { APIRequest } from '@/requests'; @@ -166,14 +166,14 @@ export const setupTestServer = ({ break; case 'ldap': - const { LdapService } = await import('@/Ldap/ldap.service.ee'); - await import('@/Ldap/ldap.controller.ee'); + const { LdapService } = await import('@/ldap/ldap.service.ee'); + await import('@/ldap/ldap.controller.ee'); testServer.license.enable('feat:ldap'); await Container.get(LdapService).init(); break; case 'saml': - const { setSamlLoginEnabled } = await import('@/sso/saml/samlHelpers'); + const { setSamlLoginEnabled } = await import('@/sso/saml/saml-helpers'); await import('@/sso/saml/routes/saml.controller.ee'); await setSamlLoginEnabled(true); break; @@ -211,11 +211,11 @@ export const setupTestServer = ({ break; case 'externalSecrets': - await import('@/ExternalSecrets/ExternalSecrets.controller.ee'); + await import('@/external-secrets/external-secrets.controller.ee'); break; case 'workflowHistory': - await import('@/workflows/workflowHistory/workflowHistory.controller.ee'); + await import('@/workflows/workflow-history/workflow-history.controller.ee'); break; case 'binaryData': diff --git a/packages/cli/test/integration/webhooks.api.test.ts b/packages/cli/test/integration/webhooks.api.test.ts index 5b61dd9861..630fe7350e 100644 --- a/packages/cli/test/integration/webhooks.api.test.ts +++ b/packages/cli/test/integration/webhooks.api.test.ts @@ -2,9 +2,9 @@ import { readFileSync } from 'fs'; import { agent as testAgent } from 'supertest'; import type { INodeType, INodeTypeDescription, IWebhookFunctions } from 'n8n-workflow'; -import { AbstractServer } from '@/AbstractServer'; -import { ExternalHooks } from '@/ExternalHooks'; -import { NodeTypes } from '@/NodeTypes'; +import { AbstractServer } from '@/abstract-server'; +import { ExternalHooks } from '@/external-hooks'; +import { NodeTypes } from '@/node-types'; import { Push } from '@/push'; import type { WorkflowEntity } from '@db/entities/WorkflowEntity'; diff --git a/packages/cli/test/integration/webhooks.test.ts b/packages/cli/test/integration/webhooks.test.ts index a729f95158..789ced02c6 100644 --- a/packages/cli/test/integration/webhooks.test.ts +++ b/packages/cli/test/integration/webhooks.test.ts @@ -2,12 +2,12 @@ import type SuperAgentTest from 'supertest/lib/agent'; import { agent as testAgent } from 'supertest'; import { mock } from 'jest-mock-extended'; -import { AbstractServer } from '@/AbstractServer'; -import { LiveWebhooks } from '@/webhooks/LiveWebhooks'; -import { ExternalHooks } from '@/ExternalHooks'; -import { TestWebhooks } from '@/webhooks/TestWebhooks'; -import { WaitingWebhooks } from '@/webhooks/WaitingWebhooks'; -import { WaitingForms } from '@/WaitingForms'; +import { AbstractServer } from '@/abstract-server'; +import { LiveWebhooks } from '@/webhooks/live-webhooks'; +import { ExternalHooks } from '@/external-hooks'; +import { TestWebhooks } from '@/webhooks/test-webhooks'; +import { WaitingWebhooks } from '@/webhooks/waiting-webhooks'; +import { WaitingForms } from '@/waiting-forms'; import type { IWebhookResponseCallbackData } from '@/webhooks/webhook.types'; import { mockInstance } from '@test/mocking'; diff --git a/packages/cli/test/integration/workflowHistoryManager.test.ts b/packages/cli/test/integration/workflowHistoryManager.test.ts index 85a114abee..fa2da33e55 100644 --- a/packages/cli/test/integration/workflowHistoryManager.test.ts +++ b/packages/cli/test/integration/workflowHistoryManager.test.ts @@ -4,8 +4,8 @@ import { DateTime } from 'luxon'; import config from '@/config'; import { WorkflowHistoryRepository } from '@db/repositories/workflowHistory.repository'; -import { License } from '@/License'; -import { WorkflowHistoryManager } from '@/workflows/workflowHistory/workflowHistoryManager.ee'; +import { License } from '@/license'; +import { WorkflowHistoryManager } from '@/workflows/workflow-history/workflow-history-manager.ee'; import { mockInstance } from '../shared/mocking'; import * as testDb from './shared/testDb'; diff --git a/packages/cli/test/integration/workflows/workflow.service.test.ts b/packages/cli/test/integration/workflows/workflow.service.test.ts index b09cf30b0d..1853c17839 100644 --- a/packages/cli/test/integration/workflows/workflow.service.test.ts +++ b/packages/cli/test/integration/workflows/workflow.service.test.ts @@ -1,6 +1,6 @@ import Container from 'typedi'; import { mock } from 'jest-mock-extended'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import { MessageEventBus } from '@/eventbus/MessageEventBus/MessageEventBus'; diff --git a/packages/cli/test/integration/workflows/workflowSharing.service.test.ts b/packages/cli/test/integration/workflows/workflowSharing.service.test.ts index 1907770fb1..58bed7d1e3 100644 --- a/packages/cli/test/integration/workflows/workflowSharing.service.test.ts +++ b/packages/cli/test/integration/workflows/workflowSharing.service.test.ts @@ -1,14 +1,14 @@ import Container from 'typedi'; import type { User } from '@db/entities/User'; -import { WorkflowSharingService } from '@/workflows/workflowSharing.service'; +import { WorkflowSharingService } from '@/workflows/workflow-sharing.service'; import * as testDb from '../shared/testDb'; import { createUser } from '../shared/db/users'; import { createWorkflow, shareWorkflowWithUsers } from '../shared/db/workflows'; import { ProjectService } from '@/services/project.service'; import { LicenseMocker } from '../shared/license'; -import { License } from '@/License'; +import { License } from '@/license'; let owner: User; let member: User; diff --git a/packages/cli/test/integration/workflows/workflows.controller.ee.test.ts b/packages/cli/test/integration/workflows/workflows.controller.ee.test.ts index e18dbd2fb5..060eba25e2 100644 --- a/packages/cli/test/integration/workflows/workflows.controller.ee.test.ts +++ b/packages/cli/test/integration/workflows/workflows.controller.ee.test.ts @@ -7,9 +7,9 @@ import type { Project } from '@db/entities/Project'; import { ProjectRepository } from '@db/repositories/project.repository'; import type { User } from '@db/entities/User'; import { WorkflowHistoryRepository } from '@db/repositories/workflowHistory.repository'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; -import { License } from '@/License'; -import { UserManagementMailer } from '@/UserManagement/email'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; +import { License } from '@/license'; +import { UserManagementMailer } from '@/user-management/email'; import type { WorkflowWithSharingsMetaDataAndCredentials } from '@/workflows/workflows.types'; import { mockInstance } from '../../shared/mocking'; diff --git a/packages/cli/test/integration/workflows/workflows.controller.test.ts b/packages/cli/test/integration/workflows/workflows.controller.test.ts index 8ada8166ad..d021df875b 100644 --- a/packages/cli/test/integration/workflows/workflows.controller.test.ts +++ b/packages/cli/test/integration/workflows/workflows.controller.test.ts @@ -11,9 +11,9 @@ import { WorkflowHistoryRepository } from '@db/repositories/workflowHistory.repo import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository'; import { ProjectRepository } from '@db/repositories/project.repository'; import { ProjectService } from '@/services/project.service'; -import { ActiveWorkflowManager } from '@/ActiveWorkflowManager'; +import { ActiveWorkflowManager } from '@/active-workflow-manager'; import { EnterpriseWorkflowService } from '@/workflows/workflow.service.ee'; -import { License } from '@/License'; +import { License } from '@/license'; import { mockInstance } from '../../shared/mocking'; import * as utils from '../shared/utils/'; From 2f3a5b63f9385c2c0aaa06368993cc2641ddc344 Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Thu, 22 Aug 2024 12:16:25 +0300 Subject: [PATCH 013/233] ci: Fix benchmark cli path (no-changelog) (#10506) --- .github/workflows/docker-images-benchmark.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-images-benchmark.yml b/.github/workflows/docker-images-benchmark.yml index e4b09cab61..cf9d7359a5 100644 --- a/.github/workflows/docker-images-benchmark.yml +++ b/.github/workflows/docker-images-benchmark.yml @@ -6,7 +6,7 @@ on: branches: - main paths: - - 'packages/benchmark/**' + - 'packages/@n8n/benchmark/**' - 'pnpm-lock.yaml' - 'pnpm-workspace.yaml' - '.github/workflows/docker-images-benchmark.yml' @@ -35,7 +35,7 @@ jobs: uses: docker/build-push-action@v5.1.0 with: context: . - file: ./packages/benchmark/Dockerfile + file: ./packages/@n8n/benchmark/Dockerfile platforms: linux/amd64 provenance: false push: true From c8ab9b1f840b25568147d5f58b5f3dda6fc7d946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=95=E0=A4=BE=E0=A4=B0=E0=A4=A4=E0=A5=8B=E0=A4=AB?= =?UTF-8?q?=E0=A5=8D=E0=A4=AB=E0=A5=87=E0=A4=B2=E0=A4=B8=E0=A5=8D=E0=A4=95?= =?UTF-8?q?=E0=A5=8D=E0=A4=B0=E0=A4=BF=E0=A4=AA=E0=A5=8D=E0=A4=9F=E2=84=A2?= Date: Thu, 22 Aug 2024 11:41:53 +0200 Subject: [PATCH 014/233] ci: Automate more of the release process (no-changelog) (#10416) --- .github/workflows/check-pr-title.yml | 3 +- .github/workflows/chromatic.yml | 2 +- .github/workflows/ci-postgres-mysql.yml | 4 + .github/workflows/ci-pull-requests.yml | 7 +- .github/workflows/docker-images-nightly.yml | 5 - .github/workflows/docker-images.yml | 48 --------- .github/workflows/e2e-reusable.yml | 11 +- .github/workflows/e2e-tests-pr.yml | 4 +- .github/workflows/linting-reusable.yml | 1 - .github/workflows/release-create-pr.yml | 6 +- .github/workflows/release-publish.yml | 111 ++++++++++++++++---- .github/workflows/units-tests-reusable.yml | 1 - 12 files changed, 108 insertions(+), 95 deletions(-) delete mode 100644 .github/workflows/docker-images.yml diff --git a/.github/workflows/check-pr-title.yml b/.github/workflows/check-pr-title.yml index add6e858a3..761cc5b8c7 100644 --- a/.github/workflows/check-pr-title.yml +++ b/.github/workflows/check-pr-title.yml @@ -7,8 +7,7 @@ on: - edited - synchronize branches: - - '**' - - '!release/*' + - 'master' jobs: check-pr-title: diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index bfd43e9257..d2ebc05320 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: pull_request_review: types: [submitted] - branch: + branches: - 'master' paths: - packages/design-system/** diff --git a/.github/workflows/ci-postgres-mysql.yml b/.github/workflows/ci-postgres-mysql.yml index d5abf1fa26..1d645ae774 100644 --- a/.github/workflows/ci-postgres-mysql.yml +++ b/.github/workflows/ci-postgres-mysql.yml @@ -8,6 +8,10 @@ on: paths: - packages/cli/src/databases/** - .github/workflows/ci-postgres-mysql.yml + pull_request_review: + types: [submitted] + branches: + - 'release/*' concurrency: group: db-${{ github.event.pull_request.number || github.ref }} diff --git a/.github/workflows/ci-pull-requests.yml b/.github/workflows/ci-pull-requests.yml index 78a5388950..d9938983b1 100644 --- a/.github/workflows/ci-pull-requests.yml +++ b/.github/workflows/ci-pull-requests.yml @@ -1,6 +1,10 @@ name: Build, unit test and lint branch -on: [pull_request] +on: + pull_request: + branches: + - '**' + - '!release/*' jobs: install-and-build: @@ -9,7 +13,6 @@ jobs: steps: - uses: actions/checkout@v4.1.1 with: - repository: n8n-io/n8n ref: refs/pull/${{ github.event.pull_request.number }}/merge - run: corepack enable diff --git a/.github/workflows/docker-images-nightly.yml b/.github/workflows/docker-images-nightly.yml index b701392e8b..34950d7ac2 100644 --- a/.github/workflows/docker-images-nightly.yml +++ b/.github/workflows/docker-images-nightly.yml @@ -6,10 +6,6 @@ on: - cron: '0 1 * * *' workflow_dispatch: inputs: - repository: - description: 'GitHub repository to create image off.' - required: true - default: 'n8n-io/n8n' branch: description: 'GitHub branch to create image off.' required: true @@ -49,7 +45,6 @@ jobs: - name: Checkout uses: actions/checkout@v4.1.1 with: - repository: ${{ github.event.inputs.repository || 'n8n-io/n8n' }} ref: ${{ github.event.inputs.branch || 'master' }} - name: Set up QEMU diff --git a/.github/workflows/docker-images.yml b/.github/workflows/docker-images.yml deleted file mode 100644 index 5c91f3832d..0000000000 --- a/.github/workflows/docker-images.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Docker Image CI - -on: - release: - types: [published] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4.1.1 - - - name: Get the version - id: vars - run: echo ::set-output name=tag::$(echo ${GITHUB_REF:14}) - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3.0.0 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.0.0 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3.0.0 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to DockerHub - uses: docker/login-action@v3.0.0 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build - uses: docker/build-push-action@v5.1.0 - with: - context: ./docker/images/n8n - build-args: | - N8N_VERSION=${{ steps.vars.outputs.tag }} - platforms: linux/amd64,linux/arm64 - provenance: false - push: true - tags: | - ${{ secrets.DOCKER_USERNAME }}/n8n:${{ steps.vars.outputs.tag }} - ghcr.io/${{ github.repository_owner }}/n8n:${{ steps.vars.outputs.tag }} diff --git a/.github/workflows/e2e-reusable.yml b/.github/workflows/e2e-reusable.yml index beea3bca27..ab88930a3a 100644 --- a/.github/workflows/e2e-reusable.yml +++ b/.github/workflows/e2e-reusable.yml @@ -22,11 +22,6 @@ on: required: false default: 'browsers:node18.12.0-chrome107' type: string - cache-key: - description: 'Cache key for modules and build artifacts.' - required: false - default: ${{ github.sha }}-${{ inputs.run-env }}-e2e-modules - type: string record: description: 'Record test run.' required: false @@ -78,7 +73,6 @@ jobs: steps: - uses: actions/checkout@v4.1.1 with: - repository: n8n-io/n8n ref: ${{ inputs.branch }} - name: Checkout PR @@ -111,7 +105,7 @@ jobs: /github/home/.cache /github/home/.pnpm-store ./packages/**/dist - key: ${{ inputs.cache-key }} + key: ${{ github.sha }}-e2e testing: runs-on: ubuntu-latest @@ -128,7 +122,6 @@ jobs: steps: - uses: actions/checkout@v4.1.1 with: - repository: n8n-io/n8n ref: ${{ inputs.branch }} - name: Checkout PR @@ -146,7 +139,7 @@ jobs: /github/home/.cache /github/home/.pnpm-store ./packages/**/dist - key: ${{ inputs.cache-key }} + key: ${{ github.sha }}-e2e - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/e2e-tests-pr.yml b/.github/workflows/e2e-tests-pr.yml index f845dbb062..3d2f122638 100644 --- a/.github/workflows/e2e-tests-pr.yml +++ b/.github/workflows/e2e-tests-pr.yml @@ -3,8 +3,9 @@ name: PR E2E on: pull_request_review: types: [submitted] - branch: + branches: - 'master' + - 'release/*' concurrency: group: e2e-${{ github.event.pull_request.number || github.ref }} @@ -18,7 +19,6 @@ jobs: with: pr_number: ${{ github.event.pull_request.number }} user: ${{ github.event.pull_request.user.login || 'PR User' }} - spec: 'e2e/*' secrets: CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} diff --git a/.github/workflows/linting-reusable.yml b/.github/workflows/linting-reusable.yml index 2650622bd0..ed8d234940 100644 --- a/.github/workflows/linting-reusable.yml +++ b/.github/workflows/linting-reusable.yml @@ -21,7 +21,6 @@ jobs: steps: - uses: actions/checkout@v4.1.1 with: - repository: n8n-io/n8n ref: ${{ inputs.ref }} - run: corepack enable diff --git a/.github/workflows/release-create-pr.yml b/.github/workflows/release-create-pr.yml index a17fa1bf89..03572e541c 100644 --- a/.github/workflows/release-create-pr.yml +++ b/.github/workflows/release-create-pr.yml @@ -56,12 +56,12 @@ jobs: git push -f origin refs/remotes/origin/${{ github.event.inputs.base-branch }}:refs/heads/release/${{ env.NEXT_RELEASE }} - name: Push the release branch, and Create the PR - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 with: base: 'release/${{ env.NEXT_RELEASE }}' - branch: '${{ env.NEXT_RELEASE }}-pr' + branch: 'release-pr/${{ env.NEXT_RELEASE }}' commit-message: ':rocket: Release ${{ env.NEXT_RELEASE }}' delete-branch: true - labels: 'release' + labels: release,release:${{ github.event.inputs.release-type }} title: ':rocket: Release ${{ env.NEXT_RELEASE }}' body-path: 'CHANGELOG-${{ env.NEXT_RELEASE }}.md' diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml index 239c18b512..522d47ff0f 100644 --- a/.github/workflows/release-publish.yml +++ b/.github/workflows/release-publish.yml @@ -8,18 +8,15 @@ on: - 'release/*' jobs: - publish-release: - if: github.event.pull_request.merged == true + publish-to-npm: + name: Publish to NPM runs-on: ubuntu-latest - - permissions: - contents: write - id-token: write - - timeout-minutes: 60 + if: github.event.pull_request.merged == true + timeout-minutes: 10 env: NPM_CONFIG_PROVENANCE: true - + outputs: + release: ${{ steps.set-release.outputs.release }} steps: - name: Checkout uses: actions/checkout@v4.1.1 @@ -51,25 +48,97 @@ jobs: pnpm publish -r --publish-branch ${{github.event.pull_request.base.ref}} --access public --tag rc --no-git-checks npm dist-tag rm n8n rc + - id: set-release + run: echo "release=${{ env.RELEASE }}" >> $GITHUB_OUTPUT + + publish-to-docker-hub: + name: Publish to DockerHub + needs: [publish-to-npm] + runs-on: ubuntu-latest + if: github.event.pull_request.merged == true + timeout-minutes: 10 + + steps: + - name: Checkout + uses: actions/checkout@v4.1.1 + with: + fetch-depth: 0 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3.0.0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3.0.0 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3.0.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Login to DockerHub + uses: docker/login-action@v3.0.0 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build + uses: docker/build-push-action@v5.1.0 + with: + context: ./docker/images/n8n + build-args: | + N8N_VERSION=${{ needs.publish-to-npm.outputs.release }} + platforms: linux/amd64,linux/arm64 + provenance: false + push: true + tags: | + ${{ secrets.DOCKER_USERNAME }}/n8n:${{ needs.publish-to-npm.outputs.release }} + ghcr.io/${{ github.repository_owner }}/n8n:${{ needs.publish-to-npm.outputs.release }} + + create-github-release: + name: Create a GitHub Release + needs: [publish-to-npm, publish-to-docker-hub] + runs-on: ubuntu-latest + if: github.event.pull_request.merged == true + timeout-minutes: 5 + + permissions: + contents: write + id-token: write + + steps: - name: Create a Release on GitHub uses: ncipollo/release-action@v1 with: commit: ${{github.event.pull_request.base.ref}} - tag: 'n8n@${{env.RELEASE}}' + tag: 'n8n@${{ needs.publish-to-npm.outputs.release }}' prerelease: true makeLatest: false body: ${{github.event.pull_request.body}} + trigger-release-note: + name: Trigger a release note + needs: [publish-to-npm, create-github-release] + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: - name: Trigger a release note - continue-on-error: true - run: curl -u docsWorkflows:${{ secrets.N8N_WEBHOOK_DOCS_PASSWORD }} --request GET 'https://internal.users.n8n.cloud/webhook/trigger-release-note' --header 'Content-Type:application/json' --data '{"version":"${{env.RELEASE}}"}' + run: curl -u docsWorkflows:${{ secrets.N8N_WEBHOOK_DOCS_PASSWORD }} --request GET 'https://internal.users.n8n.cloud/webhook/trigger-release-note' --header 'Content-Type:application/json' --data '{"version":"${{ needs.publish-to-npm.outputs.release }}"}' - # - name: Merge Release into 'master' - # run: | - # git fetch origin - # git checkout --track origin/master - # git config user.name "Jan Oberhauser" - # git config user.email jan.oberhauser@gmail.com - # git merge --ff n8n@${{env.RELEASE}} - # git push origin master - # git push origin :${{github.event.pull_request.base.ref}} + merge-back-into-master: + name: Merge back into master + needs: [publish-to-npm, create-github-release] + if: ${{ github.event.pull_request.merged == true && !contains(github.event.pull_request.labels.*.name, 'release:patch') }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.1.1 + with: + fetch-depth: 0 + - run: | + git checkout --track origin/master + git config user.name "github-actions[bot]" + git config user.email 41898282+github-actions[bot]@users.noreply.github.com + git merge --ff n8n@${{ needs.publish-to-npm.outputs.release }} + git push origin master + git push origin :${{github.event.pull_request.base.ref}} diff --git a/.github/workflows/units-tests-reusable.yml b/.github/workflows/units-tests-reusable.yml index 1f64b2e27c..60bf593e82 100644 --- a/.github/workflows/units-tests-reusable.yml +++ b/.github/workflows/units-tests-reusable.yml @@ -36,7 +36,6 @@ jobs: steps: - uses: actions/checkout@v4.1.1 with: - repository: n8n-io/n8n ref: ${{ inputs.ref }} - run: corepack enable From 3428f28a732f79e067b3cb515cc59d835de246a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=95=E0=A4=BE=E0=A4=B0=E0=A4=A4=E0=A5=8B=E0=A4=AB?= =?UTF-8?q?=E0=A5=8D=E0=A4=AB=E0=A5=87=E0=A4=B2=E0=A4=B8=E0=A5=8D=E0=A4=95?= =?UTF-8?q?=E0=A5=8D=E0=A4=B0=E0=A4=BF=E0=A4=AA=E0=A5=8D=E0=A4=9F=E2=84=A2?= Date: Thu, 22 Aug 2024 11:46:13 +0200 Subject: [PATCH 015/233] fix(core): Scheduler tasks should not trigger on follower instances (#10507) --- packages/core/src/ScheduledTaskManager.ts | 13 ++++++++++++- packages/core/test/ScheduledTaskManager.test.ts | 13 ++++++++++++- .../Schedule/tests/ScheduleTrigger.node.test.ts | 5 +++-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/packages/core/src/ScheduledTaskManager.ts b/packages/core/src/ScheduledTaskManager.ts index ce656f3716..eb519a60a7 100644 --- a/packages/core/src/ScheduledTaskManager.ts +++ b/packages/core/src/ScheduledTaskManager.ts @@ -1,13 +1,24 @@ import { Service } from 'typedi'; import { CronJob } from 'cron'; import type { CronExpression, Workflow } from 'n8n-workflow'; +import { InstanceSettings } from './InstanceSettings'; @Service() export class ScheduledTaskManager { + constructor(private readonly instanceSettings: InstanceSettings) {} + readonly cronJobs = new Map(); registerCron(workflow: Workflow, cronExpression: CronExpression, onTick: () => void) { - const cronJob = new CronJob(cronExpression, onTick, undefined, true, workflow.timezone); + const cronJob = new CronJob( + cronExpression, + () => { + if (this.instanceSettings.isLeader) onTick(); + }, + undefined, + true, + workflow.timezone, + ); const cronJobsForWorkflow = this.cronJobs.get(workflow.id); if (cronJobsForWorkflow) { cronJobsForWorkflow.push(cronJob); diff --git a/packages/core/test/ScheduledTaskManager.test.ts b/packages/core/test/ScheduledTaskManager.test.ts index df7fb9b77e..15d5f7d487 100644 --- a/packages/core/test/ScheduledTaskManager.test.ts +++ b/packages/core/test/ScheduledTaskManager.test.ts @@ -1,9 +1,11 @@ import type { Workflow } from 'n8n-workflow'; import { mock } from 'jest-mock-extended'; +import type { InstanceSettings } from '@/InstanceSettings'; import { ScheduledTaskManager } from '@/ScheduledTaskManager'; describe('ScheduledTaskManager', () => { + const instanceSettings = mock({ isLeader: true }); const workflow = mock({ timezone: 'GMT' }); const everyMinute = '0 * * * * *'; const onTick = jest.fn(); @@ -13,7 +15,7 @@ describe('ScheduledTaskManager', () => { beforeEach(() => { jest.clearAllMocks(); jest.useFakeTimers(); - scheduledTaskManager = new ScheduledTaskManager(); + scheduledTaskManager = new ScheduledTaskManager(instanceSettings); }); it('should throw when workflow timezone is invalid', () => { @@ -41,6 +43,15 @@ describe('ScheduledTaskManager', () => { expect(onTick).toHaveBeenCalledTimes(10); }); + it('should should not invoke on follower instances', async () => { + scheduledTaskManager = new ScheduledTaskManager(mock({ isLeader: false })); + scheduledTaskManager.registerCron(workflow, everyMinute, onTick); + + expect(onTick).not.toHaveBeenCalled(); + jest.advanceTimersByTime(10 * 60 * 1000); // 10 minutes + expect(onTick).not.toHaveBeenCalled(); + }); + it('should deregister CronJobs for a workflow', async () => { scheduledTaskManager.registerCron(workflow, everyMinute, onTick); scheduledTaskManager.registerCron(workflow, everyMinute, onTick); diff --git a/packages/nodes-base/nodes/Schedule/tests/ScheduleTrigger.node.test.ts b/packages/nodes-base/nodes/Schedule/tests/ScheduleTrigger.node.test.ts index fa1d2cd615..0693806f4c 100644 --- a/packages/nodes-base/nodes/Schedule/tests/ScheduleTrigger.node.test.ts +++ b/packages/nodes-base/nodes/Schedule/tests/ScheduleTrigger.node.test.ts @@ -1,6 +1,6 @@ import * as n8nWorkflow from 'n8n-workflow'; import type { INode, ITriggerFunctions, Workflow } from 'n8n-workflow'; -import { returnJsonArray } from 'n8n-core'; +import { type InstanceSettings, returnJsonArray } from 'n8n-core'; import { ScheduledTaskManager } from 'n8n-core/dist/ScheduledTaskManager'; import { mock } from 'jest-mock-extended'; import { ScheduleTrigger } from '../ScheduleTrigger.node'; @@ -18,7 +18,8 @@ describe('ScheduleTrigger', () => { const node = mock({ typeVersion: 1 }); const workflow = mock({ timezone }); - const scheduledTaskManager = new ScheduledTaskManager(); + const instanceSettings = mock({ isLeader: true }); + const scheduledTaskManager = new ScheduledTaskManager(instanceSettings); const helpers = mock({ returnJsonArray, registerCron: (cronExpression, onTick) => From dc7dc995d5e2ea8fbd0dcb54cfa8aa93ecb437c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Thu, 22 Aug 2024 13:27:45 +0200 Subject: [PATCH 016/233] perf(core): Make execution queries faster (#9817) --- packages/cli/src/databases/dsl/Indices.ts | 29 ++++- packages/cli/src/databases/dsl/index.ts | 10 +- .../1723796243146-RefactorExecutionIndices.ts | 118 ++++++++++++++++++ .../src/databases/migrations/mysqldb/index.ts | 2 + .../databases/migrations/postgresdb/index.ts | 2 + .../src/databases/migrations/sqlite/index.ts | 2 + .../repositories/execution.repository.ts | 4 +- packages/cli/src/databases/types.ts | 2 + .../src/databases/utils/migrationHelpers.ts | 4 + .../cli/src/executions/execution.service.ts | 4 +- .../cli/src/executions/execution.types.ts | 2 +- 11 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 packages/cli/src/databases/migrations/common/1723796243146-RefactorExecutionIndices.ts diff --git a/packages/cli/src/databases/dsl/Indices.ts b/packages/cli/src/databases/dsl/Indices.ts index a5ec95e101..040ab04105 100644 --- a/packages/cli/src/databases/dsl/Indices.ts +++ b/packages/cli/src/databases/dsl/Indices.ts @@ -1,5 +1,5 @@ import type { QueryRunner } from '@n8n/typeorm'; -import { TableIndex } from '@n8n/typeorm'; +import { TableIndex, TypeORMError } from '@n8n/typeorm'; import LazyPromise from 'p-lazy'; abstract class IndexOperation extends LazyPromise { @@ -48,10 +48,29 @@ export class CreateIndex extends IndexOperation { } export class DropIndex extends IndexOperation { + constructor( + tableName: string, + columnNames: string[], + tablePrefix: string, + queryRunner: QueryRunner, + customIndexName?: string, + protected skipIfMissing = false, + ) { + super(tableName, columnNames, tablePrefix, queryRunner, customIndexName); + } + async execute(queryRunner: QueryRunner) { - return await queryRunner.dropIndex( - this.fullTableName, - this.customIndexName ?? this.fullIndexName, - ); + return await queryRunner + .dropIndex(this.fullTableName, this.customIndexName ?? this.fullIndexName) + .catch((error) => { + if ( + error instanceof TypeORMError && + error.message.includes('not found') && + this.skipIfMissing + ) { + return; + } + throw error; + }); } } diff --git a/packages/cli/src/databases/dsl/index.ts b/packages/cli/src/databases/dsl/index.ts index bb5ef859ec..a51e61bd17 100644 --- a/packages/cli/src/databases/dsl/index.ts +++ b/packages/cli/src/databases/dsl/index.ts @@ -32,8 +32,14 @@ export const createSchemaBuilder = (tablePrefix: string, queryRunner: QueryRunne customIndexName?: string, ) => new CreateIndex(tableName, columnNames, isUnique, tablePrefix, queryRunner, customIndexName), - dropIndex: (tableName: string, columnNames: string[], customIndexName?: string) => - new DropIndex(tableName, columnNames, tablePrefix, queryRunner, customIndexName), + dropIndex: ( + tableName: string, + columnNames: string[], + { customIndexName, skipIfMissing }: { customIndexName?: string; skipIfMissing?: boolean } = { + skipIfMissing: false, + }, + ) => + new DropIndex(tableName, columnNames, tablePrefix, queryRunner, customIndexName, skipIfMissing), addForeignKey: ( tableName: string, diff --git a/packages/cli/src/databases/migrations/common/1723796243146-RefactorExecutionIndices.ts b/packages/cli/src/databases/migrations/common/1723796243146-RefactorExecutionIndices.ts new file mode 100644 index 0000000000..dcf558f202 --- /dev/null +++ b/packages/cli/src/databases/migrations/common/1723796243146-RefactorExecutionIndices.ts @@ -0,0 +1,118 @@ +import type { MigrationContext, ReversibleMigration } from '@/databases/types'; + +/** + * Add new indices: + * + * - `workflowId, startedAt` for `ExecutionRepository.findManyByRangeQuery` (default query) and for `ExecutionRepository.findManyByRangeQuery` (filter query) + * - `waitTill, status, deletedAt` for `ExecutionRepository.getWaitingExecutions` + * - `stoppedAt, status, deletedAt` for `ExecutionRepository.softDeletePrunableExecutions` + * + * Remove unused indices in sqlite: + * + * - `stoppedAt` (duplicate with different casing) + * - `waitTill` + * - `status, workflowId` + * + * Remove unused indices in MySQL: + * + * - `status` + * + * Remove unused indices in all DBs: + * + * - `waitTill, id` + * - `workflowId, id` + * + * Remove incomplete index in all DBs: + * + * - `stopped_at` (replaced with composite index) + * + * Keep index as is: + * + * - `deletedAt` for query at `ExecutionRepository.hardDeleteSoftDeletedExecutions` + */ +export class RefactorExecutionIndices1723796243146 implements ReversibleMigration { + async up({ schemaBuilder, isPostgres, isSqlite, isMysql, runQuery, escape }: MigrationContext) { + if (isSqlite || isPostgres) { + const executionEntity = escape.tableName('execution_entity'); + + const workflowId = escape.columnName('workflowId'); + const startedAt = escape.columnName('startedAt'); + const waitTill = escape.columnName('waitTill'); + const status = escape.columnName('status'); + const deletedAt = escape.columnName('deletedAt'); + const stoppedAt = escape.columnName('stoppedAt'); + + await runQuery(` + CREATE INDEX idx_execution_entity_workflow_id_started_at + ON ${executionEntity} (${workflowId}, ${startedAt}) + WHERE ${startedAt} IS NOT NULL AND ${deletedAt} IS NULL; + `); + + await runQuery(` + CREATE INDEX idx_execution_entity_wait_till_status_deleted_at + ON ${executionEntity} (${waitTill}, ${status}, ${deletedAt}) + WHERE ${waitTill} IS NOT NULL AND ${deletedAt} IS NULL; + `); + + await runQuery(` + CREATE INDEX idx_execution_entity_stopped_at_status_deleted_at + ON ${executionEntity} (${stoppedAt}, ${status}, ${deletedAt}) + WHERE ${stoppedAt} IS NOT NULL AND ${deletedAt} IS NULL; + `); + } else if (isMysql) { + await schemaBuilder.createIndex('execution_entity', ['workflowId', 'startedAt']); + await schemaBuilder.createIndex('execution_entity', ['waitTill', 'status', 'deletedAt']); + await schemaBuilder.createIndex('execution_entity', ['stoppedAt', 'status', 'deletedAt']); + } + + if (isSqlite) { + await schemaBuilder.dropIndex('execution_entity', ['waitTill'], { + customIndexName: 'idx_execution_entity_wait_till', + skipIfMissing: true, + }); + + await schemaBuilder.dropIndex('execution_entity', ['status', 'workflowId'], { + customIndexName: 'IDX_8b6f3f9ae234f137d707b98f3bf43584', + skipIfMissing: true, + }); + } + + if (isMysql) { + await schemaBuilder.dropIndex('execution_entity', ['status'], { + customIndexName: 'IDX_8b6f3f9ae234f137d707b98f3bf43584', + skipIfMissing: true, + }); + } + + // all DBs + + await schemaBuilder.dropIndex( + 'execution_entity', + ['stoppedAt'], + isSqlite ? { customIndexName: 'idx_execution_entity_stopped_at', skipIfMissing: true } : {}, + ); + await schemaBuilder.dropIndex('execution_entity', ['waitTill', 'id'], { + customIndexName: isPostgres + ? 'IDX_85b981df7b444f905f8bf50747' + : 'IDX_b94b45ce2c73ce46c54f20b5f9', + skipIfMissing: true, + }); + await schemaBuilder.dropIndex('execution_entity', ['workflowId', 'id'], { + customIndexName: + isPostgres || isMysql + ? 'idx_execution_entity_workflow_id_id' + : 'IDX_81fc04c8a17de15835713505e4', + skipIfMissing: true, + }); + } + + async down({ schemaBuilder }: MigrationContext) { + await schemaBuilder.dropIndex('execution_entity', ['workflowId', 'startedAt']); + await schemaBuilder.dropIndex('execution_entity', ['waitTill', 'status']); + await schemaBuilder.dropIndex('execution_entity', ['stoppedAt', 'deletedAt', 'status']); + + await schemaBuilder.createIndex('execution_entity', ['waitTill', 'id']); + await schemaBuilder.createIndex('execution_entity', ['stoppedAt']); + await schemaBuilder.createIndex('execution_entity', ['workflowId', 'id']); + } +} diff --git a/packages/cli/src/databases/migrations/mysqldb/index.ts b/packages/cli/src/databases/migrations/mysqldb/index.ts index b4900eb59d..ed08c6b2f2 100644 --- a/packages/cli/src/databases/migrations/mysqldb/index.ts +++ b/packages/cli/src/databases/migrations/mysqldb/index.ts @@ -58,6 +58,7 @@ import { MoveSshKeysToDatabase1711390882123 } from '../common/1711390882123-Move import { RemoveNodesAccess1712044305787 } from '../common/1712044305787-RemoveNodesAccess'; import { MakeExecutionStatusNonNullable1714133768521 } from '../common/1714133768521-MakeExecutionStatusNonNullable'; import { AddActivatedAtUserSetting1717498465931 } from './1717498465931-AddActivatedAtUserSetting'; +import { RefactorExecutionIndices1723796243146 } from '../common/1723796243146-RefactorExecutionIndices'; import { AddConstraintToExecutionMetadata1720101653148 } from '../common/1720101653148-AddConstraintToExecutionMetadata'; import { CreateInvalidAuthTokenTable1723627610222 } from '../common/1723627610222-CreateInvalidAuthTokenTable'; @@ -123,4 +124,5 @@ export const mysqlMigrations: Migration[] = [ AddActivatedAtUserSetting1717498465931, AddConstraintToExecutionMetadata1720101653148, CreateInvalidAuthTokenTable1723627610222, + RefactorExecutionIndices1723796243146, ]; diff --git a/packages/cli/src/databases/migrations/postgresdb/index.ts b/packages/cli/src/databases/migrations/postgresdb/index.ts index 85bd58f371..3a37f36936 100644 --- a/packages/cli/src/databases/migrations/postgresdb/index.ts +++ b/packages/cli/src/databases/migrations/postgresdb/index.ts @@ -57,6 +57,7 @@ import { MoveSshKeysToDatabase1711390882123 } from '../common/1711390882123-Move import { RemoveNodesAccess1712044305787 } from '../common/1712044305787-RemoveNodesAccess'; import { MakeExecutionStatusNonNullable1714133768521 } from '../common/1714133768521-MakeExecutionStatusNonNullable'; import { AddActivatedAtUserSetting1717498465931 } from './1717498465931-AddActivatedAtUserSetting'; +import { RefactorExecutionIndices1723796243146 } from '../common/1723796243146-RefactorExecutionIndices'; import { AddConstraintToExecutionMetadata1720101653148 } from '../common/1720101653148-AddConstraintToExecutionMetadata'; import { FixExecutionMetadataSequence1721377157740 } from './1721377157740-FixExecutionMetadataSequence'; import { CreateInvalidAuthTokenTable1723627610222 } from '../common/1723627610222-CreateInvalidAuthTokenTable'; @@ -123,4 +124,5 @@ export const postgresMigrations: Migration[] = [ AddConstraintToExecutionMetadata1720101653148, FixExecutionMetadataSequence1721377157740, CreateInvalidAuthTokenTable1723627610222, + RefactorExecutionIndices1723796243146, ]; diff --git a/packages/cli/src/databases/migrations/sqlite/index.ts b/packages/cli/src/databases/migrations/sqlite/index.ts index 974c743d0f..e55a36c1c1 100644 --- a/packages/cli/src/databases/migrations/sqlite/index.ts +++ b/packages/cli/src/databases/migrations/sqlite/index.ts @@ -55,6 +55,7 @@ import { MoveSshKeysToDatabase1711390882123 } from '../common/1711390882123-Move import { RemoveNodesAccess1712044305787 } from '../common/1712044305787-RemoveNodesAccess'; import { MakeExecutionStatusNonNullable1714133768521 } from '../common/1714133768521-MakeExecutionStatusNonNullable'; import { AddActivatedAtUserSetting1717498465931 } from './1717498465931-AddActivatedAtUserSetting'; +import { RefactorExecutionIndices1723796243146 } from '../common/1723796243146-RefactorExecutionIndices'; import { AddConstraintToExecutionMetadata1720101653148 } from '../common/1720101653148-AddConstraintToExecutionMetadata'; import { CreateInvalidAuthTokenTable1723627610222 } from '../common/1723627610222-CreateInvalidAuthTokenTable'; @@ -117,6 +118,7 @@ const sqliteMigrations: Migration[] = [ AddActivatedAtUserSetting1717498465931, AddConstraintToExecutionMetadata1720101653148, CreateInvalidAuthTokenTable1723627610222, + RefactorExecutionIndices1723796243146, ]; export { sqliteMigrations }; diff --git a/packages/cli/src/databases/repositories/execution.repository.ts b/packages/cli/src/databases/repositories/execution.repository.ts index 364619fab6..dbcbfc994e 100644 --- a/packages/cli/src/databases/repositories/execution.repository.ts +++ b/packages/cli/src/databases/repositories/execution.repository.ts @@ -784,8 +784,8 @@ export class ExecutionRepository extends Repository { if (firstId) qb.andWhere('execution.id > :firstId', { firstId }); if (lastId) qb.andWhere('execution.id < :lastId', { lastId }); - if (query.order?.stoppedAt === 'DESC') { - qb.orderBy({ 'execution.stoppedAt': 'DESC' }); + if (query.order?.startedAt === 'DESC') { + qb.orderBy({ 'execution.startedAt': 'DESC' }); } else if (query.order?.top) { qb.orderBy(`(CASE WHEN execution.status = '${query.order.top}' THEN 0 ELSE 1 END)`); } else { diff --git a/packages/cli/src/databases/types.ts b/packages/cli/src/databases/types.ts index f4c3db0452..96a26e4712 100644 --- a/packages/cli/src/databases/types.ts +++ b/packages/cli/src/databases/types.ts @@ -11,6 +11,8 @@ export interface MigrationContext { tablePrefix: string; dbType: DatabaseType; isMysql: boolean; + isSqlite: boolean; + isPostgres: boolean; dbName: string; migrationName: string; nodeTypes: INodeTypes; diff --git a/packages/cli/src/databases/utils/migrationHelpers.ts b/packages/cli/src/databases/utils/migrationHelpers.ts index 0f116590ee..ed100f9c47 100644 --- a/packages/cli/src/databases/utils/migrationHelpers.ts +++ b/packages/cli/src/databases/utils/migrationHelpers.ts @@ -93,6 +93,8 @@ function parseJson(data: string | T): T { const globalConfig = Container.get(GlobalConfig); const dbType = globalConfig.database.type; const isMysql = ['mariadb', 'mysqldb'].includes(dbType); +const isSqlite = dbType === 'sqlite'; +const isPostgres = dbType === 'postgresdb'; const dbName = globalConfig.database[dbType === 'mariadb' ? 'mysqldb' : dbType].database; const tablePrefix = globalConfig.database.tablePrefix; @@ -101,6 +103,8 @@ const createContext = (queryRunner: QueryRunner, migration: Migration): Migratio tablePrefix, dbType, isMysql, + isSqlite, + isPostgres, dbName, migrationName: migration.name, queryRunner, diff --git a/packages/cli/src/executions/execution.service.ts b/packages/cli/src/executions/execution.service.ts index 61a1dc0db1..a4ae0ffbae 100644 --- a/packages/cli/src/executions/execution.service.ts +++ b/packages/cli/src/executions/execution.service.ts @@ -361,7 +361,7 @@ export class ExecutionService { /** * Return: * - * - the latest summaries of current and completed executions that satisfy a query, + * - the summaries of latest current and completed executions that satisfy a query, * - the total count of all completed executions that satisfy the query, and * - whether the total of completed executions is an estimate. * @@ -382,7 +382,7 @@ export class ExecutionService { this.findRangeWithCount({ ...query, status: completedStatuses, - order: { stoppedAt: 'DESC' }, + order: { startedAt: 'DESC' }, }), ]); diff --git a/packages/cli/src/executions/execution.types.ts b/packages/cli/src/executions/execution.types.ts index 15c27261fc..10a2ec7285 100644 --- a/packages/cli/src/executions/execution.types.ts +++ b/packages/cli/src/executions/execution.types.ts @@ -86,7 +86,7 @@ export namespace ExecutionSummaries { type OrderFields = { order?: { top?: ExecutionStatus; - stoppedAt?: 'DESC'; + startedAt?: 'DESC'; }; }; From ab76b106fd6e082f25d12f839b06690c92c7b249 Mon Sep 17 00:00:00 2001 From: Alex Grozav Date: Thu, 22 Aug 2024 15:28:56 +0300 Subject: [PATCH 017/233] fix(editor): Fix node insert position on new canvas (no-changelog) (#10495) --- packages/editor-ui/src/composables/useCanvasOperations.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/editor-ui/src/composables/useCanvasOperations.ts b/packages/editor-ui/src/composables/useCanvasOperations.ts index 650fccbe9a..63fa57c7fd 100644 --- a/packages/editor-ui/src/composables/useCanvasOperations.ts +++ b/packages/editor-ui/src/composables/useCanvasOperations.ts @@ -980,11 +980,12 @@ export function useCanvasOperations({ router }: { router: ReturnType Date: Thu, 22 Aug 2024 14:30:55 +0200 Subject: [PATCH 018/233] fix(editor): Prevent Safari users from accessing the frontend over insecure contexts (#10510) --- packages/editor-ui/package.json | 1 + packages/editor-ui/src/constants.ts | 4 ++-- .../editor-ui/src/stores/settings.store.ts | 20 +++++++++++-------- pnpm-lock.yaml | 3 +++ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 00ec044bf9..c81e9b960a 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -44,6 +44,7 @@ "@vueuse/components": "^10.11.0", "@vueuse/core": "^10.11.0", "axios": "catalog:", + "bowser": "2.11.0", "chart.js": "^4.4.0", "codemirror-lang-html-n8n": "^1.0.0", "dateformat": "^3.0.3", diff --git a/packages/editor-ui/src/constants.ts b/packages/editor-ui/src/constants.ts index 8d23f2dea1..ea1a864b08 100644 --- a/packages/editor-ui/src/constants.ts +++ b/packages/editor-ui/src/constants.ts @@ -839,14 +839,14 @@ export const ROLE = { export const INSECURE_CONNECTION_WARNING = `

🚫

-

Your n8n server is configured to use a secure cookie,
however you are visiting this via an insecure URL +

Your n8n server is configured to use a secure cookie,
however you are either visiting this via an insecure URL, or using Safari.


To fix this, please consider the following options:
  • Setup TLS/HTTPS (recommended), or
  • -
  • If you are running this locally, try using localhost instead
  • +
  • If you are running this locally, and not using Safari, try using localhost instead
  • If you prefer to disable this security feature (not recommended), set the environment variable N8N_SECURE_COOKIE to false
diff --git a/packages/editor-ui/src/stores/settings.store.ts b/packages/editor-ui/src/stores/settings.store.ts index 0275a87047..2886aff1ba 100644 --- a/packages/editor-ui/src/stores/settings.store.ts +++ b/packages/editor-ui/src/stores/settings.store.ts @@ -1,3 +1,6 @@ +import { computed, ref } from 'vue'; +import Bowser from 'bowser'; + import * as publicApiApi from '@/api/api-keys'; import * as ldapApi from '@/api/ldap'; import * as settingsApi from '@/api/settings'; @@ -21,7 +24,6 @@ import { makeRestApiRequest } from '@/utils/apiUtils'; import { useTitleChange } from '@/composables/useTitleChange'; import { useToast } from '@/composables/useToast'; import { i18n } from '@/plugins/i18n'; -import { computed, ref } from 'vue'; export const useSettingsStore = defineStore(STORES.SETTINGS, () => { const initialized = ref(false); @@ -189,13 +191,15 @@ export const useSettingsStore = defineStore(STORES.SETTINGS, () => { useRootStore().setVersionCli(settings.value.versionCli); } - if ( - settings.value.authCookie.secure && - location.protocol === 'http:' && - !['localhost', '127.0.0.1'].includes(location.hostname) - ) { - document.write(INSECURE_CONNECTION_WARNING); - return; + if (settings.value.authCookie.secure) { + const { browser } = Bowser.parse(navigator.userAgent); + if ( + location.protocol === 'http:' && + (!['localhost', '127.0.0.1'].includes(location.hostname) || browser.name === 'Safari') + ) { + document.write(INSECURE_CONNECTION_WARNING); + return; + } } const isV1BannerDismissedPermanently = (settings.value.banners?.dismissed || []).includes('V1'); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b562d950ff..a59c4cf562 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1298,6 +1298,9 @@ importers: axios: specifier: 'catalog:' version: 1.7.4(debug@4.3.6) + bowser: + specifier: 2.11.0 + version: 2.11.0 chart.js: specifier: ^4.4.0 version: 4.4.0 From 84e54beac763f25399c9687f695f1e658e3ce434 Mon Sep 17 00:00:00 2001 From: oleg Date: Thu, 22 Aug 2024 16:59:12 +0200 Subject: [PATCH 019/233] feat(editor): Implement workflowSelector parameter type (#10482) --- cypress/constants.ts | 1 + .../e2e/45-workflow-selector-parameter.cy.ts | 82 +++++ .../Test_Subworkflow_Get_Weather.json | 53 +++ .../fixtures/Test_Subworkflow_Search_DB.json | 64 ++++ .../RetrieverWorkflow.node.ts | 37 +- .../tools/ToolWorkflow/ToolWorkflow.node.ts | 30 +- .../src/components/ParameterInput.vue | 23 +- .../src/components/ParameterInputFull.vue | 4 +- .../ResourceLocator/ResourceLocator.vue | 122 +------ .../ResourceLocator/resourceLocator.scss | 121 +++++++ .../WorkflowSelectorParameterInput.vue | 315 ++++++++++++++++++ .../useWorkflowResourceLocatorDropdown.ts | 34 ++ .../useWorkflowResourceLocatorModes.ts | 67 ++++ .../useWorkflowResourcesLocator.ts | 93 ++++++ .../ExecuteWorkflow/ExecuteWorkflow.node.ts | 18 +- .../nodes/ExecuteWorkflow/GenericFunctions.ts | 20 +- packages/workflow/src/Interfaces.ts | 3 +- packages/workflow/src/NodeHelpers.ts | 7 +- 18 files changed, 954 insertions(+), 140 deletions(-) create mode 100644 cypress/e2e/45-workflow-selector-parameter.cy.ts create mode 100644 cypress/fixtures/Test_Subworkflow_Get_Weather.json create mode 100644 cypress/fixtures/Test_Subworkflow_Search_DB.json create mode 100644 packages/editor-ui/src/components/ResourceLocator/resourceLocator.scss create mode 100644 packages/editor-ui/src/components/WorkflowSelectorParameterInput/WorkflowSelectorParameterInput.vue create mode 100644 packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourceLocatorDropdown.ts create mode 100644 packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourceLocatorModes.ts create mode 100644 packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourcesLocator.ts diff --git a/cypress/constants.ts b/cypress/constants.ts index 6f7e7b978d..cbbf838530 100644 --- a/cypress/constants.ts +++ b/cypress/constants.ts @@ -61,6 +61,7 @@ export const AI_LANGUAGE_MODEL_OPENAI_CHAT_MODEL_NODE_NAME = 'OpenAI Chat Model' export const AI_MEMORY_POSTGRES_NODE_NAME = 'Postgres Chat Memory'; export const AI_OUTPUT_PARSER_AUTO_FIXING_NODE_NAME = 'Auto-fixing Output Parser'; export const WEBHOOK_NODE_NAME = 'Webhook'; +export const EXECUTE_WORKFLOW_NODE_NAME = 'Execute Workflow'; export const META_KEY = Cypress.platform === 'darwin' ? 'meta' : 'ctrl'; diff --git a/cypress/e2e/45-workflow-selector-parameter.cy.ts b/cypress/e2e/45-workflow-selector-parameter.cy.ts new file mode 100644 index 0000000000..a6dc23e6c2 --- /dev/null +++ b/cypress/e2e/45-workflow-selector-parameter.cy.ts @@ -0,0 +1,82 @@ +import { EXECUTE_WORKFLOW_NODE_NAME } from '../constants'; +import { WorkflowPage as WorkflowPageClass, NDV } from '../pages'; +import { getVisiblePopper } from '../utils'; + +const workflowPage = new WorkflowPageClass(); +const ndv = new NDV(); + +describe('Workflow Selector Parameter', () => { + beforeEach(() => { + cy.resetDatabase(); + cy.signinAsOwner(); + ['Get_Weather', 'Search_DB'].forEach((workflowName) => { + workflowPage.actions.visit(); + cy.createFixtureWorkflow(`Test_Subworkflow_${workflowName}.json`, workflowName); + workflowPage.actions.saveWorkflowOnButtonClick(); + }); + workflowPage.actions.visit(); + workflowPage.actions.addInitialNodeToCanvas(EXECUTE_WORKFLOW_NODE_NAME, { + keepNdvOpen: true, + action: 'Call Another Workflow', + }); + }); + it('should render sub-workflows list', () => { + ndv.getters.resourceLocator('workflowId').should('be.visible'); + ndv.getters.resourceLocatorInput('workflowId').click(); + + getVisiblePopper() + .should('have.length', 1) + .findChildByTestId('rlc-item') + .should('have.length', 2); + }); + + it('should show required parameter warning', () => { + ndv.getters.resourceLocator('workflowId').should('be.visible'); + ndv.getters.resourceLocatorInput('workflowId').click(); + ndv.getters.parameterInputIssues('workflowId').should('exist'); + }); + + it('should filter sub-workflows list', () => { + ndv.getters.resourceLocator('workflowId').should('be.visible'); + ndv.getters.resourceLocatorInput('workflowId').click(); + ndv.getters.resourceLocatorSearch('workflowId').type('Weather'); + + getVisiblePopper() + .should('have.length', 1) + .findChildByTestId('rlc-item') + .should('have.length', 1) + .click(); + + ndv.getters + .resourceLocatorInput('workflowId') + .find('input') + .should('have.value', 'Get_Weather'); + }); + + it('should render sub-workflow links correctly', () => { + ndv.getters.resourceLocator('workflowId').should('be.visible'); + ndv.getters.resourceLocatorInput('workflowId').click(); + + getVisiblePopper().findChildByTestId('rlc-item').first().click(); + + ndv.getters.resourceLocatorInput('workflowId').find('a').should('exist'); + cy.getByTestId('radio-button-expression').eq(1).click(); + ndv.getters.resourceLocatorInput('workflowId').find('a').should('not.exist'); + }); + + it('should switch to ID mode on expression', () => { + ndv.getters.resourceLocator('workflowId').should('be.visible'); + ndv.getters.resourceLocatorInput('workflowId').click(); + + getVisiblePopper().findChildByTestId('rlc-item').first().click(); + ndv.getters + .resourceLocatorModeSelector('workflowId') + .find('input') + .should('have.value', 'From list'); + cy.getByTestId('radio-button-expression').eq(1).click(); + ndv.getters + .resourceLocatorModeSelector('workflowId') + .find('input') + .should('have.value', 'By ID'); + }); +}); diff --git a/cypress/fixtures/Test_Subworkflow_Get_Weather.json b/cypress/fixtures/Test_Subworkflow_Get_Weather.json new file mode 100644 index 0000000000..3829aca879 --- /dev/null +++ b/cypress/fixtures/Test_Subworkflow_Get_Weather.json @@ -0,0 +1,53 @@ +{ + "name": "Get Weather", + "nodes": [ + { + "parameters": {}, + "id": "82eed1ba-179b-4f8f-8a85-b45f0d4e5857", + "name": "Execute Workflow Trigger", + "type": "n8n-nodes-base.executeWorkflowTrigger", + "typeVersion": 1, + "position": [ + 560, + 340 + ] + }, + { + "parameters": { + "assignments": { + "assignments": [ + { + "id": "6ad8dc55-20f3-45af-a724-c7ecac90d338", + "name": "response", + "value": "Weather is sunny", + "type": "string" + } + ] + }, + "options": {} + }, + "id": "8f3e00f6-fc92-4aba-817b-93d206158bda", + "name": "Edit Fields", + "type": "n8n-nodes-base.set", + "typeVersion": 3.4, + "position": [ + 780, + 340 + ] + } + ], + "pinData": {}, + "connections": { + "Execute Workflow Trigger": { + "main": [ + [ + { + "node": "Edit Fields", + "type": "main", + "index": 0 + } + ] + ] + } + } +} diff --git a/cypress/fixtures/Test_Subworkflow_Search_DB.json b/cypress/fixtures/Test_Subworkflow_Search_DB.json new file mode 100644 index 0000000000..990aee120d --- /dev/null +++ b/cypress/fixtures/Test_Subworkflow_Search_DB.json @@ -0,0 +1,64 @@ +{ + "name": "Search DB", + "nodes": [ + { + "parameters": {}, + "id": "64465f9b-63de-43f9-8d90-b5b2eb7a2dc7", + "name": "Execute Workflow Trigger", + "type": "n8n-nodes-base.executeWorkflowTrigger", + "typeVersion": 1, + "position": [ + 640, + 380 + ] + }, + { + "parameters": { + "assignments": { + "assignments": [ + { + "id": "6ad8dc55-20f3-45af-a724-c7ecac90d338", + "name": "response", + "value": "10 results found", + "type": "string" + } + ] + }, + "options": {} + }, + "id": "b580fd2b-00c8-4a52-8acb-024f204c0947", + "name": "Edit Fields", + "type": "n8n-nodes-base.set", + "typeVersion": 3.4, + "position": [ + 860, + 380 + ] + } + ], + "pinData": {}, + "connections": { + "Execute Workflow Trigger": { + "main": [ + [ + { + "node": "Edit Fields", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": false, + "settings": { + "executionOrder": "v1" + }, + "versionId": "6026f7a4-f5dc-4c27-9f83-3a02fc6e33ae", + "meta": { + "templateCredsSetupCompleted": true, + "instanceId": "27cc9b56542ad45b38725555722c50a1c3fee1670bbb67980558314ee08517c4" + }, + "id": "BFFhCdBZmNSkx4qf", + "tags": [] +} \ No newline at end of file diff --git a/packages/@n8n/nodes-langchain/nodes/retrievers/RetrieverWorkflow/RetrieverWorkflow.node.ts b/packages/@n8n/nodes-langchain/nodes/retrievers/RetrieverWorkflow/RetrieverWorkflow.node.ts index 5b2d852178..6b446149fc 100644 --- a/packages/@n8n/nodes-langchain/nodes/retrievers/RetrieverWorkflow/RetrieverWorkflow.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/retrievers/RetrieverWorkflow/RetrieverWorkflow.node.ts @@ -9,6 +9,7 @@ import type { INodeType, INodeTypeDescription, SupplyData, + INodeParameterResourceLocator, } from 'n8n-workflow'; import { BaseRetriever, type BaseRetrieverInput } from '@langchain/core/retrievers'; @@ -41,7 +42,7 @@ export class RetrieverWorkflow implements INodeType { name: 'retrieverWorkflow', icon: 'fa:box-open', group: ['transform'], - version: 1, + version: [1, 1.1], description: 'Use an n8n Workflow as Retriever', defaults: { name: 'Workflow Retriever', @@ -105,12 +106,26 @@ export class RetrieverWorkflow implements INodeType { displayOptions: { show: { source: ['database'], + '@version': [{ _cnd: { eq: 1 } }], }, }, default: '', required: true, description: 'The workflow to execute', }, + { + displayName: 'Workflow', + name: 'workflowId', + type: 'workflowSelector', + displayOptions: { + show: { + source: ['database'], + '@version': [{ _cnd: { gte: 1.1 } }], + }, + }, + default: '', + required: true, + }, // ---------------------------------- // source:parameter @@ -301,11 +316,21 @@ export class RetrieverWorkflow implements INodeType { const workflowInfo: IExecuteWorkflowInfo = {}; if (source === 'database') { - // Read workflow from database - workflowInfo.id = this.executeFunctions.getNodeParameter( - 'workflowId', - itemIndex, - ) as string; + const nodeVersion = this.executeFunctions.getNode().typeVersion; + if (nodeVersion === 1) { + workflowInfo.id = this.executeFunctions.getNodeParameter( + 'workflowId', + itemIndex, + ) as string; + } else { + const { value } = this.executeFunctions.getNodeParameter( + 'workflowId', + itemIndex, + {}, + ) as INodeParameterResourceLocator; + workflowInfo.id = value as string; + } + baseMetadata.workflowId = workflowInfo.id; } else if (source === 'parameter') { // Read workflow from parameter diff --git a/packages/@n8n/nodes-langchain/nodes/tools/ToolWorkflow/ToolWorkflow.node.ts b/packages/@n8n/nodes-langchain/nodes/tools/ToolWorkflow/ToolWorkflow.node.ts index 5ed96cbd60..0b00e17ac4 100644 --- a/packages/@n8n/nodes-langchain/nodes/tools/ToolWorkflow/ToolWorkflow.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/tools/ToolWorkflow/ToolWorkflow.node.ts @@ -8,6 +8,7 @@ import type { SupplyData, ExecutionError, IDataObject, + INodeParameterResourceLocator, } from 'n8n-workflow'; import { NodeConnectionType, NodeOperationError, jsonParse } from 'n8n-workflow'; import type { SetField, SetNodeOptions } from 'n8n-nodes-base/dist/nodes/Set/v2/helpers/interfaces'; @@ -32,7 +33,7 @@ export class ToolWorkflow implements INodeType { name: 'toolWorkflow', icon: 'fa:network-wired', group: ['transform'], - version: [1, 1.1], + version: [1, 1.1, 1.2], description: 'Uses another n8n workflow as a tool. Allows packaging any n8n node(s) as a tool.', defaults: { name: 'Call n8n Workflow Tool', @@ -142,6 +143,7 @@ export class ToolWorkflow implements INodeType { displayOptions: { show: { source: ['database'], + '@version': [{ _cnd: { lte: 1.1 } }], }, }, default: '', @@ -150,6 +152,20 @@ export class ToolWorkflow implements INodeType { hint: 'Can be found in the URL of the workflow', }, + { + displayName: 'Workflow', + name: 'workflowId', + type: 'workflowSelector', + displayOptions: { + show: { + source: ['database'], + '@version': [{ _cnd: { gte: 1.2 } }], + }, + }, + default: '', + required: true, + }, + // ---------------------------------- // source:parameter // ---------------------------------- @@ -368,7 +384,17 @@ export class ToolWorkflow implements INodeType { const workflowInfo: IExecuteWorkflowInfo = {}; if (source === 'database') { // Read workflow from database - workflowInfo.id = this.getNodeParameter('workflowId', itemIndex) as string; + const nodeVersion = this.getNode().typeVersion; + if (nodeVersion <= 1.1) { + workflowInfo.id = this.getNodeParameter('workflowId', itemIndex) as string; + } else { + const { value } = this.getNodeParameter( + 'workflowId', + itemIndex, + {}, + ) as INodeParameterResourceLocator; + workflowInfo.id = value as string; + } } else if (source === 'parameter') { // Read workflow from parameter const workflowJson = this.getNodeParameter('workflowJson', itemIndex) as string; diff --git a/packages/editor-ui/src/components/ParameterInput.vue b/packages/editor-ui/src/components/ParameterInput.vue index 533ad6c49d..b55e7b7c6d 100644 --- a/packages/editor-ui/src/components/ParameterInput.vue +++ b/packages/editor-ui/src/components/ParameterInput.vue @@ -15,7 +15,7 @@
+ (() => { }); const isResourceLocatorParameter = computed(() => { - return props.parameter.type === 'resourceLocator'; + return props.parameter.type === 'resourceLocator' || props.parameter.type === 'workflowSelector'; }); const isSecretParameter = computed(() => { diff --git a/packages/editor-ui/src/components/ParameterInputFull.vue b/packages/editor-ui/src/components/ParameterInputFull.vue index f2107df7db..d0952be794 100644 --- a/packages/editor-ui/src/components/ParameterInputFull.vue +++ b/packages/editor-ui/src/components/ParameterInputFull.vue @@ -137,7 +137,9 @@ const node = computed(() => ndvStore.activeNode); const hint = computed(() => i18n.nodeText().hint(props.parameter, props.path)); const isInputTypeString = computed(() => props.parameter.type === 'string'); const isInputTypeNumber = computed(() => props.parameter.type === 'number'); -const isResourceLocator = computed(() => props.parameter.type === 'resourceLocator'); +const isResourceLocator = computed( + () => props.parameter.type === 'resourceLocator' || props.parameter.type === 'workflowSelector', +); const isDropDisabled = computed( () => props.parameter.noDataExpression || diff --git a/packages/editor-ui/src/components/ResourceLocator/ResourceLocator.vue b/packages/editor-ui/src/components/ResourceLocator/ResourceLocator.vue index 29b8a498e6..6eebe37e34 100644 --- a/packages/editor-ui/src/components/ResourceLocator/ResourceLocator.vue +++ b/packages/editor-ui/src/components/ResourceLocator/ResourceLocator.vue @@ -828,125 +828,5 @@ export default defineComponent({ diff --git a/packages/editor-ui/src/components/ResourceLocator/resourceLocator.scss b/packages/editor-ui/src/components/ResourceLocator/resourceLocator.scss new file mode 100644 index 0000000000..d2ec38a981 --- /dev/null +++ b/packages/editor-ui/src/components/ResourceLocator/resourceLocator.scss @@ -0,0 +1,121 @@ +$--mode-selector-width: 92px; + +.modeSelector { + --input-background-color: initial; + --input-font-color: initial; + --input-border-color: initial; + flex-basis: $--mode-selector-width; + + input { + border-radius: var(--border-radius-base) 0 0 var(--border-radius-base); + border-right: none; + overflow: hidden; + + &:focus { + border-right: var(--border-base); + } + + &:disabled { + cursor: not-allowed !important; + } + } +} + +.resourceLocator { + display: flex; + flex-wrap: wrap; + position: relative; + + --input-issues-width: 28px; + + .inputContainer { + display: flex; + align-items: center; + width: 100%; + + --input-border-top-left-radius: 0; + --input-border-bottom-left-radius: 0; + + > div { + width: 100%; + } + } + + .background { + position: absolute; + background-color: var(--color-background-input-triple); + top: 0; + bottom: 0; + left: 0; + right: var(--input-issues-width); + border: 1px solid var(--border-color-base); + border-radius: var(--border-radius-base); + } + + &.multipleModes { + .inputContainer { + display: flex; + align-items: center; + flex-basis: calc(100% - $--mode-selector-width); + flex-grow: 1; + + input { + border-radius: 0 var(--border-radius-base) var(--border-radius-base) 0; + } + } + } +} + +.droppable { + --input-border-color: var(--color-secondary-tint-1); + --input-border-style: dashed; +} + +.activeDrop { + --input-border-color: var(--color-success); + --input-background-color: var(--color-success-tint-2); + --input-border-style: solid; + + textarea, + input { + cursor: grabbing !important; + } +} + +.selectInput input { + padding-right: 30px !important; + overflow: hidden; + text-overflow: ellipsis; +} + +.selectIcon { + cursor: pointer; + font-size: 14px; + transition: transform 0.3s; + transform: rotateZ(0); + + &.isReverse { + transform: rotateZ(180deg); + } +} + +.listModeInputContainer * { + cursor: pointer; +} + +.error { + max-width: 170px; + word-break: normal; + text-align: center; +} + +.openResourceLink { + width: 25px !important; + padding-left: var(--spacing-2xs); + padding-top: var(--spacing-4xs); + align-self: flex-start; +} + +.parameter-issues { + width: 25px !important; +} diff --git a/packages/editor-ui/src/components/WorkflowSelectorParameterInput/WorkflowSelectorParameterInput.vue b/packages/editor-ui/src/components/WorkflowSelectorParameterInput/WorkflowSelectorParameterInput.vue new file mode 100644 index 0000000000..41ba8d1a1b --- /dev/null +++ b/packages/editor-ui/src/components/WorkflowSelectorParameterInput/WorkflowSelectorParameterInput.vue @@ -0,0 +1,315 @@ + + + + + diff --git a/packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourceLocatorDropdown.ts b/packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourceLocatorDropdown.ts new file mode 100644 index 0000000000..f63b9207a9 --- /dev/null +++ b/packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourceLocatorDropdown.ts @@ -0,0 +1,34 @@ +import type { Ref } from 'vue'; +import { nextTick, ref } from 'vue'; + +export function useWorkflowResourceLocatorDropdown( + isListMode: Ref, + inputRef: Ref, +) { + const isDropdownVisible = ref(false); + const resourceDropdownHiding = ref(false); + + function showDropdown() { + if (!isListMode.value || resourceDropdownHiding.value) { + return; + } + + isDropdownVisible.value = true; + } + + function hideDropdown() { + isDropdownVisible.value = false; + + resourceDropdownHiding.value = true; + void nextTick(() => { + inputRef.value?.blur?.(); + resourceDropdownHiding.value = false; + }); + } + + return { + isDropdownVisible, + showDropdown, + hideDropdown, + }; +} diff --git a/packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourceLocatorModes.ts b/packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourceLocatorModes.ts new file mode 100644 index 0000000000..1e6cae4db5 --- /dev/null +++ b/packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourceLocatorModes.ts @@ -0,0 +1,67 @@ +import type { Ref } from 'vue'; +import { computed } from 'vue'; +import { useI18n } from '@/composables/useI18n'; +import type { + INodeParameterResourceLocator, + INodePropertyMode, + ResourceLocatorModes, +} from 'n8n-workflow'; +import type { Router } from 'vue-router'; +import { useWorkflowResourcesLocator } from './useWorkflowResourcesLocator'; + +export function useWorkflowResourceLocatorModes( + modelValue: Ref, + router: Router, +) { + const i18n = useI18n(); + const { getWorkflowName } = useWorkflowResourcesLocator(router); + + const supportedModes = computed(() => [ + { + name: 'list', + type: 'list', + displayName: i18n.baseText('resourceLocator.mode.list'), + }, + { + type: 'string', + name: 'id', + displayName: i18n.baseText('resourceLocator.mode.id'), + }, + ]); + + const selectedMode = computed(() => modelValue.value?.mode || 'list'); + const isListMode = computed(() => selectedMode.value === 'list'); + + function getUpdatedModePayload(value: ResourceLocatorModes): INodeParameterResourceLocator { + if (typeof modelValue !== 'object') { + return { __rl: true, value: modelValue, mode: value }; + } + + if (value === 'id' && selectedMode.value === 'list' && modelValue.value.value) { + return { __rl: true, mode: value, value: modelValue.value.value }; + } + + return { + __rl: true, + mode: value, + value: modelValue.value.value, + cachedResultName: getWorkflowName(modelValue.value.value?.toString() ?? ''), + }; + } + + function getModeLabel(mode: INodePropertyMode): string | null { + if (mode.name === 'id' || mode.name === 'list') { + return i18n.baseText(`resourceLocator.mode.${mode.name}`); + } + + return mode.displayName; + } + + return { + supportedModes, + selectedMode, + isListMode, + getUpdatedModePayload, + getModeLabel, + }; +} diff --git a/packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourcesLocator.ts b/packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourcesLocator.ts new file mode 100644 index 0000000000..a34e9018e9 --- /dev/null +++ b/packages/editor-ui/src/components/WorkflowSelectorParameterInput/useWorkflowResourcesLocator.ts @@ -0,0 +1,93 @@ +import { ref, computed } from 'vue'; +import { useWorkflowsStore } from '@/stores/workflows.store'; +import { sortBy } from 'lodash-es'; +import type { Router } from 'vue-router'; +import { VIEWS } from '@/constants'; + +import type { IWorkflowDb } from '@/Interface'; + +export function useWorkflowResourcesLocator(router: Router) { + const workflowsStore = useWorkflowsStore(); + const workflowsResources = ref>([]); + const isLoadingResources = ref(true); + const searchFilter = ref(''); + const PAGE_SIZE = 40; + + const sortedWorkflows = computed(() => + sortBy(workflowsStore.allWorkflows, (workflow) => + new Date(workflow.updatedAt).valueOf(), + ).reverse(), + ); + + const hasMoreWorkflowsToLoad = computed( + () => workflowsStore.allWorkflows.length > workflowsResources.value.length, + ); + + const filteredResources = computed(() => { + if (!searchFilter.value) return workflowsResources.value; + + return workflowsStore.allWorkflows + .filter((resource) => resource.name.toLowerCase().includes(searchFilter.value.toLowerCase())) + .map(workflowDbToResourceMapper); + }); + + async function populateNextWorkflowsPage() { + if (workflowsStore.allWorkflows.length <= 1) { + await workflowsStore.fetchAllWorkflows(); + } + const nextPage = sortedWorkflows.value.slice( + workflowsResources.value.length, + workflowsResources.value.length + PAGE_SIZE, + ); + + workflowsResources.value.push(...nextPage.map(workflowDbToResourceMapper)); + } + + async function setWorkflowsResources() { + isLoadingResources.value = true; + await populateNextWorkflowsPage(); + isLoadingResources.value = false; + } + + function workflowDbToResourceMapper(workflow: IWorkflowDb) { + return { + name: getWorkflowName(workflow.id), + value: workflow.id, + url: getWorkflowUrl(workflow.id), + }; + } + + function getWorkflowUrl(workflowId: string) { + const { href } = router.resolve({ name: VIEWS.WORKFLOW, params: { name: workflowId } }); + return href; + } + + function getWorkflowName(id: string): string { + const workflow = workflowsStore.getWorkflowById(id); + if (workflow) { + // Add the project name if it's not a personal project + if (workflow.homeProject && workflow.homeProject.type !== 'personal') { + return `${workflow.homeProject.name} — ${workflow.name}`; + } + return workflow.name; + } + return id; + } + + function onSearchFilter(filter: string) { + searchFilter.value = filter; + } + + return { + workflowsResources, + isLoadingResources, + hasMoreWorkflowsToLoad, + filteredResources, + searchFilter, + getWorkflowUrl, + onSearchFilter, + getWorkflowName, + populateNextWorkflowsPage, + setWorkflowsResources, + }; +} diff --git a/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow.node.ts b/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow.node.ts index 6ab3c4cbf1..0dfd4b2edf 100644 --- a/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow.node.ts +++ b/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow.node.ts @@ -16,7 +16,7 @@ export class ExecuteWorkflow implements INodeType { icon: 'fa:sign-in-alt', iconColor: 'orange-red', group: ['transform'], - version: 1, + version: [1, 1.1], subtitle: '={{"Workflow: " + $parameter["workflowId"]}}', description: 'Execute another workflow', defaults: { @@ -79,6 +79,7 @@ export class ExecuteWorkflow implements INodeType { displayOptions: { show: { source: ['database'], + '@version': [1], }, }, default: '', @@ -87,7 +88,20 @@ export class ExecuteWorkflow implements INodeType { description: "Note on using an expression here: if this node is set to run once with all items, they will all be sent to the same workflow. That workflow's ID will be calculated by evaluating the expression for the first input item.", }, - + { + displayName: 'Workflow', + name: 'workflowId', + type: 'workflowSelector', + displayOptions: { + show: { + source: ['database'], + '@version': [{ _cnd: { gte: 1.1 } }], + }, + }, + default: '', + required: true, + hint: "Note on using an expression here: if this node is set to run once with all items, they will all be sent to the same workflow. That workflow's ID will be calculated by evaluating the expression for the first input item.", + }, // ---------------------------------- // source:localFile // ---------------------------------- diff --git a/packages/nodes-base/nodes/ExecuteWorkflow/GenericFunctions.ts b/packages/nodes-base/nodes/ExecuteWorkflow/GenericFunctions.ts index 9e212eb194..7588040bf8 100644 --- a/packages/nodes-base/nodes/ExecuteWorkflow/GenericFunctions.ts +++ b/packages/nodes-base/nodes/ExecuteWorkflow/GenericFunctions.ts @@ -1,13 +1,27 @@ import { readFile as fsReadFile } from 'fs/promises'; import { NodeOperationError, jsonParse } from 'n8n-workflow'; -import type { IExecuteFunctions, IExecuteWorkflowInfo, IRequestOptions } from 'n8n-workflow'; +import type { + IExecuteFunctions, + IExecuteWorkflowInfo, + INodeParameterResourceLocator, + IRequestOptions, +} from 'n8n-workflow'; export async function getWorkflowInfo(this: IExecuteFunctions, source: string, itemIndex = 0) { const workflowInfo: IExecuteWorkflowInfo = {}; - + const nodeVersion = this.getNode().typeVersion; if (source === 'database') { // Read workflow from database - workflowInfo.id = this.getNodeParameter('workflowId', itemIndex) as string; + if (nodeVersion === 1) { + workflowInfo.id = this.getNodeParameter('workflowId', itemIndex) as string; + } else { + const { value } = this.getNodeParameter( + 'workflowId', + itemIndex, + {}, + ) as INodeParameterResourceLocator; + workflowInfo.id = value as string; + } } else if (source === 'localFile') { // Read workflow from filesystem const workflowPath = this.getNodeParameter('workflowPath', itemIndex) as string; diff --git a/packages/workflow/src/Interfaces.ts b/packages/workflow/src/Interfaces.ts index a66dcc5eb4..cab0c6d0e1 100644 --- a/packages/workflow/src/Interfaces.ts +++ b/packages/workflow/src/Interfaces.ts @@ -1204,7 +1204,8 @@ export type NodePropertyTypes = | 'resourceMapper' | 'filter' | 'assignmentCollection' - | 'credentials'; + | 'credentials' + | 'workflowSelector'; export type CodeAutocompleteTypes = 'function' | 'functionItem'; diff --git a/packages/workflow/src/NodeHelpers.ts b/packages/workflow/src/NodeHelpers.ts index 1f27bacee9..485ad0d9b1 100644 --- a/packages/workflow/src/NodeHelpers.ts +++ b/packages/workflow/src/NodeHelpers.ts @@ -1580,7 +1580,7 @@ export function addToIssuesIfMissing( (nodeProperties.type === 'multiOptions' && Array.isArray(value) && value.length === 0) || (nodeProperties.type === 'dateTime' && value === undefined) || (nodeProperties.type === 'options' && (value === '' || value === undefined)) || - (nodeProperties.type === 'resourceLocator' && + ((nodeProperties.type === 'resourceLocator' || nodeProperties.type === 'workflowSelector') && !isValidResourceLocatorParameterValue(value as INodeParameterResourceLocator)) ) { // Parameter is required but empty @@ -1654,7 +1654,10 @@ export function getParameterIssues( } } - if (nodeProperties.type === 'resourceLocator' && isDisplayed) { + if ( + (nodeProperties.type === 'resourceLocator' || nodeProperties.type === 'workflowSelector') && + isDisplayed + ) { const value = getParameterValueByPath(nodeValues, nodeProperties.name, path); if (isINodeParameterResourceLocator(value)) { const mode = nodeProperties.modes?.find((option) => option.name === value.mode); From 873056a92e52cc629d2873c960656d5f06d4728e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Fri, 23 Aug 2024 08:19:59 +0200 Subject: [PATCH 020/233] fix(core): Restore Redis cache key (#10520) --- packages/@n8n/config/src/configs/cache.config.ts | 2 +- packages/@n8n/config/test/config.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@n8n/config/src/configs/cache.config.ts b/packages/@n8n/config/src/configs/cache.config.ts index fa1295d583..50c3b8d1b1 100644 --- a/packages/@n8n/config/src/configs/cache.config.ts +++ b/packages/@n8n/config/src/configs/cache.config.ts @@ -15,7 +15,7 @@ class MemoryConfig { class RedisConfig { /** Prefix for cache keys in Redis. */ @Env('N8N_CACHE_REDIS_KEY_PREFIX') - prefix: string = 'redis'; + prefix: string = 'cache'; /** Time to live (in milliseconds) for data cached in Redis. 0 for no TTL. */ @Env('N8N_CACHE_REDIS_TTL') diff --git a/packages/@n8n/config/test/config.test.ts b/packages/@n8n/config/test/config.test.ts index adecff7f9d..eb7c077a0a 100644 --- a/packages/@n8n/config/test/config.test.ts +++ b/packages/@n8n/config/test/config.test.ts @@ -181,7 +181,7 @@ describe('GlobalConfig', () => { ttl: 3600000, }, redis: { - prefix: 'redis', + prefix: 'cache', ttl: 3600000, }, }, From 00412563b6a9731daeba47a4de307834e547f016 Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Fri, 23 Aug 2024 10:35:34 +0300 Subject: [PATCH 021/233] fix: Fix resolving of k6 executable (no-changelog) (#10511) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Iván Ovejero --- .../benchmark/src/testExecution/k6Executor.ts | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/@n8n/benchmark/src/testExecution/k6Executor.ts b/packages/@n8n/benchmark/src/testExecution/k6Executor.ts index 903d06ca74..49386993a5 100644 --- a/packages/@n8n/benchmark/src/testExecution/k6Executor.ts +++ b/packages/@n8n/benchmark/src/testExecution/k6Executor.ts @@ -1,4 +1,4 @@ -import { $ } from 'zx'; +import { $, which } from 'zx'; import { Scenario } from '@/types/scenario'; /** @@ -14,15 +14,31 @@ export class K6Executor { // For 1 min with 5 virtual users const stage = '1m:5'; + const k6ExecutablePath = await this.resolveK6ExecutablePath(); + const processPromise = $({ cwd: scenario.scenarioDirPath, env: { API_BASE_URL: this.n8nApiBaseUrl, }, - })`${this.k6ExecutablePath} run --quiet --stage ${stage} ${scenario.scriptPath}`; + })`${k6ExecutablePath} run --quiet --stage ${stage} ${scenario.scriptPath}`; for await (const chunk of processPromise.stdout) { console.log(chunk.toString()); } } + + /** + * @returns Resolved path to the k6 executable + */ + private async resolveK6ExecutablePath(): Promise { + const k6ExecutablePath = await which(this.k6ExecutablePath, { nothrow: true }); + if (!k6ExecutablePath) { + throw new Error( + 'Could not find k6 executable based on your `PATH`. Please ensure k6 is available in your system and add it to your `PATH` or specify the path to the k6 executable using the `K6_PATH` environment variable.', + ); + } + + return k6ExecutablePath; + } } From 9cd7f1ec0de2cfab3fa226b9338f9791029cd347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milorad=20FIlipovi=C4=87?= Date: Fri, 23 Aug 2024 10:16:10 +0200 Subject: [PATCH 022/233] fix(editor): Prevent dialog overlay from rendering on top of AI Assistant (no-changelog) (#10509) --- .../editor-ui/src/components/AskAssistant/AskAssistantChat.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor-ui/src/components/AskAssistant/AskAssistantChat.vue b/packages/editor-ui/src/components/AskAssistant/AskAssistantChat.vue index 6a379e0a5f..38255426c5 100644 --- a/packages/editor-ui/src/components/AskAssistant/AskAssistantChat.vue +++ b/packages/editor-ui/src/components/AskAssistant/AskAssistantChat.vue @@ -97,7 +97,7 @@ function onClose() { .container { grid-area: rightsidebar; height: 100%; - z-index: 3000; /* Above NDV, below notifications */ + z-index: 99999; /* Needs to be high enough so it doesn't get covered by element-ui dialogs */ } .wrapper { From dd0c098b86330ba09c1df5f7fceb9df47958ae04 Mon Sep 17 00:00:00 2001 From: Michael Kret <88898367+michael-radency@users.noreply.github.com> Date: Fri, 23 Aug 2024 11:48:01 +0300 Subject: [PATCH 023/233] fix(AI Transform Node): Data Transformation > Other section should not contain node (no-changelog) (#10519) --- .../NodeCreator/composables/useViewStacks.ts | 17 +++++++++++++++-- .../components/Node/NodeCreator/viewsData.ts | 13 ++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/editor-ui/src/components/Node/NodeCreator/composables/useViewStacks.ts b/packages/editor-ui/src/components/Node/NodeCreator/composables/useViewStacks.ts index 891c360e2c..2ce7aad64d 100644 --- a/packages/editor-ui/src/components/Node/NodeCreator/composables/useViewStacks.ts +++ b/packages/editor-ui/src/components/Node/NodeCreator/composables/useViewStacks.ts @@ -36,8 +36,14 @@ import { useI18n } from '@/composables/useI18n'; import { useKeyboardNavigation } from './useKeyboardNavigation'; import { useNodeTypesStore } from '@/stores/nodeTypes.store'; -import type { INodeInputFilter, NodeConnectionType, Themed } from 'n8n-workflow'; +import { + AI_TRANSFORM_NODE_TYPE, + type INodeInputFilter, + type NodeConnectionType, + type Themed, +} from 'n8n-workflow'; import { useCanvasStore } from '@/stores/canvas.store'; +import { usePostHog } from '../../../../stores/posthog.store'; interface ViewStack { uuid?: string; @@ -350,7 +356,14 @@ export const useViewStacks = defineStore('nodeCreatorViewStacks', () => { if (!stack?.items) { const subcategory = stack?.subcategory ?? DEFAULT_SUBCATEGORY; - const itemsInSubcategory = itemsBySubcategory.value[subcategory]; + let itemsInSubcategory = itemsBySubcategory.value[subcategory]; + + const aiEnabled = usePostHog().isAiEnabled(); + if (!aiEnabled) { + itemsInSubcategory = itemsInSubcategory.filter( + (item) => item.key !== AI_TRANSFORM_NODE_TYPE, + ); + } const sections = stack.sections; if (sections) { diff --git a/packages/editor-ui/src/components/Node/NodeCreator/viewsData.ts b/packages/editor-ui/src/components/Node/NodeCreator/viewsData.ts index 479a85f644..33d3626d7e 100644 --- a/packages/editor-ui/src/components/Node/NodeCreator/viewsData.ts +++ b/packages/editor-ui/src/components/Node/NodeCreator/viewsData.ts @@ -64,7 +64,6 @@ import { NodeConnectionType } from 'n8n-workflow'; import { useTemplatesStore } from '@/stores/templates.store'; import type { BaseTextKey } from '@/plugins/i18n'; import { camelCase } from 'lodash-es'; -import { usePostHog } from '@/stores/posthog.store'; export interface NodeViewItemSection { key: string; @@ -431,12 +430,12 @@ export function TriggerView() { export function RegularView(nodes: SimplifiedNodeType[]) { const i18n = useI18n(); - const popularItemsSubcategory = [SET_NODE_TYPE, CODE_NODE_TYPE, DATETIME_NODE_TYPE]; - const aiEnabled = usePostHog().isAiEnabled(); - - if (aiEnabled) { - popularItemsSubcategory.push(AI_TRANSFORM_NODE_TYPE); - } + const popularItemsSubcategory = [ + SET_NODE_TYPE, + CODE_NODE_TYPE, + DATETIME_NODE_TYPE, + AI_TRANSFORM_NODE_TYPE, + ]; const view: NodeView = { value: REGULAR_NODE_CREATOR_VIEW, From 8403f4aa1123b2da6ce4bbf2d76a6b9a56a93a23 Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Fri, 23 Aug 2024 13:19:12 +0300 Subject: [PATCH 024/233] ci: Configure eslint for benchmark cli (#10480) --- packages/@n8n/benchmark/.eslintrc.js | 30 +++++++++++++++++++ packages/@n8n/benchmark/package.json | 2 ++ .../n8nApiClient/authenticatedN8nApiClient.ts | 2 +- .../src/n8nApiClient/n8nApiClient.ts | 9 +++--- .../src/n8nApiClient/workflowsApiClient.ts | 4 +-- .../src/scenario/scenarioDataLoader.ts | 15 +++++----- .../benchmark/src/scenario/scenarioLoader.ts | 21 ++++++++++++- .../benchmark/src/testExecution/k6Executor.ts | 4 +-- .../src/testExecution/scenarioDataImporter.ts | 4 +-- .../src/testExecution/scenarioRunner.ts | 8 ++--- 10 files changed, 75 insertions(+), 24 deletions(-) create mode 100644 packages/@n8n/benchmark/.eslintrc.js diff --git a/packages/@n8n/benchmark/.eslintrc.js b/packages/@n8n/benchmark/.eslintrc.js new file mode 100644 index 0000000000..99c277f212 --- /dev/null +++ b/packages/@n8n/benchmark/.eslintrc.js @@ -0,0 +1,30 @@ +const sharedOptions = require('@n8n_io/eslint-config/shared'); + +/** + * @type {import('@types/eslint').ESLint.ConfigData} + */ +module.exports = { + extends: ['@n8n_io/eslint-config/node'], + + ...sharedOptions(__dirname), + + parserOptions: { + project: './tsconfig.json', + }, + + ignorePatterns: ['scenarios/**'], + + rules: { + 'n8n-local-rules/no-plain-errors': 'off', + complexity: 'error', + }, + + overrides: [ + { + files: ['./src/commands/*.ts'], + rules: { + 'import/no-default-export': 'off', + }, + }, + ], +}; diff --git a/packages/@n8n/benchmark/package.json b/packages/@n8n/benchmark/package.json index 3a7afb50a3..2a3ad1c214 100644 --- a/packages/@n8n/benchmark/package.json +++ b/packages/@n8n/benchmark/package.json @@ -5,6 +5,8 @@ "main": "dist/index", "scripts": { "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json", + "lint": "eslint .", + "lintfix": "eslint . --fix", "start": "./bin/n8n-benchmark", "test": "echo \"Error: no test specified\" && exit 1", "typecheck": "tsc --noEmit", diff --git a/packages/@n8n/benchmark/src/n8nApiClient/authenticatedN8nApiClient.ts b/packages/@n8n/benchmark/src/n8nApiClient/authenticatedN8nApiClient.ts index 93cd767347..b7ebc6800d 100644 --- a/packages/@n8n/benchmark/src/n8nApiClient/authenticatedN8nApiClient.ts +++ b/packages/@n8n/benchmark/src/n8nApiClient/authenticatedN8nApiClient.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'node:assert'; +import type { AxiosRequestConfig } from 'axios'; import { N8nApiClient } from './n8nApiClient'; -import { AxiosRequestConfig } from 'axios'; export class AuthenticatedN8nApiClient extends N8nApiClient { constructor( diff --git a/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts b/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts index 86ca52aff8..b1ec2d5162 100644 --- a/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts +++ b/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts @@ -1,4 +1,5 @@ -import axios, { AxiosError, AxiosRequestConfig } from 'axios'; +import type { AxiosError, AxiosRequestConfig } from 'axios'; +import axios from 'axios'; export class N8nApiClient { constructor(public readonly apiBaseUrl: string) {} @@ -11,7 +12,7 @@ export class N8nApiClient { while (Date.now() - START_TIME < TIMEOUT_MS) { try { - const response = await axios.request({ + const response = await axios.request<{ status: 'ok' }>({ url: `${this.apiBaseUrl}/${HEALTH_ENDPOINT}`, method: 'GET', }); @@ -72,7 +73,7 @@ export class N8nApiClient { return `${this.apiBaseUrl}/rest${endpoint}`; } - private delay(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + private async delay(ms: number): Promise { + return await new Promise((resolve) => setTimeout(resolve, ms)); } } diff --git a/packages/@n8n/benchmark/src/n8nApiClient/workflowsApiClient.ts b/packages/@n8n/benchmark/src/n8nApiClient/workflowsApiClient.ts index 18f2ecbcda..825303a111 100644 --- a/packages/@n8n/benchmark/src/n8nApiClient/workflowsApiClient.ts +++ b/packages/@n8n/benchmark/src/n8nApiClient/workflowsApiClient.ts @@ -1,5 +1,5 @@ -import { Workflow } from '@/n8nApiClient/n8nApiClient.types'; -import { AuthenticatedN8nApiClient } from './authenticatedN8nApiClient'; +import type { AuthenticatedN8nApiClient } from './authenticatedN8nApiClient'; +import type { Workflow } from '@/n8nApiClient/n8nApiClient.types'; export class WorkflowApiClient { constructor(private readonly apiClient: AuthenticatedN8nApiClient) {} diff --git a/packages/@n8n/benchmark/src/scenario/scenarioDataLoader.ts b/packages/@n8n/benchmark/src/scenario/scenarioDataLoader.ts index 43638a2e00..d59857cc62 100644 --- a/packages/@n8n/benchmark/src/scenario/scenarioDataLoader.ts +++ b/packages/@n8n/benchmark/src/scenario/scenarioDataLoader.ts @@ -1,7 +1,7 @@ -import fs from 'node:fs'; -import path from 'node:path'; -import { Scenario } from '@/types/scenario'; -import { Workflow } from '@/n8nApiClient/n8nApiClient.types'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import type { Scenario } from '@/types/scenario'; +import type { Workflow } from '@/n8nApiClient/n8nApiClient.types'; /** * Loads scenario data files from FS @@ -25,11 +25,10 @@ export class ScenarioDataFileLoader { const fileContent = fs.readFileSync(workflowFilePath, 'utf8'); try { - return JSON.parse(fileContent); + return JSON.parse(fileContent) as Workflow; } catch (error) { - throw new Error( - `Failed to parse workflow file ${workflowFilePath}: ${error instanceof Error ? error.message : error}`, - ); + const e = error as Error; + throw new Error(`Failed to parse workflow file ${workflowFilePath}: ${e.message}`); } } } diff --git a/packages/@n8n/benchmark/src/scenario/scenarioLoader.ts b/packages/@n8n/benchmark/src/scenario/scenarioLoader.ts index 475ce495ac..13cc52daf0 100644 --- a/packages/@n8n/benchmark/src/scenario/scenarioLoader.ts +++ b/packages/@n8n/benchmark/src/scenario/scenarioLoader.ts @@ -48,7 +48,11 @@ export class ScenarioLoader { private loadAndValidateScenarioManifest( scenarioManifestPath: string, ): [ScenarioManifest, null] | [null, string[]] { - const scenario = JSON.parse(fs.readFileSync(scenarioManifestPath, 'utf8')); + const [scenario, error] = this.loadScenarioManifest(scenarioManifestPath); + if (!scenario) { + return [null, [error]]; + } + const validationErrors: string[] = []; if (!scenario.name) { @@ -61,6 +65,21 @@ export class ScenarioLoader { return validationErrors.length === 0 ? [scenario, null] : [null, validationErrors]; } + private loadScenarioManifest( + scenarioManifestPath: string, + ): [ScenarioManifest, null] | [null, string] { + try { + const scenario = JSON.parse( + fs.readFileSync(scenarioManifestPath, 'utf8'), + ) as ScenarioManifest; + + return [scenario, null]; + } catch (error) { + const message = error instanceof Error ? error.message : JSON.stringify(error); + return [null, `Failed to parse manifest ${scenarioManifestPath}: ${message}`]; + } + } + private formScenarioId(scenarioPath: string): string { return createHash('sha256').update(scenarioPath).digest('hex'); } diff --git a/packages/@n8n/benchmark/src/testExecution/k6Executor.ts b/packages/@n8n/benchmark/src/testExecution/k6Executor.ts index 49386993a5..176f1c15bb 100644 --- a/packages/@n8n/benchmark/src/testExecution/k6Executor.ts +++ b/packages/@n8n/benchmark/src/testExecution/k6Executor.ts @@ -1,5 +1,5 @@ import { $, which } from 'zx'; -import { Scenario } from '@/types/scenario'; +import type { Scenario } from '@/types/scenario'; /** * Executes test scenarios using k6 @@ -24,7 +24,7 @@ export class K6Executor { })`${k6ExecutablePath} run --quiet --stage ${stage} ${scenario.scriptPath}`; for await (const chunk of processPromise.stdout) { - console.log(chunk.toString()); + console.log((chunk as Buffer).toString()); } } diff --git a/packages/@n8n/benchmark/src/testExecution/scenarioDataImporter.ts b/packages/@n8n/benchmark/src/testExecution/scenarioDataImporter.ts index 1c1ec3777e..25fc4cf875 100644 --- a/packages/@n8n/benchmark/src/testExecution/scenarioDataImporter.ts +++ b/packages/@n8n/benchmark/src/testExecution/scenarioDataImporter.ts @@ -1,5 +1,5 @@ -import { AuthenticatedN8nApiClient } from '@/n8nApiClient/authenticatedN8nApiClient'; -import { Workflow } from '@/n8nApiClient/n8nApiClient.types'; +import type { AuthenticatedN8nApiClient } from '@/n8nApiClient/authenticatedN8nApiClient'; +import type { Workflow } from '@/n8nApiClient/n8nApiClient.types'; import { WorkflowApiClient } from '@/n8nApiClient/workflowsApiClient'; /** diff --git a/packages/@n8n/benchmark/src/testExecution/scenarioRunner.ts b/packages/@n8n/benchmark/src/testExecution/scenarioRunner.ts index 83e1077680..e9a9dfc396 100644 --- a/packages/@n8n/benchmark/src/testExecution/scenarioRunner.ts +++ b/packages/@n8n/benchmark/src/testExecution/scenarioRunner.ts @@ -1,7 +1,7 @@ -import { Scenario } from '@/types/scenario'; -import { N8nApiClient } from '@/n8nApiClient/n8nApiClient'; -import { ScenarioDataFileLoader } from '@/scenario/scenarioDataLoader'; -import { K6Executor } from './k6Executor'; +import type { K6Executor } from './k6Executor'; +import type { Scenario } from '@/types/scenario'; +import type { N8nApiClient } from '@/n8nApiClient/n8nApiClient'; +import type { ScenarioDataFileLoader } from '@/scenario/scenarioDataLoader'; import { ScenarioDataImporter } from '@/testExecution/scenarioDataImporter'; import { AuthenticatedN8nApiClient } from '@/n8nApiClient/authenticatedN8nApiClient'; From a1a1b0a7b4997a8b73d0b952d8586f1433100e0d Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Fri, 23 Aug 2024 14:43:26 +0300 Subject: [PATCH 025/233] feat: Benchmark env with run scripts (no-changelog) (#10477) --- .github/pull_request_title_conventions.md | 31 +-- .../workflows/benchmark-destroy-nightly.yml | 40 ++++ .github/workflows/benchmark-nightly.yml | 68 +++++++ packages/@n8n/benchmark/.gitignore | 4 + packages/@n8n/benchmark/README.md | 8 + .../@n8n/benchmark/infra/.terraform.lock.hcl | 60 ++++++ .../@n8n/benchmark/infra/benchmark-env.tf | 54 +++++ .../infra/modules/benchmark-vm/output.tf | 7 + .../infra/modules/benchmark-vm/vars.tf | 31 +++ .../infra/modules/benchmark-vm/vm.tf | 136 +++++++++++++ packages/@n8n/benchmark/infra/output.tf | 3 + packages/@n8n/benchmark/infra/providers.tf | 23 +++ packages/@n8n/benchmark/infra/vars.tf | 34 ++++ packages/@n8n/benchmark/package.json | 2 + .../benchmark/scripts/destroyCloudEnv.mjs | 90 +++++++++ .../@n8n/benchmark/scripts/runInCloud.mjs | 185 ++++++++++++++++++ .../benchmark/scripts/runOnVm/bootstrap.sh | 38 ++++ .../n8nSetups/sqlite/docker-compose.yml | 16 ++ .../benchmark/scripts/runOnVm/runOnVm.mjs | 53 +++++ packages/@n8n/benchmark/scripts/sshClient.mjs | 28 +++ .../benchmark/scripts/terraformClient.mjs | 53 +++++ .../src/n8nApiClient/n8nApiClient.ts | 6 + 22 files changed, 955 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/benchmark-destroy-nightly.yml create mode 100644 .github/workflows/benchmark-nightly.yml create mode 100644 packages/@n8n/benchmark/.gitignore create mode 100644 packages/@n8n/benchmark/infra/.terraform.lock.hcl create mode 100644 packages/@n8n/benchmark/infra/benchmark-env.tf create mode 100644 packages/@n8n/benchmark/infra/modules/benchmark-vm/output.tf create mode 100644 packages/@n8n/benchmark/infra/modules/benchmark-vm/vars.tf create mode 100644 packages/@n8n/benchmark/infra/modules/benchmark-vm/vm.tf create mode 100644 packages/@n8n/benchmark/infra/output.tf create mode 100644 packages/@n8n/benchmark/infra/providers.tf create mode 100644 packages/@n8n/benchmark/infra/vars.tf create mode 100644 packages/@n8n/benchmark/scripts/destroyCloudEnv.mjs create mode 100755 packages/@n8n/benchmark/scripts/runInCloud.mjs create mode 100644 packages/@n8n/benchmark/scripts/runOnVm/bootstrap.sh create mode 100644 packages/@n8n/benchmark/scripts/runOnVm/n8nSetups/sqlite/docker-compose.yml create mode 100755 packages/@n8n/benchmark/scripts/runOnVm/runOnVm.mjs create mode 100644 packages/@n8n/benchmark/scripts/sshClient.mjs create mode 100644 packages/@n8n/benchmark/scripts/terraformClient.mjs diff --git a/.github/pull_request_title_conventions.md b/.github/pull_request_title_conventions.md index 8808000e3b..0fc951d0e4 100644 --- a/.github/pull_request_title_conventions.md +++ b/.github/pull_request_title_conventions.md @@ -11,19 +11,19 @@ A PR title consists of these elements: | | Capitalized | | No period at the end. │ │ - │ └─⫸ Scope: API|core|editor|* Node + │ └─⫸ Scope: API|core|editor|* Node|benchmark │ └─⫸ Type: build|ci|docs|feat|fix|perf|refactor|test ``` - PR title - - type - - scope (*optional*) - - summary + - type + - scope (_optional_) + - summary - PR description - - body (optional) - - blank line - - footer (optional) + - body (optional) + - blank line + - footer (optional) The structure looks like this: @@ -46,13 +46,14 @@ If the prefix is `feat`, `fix` or `perf`, it will appear in the changelog. H The scope should specify the place of the commit change as long as the commit clearly addresses one of the following supported scopes. (Otherwise, omit the scope!) -- `API` - changes to the *public* API +- `API` - changes to the _public_ API - `core` - changes to the core / private API / backend of n8n - `editor` - changes to the Editor UI - `* Node` - changes to a specific node or trigger node (”`*`” to be replaced with the node name, not its display name), e.g. - - mattermost → Mattermost Node - - microsoftToDo → Microsoft To Do Node - - n8n → n8n Node + - mattermost → Mattermost Node + - microsoftToDo → Microsoft To Do Node + - n8n → n8n Node +- `benchmark` - changes to the Benchmark cli ### **Summary** @@ -60,8 +61,8 @@ The summary contains succinct description of the change: - use the imperative, present tense: "change" not "changed" nor "changes" - capitalize the first letter -- *no* dot (.) at the end -- do *not* include Linear ticket IDs etc. (e.g. N8N-1234) +- _no_ dot (.) at the end +- do _not_ include Linear ticket IDs etc. (e.g. N8N-1234) - suffix with “(no-changelog)” for commits / PRs that should not get mentioned in the changelog. ### **Body (optional)** @@ -95,7 +96,7 @@ Closes # A Breaking Change section should start with the phrase "`BREAKING CHANGE:` " followed by a summary of the breaking change, a blank line, and a detailed description of the breaking change that also includes migration instructions. > 💡 A breaking change can additionally also be marked by adding a “`!`” to the header, right before the “`:`”, e.g. `feat(editor)!: Remove support for dark mode` -> +> > This makes locating breaking changes easier when just skimming through commit messages. > 💡 The breaking changes must also be added to the [packages/cli/BREAKING-CHANGES.md](https://github.com/n8n-io/n8n/blob/master/packages/cli/BREAKING-CHANGES.md) file located in the n8n repository. @@ -109,4 +110,4 @@ If the commit reverts a previous commit, it should begin with `revert:` , foll The content of the commit message body should contain: - information about the SHA of the commit being reverted in the following format: `This reverts commit `, -- a clear description of the reason for reverting the commit message. \ No newline at end of file +- a clear description of the reason for reverting the commit message. diff --git a/.github/workflows/benchmark-destroy-nightly.yml b/.github/workflows/benchmark-destroy-nightly.yml new file mode 100644 index 0000000000..446801fd98 --- /dev/null +++ b/.github/workflows/benchmark-destroy-nightly.yml @@ -0,0 +1,40 @@ +name: Destroy Benchmark Env + +on: + schedule: + - cron: '30 4 * * *' + workflow_dispatch: + +permissions: + id-token: write + contents: read + +jobs: + build: + runs-on: ubuntu-latest + environment: benchmark + + steps: + - name: Checkout + uses: actions/checkout@v4.1.1 + + - name: Azure login + uses: azure/login@v2.1.1 + with: + client-id: ${{ secrets.BENCHMARK_ARM_CLIENT_ID }} + tenant-id: ${{ secrets.BENCHMARK_ARM_TENANT_ID }} + subscription-id: ${{ secrets.BENCHMARK_ARM_SUBSCRIPTION_ID }} + + - run: Setup node + - uses: actions/setup-node@v4.0.2 + with: + node-version: 20.x + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Destroy cloud env + if: github.event.inputs.debug == 'true' + run: pnpm destroy-cloud-env + working-directory: packages/@n8n/benchmark diff --git a/.github/workflows/benchmark-nightly.yml b/.github/workflows/benchmark-nightly.yml new file mode 100644 index 0000000000..2a15587793 --- /dev/null +++ b/.github/workflows/benchmark-nightly.yml @@ -0,0 +1,68 @@ +name: Run Nightly Benchmark +run-name: Benchmark ${{ inputs.n8n_tag }} + +on: + schedule: + - cron: '0 2 * * *' + workflow_dispatch: + inputs: + debug: + description: 'Use debug logging' + required: true + default: 'false' + n8n_tag: + description: 'Name of the n8n docker tag to run the benchmark against.' + required: true + default: 'nightly' + benchmark_tag: + description: 'Name of the benchmark cli docker tag to run the benchmark with.' + required: true + default: 'latest' + +env: + ARM_CLIENT_ID: ${{ secrets.BENCHMARK_ARM_CLIENT_ID }} + ARM_SUBSCRIPTION_ID: ${{ secrets.BENCHMARK_ARM_SUBSCRIPTION_ID }} + ARM_TENANT_ID: ${{ secrets.BENCHMARK_ARM_TENANT_ID }} + +permissions: + id-token: write + contents: read + +jobs: + build: + runs-on: ubuntu-latest + environment: benchmark + + steps: + - name: Checkout + uses: actions/checkout@v4.1.1 + + - uses: hashicorp/setup-terraform@v3 + with: + terraform_version: '1.8.5' + + - run: corepack enable + - uses: actions/setup-node@v4.0.2 + with: + node-version: 20.x + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Azure login + uses: azure/login@v2.1.1 + with: + client-id: ${{ env.ARM_CLIENT_ID }} + tenant-id: ${{ env.ARM_TENANT_ID }} + subscription-id: ${{ env.ARM_SUBSCRIPTION_ID }} + + - name: Run the benchmark with debug logging + if: github.event.inputs.debug == 'true' + run: pnpm run-in-cloud sqlite --debug + working-directory: packages/@n8n/benchmark + + - name: Run the benchmark + if: github.event.inputs.debug != 'true' + run: pnpm run-in-cloud sqlite + working-directory: packages/@n8n/benchmark diff --git a/packages/@n8n/benchmark/.gitignore b/packages/@n8n/benchmark/.gitignore new file mode 100644 index 0000000000..ee04166857 --- /dev/null +++ b/packages/@n8n/benchmark/.gitignore @@ -0,0 +1,4 @@ +**/.terraform/* +**/*.tfstate* +**/*.tfvars +privatekey.pem diff --git a/packages/@n8n/benchmark/README.md b/packages/@n8n/benchmark/README.md index 569bcf897f..a16e03572a 100644 --- a/packages/@n8n/benchmark/README.md +++ b/packages/@n8n/benchmark/README.md @@ -40,6 +40,14 @@ N8N_USER_EMAIL=user@n8n.io N8N_USER_PASSWORD=password ./bin/n8n-benchmark run K6_PATH=/opt/homebrew/bin/k6 N8N_USER_EMAIL=user@n8n.io N8N_USER_PASSWORD=password ./bin/n8n-benchmark run ``` +## Running in the cloud + +There's a script to run the performance tests in a cloud environment. The script provisions a cloud environment, sets up n8n in the environment, runs the tests and destroys the environment. + +```sh +pnpm run-in-cloud +``` + ## Configuration The configuration options the cli accepts can be seen from [config.ts](./src/config/config.ts) diff --git a/packages/@n8n/benchmark/infra/.terraform.lock.hcl b/packages/@n8n/benchmark/infra/.terraform.lock.hcl new file mode 100644 index 0000000000..3012516861 --- /dev/null +++ b/packages/@n8n/benchmark/infra/.terraform.lock.hcl @@ -0,0 +1,60 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/azurerm" { + version = "3.115.0" + constraints = "~> 3.115.0" + hashes = [ + "h1:O7C3Xb+MSOc9C/eAJ5C/CiJ4vuvUsYxxIzr9ZurmHNI=", + "zh:0ea93abd53cb872691bad6d5625bda88b5d9619ea813c208b36e0ee236308589", + "zh:26703cb9c2c38bc43e97bc83af03559d065750856ea85834b71fbcb2ef9d935c", + "zh:316255a3391c49fe9bd7c5b6aa53b56dd490e1083d19b722e7b8f956a2dfe004", + "zh:431637ae90c592126fb1ec813fee6390604275438a0d5e15904c65b0a6a0f826", + "zh:4cee0fa2e84f89853723c0bc72b7debf8ea2ffffc7ae34ff28d8a69269d3a879", + "zh:64a3a3c78ea877515365ed336bd0f3abbe71db7c99b3d2837915fbca168d429c", + "zh:7380d7b503b5a87fd71a31360c3eeab504f78e4f314824e3ceda724d9dc74cf0", + "zh:974213e05708037a6d2d8c58cc84981819138f44fe40e344034eb80e16ca6012", + "zh:9a91614de0476074e9c62bbf08d3bb9c64adbd1d3a4a2b5a3e8e41d9d6d5672f", + "zh:a438471c85b8788ab21bdef4cd5ca391a46cbae33bd0262668a80f5e6c4610e1", + "zh:bf823f2c941b336a1208f015466212b1a8fdf6da28abacf59bea708377709d9e", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} + +provider "registry.terraform.io/hashicorp/random" { + version = "3.6.2" + hashes = [ + "h1:VavG5unYCa3SYISMKF9pzc3718M0bhPlcbUZZGl7wuo=", + "zh:0ef01a4f81147b32c1bea3429974d4d104bbc4be2ba3cfa667031a8183ef88ec", + "zh:1bcd2d8161e89e39886119965ef0f37fcce2da9c1aca34263dd3002ba05fcb53", + "zh:37c75d15e9514556a5f4ed02e1548aaa95c0ecd6ff9af1119ac905144c70c114", + "zh:4210550a767226976bc7e57d988b9ce48f4411fa8a60cd74a6b246baf7589dad", + "zh:562007382520cd4baa7320f35e1370ffe84e46ed4e2071fdc7e4b1a9b1f8ae9b", + "zh:5efb9da90f665e43f22c2e13e0ce48e86cae2d960aaf1abf721b497f32025916", + "zh:6f71257a6b1218d02a573fc9bff0657410404fb2ef23bc66ae8cd968f98d5ff6", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:9647e18f221380a85f2f0ab387c68fdafd58af6193a932417299cdcae4710150", + "zh:bb6297ce412c3c2fa9fec726114e5e0508dd2638cad6a0cb433194930c97a544", + "zh:f83e925ed73ff8a5ef6e3608ad9225baa5376446349572c2449c0c0b3cf184b7", + "zh:fbef0781cb64de76b1df1ca11078aecba7800d82fd4a956302734999cfd9a4af", + ] +} + +provider "registry.terraform.io/hashicorp/tls" { + version = "4.0.5" + hashes = [ + "h1:zeG5RmggBZW/8JWIVrdaeSJa0OG62uFX5HY1eE8SjzY=", + "zh:01cfb11cb74654c003f6d4e32bbef8f5969ee2856394a96d127da4949c65153e", + "zh:0472ea1574026aa1e8ca82bb6df2c40cd0478e9336b7a8a64e652119a2fa4f32", + "zh:1a8ddba2b1550c5d02003ea5d6cdda2eef6870ece86c5619f33edd699c9dc14b", + "zh:1e3bb505c000adb12cdf60af5b08f0ed68bc3955b0d4d4a126db5ca4d429eb4a", + "zh:6636401b2463c25e03e68a6b786acf91a311c78444b1dc4f97c539f9f78de22a", + "zh:76858f9d8b460e7b2a338c477671d07286b0d287fd2d2e3214030ae8f61dd56e", + "zh:a13b69fb43cb8746793b3069c4d897bb18f454290b496f19d03c3387d1c9a2dc", + "zh:a90ca81bb9bb509063b736842250ecff0f886a91baae8de65c8430168001dad9", + "zh:c4de401395936e41234f1956ebadbd2ed9f414e6908f27d578614aaa529870d4", + "zh:c657e121af8fde19964482997f0de2d5173217274f6997e16389e7707ed8ece8", + "zh:d68b07a67fbd604c38ec9733069fbf23441436fecf554de6c75c032f82e1ef19", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} diff --git a/packages/@n8n/benchmark/infra/benchmark-env.tf b/packages/@n8n/benchmark/infra/benchmark-env.tf new file mode 100644 index 0000000000..eff8fa12a9 --- /dev/null +++ b/packages/@n8n/benchmark/infra/benchmark-env.tf @@ -0,0 +1,54 @@ + +data "azurerm_resource_group" "main" { + name = var.resource_group_name +} + +# Random prefix for the resources +resource "random_string" "prefix" { + length = 8 + special = false +} + +# SSH key pair +resource "tls_private_key" "ssh_key" { + algorithm = "RSA" + rsa_bits = 4096 +} + +# Dedicated Host Group & Hosts + +resource "azurerm_dedicated_host_group" "main" { + name = "${random_string.prefix.result}-hostgroup" + location = var.location + resource_group_name = data.azurerm_resource_group.main.name + platform_fault_domain_count = 1 + automatic_placement_enabled = false + zone = 1 + + tags = local.common_tags +} + +resource "azurerm_dedicated_host" "hosts" { + name = "${random_string.prefix.result}-host" + location = var.location + dedicated_host_group_id = azurerm_dedicated_host_group.main.id + sku_name = var.host_size_family + platform_fault_domain = 0 + + tags = local.common_tags +} + +# VM + +module "test_vm" { + source = "./modules/benchmark-vm" + + location = var.location + resource_group_name = data.azurerm_resource_group.main.name + prefix = random_string.prefix.result + dedicated_host_id = azurerm_dedicated_host.hosts.id + ssh_public_key = tls_private_key.ssh_key.public_key_openssh + vm_size = var.vm_size + + tags = local.common_tags +} diff --git a/packages/@n8n/benchmark/infra/modules/benchmark-vm/output.tf b/packages/@n8n/benchmark/infra/modules/benchmark-vm/output.tf new file mode 100644 index 0000000000..4660ebf413 --- /dev/null +++ b/packages/@n8n/benchmark/infra/modules/benchmark-vm/output.tf @@ -0,0 +1,7 @@ +output "vm_name" { + value = azurerm_linux_virtual_machine.main.name +} + +output "ip" { + value = azurerm_public_ip.main.ip_address +} diff --git a/packages/@n8n/benchmark/infra/modules/benchmark-vm/vars.tf b/packages/@n8n/benchmark/infra/modules/benchmark-vm/vars.tf new file mode 100644 index 0000000000..d671253006 --- /dev/null +++ b/packages/@n8n/benchmark/infra/modules/benchmark-vm/vars.tf @@ -0,0 +1,31 @@ +variable "location" { + description = "Region to deploy resources" + default = "East US" +} + +variable "resource_group_name" { + description = "Name of the resource group" +} + +variable "prefix" { + description = "Prefix to append to resources" +} + +variable "dedicated_host_id" { + description = "Dedicated Host ID" +} + +variable "ssh_public_key" { + description = "SSH Public Key" +} + +variable "vm_size" { + description = "VM Size" + # 4 vCPUs, 16 GiB memory + default = "Standard_DC4s_v2" +} + +variable "tags" { + description = "Tags to apply to all resources created by this module" + type = map(string) +} diff --git a/packages/@n8n/benchmark/infra/modules/benchmark-vm/vm.tf b/packages/@n8n/benchmark/infra/modules/benchmark-vm/vm.tf new file mode 100644 index 0000000000..651a9d2a0b --- /dev/null +++ b/packages/@n8n/benchmark/infra/modules/benchmark-vm/vm.tf @@ -0,0 +1,136 @@ +# Network + +resource "azurerm_virtual_network" "main" { + name = "${var.prefix}-vnet" + location = var.location + resource_group_name = var.resource_group_name + address_space = ["10.0.0.0/16"] + + tags = var.tags +} + +resource "azurerm_subnet" "main" { + name = "${var.prefix}-subnet" + resource_group_name = var.resource_group_name + virtual_network_name = azurerm_virtual_network.main.name + address_prefixes = ["10.0.0.0/24"] +} + +resource "azurerm_network_security_group" "ssh" { + name = "${var.prefix}-nsg" + location = var.location + resource_group_name = var.resource_group_name + + security_rule { + name = "AllowSSH" + priority = 1001 + direction = "Inbound" + access = "Allow" + protocol = "Tcp" + source_port_range = "*" + destination_port_range = "22" + source_address_prefix = "*" + destination_address_prefix = "*" + } + + tags = var.tags +} + +resource "azurerm_public_ip" "main" { + name = "${var.prefix}-pip" + location = var.location + resource_group_name = var.resource_group_name + allocation_method = "Static" + sku = "Standard" + + tags = var.tags +} + +resource "azurerm_network_interface" "main" { + name = "${var.prefix}-nic" + location = var.location + resource_group_name = var.resource_group_name + + ip_configuration { + name = "${var.prefix}-ipconfig" + subnet_id = azurerm_subnet.main.id + private_ip_address_allocation = "Dynamic" + public_ip_address_id = azurerm_public_ip.main.id + } + + tags = var.tags +} + +resource "azurerm_network_interface_security_group_association" "ssh" { + network_interface_id = azurerm_network_interface.main.id + network_security_group_id = azurerm_network_security_group.ssh.id +} + +# Disk + +resource "azurerm_managed_disk" "data" { + name = "${var.prefix}-disk" + location = var.location + resource_group_name = var.resource_group_name + storage_account_type = "PremiumV2_LRS" + create_option = "Empty" + disk_size_gb = "16" + zone = 1 + + tags = var.tags +} + +resource "azurerm_virtual_machine_data_disk_attachment" "data" { + managed_disk_id = azurerm_managed_disk.data.id + virtual_machine_id = azurerm_linux_virtual_machine.main.id + lun = "1" + caching = "None" +} + +# VM + +resource "azurerm_linux_virtual_machine" "main" { + name = "${var.prefix}-vm" + location = var.location + resource_group_name = var.resource_group_name + network_interface_ids = [azurerm_network_interface.main.id] + dedicated_host_id = var.dedicated_host_id + zone = 1 + + size = var.vm_size + + admin_username = "benchmark" + + admin_ssh_key { + username = "benchmark" + public_key = var.ssh_public_key + } + + os_disk { + caching = "ReadWrite" + storage_account_type = "Premium_LRS" + } + + source_image_reference { + publisher = "Canonical" + offer = "0001-com-ubuntu-server-jammy" + sku = "22_04-lts-gen2" + version = "latest" + } + + identity { + type = "SystemAssigned" + } + + tags = var.tags +} + +resource "azurerm_virtual_machine_extension" "entra_login" { + name = "AADSSHLoginForLinux" + virtual_machine_id = azurerm_linux_virtual_machine.main.id + publisher = "Microsoft.Azure.ActiveDirectory" + type = "AADSSHLoginForLinux" + type_handler_version = "1.0" + + tags = var.tags +} diff --git a/packages/@n8n/benchmark/infra/output.tf b/packages/@n8n/benchmark/infra/output.tf new file mode 100644 index 0000000000..5caa0adce3 --- /dev/null +++ b/packages/@n8n/benchmark/infra/output.tf @@ -0,0 +1,3 @@ +output "vm_name" { + value = module.test_vm.vm_name +} diff --git a/packages/@n8n/benchmark/infra/providers.tf b/packages/@n8n/benchmark/infra/providers.tf new file mode 100644 index 0000000000..1ce880f5cd --- /dev/null +++ b/packages/@n8n/benchmark/infra/providers.tf @@ -0,0 +1,23 @@ + +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "~> 3.115.0" + } + + random = { + source = "hashicorp/random" + } + } + + required_version = "~> 1.8.5" +} + +provider "azurerm" { + features {} + + skip_provider_registration = true +} + +provider "random" {} diff --git a/packages/@n8n/benchmark/infra/vars.tf b/packages/@n8n/benchmark/infra/vars.tf new file mode 100644 index 0000000000..379bafe80b --- /dev/null +++ b/packages/@n8n/benchmark/infra/vars.tf @@ -0,0 +1,34 @@ +variable "location" { + description = "Region to deploy resources" + default = "East US" +} + +variable "resource_group_name" { + description = "Name of the resource group" + default = "n8n-benchmarking" +} + +variable "host_size_family" { + description = "Size Family for the Host Group" + default = "DCSv2-Type1" +} + +variable "vm_size" { + description = "VM Size" + # 2 vCPUs, 8 GiB memory + default = "Standard_DC2s_v2" +} + +variable "number_of_vms" { + description = "Number of VMs to create" + default = 1 +} + +locals { + common_tags = { + Id = "N8nBenchmark" + Terraform = "true" + Owner = "Catalysts" + CreatedAt = timestamp() + } +} diff --git a/packages/@n8n/benchmark/package.json b/packages/@n8n/benchmark/package.json index 2a3ad1c214..81588845b7 100644 --- a/packages/@n8n/benchmark/package.json +++ b/packages/@n8n/benchmark/package.json @@ -10,6 +10,8 @@ "start": "./bin/n8n-benchmark", "test": "echo \"Error: no test specified\" && exit 1", "typecheck": "tsc --noEmit", + "run-in-cloud": "zx scripts/runInCloud.mjs", + "destroy-cloud-env": "zx scripts/destroyCloudEnv.mjs", "watch": "concurrently \"tsc -w -p tsconfig.build.json\" \"tsc-alias -w -p tsconfig.build.json\"" }, "engines": { diff --git a/packages/@n8n/benchmark/scripts/destroyCloudEnv.mjs b/packages/@n8n/benchmark/scripts/destroyCloudEnv.mjs new file mode 100644 index 0000000000..1ffc852aea --- /dev/null +++ b/packages/@n8n/benchmark/scripts/destroyCloudEnv.mjs @@ -0,0 +1,90 @@ +#!/usr/bin/env zx +/** + * Script that deletes all resources created by the benchmark environment + * and that are older than 2 hours. + * + * Even tho the environment is provisioned using terraform, the terraform + * state is not persisted. Hence we can't use terraform to delete the resources. + * We could store the state to a storage account, but then we wouldn't be able + * to spin up new envs on-demand. Hence this design. + * + * Usage: + * zx scripts/deleteCloudEnv.mjs + */ +// @ts-check +import { $ } from 'zx'; + +const EXPIRE_TIME_IN_H = 2; +const EXPIRE_TIME_IN_MS = EXPIRE_TIME_IN_H * 60 * 60 * 1000; +const RESOURCE_GROUP_NAME = 'n8n-benchmarking'; + +async function main() { + const resourcesResult = + await $`az resource list --resource-group ${RESOURCE_GROUP_NAME} --query "[?tags.Id == 'N8nBenchmark'].{id:id, createdAt:tags.CreatedAt}" -o json`; + + const resources = JSON.parse(resourcesResult.stdout); + + const now = Date.now(); + + const resourcesToDelete = resources + .filter((resource) => { + if (resource.createdAt === undefined) { + return true; + } + + const createdAt = new Date(resource.createdAt); + const resourceExpiredAt = createdAt.getTime() + EXPIRE_TIME_IN_MS; + + return now > resourceExpiredAt; + }) + .map((resource) => resource.id); + + if (resourcesToDelete.length === 0) { + if (resources.length === 0) { + console.log('No resources found in the resource group.'); + } else { + console.log( + `Found ${resources.length} resources in the resource group, but none are older than ${EXPIRE_TIME_IN_H} hours.`, + ); + } + + return; + } + + await deleteResources(resourcesToDelete); +} + +async function deleteResources(resourceIds) { + // We don't know the order in which resource should be deleted. + // Here's a poor person's approach to try deletion until all complete + const MAX_ITERATIONS = 100; + let i = 0; + const toDelete = [...resourceIds]; + + console.log(`Deleting ${resourceIds.length} resources...`); + while (toDelete.length > 0) { + const resourceId = toDelete.shift(); + const deleted = await deleteById(resourceId); + if (!deleted) { + toDelete.push(resourceId); + } + + if (i++ > MAX_ITERATIONS) { + console.log( + `Max iterations reached. Exiting. Could not delete ${toDelete.length} resources.`, + ); + process.exit(1); + } + } +} + +async function deleteById(id) { + try { + await $`az resource delete --ids ${id}`; + return true; + } catch (error) { + return false; + } +} + +main(); diff --git a/packages/@n8n/benchmark/scripts/runInCloud.mjs b/packages/@n8n/benchmark/scripts/runInCloud.mjs new file mode 100755 index 0000000000..3e0225eeff --- /dev/null +++ b/packages/@n8n/benchmark/scripts/runInCloud.mjs @@ -0,0 +1,185 @@ +#!/usr/bin/env zx +/** + * Script to run benchmarks on the cloud benchmark environment. + * This script will: + * 1. Provision a benchmark environment using Terraform. + * 2. Run the benchmarks on the VM. + * 3. Destroy the cloud environment. + * + * NOTE: Must be run in the root of the package. + * + * Usage: + * zx scripts/runBenchmarksOnCloud.mjs [--debug] + * + */ +// @ts-check +import fs from 'fs'; +import minimist from 'minimist'; +import { $, sleep, tmpdir, which } from 'zx'; +import path from 'path'; +import { SshClient } from './sshClient.mjs'; +import { TerraformClient } from './terraformClient.mjs'; + +/** + * @typedef {Object} BenchmarkEnv + * @property {string} vmName + */ + +const RESOURCE_GROUP_NAME = 'n8n-benchmarking'; + +const paths = { + n8nSetupsDir: path.join(path.resolve('scripts'), 'runOnVm', 'n8nSetups'), +}; + +async function main() { + const config = await parseAndValidateConfig(); + await ensureDependencies(); + + console.log('Using n8n tag', config.n8nTag); + console.log('Using benchmark cli tag', config.benchmarkTag); + + const terraformClient = new TerraformClient({ + privateKeyPath: paths.privateKeyPath, + isVerbose: config.isVerbose, + }); + + try { + const benchmarkEnv = await terraformClient.provisionEnvironment(); + + await runBenchmarksOnVm(config, benchmarkEnv); + } catch (error) { + console.error('An error occurred while running the benchmarks:'); + console.error(error); + } finally { + await terraformClient.destroyEnvironment(); + } +} + +async function ensureDependencies() { + await which('terraform'); + await which('az'); +} + +/** + * + * @param {Config} config + * @param {BenchmarkEnv} benchmarkEnv + */ +async function runBenchmarksOnVm(config, benchmarkEnv) { + console.log(`Setting up the environment for ${config.n8nSetupToUse}...`); + + const sshClient = new SshClient({ + vmName: benchmarkEnv.vmName, + resourceGroupName: RESOURCE_GROUP_NAME, + verbose: config.isVerbose, + }); + + await ensureVmIsReachable(sshClient); + + const scriptsDir = await transferScriptsToVm(sshClient); + + // Bootstrap the environment with dependencies + console.log('Running bootstrap script...'); + const bootstrapScriptPath = path.join(scriptsDir, 'bootstrap.sh'); + await sshClient.ssh(`chmod a+x ${bootstrapScriptPath} && ${bootstrapScriptPath}`); + + // Give some time for the VM to be ready + await sleep(1000); + + console.log('Running benchmarks...'); + const runScriptPath = path.join(scriptsDir, 'runOnVm.mjs'); + await sshClient.ssh( + `npx zx ${runScriptPath} --n8nDockerTag=${config.n8nTag} --benchmarkDockerTag=${config.benchmarkTag} ${config.n8nSetupToUse}`, + { + // Test run should always log its output + verbose: true, + }, + ); +} + +async function ensureVmIsReachable(sshClient) { + await sshClient.ssh('echo "VM is reachable"'); +} + +/** + * @returns Path where the scripts are located on the VM + */ +async function transferScriptsToVm(sshClient) { + await sshClient.ssh('rm -rf ~/n8n'); + + await sshClient.ssh('git clone --depth=0 https://github.com/n8n-io/n8n.git'); + + return '~/n8n/packages/@n8n/benchmark/scripts/runOnVm'; +} + +function readAvailableN8nSetups() { + const setups = fs.readdirSync(paths.n8nSetupsDir); + + return setups; +} + +/** + * @typedef {Object} Config + * @property {boolean} isVerbose + * @property {string} n8nSetupToUse + * @property {string} n8nTag + * @property {string} benchmarkTag + * + * @returns {Promise} + */ +async function parseAndValidateConfig() { + const args = minimist(process.argv.slice(2), { + boolean: ['debug'], + }); + + const n8nSetupToUse = await getAndValidateN8nSetup(args); + const isVerbose = args.debug || false; + const n8nTag = args.n8nTag || process.env.N8N_DOCKER_TAG || 'latest'; + const benchmarkTag = args.benchmarkTag || process.env.BENCHMARK_DOCKER_TAG || 'latest'; + + return { + isVerbose, + n8nSetupToUse, + n8nTag, + benchmarkTag, + }; +} + +/** + * @param {minimist.ParsedArgs} args + */ +async function getAndValidateN8nSetup(args) { + // Last parameter is the n8n setup to use + const n8nSetupToUse = args._[args._.length - 1]; + + if (!n8nSetupToUse) { + printUsage(); + process.exit(1); + } + + const availableSetups = readAvailableN8nSetups(); + + if (!availableSetups.includes(n8nSetupToUse)) { + printUsage(); + process.exit(1); + } + + return n8nSetupToUse; +} + +function printUsage() { + const availableSetups = readAvailableN8nSetups(); + + console.log('Usage: zx scripts/runInCloud.mjs '); + console.log(' eg: zx scripts/runInCloud.mjs sqlite'); + console.log(''); + console.log('Options:'); + console.log(' --debug Enable verbose output'); + console.log(' --n8nTag Docker tag for n8n image. Default is latest'); + console.log(' --benchmarkTag Docker tag for benchmark cli image. Default is latest'); + console.log(''); + console.log('Available setups:'); + console.log(` ${availableSetups.join(', ')}`); +} + +main().catch(console.error); diff --git a/packages/@n8n/benchmark/scripts/runOnVm/bootstrap.sh b/packages/@n8n/benchmark/scripts/runOnVm/bootstrap.sh new file mode 100644 index 0000000000..9a5ffbe253 --- /dev/null +++ b/packages/@n8n/benchmark/scripts/runOnVm/bootstrap.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# +# Script to initialize the benchmark environment on a VM +# + +set -euo pipefail; + +CURRENT_USER=$(whoami) + +# Mount the data disk +if [ -d "/n8n" ]; then + echo "Data disk already mounted. Clearing it..." + rm -rf /n8n/* + rm -rf /n8n/.[!.]* +else + sudo mkdir -p /n8n + sudo parted /dev/sdc --script mklabel gpt mkpart xfspart xfs 0% 100% + sudo mkfs.xfs /dev/sdc1 + sudo partprobe /dev/sdc1 + sudo mount /dev/sdc1 /n8n +fi + +# Allow the current user to write to the data disk +sudo chmod a+rw /n8n + +# Include nodejs v20 repository +curl -fsSL https://deb.nodesource.com/setup_20.x -o nodesource_setup.sh +sudo -E bash nodesource_setup.sh + +# Install docker, docker compose and nodejs +sudo DEBIAN_FRONTEND=noninteractive apt-get update +sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker.io docker-compose nodejs + +# Add the current user to the docker group +sudo usermod -aG docker "$CURRENT_USER" + +# Install zx +npm install zx diff --git a/packages/@n8n/benchmark/scripts/runOnVm/n8nSetups/sqlite/docker-compose.yml b/packages/@n8n/benchmark/scripts/runOnVm/n8nSetups/sqlite/docker-compose.yml new file mode 100644 index 0000000000..c5c8b2d4f1 --- /dev/null +++ b/packages/@n8n/benchmark/scripts/runOnVm/n8nSetups/sqlite/docker-compose.yml @@ -0,0 +1,16 @@ +services: + n8n: + image: ghcr.io/n8n-io/n8n:${N8N_VERSION:-latest} + environment: + - N8N_DIAGNOSTICS_ENABLED=false + - N8N_USER_FOLDER=/n8n + ports: + - 5678:5678 + volumes: + - /n8n:/n8n + benchmark: + image: ghcr.io/n8n-io/n8n-benchmark:${N8N_BENCHMARK_VERSION:-latest} + depends_on: + - n8n + environment: + - N8N_BASE_URL=http://n8n:5678 diff --git a/packages/@n8n/benchmark/scripts/runOnVm/runOnVm.mjs b/packages/@n8n/benchmark/scripts/runOnVm/runOnVm.mjs new file mode 100755 index 0000000000..05908426c8 --- /dev/null +++ b/packages/@n8n/benchmark/scripts/runOnVm/runOnVm.mjs @@ -0,0 +1,53 @@ +#!/usr/bin/env zx +/** + * This script runs the benchmarks using a given docker compose setup + */ + +import { $ } from 'zx'; + +const [n8nSetupToUse] = argv._; + +if (!n8nSetupToUse) { + printUsage(); + process.exit(1); +} + +function printUsage() { + console.log('Usage: zx runOnVm.mjs '); + console.log(' eg: zx runOnVm.mjs sqlite'); +} + +async function main() { + const composeFilePath = path.join(__dirname, 'n8nSetups', n8nSetupToUse); + const n8nTag = argv.n8nDockerTag || process.env.N8N_DOCKER_TAG || 'latest'; + const benchmarkTag = argv.benchmarkDockerTag || process.env.BENCHMARK_DOCKER_TAG || 'latest'; + + const $$ = $({ + cwd: composeFilePath, + verbose: true, + env: { + N8N_VERSION: n8nTag, + BENCHMARK_VERSION: benchmarkTag, + }, + }); + + try { + await $$`docker-compose up -d n8n`; + + await $$`docker-compose run benchmark run`; + } catch (error) { + console.error('An error occurred while running the benchmarks:'); + console.error(error); + console.error(''); + await dumpN8nInstanceLogs($$); + } finally { + await $$`docker-compose down`; + } +} + +async function dumpN8nInstanceLogs($$) { + console.error('n8n instance logs:'); + await $$`docker-compose logs n8n`; +} + +main(); diff --git a/packages/@n8n/benchmark/scripts/sshClient.mjs b/packages/@n8n/benchmark/scripts/sshClient.mjs new file mode 100644 index 0000000000..033312f48e --- /dev/null +++ b/packages/@n8n/benchmark/scripts/sshClient.mjs @@ -0,0 +1,28 @@ +// @ts-check +import { $ } from 'zx'; + +export class SshClient { + /** + * + * @param {{ vmName: string; resourceGroupName: string; verbose?: boolean }} param0 + */ + constructor({ vmName, resourceGroupName, verbose = false }) { + this.vmName = vmName; + this.resourceGroupName = resourceGroupName; + this.verbose = verbose; + + this.$$ = $({ + verbose, + }); + } + + /** + * @param {string} command + * @param {{ verbose?: boolean }} [options] + */ + async ssh(command, options = {}) { + const $$ = options?.verbose ? $({ verbose: true }) : this.$$; + + await $$`az ssh vm -n ${this.vmName} -g ${this.resourceGroupName} --yes -- -o StrictHostKeyChecking=accept-new ${command}`; + } +} diff --git a/packages/@n8n/benchmark/scripts/terraformClient.mjs b/packages/@n8n/benchmark/scripts/terraformClient.mjs new file mode 100644 index 0000000000..1ba4fcedb4 --- /dev/null +++ b/packages/@n8n/benchmark/scripts/terraformClient.mjs @@ -0,0 +1,53 @@ +// @ts-check + +import path from 'path'; +import { $, fs } from 'zx'; + +const paths = { + infraCodeDir: path.resolve('infra'), + terraformStateFile: path.join(path.resolve('infra'), 'terraform.tfstate'), +}; + +export class TerraformClient { + constructor({ privateKeyPath, isVerbose = false }) { + this.privateKeyPath = privateKeyPath; + this.isVerbose = isVerbose; + this.$$ = $({ + cwd: paths.infraCodeDir, + verbose: isVerbose, + }); + } + + /** + * @typedef {Object} BenchmarkEnv + * @property {string} vmName + * + * @returns {Promise} + */ + async provisionEnvironment() { + console.log('Provisioning cloud environment...'); + + await this.$$`terraform init`; + await this.$$`terraform apply -input=false -auto-approve`; + + return { + vmName: await this.getTerraformOutput('vm_name'), + }; + } + + async destroyEnvironment() { + if (!fs.existsSync(paths.terraformStateFile)) { + console.log('No cloud environment to destroy. Skipping...'); + return; + } + + console.log('Destroying cloud environment...'); + + await this.$$`terraform destroy -input=false -auto-approve`; + } + + async getTerraformOutput(key) { + const output = await this.$$`terraform output -raw ${key}`; + return output.stdout.trim(); + } +} diff --git a/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts b/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts index b1ec2d5162..a188c4eefe 100644 --- a/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts +++ b/packages/@n8n/benchmark/src/n8nApiClient/n8nApiClient.ts @@ -49,6 +49,12 @@ export class N8nApiClient { } else if (response.status === 400) { if (responsePayload.message === 'Instance owner already setup') console.log('Owner already set up'); + } else if (response.status === 404) { + // The n8n instance setup owner endpoint not be available yet even tho + // the health endpoint returns ok. In this case we simply retry. + console.log('Owner setup endpoint not available yet, retrying in 1s...'); + await this.delay(1000); + await this.setupOwnerIfNeeded(loginDetails); } else { throw new Error( `Owner setup failed with status ${response.status}: ${responsePayload.message}`, From f4be8b950c68c07fd9b40eb946bc70a80c903728 Mon Sep 17 00:00:00 2001 From: Eugene Date: Fri, 23 Aug 2024 14:25:07 +0200 Subject: [PATCH 026/233] fix(core): Update zod to the latest version (no-changelog) (#10516) --- packages/@n8n/nodes-langchain/package.json | 2 +- packages/cli/package.json | 2 +- pnpm-lock.yaml | 14 ++++++-------- pnpm-workspace.yaml | 1 + 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/@n8n/nodes-langchain/package.json b/packages/@n8n/nodes-langchain/package.json index 28303136c2..7e114c4156 100644 --- a/packages/@n8n/nodes-langchain/package.json +++ b/packages/@n8n/nodes-langchain/package.json @@ -181,7 +181,7 @@ "sqlite3": "5.1.7", "temp": "0.9.4", "tmp-promise": "3.0.3", - "zod": "3.23.8", + "zod": "catalog:", "zod-to-json-schema": "3.23.0" } } diff --git a/packages/cli/package.json b/packages/cli/package.json index c7608d1c34..481c91032a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -173,6 +173,6 @@ "xmllint-wasm": "3.0.1", "xss": "^1.0.14", "yamljs": "0.3.0", - "zod": "3.22.4" + "zod": "catalog:" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a59c4cf562..a826d9b452 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,6 +51,9 @@ catalogs: xml2js: specifier: 0.6.2 version: 0.6.2 + zod: + specifier: 3.23.8 + version: 3.23.8 frontend: '@vitest/coverage-v8': specifier: ^1.6.0 @@ -510,7 +513,7 @@ importers: specifier: 3.0.3 version: 3.0.3 zod: - specifier: 3.23.8 + specifier: 'catalog:' version: 3.23.8 zod-to-json-schema: specifier: 3.23.0 @@ -915,8 +918,8 @@ importers: specifier: 0.3.0 version: 0.3.0 zod: - specifier: 3.22.4 - version: 3.22.4 + specifier: 'catalog:' + version: 3.23.8 devDependencies: '@redocly/cli': specifier: ^1.6.0 @@ -13374,9 +13377,6 @@ packages: peerDependencies: zod: ^3.23.3 - zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -27956,8 +27956,6 @@ snapshots: dependencies: zod: 3.23.8 - zod@3.22.4: {} - zod@3.23.8: {} zx@8.1.4: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6d78dbe6bf..e23937456c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -20,6 +20,7 @@ catalog: typedi: 0.10.0 uuid: 8.3.2 xml2js: 0.6.2 + zod: 3.23.8 catalogs: frontend: From 47839c936d6c75146e3489d1157d291cb2dd316b Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Fri, 23 Aug 2024 15:44:00 +0300 Subject: [PATCH 027/233] ci: Use correct env for benchmark nightly workflow (no-changelog) (#10529) --- .github/workflows/benchmark-nightly.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/benchmark-nightly.yml b/.github/workflows/benchmark-nightly.yml index 2a15587793..146668491e 100644 --- a/.github/workflows/benchmark-nightly.yml +++ b/.github/workflows/benchmark-nightly.yml @@ -31,7 +31,7 @@ permissions: jobs: build: runs-on: ubuntu-latest - environment: benchmark + environment: benchmarking steps: - name: Checkout From 29dd153df1d43a17f7c69578386fca01673e4378 Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Fri, 23 Aug 2024 16:06:43 +0300 Subject: [PATCH 028/233] ci: Fix fetch depth in benchmark (no-changelog) (#10532) --- packages/@n8n/benchmark/scripts/runInCloud.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@n8n/benchmark/scripts/runInCloud.mjs b/packages/@n8n/benchmark/scripts/runInCloud.mjs index 3e0225eeff..ee5c6b48e8 100755 --- a/packages/@n8n/benchmark/scripts/runInCloud.mjs +++ b/packages/@n8n/benchmark/scripts/runInCloud.mjs @@ -107,7 +107,7 @@ async function ensureVmIsReachable(sshClient) { async function transferScriptsToVm(sshClient) { await sshClient.ssh('rm -rf ~/n8n'); - await sshClient.ssh('git clone --depth=0 https://github.com/n8n-io/n8n.git'); + await sshClient.ssh('git clone --depth=1 https://github.com/n8n-io/n8n.git'); return '~/n8n/packages/@n8n/benchmark/scripts/runOnVm'; } From 7bcb0be27ad3afe4f21fd10109c8ba2af75f1493 Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Fri, 23 Aug 2024 16:23:31 +0300 Subject: [PATCH 029/233] refactor(editor): Convert DeleteUserModal to composition api (no-changelog) (#10531) --- .../src/components/DeleteUserModal.vue | 257 +++++++++--------- 1 file changed, 124 insertions(+), 133 deletions(-) diff --git a/packages/editor-ui/src/components/DeleteUserModal.vue b/packages/editor-ui/src/components/DeleteUserModal.vue index 2fdb0ad734..db9bb671c4 100644 --- a/packages/editor-ui/src/components/DeleteUserModal.vue +++ b/packages/editor-ui/src/components/DeleteUserModal.vue @@ -1,3 +1,118 @@ + + - - diff --git a/packages/editor-ui/src/components/FeatureComingSoon.vue b/packages/editor-ui/src/components/FeatureComingSoon.vue index 3dcf1e58b1..a96b3d0ec3 100644 --- a/packages/editor-ui/src/components/FeatureComingSoon.vue +++ b/packages/editor-ui/src/components/FeatureComingSoon.vue @@ -1,31 +1,3 @@ - - + + diff --git a/packages/editor-ui/src/components/NodeList.vue b/packages/editor-ui/src/components/NodeList.vue index 53d710ad15..8e93ecbe5a 100644 --- a/packages/editor-ui/src/components/NodeList.vue +++ b/packages/editor-ui/src/components/NodeList.vue @@ -1,17 +1,3 @@ - - + + diff --git a/packages/editor-ui/src/components/ResourceLocator/ResourceLocatorDropdown.vue b/packages/editor-ui/src/components/ResourceLocator/ResourceLocatorDropdown.vue index ddadd763f9..658f2da9d5 100644 --- a/packages/editor-ui/src/components/ResourceLocator/ResourceLocatorDropdown.vue +++ b/packages/editor-ui/src/components/ResourceLocator/ResourceLocatorDropdown.vue @@ -1,82 +1,3 @@ - - + + diff --git a/packages/editor-ui/src/components/TemplatesInfoCarousel.vue b/packages/editor-ui/src/components/TemplatesInfoCarousel.vue index 377f6c8137..6810443b26 100644 --- a/packages/editor-ui/src/components/TemplatesInfoCarousel.vue +++ b/packages/editor-ui/src/components/TemplatesInfoCarousel.vue @@ -1,41 +1,3 @@ - - + + diff --git a/packages/editor-ui/src/components/WorkflowLMChat/WorkflowLMChat.vue b/packages/editor-ui/src/components/WorkflowLMChat/WorkflowLMChat.vue index 333a16cc36..9d032f5fa1 100644 --- a/packages/editor-ui/src/components/WorkflowLMChat/WorkflowLMChat.vue +++ b/packages/editor-ui/src/components/WorkflowLMChat/WorkflowLMChat.vue @@ -1,80 +1,3 @@ - - + + diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleMainInput.spec.ts b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleMainInput.spec.ts new file mode 100644 index 0000000000..78d7f073e0 --- /dev/null +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleMainInput.spec.ts @@ -0,0 +1,21 @@ +import CanvasHandleMainInput from '@/components/canvas/elements/handles/render-types/CanvasHandleMainInput.vue'; +import { createComponentRenderer } from '@/__tests__/render'; +import { createCanvasHandleProvide } from '@/__tests__/data'; + +const renderComponent = createComponentRenderer(CanvasHandleMainInput); + +describe('CanvasHandleMainInput', () => { + it('should render correctly', async () => { + const label = 'Test Label'; + const { container, getByText } = renderComponent({ + global: { + provide: { + ...createCanvasHandleProvide({ label }), + }, + }, + }); + + expect(container.querySelector('.canvas-node-handle-main-input')).toBeInTheDocument(); + expect(getByText(label)).toBeInTheDocument(); + }); +}); diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleMainInput.vue b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleMainInput.vue new file mode 100644 index 0000000000..f34cc07789 --- /dev/null +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleMainInput.vue @@ -0,0 +1,34 @@ + + + + diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleMainOutput.vue b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleMainOutput.vue index ba9e32ade4..9a37a3aff7 100644 --- a/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleMainOutput.vue +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleMainOutput.vue @@ -1,12 +1,25 @@ + + diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainInput.spec.ts b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainInput.spec.ts index 9e9dab81e0..19fb1214e0 100644 --- a/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainInput.spec.ts +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainInput.spec.ts @@ -15,7 +15,7 @@ describe('CanvasHandleNonMainInput', () => { }, }); - expect(container.querySelector('.canvas-node-handle-non-main')).toBeInTheDocument(); + expect(container.querySelector('.canvas-node-handle-non-main-input')).toBeInTheDocument(); expect(getByText(label)).toBeInTheDocument(); }); }); diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainInput.vue b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainInput.vue index 44f9f09f98..384eaeecaf 100644 --- a/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainInput.vue +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainInput.vue @@ -2,48 +2,89 @@ import CanvasHandlePlus from '@/components/canvas/elements/handles/render-types/parts/CanvasHandlePlus.vue'; import { useCanvasNodeHandle } from '@/composables/useCanvasNodeHandle'; import { NodeConnectionType } from 'n8n-workflow'; -import { computed } from 'vue'; +import { computed, ref } from 'vue'; const emit = defineEmits<{ add: []; }>(); -const { label, connected, type } = useCanvasNodeHandle(); +const { label, isConnected, isConnecting, type } = useCanvasNodeHandle(); -const isAddButtonVisible = computed( - () => !connected.value || type.value === NodeConnectionType.AiTool, +const handleClasses = 'target'; + +const supportsMultipleConnections = computed(() => type.value === NodeConnectionType.AiTool); + +const isHandlePlusAvailable = computed( + () => !isConnected.value || supportsMultipleConnections.value, ); +const isHandlePlusVisible = computed( + () => !isConnecting.value || isHovered.value || supportsMultipleConnections.value, +); +const isHovered = ref(false); + +function onMouseEnter() { + isHovered.value = true; +} + +function onMouseLeave() { + isHovered.value = false; +} function onClickAdd() { emit('add'); } + + diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainOutput.spec.ts b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainOutput.spec.ts new file mode 100644 index 0000000000..69094e4a90 --- /dev/null +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainOutput.spec.ts @@ -0,0 +1,21 @@ +import CanvasHandleNonMainOutput from '@/components/canvas/elements/handles/render-types/CanvasHandleNonMainOutput.vue'; +import { createComponentRenderer } from '@/__tests__/render'; +import { createCanvasHandleProvide } from '@/__tests__/data'; + +const renderComponent = createComponentRenderer(CanvasHandleNonMainOutput); + +describe('CanvasHandleNonMainOutput', () => { + it('should render correctly', async () => { + const label = 'Test Label'; + const { container, getByText } = renderComponent({ + global: { + provide: { + ...createCanvasHandleProvide({ label }), + }, + }, + }); + + expect(container.querySelector('.canvas-node-handle-non-main-output')).toBeInTheDocument(); + expect(getByText(label)).toBeInTheDocument(); + }); +}); diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainOutput.vue b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainOutput.vue new file mode 100644 index 0000000000..6d62bfc23d --- /dev/null +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/CanvasHandleNonMainOutput.vue @@ -0,0 +1,38 @@ + + + + diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDiamond.spec.ts b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDiamond.spec.ts new file mode 100644 index 0000000000..cc6267034c --- /dev/null +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDiamond.spec.ts @@ -0,0 +1,21 @@ +import CanvasHandlePlus from './CanvasHandlePlus.vue'; +import { createComponentRenderer } from '@/__tests__/render'; + +const renderComponent = createComponentRenderer(CanvasHandlePlus, {}); + +describe('CanvasHandleDiamond', () => { + it('should render with default props', () => { + const { html } = renderComponent(); + + expect(html()).toMatchSnapshot(); + }); + + it('should apply `handleClasses` prop correctly', () => { + const customClass = 'custom-handle-class'; + const wrapper = renderComponent({ + props: { handleClasses: customClass }, + }); + + expect(wrapper.container.querySelector(`.${customClass}`)).toBeTruthy(); + }); +}); diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDiamond.vue b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDiamond.vue new file mode 100644 index 0000000000..a21f8d84d2 --- /dev/null +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDiamond.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDot.spec.ts b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDot.spec.ts new file mode 100644 index 0000000000..e3451c92d9 --- /dev/null +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDot.spec.ts @@ -0,0 +1,21 @@ +import CanvasHandleDot from './CanvasHandleDot.vue'; +import { createComponentRenderer } from '@/__tests__/render'; + +const renderComponent = createComponentRenderer(CanvasHandleDot, {}); + +describe('CanvasHandleDot', () => { + it('should render with default props', () => { + const { html } = renderComponent(); + + expect(html()).toMatchSnapshot(); + }); + + it('should apply `handleClasses` prop correctly', () => { + const customClass = 'custom-handle-class'; + const wrapper = renderComponent({ + props: { handleClasses: customClass }, + }); + + expect(wrapper.container.querySelector(`.${customClass}`)).toBeTruthy(); + }); +}); diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDot.vue b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDot.vue new file mode 100644 index 0000000000..691ee755cf --- /dev/null +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandleDot.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandlePlus.spec.ts b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandlePlus.spec.ts index 841d11a44e..fca5297c72 100644 --- a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandlePlus.spec.ts +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandlePlus.spec.ts @@ -18,9 +18,9 @@ describe('CanvasHandlePlus', () => { expect(html()).toMatchSnapshot(); }); - it('emits click:plus event when plus icon is clicked', async () => { + it('should emit click:plus event when plus icon is clicked', async () => { const { container, emitted } = renderComponent(); - const plusIcon = container.querySelector('svg.plus'); + const plusIcon = container.querySelector('.plus'); if (!plusIcon) throw new Error('Plus icon not found'); @@ -29,7 +29,7 @@ describe('CanvasHandlePlus', () => { expect(emitted()).toHaveProperty('click:plus'); }); - it('applies correct classes based on position prop', () => { + it('should apply correct classes based on position prop', () => { const positions = ['top', 'right', 'bottom', 'left']; positions.forEach((position) => { @@ -40,15 +40,17 @@ describe('CanvasHandlePlus', () => { }); }); - it('renders SVG elements correctly', () => { + it('should render SVG elements correctly', () => { const { container } = renderComponent(); - const lineSvg = container.querySelector('svg.line'); - expect(lineSvg).toBeTruthy(); - expect(lineSvg?.getAttribute('viewBox')).toBe('0 0 46 24'); + const svg = container.querySelector('svg'); + expect(svg).toBeTruthy(); + expect(svg?.getAttribute('viewBox')).toBe('0 0 70 24'); - const plusSvg = container.querySelector('svg.plus'); + const lineSvg = container.querySelector('line'); + expect(lineSvg).toBeTruthy(); + + const plusSvg = container.querySelector('.plus'); expect(plusSvg).toBeTruthy(); - expect(plusSvg?.getAttribute('viewBox')).toBe('0 0 24 24'); }); }); diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandlePlus.vue b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandlePlus.vue index eb88dfb3a5..8d0776e4a1 100644 --- a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandlePlus.vue +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/CanvasHandlePlus.vue @@ -4,9 +4,11 @@ import { computed, useCssModule } from 'vue'; const props = withDefaults( defineProps<{ position?: 'top' | 'right' | 'bottom' | 'left'; + handleClasses?: string; }>(), { position: 'right', + handleClasses: undefined, }, ); @@ -16,7 +18,64 @@ const emit = defineEmits<{ const style = useCssModule(); -const classes = computed(() => [style.wrapper, style[props.position]]); +const classes = computed(() => [style.wrapper, style[props.position], props.handleClasses]); + +const plusSize = 24; +const lineSize = 46; + +const viewBox = computed(() => { + switch (props.position) { + case 'bottom': + case 'top': + return { + width: plusSize, + height: lineSize + plusSize, + }; + default: + return { + width: lineSize + plusSize, + height: plusSize, + }; + } +}); + +const linePosition = computed(() => { + switch (props.position) { + case 'top': + return [ + [viewBox.value.width / 2, viewBox.value.height - lineSize + 1], + [viewBox.value.width / 2, viewBox.value.height], + ]; + case 'bottom': + return [ + [viewBox.value.width / 2, 0], + [viewBox.value.width / 2, lineSize + 1], + ]; + case 'left': + return [ + [viewBox.value.width - lineSize - 1, viewBox.value.height / 2], + [viewBox.value.width, viewBox.value.height / 2], + ]; + default: + return [ + [0, viewBox.value.height / 2], + [lineSize + 1, viewBox.value.height / 2], + ]; + } +}); + +const plusPosition = computed(() => { + switch (props.position) { + case 'bottom': + return [0, viewBox.value.height - plusSize]; + case 'top': + return [0, 0]; + case 'left': + return [0, 0]; + default: + return [viewBox.value.width - plusSize, 0]; + } +}); function onClick(event: MouseEvent) { emit('click:plus', event); @@ -24,19 +83,23 @@ function onClick(event: MouseEvent) { diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandleDiamond.spec.ts.snap b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandleDiamond.spec.ts.snap new file mode 100644 index 0000000000..8a04f4a9d4 --- /dev/null +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandleDiamond.spec.ts.snap @@ -0,0 +1,11 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`CanvasHandleDiamond > should render with default props 1`] = ` +" + + + + + +" +`; diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandleDot.spec.ts.snap b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandleDot.spec.ts.snap new file mode 100644 index 0000000000..a902ea6fe9 --- /dev/null +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandleDot.spec.ts.snap @@ -0,0 +1,3 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`CanvasHandleDot > should render with default props 1`] = `"
"`; diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandlePlus.spec.ts.snap b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandlePlus.spec.ts.snap index 585581dfae..4e18c15613 100644 --- a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandlePlus.spec.ts.snap +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandlePlus.spec.ts.snap @@ -1,12 +1,11 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`CanvasHandlePlus > should render with default props 1`] = ` -"
- - - - - - -
" +" + + + + + +" `; diff --git a/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandleRectangle.spec.ts.snap b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandleRectangle.spec.ts.snap new file mode 100644 index 0000000000..7ceb928370 --- /dev/null +++ b/packages/editor-ui/src/components/canvas/elements/handles/render-types/parts/__snapshots__/CanvasHandleRectangle.spec.ts.snap @@ -0,0 +1,3 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`CanvasHandleRectangle > should render with default props 1`] = `"
"`; diff --git a/packages/editor-ui/src/components/canvas/elements/nodes/CanvasNode.vue b/packages/editor-ui/src/components/canvas/elements/nodes/CanvasNode.vue index c3b3994622..34c4bd7bff 100644 --- a/packages/editor-ui/src/components/canvas/elements/nodes/CanvasNode.vue +++ b/packages/editor-ui/src/components/canvas/elements/nodes/CanvasNode.vue @@ -1,9 +1,9 @@