mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-27 14:13:08 +00:00
refactor: Setup typescript project references across workflow, core, and cli (#4519)
* refactor: use consistent folder structure across workflow, core, and cli * setup typescript project references across workflow, core, and cli
This commit is contained in:
committed by
GitHub
parent
de96def372
commit
698d96a617
@@ -1,29 +1,35 @@
|
||||
import { ActiveExecutions, IWorkflowExecutionDataProcess, Db } from '../../src';
|
||||
import * as Db from '@/Db';
|
||||
import { ActiveExecutions } from '@/ActiveExecutions';
|
||||
import { mocked } from 'jest-mock';
|
||||
import PCancelable from 'p-cancelable';
|
||||
import { v4 as uuid } from 'uuid';
|
||||
import { createDeferredPromise, IDeferredPromise, IExecuteResponsePromiseData, IRun } from 'n8n-workflow';
|
||||
import {
|
||||
createDeferredPromise,
|
||||
IDeferredPromise,
|
||||
IExecuteResponsePromiseData,
|
||||
IRun,
|
||||
} from 'n8n-workflow';
|
||||
import { IWorkflowExecutionDataProcess } from '@/Interfaces';
|
||||
|
||||
const FAKE_EXECUTION_ID = '15';
|
||||
const FAKE_SECOND_EXECUTION_ID = '20';
|
||||
|
||||
jest.mock('../../src/Db', () => {
|
||||
jest.mock('@/Db', () => {
|
||||
return {
|
||||
collections: {
|
||||
Execution: {
|
||||
save: jest.fn(async () => Promise.resolve({id: FAKE_EXECUTION_ID})),
|
||||
save: jest.fn(async () => Promise.resolve({ id: FAKE_EXECUTION_ID })),
|
||||
update: jest.fn(),
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
describe('ActiveExecutions', () => {
|
||||
|
||||
let activeExecutions: ActiveExecutions.ActiveExecutions;
|
||||
let activeExecutions: ActiveExecutions;
|
||||
|
||||
beforeEach(() => {
|
||||
activeExecutions = new ActiveExecutions.ActiveExecutions();
|
||||
activeExecutions = new ActiveExecutions();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@@ -46,7 +52,11 @@ describe('ActiveExecutions', () => {
|
||||
|
||||
test('Should update execution if add is called with execution ID', async () => {
|
||||
const newExecution = mockExecutionData();
|
||||
const executionId = await activeExecutions.add(newExecution, undefined, FAKE_SECOND_EXECUTION_ID);
|
||||
const executionId = await activeExecutions.add(
|
||||
newExecution,
|
||||
undefined,
|
||||
FAKE_SECOND_EXECUTION_ID,
|
||||
);
|
||||
|
||||
expect(executionId).toBe(FAKE_SECOND_EXECUTION_ID);
|
||||
expect(activeExecutions.getActiveExecutions().length).toBe(1);
|
||||
@@ -67,7 +77,9 @@ describe('ActiveExecutions', () => {
|
||||
await activeExecutions.add(newExecution, undefined, FAKE_EXECUTION_ID);
|
||||
const deferredPromise = mockCancelablePromise();
|
||||
|
||||
expect(() => activeExecutions.attachWorkflowExecution(FAKE_EXECUTION_ID, deferredPromise)).not.toThrow();
|
||||
expect(() =>
|
||||
activeExecutions.attachWorkflowExecution(FAKE_EXECUTION_ID, deferredPromise),
|
||||
).not.toThrow();
|
||||
});
|
||||
|
||||
test('Should attach and resolve response promise to existing execution', async () => {
|
||||
@@ -75,7 +87,7 @@ describe('ActiveExecutions', () => {
|
||||
await activeExecutions.add(newExecution, undefined, FAKE_EXECUTION_ID);
|
||||
const deferredPromise = await mockDeferredPromise();
|
||||
activeExecutions.attachResponsePromise(FAKE_EXECUTION_ID, deferredPromise);
|
||||
const fakeResponse = {data: {resultData: {runData: {}}}};
|
||||
const fakeResponse = { data: { resultData: { runData: {} } } };
|
||||
activeExecutions.resolveResponsePromise(FAKE_EXECUTION_ID, fakeResponse);
|
||||
|
||||
expect(deferredPromise.promise()).resolves.toEqual(fakeResponse);
|
||||
@@ -103,10 +115,8 @@ describe('ActiveExecutions', () => {
|
||||
expect(postExecutePromise).resolves.toEqual(fakeOutput);
|
||||
});
|
||||
|
||||
test('Should throw error when trying to create a promise with invalid execution', async() => {
|
||||
expect(
|
||||
activeExecutions.getPostExecutePromise(FAKE_EXECUTION_ID)
|
||||
).rejects.toThrow();
|
||||
test('Should throw error when trying to create a promise with invalid execution', async () => {
|
||||
expect(activeExecutions.getPostExecutePromise(FAKE_EXECUTION_ID)).rejects.toThrow();
|
||||
});
|
||||
|
||||
test('Should call function to cancel execution when asked to stop', async () => {
|
||||
@@ -120,7 +130,6 @@ describe('ActiveExecutions', () => {
|
||||
|
||||
expect(cancelExecution).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
function mockExecutionData(): IWorkflowExecutionDataProcess {
|
||||
@@ -132,18 +141,18 @@ function mockExecutionData(): IWorkflowExecutionDataProcess {
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
nodes: [],
|
||||
connections: {}
|
||||
connections: {},
|
||||
},
|
||||
userId: uuid(),
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function mockFullRunData(): IRun {
|
||||
return {
|
||||
data: {
|
||||
resultData: {
|
||||
runData: {}
|
||||
}
|
||||
runData: {},
|
||||
},
|
||||
},
|
||||
mode: 'manual',
|
||||
startedAt: new Date(),
|
||||
@@ -159,4 +168,3 @@ function mockCancelablePromise(): PCancelable<IRun> {
|
||||
function mockDeferredPromise(): Promise<IDeferredPromise<IExecuteResponsePromiseData>> {
|
||||
return createDeferredPromise<IExecuteResponsePromiseData>();
|
||||
}
|
||||
|
||||
|
||||
@@ -11,20 +11,20 @@ import {
|
||||
matchMissingPackages,
|
||||
hasPackageLoaded,
|
||||
removePackageFromMissingList,
|
||||
} from '../../src/CommunityNodes/helpers';
|
||||
} from '@/CommunityNodes/helpers';
|
||||
import {
|
||||
NODE_PACKAGE_PREFIX,
|
||||
NPM_COMMAND_TOKENS,
|
||||
NPM_PACKAGE_STATUS_GOOD,
|
||||
RESPONSE_ERROR_MESSAGES,
|
||||
} from '../../src/constants';
|
||||
import { InstalledPackages } from '../../src/databases/entities/InstalledPackages';
|
||||
import { InstalledNodes } from '../../src/databases/entities/InstalledNodes';
|
||||
} from '@/constants';
|
||||
import { InstalledPackages } from '@db/entities/InstalledPackages';
|
||||
import { InstalledNodes } from '@db/entities/InstalledNodes';
|
||||
import { randomName } from '../integration/shared/random';
|
||||
import config from '../../config';
|
||||
import config from '@/config';
|
||||
import { installedPackagePayload, installedNodePayload } from '../integration/shared/utils';
|
||||
|
||||
import type { CommunityPackages } from '../../src/Interfaces';
|
||||
import type { CommunityPackages } from '@/Interfaces';
|
||||
|
||||
jest.mock('fs/promises');
|
||||
jest.mock('child_process');
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { CredentialTypes } from '../../src';
|
||||
import type { ICredentialTypeData, ICredentialTypes } from 'n8n-workflow';
|
||||
import { CredentialTypes } from '@/CredentialTypes';
|
||||
|
||||
describe('ActiveExecutions', () => {
|
||||
|
||||
let credentialTypes: ICredentialTypes;
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -35,7 +34,9 @@ describe('ActiveExecutions', () => {
|
||||
test('Should return correct credential type for valid name', () => {
|
||||
credentialTypes.init(mockCredentialTypes());
|
||||
const mockedCredentialTypes = mockCredentialTypes();
|
||||
expect(credentialTypes.getByName('fakeFirstCredential')).toStrictEqual(mockedCredentialTypes.fakeFirstCredential.type);
|
||||
expect(credentialTypes.getByName('fakeFirstCredential')).toStrictEqual(
|
||||
mockedCredentialTypes.fakeFirstCredential.type,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import { CredentialsHelper, CredentialTypes } from '../../src';
|
||||
import * as Helpers from './Helpers';
|
||||
import {
|
||||
IAuthenticateGeneric,
|
||||
ICredentialDataDecryptedObject,
|
||||
@@ -10,6 +8,9 @@ import {
|
||||
INodeProperties,
|
||||
Workflow,
|
||||
} from 'n8n-workflow';
|
||||
import { CredentialsHelper } from '@/CredentialsHelper';
|
||||
import { CredentialTypes } from '@/CredentialTypes';
|
||||
import * as Helpers from './Helpers';
|
||||
|
||||
const TEST_ENCRYPTION_KEY = 'test';
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { toHttpNodeParameters } from "../../src/CurlConverterHelper";
|
||||
import { toHttpNodeParameters } from '@/CurlConverterHelper';
|
||||
|
||||
describe('CurlConverterHelper', () => {
|
||||
|
||||
test('Should parse form-urlencoded content type correctly', () => {
|
||||
const curl = 'curl -X POST https://reqbin.com/echo/post/form -H "Content-Type: application/x-www-form-urlencoded" -d "param1=value1¶m2=value2"';
|
||||
const curl =
|
||||
'curl -X POST https://reqbin.com/echo/post/form -H "Content-Type: application/x-www-form-urlencoded" -d "param1=value1¶m2=value2"';
|
||||
const parameters = toHttpNodeParameters(curl);
|
||||
expect(parameters.url).toBe('https://reqbin.com/echo/post/form');
|
||||
expect(parameters.sendBody).toBe(true);
|
||||
@@ -113,7 +113,9 @@ describe('CurlConverterHelper', () => {
|
||||
expect(parameters.sendQuery).toBe(false);
|
||||
expect(parameters.sendHeaders).toBe(true);
|
||||
expect(parameters.headerParameters?.parameters[0].name).toBe('authorization');
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(`Basic ${Buffer.from('login:password').toString('base64')}`);
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(
|
||||
`Basic ${Buffer.from('login:password').toString('base64')}`,
|
||||
);
|
||||
});
|
||||
|
||||
test('Should parse location flag with --location', () => {
|
||||
@@ -125,7 +127,9 @@ describe('CurlConverterHelper', () => {
|
||||
expect(parameters.sendQuery).toBe(false);
|
||||
expect(parameters.sendHeaders).toBe(true);
|
||||
expect(parameters.headerParameters?.parameters[0].name).toBe('authorization');
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(`Basic ${Buffer.from('login:password').toString('base64')}`);
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(
|
||||
`Basic ${Buffer.from('login:password').toString('base64')}`,
|
||||
);
|
||||
expect(parameters.options.redirect.redirect.followRedirects).toBe(true);
|
||||
});
|
||||
|
||||
@@ -138,7 +142,9 @@ describe('CurlConverterHelper', () => {
|
||||
expect(parameters.sendQuery).toBe(false);
|
||||
expect(parameters.sendHeaders).toBe(true);
|
||||
expect(parameters.headerParameters?.parameters[0].name).toBe('authorization');
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(`Basic ${Buffer.from('login:password').toString('base64')}`);
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(
|
||||
`Basic ${Buffer.from('login:password').toString('base64')}`,
|
||||
);
|
||||
expect(parameters.options.redirect.redirect.followRedirects).toBe(true);
|
||||
});
|
||||
|
||||
@@ -151,9 +157,11 @@ describe('CurlConverterHelper', () => {
|
||||
expect(parameters.sendQuery).toBe(false);
|
||||
expect(parameters.sendHeaders).toBe(true);
|
||||
expect(parameters.headerParameters?.parameters[0].name).toBe('authorization');
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(`Basic ${Buffer.from('login:password').toString('base64')}`);
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(
|
||||
`Basic ${Buffer.from('login:password').toString('base64')}`,
|
||||
);
|
||||
expect(parameters.options.redirect.redirect.followRedirects).toBe(true);
|
||||
expect(parameters.options.redirect.redirect.maxRedirects).toBe("10");
|
||||
expect(parameters.options.redirect.redirect.maxRedirects).toBe('10');
|
||||
});
|
||||
|
||||
test('Should parse proxy flag -x', () => {
|
||||
@@ -165,7 +173,9 @@ describe('CurlConverterHelper', () => {
|
||||
expect(parameters.sendQuery).toBe(false);
|
||||
expect(parameters.sendHeaders).toBe(true);
|
||||
expect(parameters.headerParameters?.parameters[0].name).toBe('authorization');
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(`Basic ${Buffer.from('login:password').toString('base64')}`);
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(
|
||||
`Basic ${Buffer.from('login:password').toString('base64')}`,
|
||||
);
|
||||
expect(parameters.options.proxy).toBe('https://google.com');
|
||||
});
|
||||
|
||||
@@ -178,7 +188,9 @@ describe('CurlConverterHelper', () => {
|
||||
expect(parameters.sendQuery).toBe(false);
|
||||
expect(parameters.sendHeaders).toBe(true);
|
||||
expect(parameters.headerParameters?.parameters[0].name).toBe('authorization');
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(`Basic ${Buffer.from('login:password').toString('base64')}`);
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(
|
||||
`Basic ${Buffer.from('login:password').toString('base64')}`,
|
||||
);
|
||||
expect(parameters.options.proxy).toBe('https://google.com');
|
||||
});
|
||||
|
||||
@@ -191,7 +203,9 @@ describe('CurlConverterHelper', () => {
|
||||
expect(parameters.sendQuery).toBe(false);
|
||||
expect(parameters.sendHeaders).toBe(true);
|
||||
expect(parameters.headerParameters?.parameters[0].name).toBe('authorization');
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(`Basic ${Buffer.from('login:password').toString('base64')}`);
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(
|
||||
`Basic ${Buffer.from('login:password').toString('base64')}`,
|
||||
);
|
||||
expect(parameters.options.response.response.fullResponse).toBe(true);
|
||||
});
|
||||
|
||||
@@ -204,7 +218,9 @@ describe('CurlConverterHelper', () => {
|
||||
expect(parameters.sendQuery).toBe(false);
|
||||
expect(parameters.sendHeaders).toBe(true);
|
||||
expect(parameters.headerParameters?.parameters[0].name).toBe('authorization');
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(`Basic ${Buffer.from('login:password').toString('base64')}`);
|
||||
expect(parameters.headerParameters?.parameters[0].value).toBe(
|
||||
`Basic ${Buffer.from('login:password').toString('base64')}`,
|
||||
);
|
||||
expect(parameters.options.response.response.fullResponse).toBe(true);
|
||||
});
|
||||
|
||||
@@ -235,13 +251,13 @@ describe('CurlConverterHelper', () => {
|
||||
|
||||
test('Should parse download file flag -O', () => {
|
||||
const curl = `curl --request POST https://reqbin.com/echo -u "login:password" -O`;
|
||||
; const parameters = toHttpNodeParameters(curl);
|
||||
const parameters = toHttpNodeParameters(curl);
|
||||
expect(parameters.url).toBe('https://reqbin.com/echo');
|
||||
expect(parameters.method).toBe('POST');
|
||||
expect(parameters.sendBody).toBe(false);
|
||||
expect(parameters.options.response.response.responseFormat).toBe('file');
|
||||
expect(parameters.options.response.response.outputPropertyName).toBe('data');
|
||||
})
|
||||
});
|
||||
|
||||
test('Should parse download file flag -o', () => {
|
||||
const curl = `curl --request POST https://reqbin.com/echo -u "login:password" -o`;
|
||||
@@ -251,7 +267,7 @@ describe('CurlConverterHelper', () => {
|
||||
expect(parameters.sendBody).toBe(false);
|
||||
expect(parameters.options.response.response.responseFormat).toBe('file');
|
||||
expect(parameters.options.response.response.outputPropertyName).toBe('data');
|
||||
})
|
||||
});
|
||||
|
||||
test('Should parse ignore SSL flag -k', () => {
|
||||
const curl = `curl --request POST https://reqbin.com/echo -u "login:password" -k`;
|
||||
@@ -260,7 +276,7 @@ describe('CurlConverterHelper', () => {
|
||||
expect(parameters.method).toBe('POST');
|
||||
expect(parameters.sendBody).toBe(false);
|
||||
expect(parameters.options.allowUnauthorizedCerts).toBe(true);
|
||||
})
|
||||
});
|
||||
|
||||
test('Should parse ignore SSL flag --insecure', () => {
|
||||
const curl = `curl --request POST https://reqbin.com/echo -u "login:password" --insecure`;
|
||||
@@ -269,6 +285,5 @@ describe('CurlConverterHelper', () => {
|
||||
expect(parameters.method).toBe('POST');
|
||||
expect(parameters.sendBody).toBe(false);
|
||||
expect(parameters.options.allowUnauthorizedCerts).toBe(true);
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Telemetry } from '../../src/telemetry';
|
||||
import config from '../../config';
|
||||
import { Telemetry } from '@/telemetry';
|
||||
import config from '@/config';
|
||||
|
||||
jest.spyOn(Telemetry.prototype as any, 'initRudderStack').mockImplementation(() => {
|
||||
return {
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
import { WorkflowCredentials, Db } from '../../src';
|
||||
import { mocked } from 'jest-mock';
|
||||
import type { IRun, INode, IWorkflowCredentials, IDataObject } from 'n8n-workflow';
|
||||
import type { INode, IWorkflowCredentials } from 'n8n-workflow';
|
||||
import * as Db from '@/Db';
|
||||
import { WorkflowCredentials } from '@/WorkflowCredentials';
|
||||
|
||||
// Define a function used to mock the findOne function
|
||||
async function mockFind({ id, type }): Promise<IWorkflowCredentials | null> {
|
||||
// Simple statement that maps a return value based on the `id` paremeter
|
||||
async function mockFind({
|
||||
id,
|
||||
type,
|
||||
}: {
|
||||
id: string | number;
|
||||
type: string;
|
||||
}): Promise<IWorkflowCredentials | null> {
|
||||
// Simple statement that maps a return value based on the `id` parameter
|
||||
if (id === notFoundNode.credentials!!.test.id) {
|
||||
return null;
|
||||
}
|
||||
@@ -22,7 +29,7 @@ async function mockFind({ id, type }): Promise<IWorkflowCredentials | null> {
|
||||
};
|
||||
}
|
||||
|
||||
jest.mock('../../src/Db', () => {
|
||||
jest.mock('@/Db', () => {
|
||||
return {
|
||||
collections: {
|
||||
Credentials: {
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
import { INode, LoggerProxy } from 'n8n-workflow';
|
||||
import { WorkflowEntity } from '../../src/databases/entities/WorkflowEntity';
|
||||
import { CredentialsEntity } from '../../src/databases/entities/CredentialsEntity';
|
||||
import {
|
||||
getNodesWithInaccessibleCreds,
|
||||
validateWorkflowCredentialUsage,
|
||||
} from '../../src/WorkflowHelpers';
|
||||
import { getLogger } from '../../src/Logger';
|
||||
import { WorkflowEntity } from '@db/entities/WorkflowEntity';
|
||||
import { CredentialsEntity } from '@db/entities/CredentialsEntity';
|
||||
import { getNodesWithInaccessibleCreds, validateWorkflowCredentialUsage } from '@/WorkflowHelpers';
|
||||
import { getLogger } from '@/Logger';
|
||||
|
||||
const FIRST_CREDENTIAL_ID = '1';
|
||||
const SECOND_CREDENTIAL_ID = '2';
|
||||
|
||||
Reference in New Issue
Block a user