mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Allow npm install args to be customised by preInstall trigger
This commit is contained in:
		@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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")
 | 
			
		||||
 
 | 
			
		||||
@@ -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")
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user