diff --git a/packages/node_modules/@node-red/registry/lib/externalModules.js b/packages/node_modules/@node-red/registry/lib/externalModules.js index 839f63b23..726c5384e 100644 --- a/packages/node_modules/@node-red/registry/lib/externalModules.js +++ b/packages/node_modules/@node-red/registry/lib/externalModules.js @@ -190,16 +190,18 @@ async function installModule(moduleDetails) { await ensureModuleDir(); - var args = ["install", installSpec, "--production"]; let triggerPayload = { "module": moduleDetails.module, "version": moduleDetails.version, "dir": installDir, + "args": ["--production"] } return hooks.trigger("preInstall", triggerPayload).then((result) => { // preInstall passed // - run install if (result !== false) { + let extraArgs = triggerPayload.args || []; + let args = ['install', ...extraArgs, installSpec] log.trace(NPM_COMMAND + JSON.stringify(args)); return exec.run(NPM_COMMAND, args, { cwd: installDir },true) } else { diff --git a/packages/node_modules/@node-red/registry/lib/installer.js b/packages/node_modules/@node-red/registry/lib/installer.js index f501f0d4c..9efea696f 100644 --- a/packages/node_modules/@node-red/registry/lib/installer.js +++ b/packages/node_modules/@node-red/registry/lib/installer.js @@ -168,20 +168,22 @@ async function installModule(module,version,url) { } var installDir = settings.userDir || process.env.NODE_RED_HOME || "."; - var args = ['install','--no-audit','--no-update-notifier','--no-fund','--save','--save-prefix=~','--production',installName]; let triggerPayload = { "module": module, "version": version, "url": url, "dir": installDir, "isExisting": isExisting, - "isUpgrade": isUpgrade + "isUpgrade": isUpgrade, + "args": ['--no-audit','--no-update-notifier','--no-fund','--save','--save-prefix=~','--production'] } return hooks.trigger("preInstall", triggerPayload).then((result) => { // preInstall passed // - run install if (result !== false) { + let extraArgs = triggerPayload.args || []; + let args = ['install', ...extraArgs, installName] log.trace(npmCommand + JSON.stringify(args)); return exec.run(npmCommand,args,{ cwd: installDir}, true) } else { diff --git a/test/unit/@node-red/registry/lib/externalModules_spec.js b/test/unit/@node-red/registry/lib/externalModules_spec.js index f226f45e5..5a2e8cb36 100644 --- a/test/unit/@node-red/registry/lib/externalModules_spec.js +++ b/test/unit/@node-red/registry/lib/externalModules_spec.js @@ -48,13 +48,13 @@ describe("externalModules api", function() { beforeEach(function() { sinon.stub(exec,"run").callsFake(async function(cmd, args, options) { let error; - if (args[1] === "moduleNotFound") { + if (args[2] === "moduleNotFound") { error = new Error(); error.stderr = "E404"; - } else if (args[1] === "moduleVersionNotFound") { + } else if (args[2] === "moduleVersionNotFound") { error = new Error(); error.stderr = "ETARGET"; - } else if (args[1] === "moduleFail") { + } else if (args[2] === "moduleFail") { error = new Error(); error.stderr = "Some unexpected install error"; } @@ -109,13 +109,14 @@ describe("externalModules api", function() { externalModules.init({userDir: homeDir}); externalModules.register("function", "libs"); let receivedPreEvent,receivedPostEvent; - hooks.add("preInstall", function(event) { receivedPreEvent = event; }) + hooks.add("preInstall", function(event) { event.args = ["a"]; receivedPreEvent = event; }) hooks.add("postInstall", function(event) { receivedPostEvent = event; }) await externalModules.checkFlowDependencies([ {type: "function", libs:[{module: "foo"}]} ]) exec.run.called.should.be.true(); + // exec.run.lastCall.args[1].should.eql([ 'install', 'a', 'foo' ]); receivedPreEvent.should.have.property("module","foo") receivedPreEvent.should.have.property("version") receivedPreEvent.should.have.property("dir") diff --git a/test/unit/@node-red/registry/lib/installer_spec.js b/test/unit/@node-red/registry/lib/installer_spec.js index 5311e55d0..63075ff24 100644 --- a/test/unit/@node-red/registry/lib/installer_spec.js +++ b/test/unit/@node-red/registry/lib/installer_spec.js @@ -254,7 +254,7 @@ describe('nodes/registry/installer', function() { it("triggers preInstall and postInstall hooks", function(done) { let receivedPreEvent,receivedPostEvent; - hooks.add("preInstall", function(event) { receivedPreEvent = event; }) + hooks.add("preInstall", function(event) { event.args = ["a"]; receivedPreEvent = event; }) hooks.add("postInstall", function(event) { receivedPostEvent = event; }) var nodeInfo = {nodes:{module:"foo",types:["a"]}}; var res = {code: 0,stdout:"",stderr:""} @@ -267,6 +267,8 @@ describe('nodes/registry/installer', function() { }); installer.installModule("this_wont_exist","1.2.3").then(function(info) { + exec.run.called.should.be.true(); + exec.run.lastCall.args[1].should.eql([ 'install', 'a', 'this_wont_exist@1.2.3' ]); info.should.eql(nodeInfo); should.exist(receivedPreEvent) receivedPreEvent.should.have.property("module","this_wont_exist")