feat: implement universal Node.js compatibility with automatic database adapter fallback

This commit is contained in:
czlonkowski
2025-06-12 23:51:47 +02:00
parent 66f5d74e42
commit b476d36275
20 changed files with 16668 additions and 4772 deletions

View File

@@ -8,8 +8,8 @@ export interface LoadedNode {
export class N8nNodeLoader {
private readonly CORE_PACKAGES = [
'n8n-nodes-base',
'@n8n/n8n-nodes-langchain'
{ name: 'n8n-nodes-base', path: 'n8n/node_modules/n8n-nodes-base' },
{ name: '@n8n/n8n-nodes-langchain', path: '@n8n/n8n-nodes-langchain' }
];
async loadAllNodes(): Promise<LoadedNode[]> {
@@ -17,21 +17,21 @@ export class N8nNodeLoader {
for (const pkg of this.CORE_PACKAGES) {
try {
console.log(`\n📦 Loading package: ${pkg}`);
// Direct require - no complex path resolution
const packageJson = require(`${pkg}/package.json`);
console.log(`\n📦 Loading package: ${pkg.name} from ${pkg.path}`);
// Use the path property to locate the package
const packageJson = require(`${pkg.path}/package.json`);
console.log(` Found ${Object.keys(packageJson.n8n?.nodes || {}).length} nodes in package.json`);
const nodes = await this.loadPackageNodes(pkg, packageJson);
const nodes = await this.loadPackageNodes(pkg.name, pkg.path, packageJson);
results.push(...nodes);
} catch (error) {
console.error(`Failed to load ${pkg}:`, error);
console.error(`Failed to load ${pkg.name}:`, error);
}
}
return results;
}
private async loadPackageNodes(packageName: string, packageJson: any): Promise<LoadedNode[]> {
private async loadPackageNodes(packageName: string, packagePath: string, packageJson: any): Promise<LoadedNode[]> {
const n8nConfig = packageJson.n8n || {};
const nodes: LoadedNode[] = [];
@@ -42,7 +42,7 @@ export class N8nNodeLoader {
// Handle array format (n8n-nodes-base uses this)
for (const nodePath of nodesList) {
try {
const fullPath = require.resolve(`${packageName}/${nodePath}`);
const fullPath = require.resolve(`${packagePath}/${nodePath}`);
const nodeModule = require(fullPath);
// Extract node name from path (e.g., "dist/nodes/Slack/Slack.node.js" -> "Slack")
@@ -65,7 +65,7 @@ export class N8nNodeLoader {
// Handle object format (for other packages)
for (const [nodeName, nodePath] of Object.entries(nodesList)) {
try {
const fullPath = require.resolve(`${packageName}/${nodePath as string}`);
const fullPath = require.resolve(`${packagePath}/${nodePath as string}`);
const nodeModule = require(fullPath);
// Handle default export and various export patterns