Skip to content

Commit

Permalink
fix(core): Fix node exclusion on the frontend types (#12544)
Browse files Browse the repository at this point in the history
  • Loading branch information
netroy authored Jan 10, 2025
1 parent 68da9bb commit b2cbed9
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 42 deletions.
43 changes: 27 additions & 16 deletions packages/core/src/DirectoryLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ export abstract class DirectoryLoader {

constructor(
readonly directory: string,
protected readonly excludeNodes: string[] = [],
protected readonly includeNodes: string[] = [],
protected excludeNodes: string[] = [],
protected includeNodes: string[] = [],
) {}

abstract packageName: string;
Expand Down Expand Up @@ -121,13 +121,12 @@ export abstract class DirectoryLoader {
this.addCodex(tempNode, filePath);

const nodeType = tempNode.description.name;
const fullNodeType = `${this.packageName}.${nodeType}`;

if (this.includeNodes.length && !this.includeNodes.includes(fullNodeType)) {
if (this.includeNodes.length && !this.includeNodes.includes(nodeType)) {
return;
}

if (this.excludeNodes.includes(fullNodeType)) {
if (this.excludeNodes.includes(nodeType)) {
return;
}

Expand All @@ -151,7 +150,7 @@ export abstract class DirectoryLoader {
if (currentVersionNode.hasOwnProperty('executeSingle')) {
throw new ApplicationError(
'"executeSingle" has been removed. Please update the code of this node to use "execute" instead.',
{ extra: { nodeType: fullNodeType } },
{ extra: { nodeType } },
);
}
} else {
Expand Down Expand Up @@ -430,9 +429,25 @@ export class CustomDirectoryLoader extends DirectoryLoader {
* e.g. /nodes-base or community packages.
*/
export class PackageDirectoryLoader extends DirectoryLoader {
packageJson: n8n.PackageJson = this.readJSONSync('package.json');
packageJson: n8n.PackageJson;

packageName = this.packageJson.name;
packageName: string;

constructor(directory: string, excludeNodes: string[] = [], includeNodes: string[] = []) {
super(directory, excludeNodes, includeNodes);

this.packageJson = this.readJSONSync('package.json');
this.packageName = this.packageJson.name;
this.excludeNodes = this.extractNodeTypes(excludeNodes);
this.includeNodes = this.extractNodeTypes(includeNodes);
}

private extractNodeTypes(fullNodeTypes: string[]) {
return fullNodeTypes
.map((fullNodeType) => fullNodeType.split('.'))
.filter(([packageName]) => packageName === this.packageName)
.map(([_, nodeType]) => nodeType);
}

override async loadAll() {
const { n8n } = this.packageJson;
Expand Down Expand Up @@ -524,9 +539,8 @@ export class LazyPackageDirectoryLoader extends PackageDirectoryLoader {

if (this.includeNodes.length) {
const allowedNodes: typeof this.known.nodes = {};
for (const fullNodeType of this.includeNodes) {
const [packageName, nodeType] = fullNodeType.split('.');
if (packageName === this.packageName && nodeType in this.known.nodes) {
for (const nodeType of this.includeNodes) {
if (nodeType in this.known.nodes) {
allowedNodes[nodeType] = this.known.nodes[nodeType];
}
}
Expand All @@ -538,11 +552,8 @@ export class LazyPackageDirectoryLoader extends PackageDirectoryLoader {
}

if (this.excludeNodes.length) {
for (const fullNodeType of this.excludeNodes) {
const [packageName, nodeType] = fullNodeType.split('.');
if (packageName === this.packageName) {
delete this.known.nodes[nodeType];
}
for (const nodeType of this.excludeNodes) {
delete this.known.nodes[nodeType];
}

this.types.nodes = this.types.nodes.filter(
Expand Down
31 changes: 5 additions & 26 deletions packages/core/test/DirectoryLoader.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -235,10 +235,7 @@ describe('DirectoryLoader', () => {
return JSON.stringify({});
}
if (path.endsWith('types/nodes.json')) {
return JSON.stringify([
{ name: 'n8n-nodes-testing.node1' },
{ name: 'n8n-nodes-testing.node2' },
]);
return JSON.stringify([{ name: 'node1' }, { name: 'node2' }]);
}
if (path.endsWith('types/credentials.json')) {
return JSON.stringify([]);
Expand All @@ -254,7 +251,7 @@ describe('DirectoryLoader', () => {
node1: { className: 'Node1', sourcePath: 'dist/Node1/Node1.node.js' },
});
expect(loader.types.nodes).toHaveLength(1);
expect(loader.types.nodes[0].name).toBe('n8n-nodes-testing.node1');
expect(loader.types.nodes[0].name).toBe('node1');
expect(classLoader.loadClassInIsolation).not.toHaveBeenCalled();
});

Expand All @@ -274,10 +271,7 @@ describe('DirectoryLoader', () => {
return JSON.stringify({});
}
if (path.endsWith('types/nodes.json')) {
return JSON.stringify([
{ name: 'n8n-nodes-testing.node1' },
{ name: 'n8n-nodes-testing.node2' },
]);
return JSON.stringify([{ name: 'node1' }, { name: 'node2' }]);
}
if (path.endsWith('types/credentials.json')) {
return JSON.stringify([]);
Expand Down Expand Up @@ -314,10 +308,7 @@ describe('DirectoryLoader', () => {
return JSON.stringify({});
}
if (path.endsWith('types/nodes.json')) {
return JSON.stringify([
{ name: 'n8n-nodes-testing.node1' },
{ name: 'n8n-nodes-testing.node2' },
]);
return JSON.stringify([{ name: 'node1' }, { name: 'node2' }]);
}
if (path.endsWith('types/credentials.json')) {
return JSON.stringify([]);
Expand All @@ -333,7 +324,7 @@ describe('DirectoryLoader', () => {
node2: { className: 'Node2', sourcePath: 'dist/Node2/Node2.node.js' },
});
expect(loader.types.nodes).toHaveLength(1);
expect(loader.types.nodes[0].name).toBe('n8n-nodes-testing.node2');
expect(loader.types.nodes[0].name).toBe('node2');
expect(classLoader.loadClassInIsolation).not.toHaveBeenCalled();
});
});
Expand Down Expand Up @@ -654,18 +645,6 @@ describe('DirectoryLoader', () => {
expect(nodeWithIcon.description.icon).toBeUndefined();
});

it('should skip node if included in excludeNodes', () => {
const loader = new CustomDirectoryLoader(directory, ['CUSTOM.node1']);
const filePath = 'dist/Node1/Node1.node.js';

loader.loadNodeFromFile(filePath);

expect(loader.nodeTypes).toEqual({});
expect(loader.known.nodes).toEqual({});
expect(loader.types.nodes).toEqual([]);
expect(loader.loadedNodes).toEqual([]);
});

it('should skip node if not in includeNodes', () => {
const loader = new CustomDirectoryLoader(directory, [], ['CUSTOM.other']);
const filePath = 'dist/Node1/Node1.node.js';
Expand Down

0 comments on commit b2cbed9

Please sign in to comment.