trigger-on-stdout-change.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. var treeKill = require('tree-kill');
  2. var spawnCommand = require('spawn-command');
  3. var supportsColor = require('supports-color');
  4. var CMD = process.argv[2];
  5. var CMD_TO_TRIGGER = process.argv[3];
  6. var IS_WINDOWS = /^win/.test(process.platform);
  7. var waitForFirstBuild = true;
  8. var triggeredChild;
  9. var delayedTrigger;
  10. setTimeout(function() {
  11. waitForFirstBuild = false;
  12. }, 5000);
  13. run(CMD, CMD_TO_TRIGGER);
  14. function run(commands, commandToTrigger, spawnOpts) {
  15. spawnOpts = spawnOpts || {};
  16. if (IS_WINDOWS) {
  17. spawnOpts.detached = false;
  18. }
  19. spawnOpts.env = Object.assign({FORCE_COLOR: supportsColor.level}, process.env);
  20. var child;
  21. try {
  22. child = spawnCommand(commands, spawnOpts);
  23. } catch(ex) {
  24. console.log('Error occured when executing command: ' + commands);
  25. console.log(ex.stack);
  26. process.exit(1);
  27. }
  28. if (commandToTrigger) {
  29. child.stdout.on('data', function(data) {
  30. if (waitForFirstBuild) {
  31. return;
  32. }
  33. if (triggeredChild) {
  34. treeKill(triggeredChild.pid);
  35. }
  36. if (!delayedTrigger) {
  37. delayedTrigger = debounce(function() {
  38. triggeredChild = run(commandToTrigger);
  39. }, 1000);
  40. }
  41. delayedTrigger();
  42. });
  43. }
  44. child.stdout.pipe(process.stdout);
  45. child.stderr.pipe(process.stderr);
  46. if (commandToTrigger) {
  47. ['SIGINT', 'SIGTERM'].forEach(function(signal) {
  48. process.on(signal, function() {
  49. treeKill(child.pid, signal);
  50. });
  51. });
  52. }
  53. return child;
  54. }
  55. function debounce(func, wait) {
  56. var lastTimer = null;
  57. var result;
  58. function _debounce() {
  59. var args = arguments;
  60. if (lastTimer) {
  61. clearTimeout(lastTimer);
  62. }
  63. lastTimer = setTimeout(function() {
  64. result = func.apply(this, args);
  65. }, wait);
  66. return result;
  67. }
  68. return _debounce;
  69. }