mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 18:12:04 +00:00
chore: Fix hot reload for nodes-langchain package (no-changelog) (#17111)
This commit is contained in:
@@ -14,7 +14,7 @@
|
|||||||
"format:check": "biome ci .",
|
"format:check": "biome ci .",
|
||||||
"lint": "eslint nodes credentials utils --quiet",
|
"lint": "eslint nodes credentials utils --quiet",
|
||||||
"lintfix": "eslint nodes credentials utils --fix",
|
"lintfix": "eslint nodes credentials utils --fix",
|
||||||
"watch": "tsup --watch --tsconfig tsconfig.build.json --onSuccess \"pnpm copy-nodes-json && tsc-alias -p tsconfig.build.json && pnpm n8n-generate-metadata\"",
|
"watch": "tsup --watch nodes --watch credentials --watch utils --watch types --tsconfig tsconfig.build.json --onSuccess \"node ./scripts/post-build.js\"",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"test:dev": "jest --watch"
|
"test:dev": "jest --watch"
|
||||||
},
|
},
|
||||||
|
|||||||
23
packages/@n8n/nodes-langchain/scripts/post-build.js
Normal file
23
packages/@n8n/nodes-langchain/scripts/post-build.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Post-build script
|
||||||
|
*
|
||||||
|
* This is a separate script instead of inline npm commands because using "&&"" to chain commands in --onSuccess can cause the watch mode to hang
|
||||||
|
*/
|
||||||
|
|
||||||
|
const { execSync } = require('child_process');
|
||||||
|
|
||||||
|
function runCommand(command) {
|
||||||
|
try {
|
||||||
|
execSync(command, { stdio: 'inherit' });
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Command failed: ${command}`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run all post-build tasks
|
||||||
|
runCommand('npx tsc-alias -p tsconfig.build.json');
|
||||||
|
runCommand('node scripts/copy-tokenizer-json.js .');
|
||||||
|
runCommand('node ../../nodes-base/scripts/copy-nodes-json.js .');
|
||||||
|
runCommand('pnpm n8n-copy-static-files');
|
||||||
|
runCommand('pnpm n8n-generate-metadata');
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && pnpm run build:data",
|
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && pnpm run build:data",
|
||||||
"build:data": "node scripts/build.mjs",
|
"build:data": "node scripts/build.mjs",
|
||||||
"buildAndDev": "pnpm run build && pnpm run dev",
|
"buildAndDev": "pnpm run build && pnpm run dev",
|
||||||
"dev": "concurrently -k -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"npm run watch\" \"nodemon\"",
|
"dev": "concurrently -k -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"npm run watch\" \"nodemon --delay 1\"",
|
||||||
"dev:worker": "concurrently -k -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"npm run watch\" \"nodemon worker\"",
|
"dev:worker": "concurrently -k -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"npm run watch\" \"nodemon worker\"",
|
||||||
"dev:webhook": "concurrently -k -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"npm run watch\" \"nodemon webhook\"",
|
"dev:webhook": "concurrently -k -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"npm run watch\" \"nodemon webhook\"",
|
||||||
"format": "biome format --write .",
|
"format": "biome format --write .",
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import type {
|
|||||||
LoadedNodesAndCredentials,
|
LoadedNodesAndCredentials,
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
import { deepCopy, NodeConnectionTypes, UnexpectedError, UserError } from 'n8n-workflow';
|
import { deepCopy, NodeConnectionTypes, UnexpectedError, UserError } from 'n8n-workflow';
|
||||||
|
import { type Stats } from 'node:fs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import picocolors from 'picocolors';
|
import picocolors from 'picocolors';
|
||||||
|
|
||||||
@@ -532,24 +533,47 @@ export class LoadNodesAndCredentials {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const reloader = debounce(async () => {
|
const reloader = debounce(async () => {
|
||||||
|
this.logger.info(`Hot reload triggered for ${loader.packageName}`);
|
||||||
|
try {
|
||||||
loader.reset();
|
loader.reset();
|
||||||
await loader.loadAll();
|
await loader.loadAll();
|
||||||
await this.postProcessLoaders();
|
await this.postProcessLoaders();
|
||||||
push.broadcast({ type: 'nodeDescriptionUpdated', data: {} });
|
push.broadcast({ type: 'nodeDescriptionUpdated', data: {} });
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error(`Hot reload failed for ${loader.packageName}`);
|
||||||
|
}
|
||||||
}, 100);
|
}, 100);
|
||||||
|
|
||||||
const toWatch = loader.isLazyLoaded
|
// For lazy loaded packages, we need to watch the dist directory
|
||||||
? ['**/nodes.json', '**/credentials.json']
|
const watchPath = loader.isLazyLoaded ? path.join(directory, 'dist') : directory;
|
||||||
: ['**/*.js', '**/*.json'];
|
|
||||||
const files = await glob(toWatch, {
|
// Watch options for chokidar v4
|
||||||
cwd: directory,
|
const watchOptions = {
|
||||||
ignore: ['node_modules/**'],
|
|
||||||
});
|
|
||||||
const watcher = watch(files, {
|
|
||||||
cwd: directory,
|
|
||||||
ignoreInitial: true,
|
ignoreInitial: true,
|
||||||
});
|
cwd: directory,
|
||||||
watcher.on('add', reloader).on('change', reloader).on('unlink', reloader);
|
// Filter which files to watch based on loader type
|
||||||
|
ignored: (filePath: string, stats?: Stats) => {
|
||||||
|
if (!stats) return false;
|
||||||
|
if (stats.isDirectory()) return false;
|
||||||
|
if (filePath.includes('node_modules')) return true;
|
||||||
|
|
||||||
|
if (loader.isLazyLoaded) {
|
||||||
|
// Only watch nodes.json and credentials.json files
|
||||||
|
const basename = path.basename(filePath);
|
||||||
|
return basename !== 'nodes.json' && basename !== 'credentials.json';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Watch all .js and .json files
|
||||||
|
return !filePath.endsWith('.js') && !filePath.endsWith('.json');
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const watcher = watch(watchPath, watchOptions);
|
||||||
|
|
||||||
|
// Watch for file changes and additions
|
||||||
|
// Not watching removals to prevent issues during build processes
|
||||||
|
watcher.on('change', reloader);
|
||||||
|
watcher.on('add', reloader);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user