diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/projects.js b/packages/node_modules/@node-red/editor-api/lib/editor/projects.js index 0849c8ff8..02dc58c58 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/projects.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/projects.js @@ -137,6 +137,7 @@ module.exports = { req.body.hasOwnProperty('description') || req.body.hasOwnProperty('dependencies')|| req.body.hasOwnProperty('summary') || + req.body.hasOwnProperty('version') || req.body.hasOwnProperty('files') || req.body.hasOwnProperty('git')) { runtimeAPI.projects.updateProject(opts).then(function() { diff --git a/packages/node_modules/@node-red/editor-api/lib/util.js b/packages/node_modules/@node-red/editor-api/lib/util.js index 950e3d9cc..621fd9e33 100644 --- a/packages/node_modules/@node-red/editor-api/lib/util.js +++ b/packages/node_modules/@node-red/editor-api/lib/util.js @@ -43,6 +43,10 @@ module.exports = { rejectHandler: function(req,res,err) { //TODO: why this when errorHandler also?! log.audit({event: "api.error",error:err.code||"unexpected_error",message:err.message||err.toString()},req); + if (!err.code) { + // by definition, an unexpected_error to log + log.error(err); + } var response = { code: err.code||"unexpected_error", message: err.message||err.toString() diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 26f0df2af..9fe4ef33e 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -721,6 +721,12 @@ "committerTip": "Leave blank to use system default", "userName": "Username", "email": "Email", + "workflow": "Workflow", + "workfowTip": "Choose your preferred git workflow", + "workflowManual": "Manual", + "workflowManualTip": "All changes must be manually committed under the 'history' sidebar", + "workflowAuto": "Automatic", + "workflowAutoTip": "Changes are committed automatically with every deploy", "sshKeys": "SSH Keys", "sshKeysTip": "Allows you to create secure connections to remote git repositories.", "add": "add key", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js index f0944c879..4abe6fd1f 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js @@ -166,34 +166,42 @@ RED.projects.settings = (function() { description.find(".red-ui-text-bidi-aware").contents().filter(function() { return this.nodeType === 3 && this.textContent.trim() !== "" }).wrap( "" ); } - function editSummary(activeProject, summary, container) { + function editSummary(activeProject, summary, container, version, versionContainer) { var editButton = container.prev(); editButton.hide(); container.empty(); + versionContainer.empty(); var bg = $('').appendTo(container); var input = $('').val(summary||"").appendTo(container); + var versionInput = $('').val(version||"").appendTo(versionContainer); + $('') .appendTo(bg) .on("click", function(evt) { evt.preventDefault(); updateProjectSummary(activeProject.summary, container); + updateProjectVersion(activeProject.version, versionContainer); editButton.show(); }); $('') .appendTo(bg) .on("click", function(evt) { evt.preventDefault(); - var v = input.val(); - updateProjectSummary(v, container); - var spinner = utils.addSpinnerOverlay(container); + var newSummary = input.val(); + var newVersion = versionInput.val(); + updateProjectSummary(newSummary, container); + updateProjectVersion(newVersion, versionContainer); + var spinner = utils.addSpinnerOverlay(container).addClass('red-ui-component-spinner-contain'); var done = function(err,res) { if (err) { spinner.remove(); - return editSummary(activeProject, summary, container); + return editSummary(activeProject, summary, container, version, versionContainer); } - activeProject.summary = v; + activeProject.summary = newSummary; + activeProject.version = newVersion; spinner.remove(); updateProjectSummary(activeProject.summary, container); + updateProjectVersion(activeProject.version, versionContainer); editButton.show(); } utils.sendRequest({ @@ -214,31 +222,39 @@ RED.projects.settings = (function() { } }, } - },{summary:v}); + },{summary:newSummary, version: newVersion}); }); } function updateProjectSummary(summary, container) { container.empty(); if (summary) { - container.text(summary).removeClass('node-info-node'); + container.text(summary).removeClass('red-ui-help-info-none'); } else { container.text(RED._("sidebar.project.noSummaryAvailable")).addClass('red-ui-help-info-none'); } } - + function updateProjectVersion(version, container) { + container.empty(); + if (version) { + container.text(version); + } + } function createMainPane(activeProject) { var pane = $('
'); $('

').text(activeProject.name).appendTo(pane); var summary = $('
').appendTo(pane); var summaryContent = $('
').appendTo(summary); + var versionContent = $('
').addClass('red-ui-help-info-none').appendTo(summary); updateProjectSummary(activeProject.summary, summaryContent); + updateProjectVersion(activeProject.version, versionContent); + if (RED.user.hasPermission("projects.write")) { $('') .prependTo(summary) .on("click", function(evt) { evt.preventDefault(); - editSummary(activeProject, activeProject.summary, summaryContent); + editSummary(activeProject, activeProject.summary, summaryContent, activeProject.version, versionContent); }); } $('
').appendTo(pane); @@ -1573,8 +1589,6 @@ RED.projects.settings = (function() { updateForm(); } - - function createSettingsPane(activeProject) { var pane = $('
'); createFilesSection(activeProject,pane); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectUserSettings.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectUserSettings.js index 170aacea0..31acbc1e4 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectUserSettings.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectUserSettings.js @@ -38,13 +38,34 @@ RED.projects.userSettings = (function() { $('').text(RED._("editor:sidebar.project.userSettings.email")).appendTo(row); gitEmailInput = $('').appendTo(row); gitEmailInput.val(currentGitSettings.user.email||""); + + } + + function createWorkflowSection(pane) { + + var currentGitSettings = RED.settings.get('git') || {}; + currentGitSettings.workflow = currentGitSettings.workflow || {}; + currentGitSettings.workflow.mode = currentGitSettings.workflow.mode || "manual"; + + var title = $('

').text(RED._("editor:sidebar.project.userSettings.workflow")).appendTo(pane); + + var workflowContainer = $('
').appendTo(pane); + $('
').appendTo(workflowContainer).text(RED._("editor:sidebar.project.userSettings.workfowTip")); + + var row = $('
').appendTo(workflowContainer); + $('').appendTo(row); + row = $('
').appendTo(workflowContainer); + $('').appendTo(row); + + workflowContainer.find('[name="user-setting-gitworkflow"][type="radio"][value="'+currentGitSettings.workflow.mode+'"]').prop('checked',true) + } function createSSHKeySection(pane) { + var title = $('

').text(RED._("editor:sidebar.project.userSettings.sshKeys")).appendTo(pane); var container = $('
').appendTo(pane); var popover; - var title = $('

').text(RED._("editor:sidebar.project.userSettings.sshKeys")).appendTo(container); var subtitle = $('
').appendTo(container).text(RED._("editor:sidebar.project.userSettings.sshKeysTip")); var addKeyButton = $('') @@ -391,6 +412,7 @@ RED.projects.userSettings = (function() { function createSettingsPane(activeProject) { var pane = $('
'); createGitUserSection(pane); + createWorkflowSection(pane); createSSHKeySection(pane); return pane; } @@ -407,6 +429,9 @@ RED.projects.userSettings = (function() { currentGitSettings.user = currentGitSettings.user || {}; currentGitSettings.user.name = gitUsernameInput.val(); currentGitSettings.user.email = gitEmailInput.val(); + currentGitSettings.workflow = currentGitSettings.workflow || {}; + currentGitSettings.workflow.mode = $('[name="user-setting-gitworkflow"][type="radio"]:checked').val() + RED.settings.set('git', currentGitSettings); } }); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js index 7d20fe094..8aede9c2b 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js @@ -293,14 +293,20 @@ RED.sidebar.versionControl = (function() { if (activeProject) { // TODO: this is a full refresh of the files - should be able to // just do an incremental refresh - allChanges = {}; - unstagedChangesList.editableList('empty'); - stagedChangesList.editableList('empty'); - unmergedChangesList.editableList('empty'); - $.getJSON("projects/"+activeProject.name+"/status",function(result) { - refreshFiles(result); - }); + var workflowMode = ((RED.settings.get('git') || {}).workflow || {}).mode || "manual"; + if (workflowMode === 'auto') { + refresh(true); + } else { + allChanges = {}; + unstagedChangesList.editableList('empty'); + stagedChangesList.editableList('empty'); + unmergedChangesList.editableList('empty'); + + $.getJSON("projects/"+activeProject.name+"/status",function(result) { + refreshFiles(result); + }); + } } }); RED.events.on("login",function() { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss b/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss index 60afeebe4..5cf0570c2 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss @@ -79,7 +79,7 @@ display: table; clear: both; } - .uneditable-input, input, textarea { + .uneditable-input, input[type="text"],input[type="password"], textarea { width: calc(100% - 150px); } textarea { diff --git a/packages/node_modules/@node-red/runtime/lib/api/flows.js b/packages/node_modules/@node-red/runtime/lib/api/flows.js index 6cbda197a..4207c83ce 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/flows.js +++ b/packages/node_modules/@node-red/runtime/lib/api/flows.js @@ -88,7 +88,7 @@ var api = module.exports = { return reject(err); } } - apiPromise = runtime.nodes.setFlows(flows.flows,flows.credentials,deploymentType); + apiPromise = runtime.nodes.setFlows(flows.flows,flows.credentials,deploymentType,null,null,opts.user); } apiPromise.then(function(flowId) { return resolve({rev:flowId}); @@ -98,7 +98,7 @@ var api = module.exports = { return reject(err); }); }); - }); + }); }, /** @@ -114,7 +114,7 @@ var api = module.exports = { return mutex.runExclusive(function() { return new Promise(function (resolve, reject) { var flow = opts.flow; - runtime.nodes.addFlow(flow).then(function (id) { + runtime.nodes.addFlow(flow,opts.user).then(function (id) { runtime.log.audit({event: "flow.add", id: id}, opts.req); return resolve(id); }).catch(function (err) { @@ -170,7 +170,7 @@ var api = module.exports = { var flow = opts.flow; var id = opts.id; try { - runtime.nodes.updateFlow(id, flow).then(function () { + runtime.nodes.updateFlow(id, flow, opts.user).then(function () { runtime.log.audit({event: "flow.update", id: id}, opts.req); return resolve(id); }).catch(function (err) { @@ -216,7 +216,7 @@ var api = module.exports = { return new Promise(function (resolve, reject) { var id = opts.id; try { - runtime.nodes.removeFlow(id).then(function () { + runtime.nodes.removeFlow(id, opts.user).then(function () { runtime.log.audit({event: "flow.remove", id: id}, opts.req); return resolve(); }).catch(function (err) { diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/flows/index.js b/packages/node_modules/@node-red/runtime/lib/nodes/flows/index.js index 1a350ce7c..38742daf3 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/flows/index.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/flows/index.js @@ -115,7 +115,7 @@ function load(forceStart) { * type - full/nodes/flows/load (default full) * muteLog - don't emit the standard log messages (used for individual flow api) */ -function setFlows(_config,_credentials,type,muteLog,forceStart) { +function setFlows(_config,_credentials,type,muteLog,forceStart,user) { if (typeof _credentials === "string") { type = _credentials; _credentials = null; @@ -186,7 +186,7 @@ function setFlows(_config,_credentials,type,muteLog,forceStart) { credentialsDirty:credsDirty, credentials: creds } - return storage.saveFlows(saveConfig); + return storage.saveFlows(saveConfig, user); }); } @@ -481,7 +481,7 @@ function updateMissingTypes() { } } -function addFlow(flow) { +function addFlow(flow, user) { var i,node; if (!flow.hasOwnProperty('nodes')) { throw new Error('missing nodes property'); @@ -531,7 +531,7 @@ function addFlow(flow) { var newConfig = clone(activeConfig.flows); newConfig = newConfig.concat(nodes); - return setFlows(newConfig,null,'flows',true).then(function() { + return setFlows(newConfig, null, 'flows', true, null, user).then(function() { log.info(log._("nodes.flows.added-flow",{label:(flow.label?flow.label+" ":"")+"["+flow.id+"]"})); return flow.id; }); @@ -607,7 +607,7 @@ function getFlow(id) { return result; } -function updateFlow(id,newFlow) { +function updateFlow(id,newFlow, user) { var label = id; if (id !== 'global') { if (!activeFlowConfig.flows[id]) { @@ -662,12 +662,12 @@ function updateFlow(id,newFlow) { } newConfig = newConfig.concat(nodes); - return setFlows(newConfig,null,'flows',true).then(function() { + return setFlows(newConfig, null, 'flows', true, null, user).then(function() { log.info(log._("nodes.flows.updated-flow",{label:(label?label+" ":"")+"["+id+"]"})); }) } -function removeFlow(id) { +function removeFlow(id, user) { if (id === 'global') { // TODO: nls + error code throw new Error('not allowed to remove global'); @@ -684,7 +684,7 @@ function removeFlow(id) { return node.z !== id && node.id !== id; }); - return setFlows(newConfig,null,'flows',true).then(function() { + return setFlows(newConfig, null, 'flows', true, null, user).then(function() { log.info(log._("nodes.flows.removed-flow",{label:(flow.label?flow.label+" ":"")+"["+flow.id+"]"})); }); } diff --git a/packages/node_modules/@node-red/runtime/lib/storage/index.js b/packages/node_modules/@node-red/runtime/lib/storage/index.js index 4966820a3..0a5ddbf0d 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/index.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/index.js @@ -82,7 +82,7 @@ var storageModuleInterface = { }) }); }, - saveFlows: function(config) { + saveFlows: function(config, user) { var flows = config.flows; var credentials = config.credentials; var credentialSavePromise; @@ -94,7 +94,7 @@ var storageModuleInterface = { delete config.credentialsDirty; return credentialSavePromise.then(function() { - return storageModule.saveFlows(flows).then(function() { + return storageModule.saveFlows(flows, user).then(function() { return crypto.createHash('md5').update(JSON.stringify(config.flows)).digest("hex"); }) }); diff --git a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/Project.js b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/Project.js index ad3c0bf26..0fbf89de4 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/Project.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/Project.js @@ -40,16 +40,22 @@ function getSSHKeyUsername(userObj) { } return username; } -function getGitUser(user) { + +function getUserGitSettings(user) { var username; if (!user) { username = "_"; } else { username = user.username; } - var userSettings = settings.getUserSettings(username); - if (userSettings && userSettings.git) { - return userSettings.git.user; + var userSettings = settings.getUserSettings(username)||{}; + return userSettings.git; +} + +function getGitUser(user) { + var gitSettings = getUserGitSettings(user); + if (gitSettings) { + return gitSettings.user; } return null; } @@ -172,7 +178,7 @@ Project.prototype.initialise = function(user,data) { } } - return when.all(promises).then(function() { + return Promise.all(promises).then(function() { return gitTools.stageFile(project.path,files); }).then(function() { return gitTools.commit(project.path,"Create project files",getGitUser(user)); @@ -343,6 +349,10 @@ Project.prototype.update = function (user, data) { savePackage = true; this.package.description = data.summary; } + if (data.hasOwnProperty('version')) { + savePackage = true; + this.package.version = data.version; + } if (data.hasOwnProperty('git')) { if (data.git.hasOwnProperty('user')) { @@ -390,11 +400,15 @@ Project.prototype.update = function (user, data) { if (saveSettings) { promises.push(settings.set("projects",globalProjectSettings)); } + + var modifiedFiles = []; + if (saveREADME) { promises.push(util.writeFile(fspath.join(this.path,this.paths['README.md']), this.description)); + modifiedFiles.push('README.md'); } if (savePackage) { - promises.push(fs.readFile(fspath.join(project.path,project.paths['package.json']),"utf8").then(content => { + promises.push(fs.readFile(fspath.join(this.path,this.paths['package.json']),"utf8").then(content => { var currentPackage = {}; try { currentPackage = util.parseJSON(content); @@ -403,12 +417,22 @@ Project.prototype.update = function (user, data) { this.package = Object.assign(currentPackage,this.package); return util.writeFile(fspath.join(project.path,this.paths['package.json']), JSON.stringify(this.package,"",4)); })); + modifiedFiles.push('package.json'); } - return when.settle(promises).then(res => { + return when.settle(promises).then(function(res) { + var gitSettings = getUserGitSettings(user) || {}; + var workflowMode = (gitSettings.workflow||{}).mode || "manual"; + if (workflowMode === 'auto') { + return project.stageFile(modifiedFiles.map(f => project.paths[f])).then(() => { + return project.commit(user,{message:"Update "+modifiedFiles.join(", ")}) + }) + } + }).then(res => { if (reloadProject) { return this.load() } - }).then(() => { return { + }).then(function() { + return { flowFilesChanged: flowFilesChanged, credentialSecretChanged: credentialSecretChanged }}) @@ -809,6 +833,7 @@ Project.prototype.export = function () { return { name: this.name, summary: this.package.description, + version: this.package.version, description: this.description, dependencies: this.package.dependencies||{}, empty: this.empty, @@ -910,7 +935,7 @@ function createDefaultProject(user, project) { } } - return when.all(promises).then(function() { + return Promise.all(promises).then(function() { return gitTools.stageFile(projectPath,files); }).then(function() { return gitTools.commit(projectPath,"Create project",getGitUser(user)); diff --git a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js index 22b0aa36a..5e1d4f15b 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js @@ -190,7 +190,13 @@ function listProjects() { } function getUserGitSettings(user) { - var userSettings = settings.getUserSettings(user)||{}; + var username; + if (!user) { + username = "_"; + } else { + username = user.username; + } + var userSettings = settings.getUserSettings(username)||{}; return userSettings.git; } @@ -362,7 +368,6 @@ function reloadActiveProject(action) { }); } function createProject(user, metadata) { - // var userSettings = getUserGitSettings(user); if (metadata.files && metadata.migrateFiles) { // We expect there to be no active project in this scenario if (activeProject) { @@ -549,7 +554,7 @@ function getFlows() { }); } -function saveFlows(flows) { +function saveFlows(flows, user) { if (settings.readOnly) { return when.resolve(); } @@ -569,7 +574,15 @@ function saveFlows(flows) { } else { flowData = JSON.stringify(flows); } - return util.writeFile(flowsFullPath, flowData, flowsFileBackup); + return util.writeFile(flowsFullPath, flowData, flowsFileBackup).then(() => { + var gitSettings = getUserGitSettings(user) || {}; + var workflowMode = (gitSettings.workflow||{}).mode || "manual"; + if (activeProject && workflowMode === 'auto') { + return activeProject.stageFile([flowsFullPath, credentialsFile]).then(() => { + return activeProject.commit(user,{message:"Update flow files"}) + }) + } + }); } function getCredentials() { diff --git a/test/unit/@node-red/runtime/lib/storage/localfilesystem/index_spec.js b/test/unit/@node-red/runtime/lib/storage/localfilesystem/index_spec.js index acfe3db43..a145716dc 100644 --- a/test/unit/@node-red/runtime/lib/storage/localfilesystem/index_spec.js +++ b/test/unit/@node-red/runtime/lib/storage/localfilesystem/index_spec.js @@ -45,7 +45,7 @@ describe('storage/localfilesystem', function() { }); it('should initialise the user directory',function(done) { - localfilesystem.init({userDir:userDir}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir,getUserSettings: () => {{}}}, mockRuntime).then(function() { fs.existsSync(path.join(userDir,"lib")).should.be.true(); fs.existsSync(path.join(userDir,"lib",'flows')).should.be.true(); done(); @@ -60,7 +60,7 @@ describe('storage/localfilesystem', function() { process.env.NODE_RED_HOME = path.join(userDir,"NRH"); fs.mkdirSync(process.env.NODE_RED_HOME); fs.writeFileSync(path.join(process.env.NODE_RED_HOME,".config.json"),"{}","utf8"); - var settings = {}; + var settings = {getUserSettings: () => {{}}}; localfilesystem.init(settings, mockRuntime).then(function() { try { fs.existsSync(path.join(process.env.NODE_RED_HOME,"lib")).should.be.true(); @@ -85,7 +85,7 @@ describe('storage/localfilesystem', function() { fs.mkdirSync(process.env.HOMEPATH); fs.mkdirSync(path.join(process.env.HOMEPATH,".node-red")); fs.writeFileSync(path.join(process.env.HOMEPATH,".node-red",".config.json"),"{}","utf8"); - var settings = {}; + var settings = {getUserSettings: () => {{}}}; localfilesystem.init(settings, mockRuntime).then(function() { try { fs.existsSync(path.join(process.env.HOMEPATH,".node-red","lib")).should.be.true(); @@ -112,7 +112,7 @@ describe('storage/localfilesystem', function() { process.env.HOMEPATH = path.join(userDir,"HOMEPATH"); fs.mkdirSync(process.env.HOME); - var settings = {}; + var settings = {getUserSettings: () => {{}}}; localfilesystem.init(settings, mockRuntime).then(function() { try { fs.existsSync(path.join(process.env.HOME,".node-red","lib")).should.be.true(); @@ -142,7 +142,7 @@ describe('storage/localfilesystem', function() { process.env.USERPROFILE = path.join(userDir,"USERPROFILE"); fs.mkdirSync(process.env.USERPROFILE); - var settings = {}; + var settings = {getUserSettings: () => {{}}}; localfilesystem.init(settings, mockRuntime).then(function() { try { fs.existsSync(path.join(process.env.USERPROFILE,".node-red","lib")).should.be.true(); @@ -163,7 +163,7 @@ describe('storage/localfilesystem', function() { }); it('should handle missing flow file',function(done) { - localfilesystem.init({userDir:userDir}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir,getUserSettings: () => {{}}}, mockRuntime).then(function() { var flowFile = 'flows_'+require('os').hostname()+'.json'; var flowFilePath = path.join(userDir,flowFile); fs.existsSync(flowFilePath).should.be.false(); @@ -179,7 +179,7 @@ describe('storage/localfilesystem', function() { }); it('should handle empty flow file, no backup',function(done) { - localfilesystem.init({userDir:userDir}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir,getUserSettings: () => {{}}}, mockRuntime).then(function() { var flowFile = 'flows_'+require('os').hostname()+'.json'; var flowFilePath = path.join(userDir,flowFile); var flowFileBackupPath = path.join(userDir,"."+flowFile+".backup"); @@ -197,7 +197,7 @@ describe('storage/localfilesystem', function() { }); it('should handle empty flow file, restores backup',function(done) { - localfilesystem.init({userDir:userDir}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir,getUserSettings: () => {{}}}, mockRuntime).then(function() { var flowFile = 'flows_'+require('os').hostname()+'.json'; var flowFilePath = path.join(userDir,flowFile); var flowFileBackupPath = path.join(userDir,"."+flowFile+".backup"); @@ -220,7 +220,7 @@ describe('storage/localfilesystem', function() { }); it('should save flows to the default file',function(done) { - localfilesystem.init({userDir:userDir}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir,getUserSettings: () => {{}}}, mockRuntime).then(function() { var flowFile = 'flows_'+require('os').hostname()+'.json'; var flowFilePath = path.join(userDir,flowFile); var flowFileBackupPath = path.join(userDir,"."+flowFile+".backup"); @@ -249,7 +249,7 @@ describe('storage/localfilesystem', function() { var flowFile = 'test.json'; var flowFilePath = path.join(userDir,flowFile); - localfilesystem.init({userDir:userDir, flowFile:flowFilePath}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir, flowFile:flowFilePath,getUserSettings: () => {{}}}, mockRuntime).then(function() { fs.existsSync(defaultFlowFilePath).should.be.false(); fs.existsSync(flowFilePath).should.be.false(); @@ -273,7 +273,7 @@ describe('storage/localfilesystem', function() { it('should format the flows file when flowFilePretty specified',function(done) { var flowFile = 'test.json'; var flowFilePath = path.join(userDir,flowFile); - localfilesystem.init({userDir:userDir, flowFile:flowFilePath,flowFilePretty:true}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir, flowFile:flowFilePath,flowFilePretty:true,getUserSettings: () => {{}}}, mockRuntime).then(function() { localfilesystem.saveFlows(testFlow).then(function() { var content = fs.readFileSync(flowFilePath,"utf8"); content.split("\n").length.should.be.above(1); @@ -294,7 +294,7 @@ describe('storage/localfilesystem', function() { it('should fsync the flows file',function(done) { var flowFile = 'test.json'; var flowFilePath = path.join(userDir,flowFile); - localfilesystem.init({editorTheme:{projects:{enabled:false}},userDir:userDir, flowFile:flowFilePath}, mockRuntime).then(function() { + localfilesystem.init({editorTheme:{projects:{enabled:false}},userDir:userDir, flowFile:flowFilePath,getUserSettings: () => {{}}}, mockRuntime).then(function() { sinon.spy(fs,"fsync"); localfilesystem.saveFlows(testFlow).then(function() { fs.fsync.callCount.should.be.greaterThan(0); @@ -312,7 +312,7 @@ describe('storage/localfilesystem', function() { it('should log fsync errors and continue',function(done) { var flowFile = 'test.json'; var flowFilePath = path.join(userDir,flowFile); - localfilesystem.init({userDir:userDir, flowFile:flowFilePath}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir, flowFile:flowFilePath,getUserSettings: () => {{}}}, mockRuntime).then(function() { sinon.stub(fs,"fsync", function(fd, cb) { cb(new Error()); }); @@ -338,7 +338,7 @@ describe('storage/localfilesystem', function() { var flowFilePath = path.join(userDir,flowFile); var flowFileBackupPath = path.join(userDir,"."+flowFile+".backup"); - localfilesystem.init({userDir:userDir, flowFile:flowFilePath}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir, flowFile:flowFilePath,getUserSettings: () => {{}}}, mockRuntime).then(function() { fs.existsSync(defaultFlowFilePath).should.be.false(); fs.existsSync(flowFilePath).should.be.false(); fs.existsSync(flowFileBackupPath).should.be.false(); @@ -378,7 +378,7 @@ describe('storage/localfilesystem', function() { var flowFile = 'test.json'; var flowFilePath = path.join(userDir,flowFile); var credFile = path.join(userDir,"test_cred.json"); - localfilesystem.init({userDir:userDir, flowFile:flowFilePath}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir, flowFile:flowFilePath,getUserSettings: () => {{}}}, mockRuntime).then(function() { fs.existsSync(credFile).should.be.false(); localfilesystem.getCredentials().then(function(creds) { @@ -397,7 +397,7 @@ describe('storage/localfilesystem', function() { var flowFilePath = path.join(userDir,flowFile); var credFile = path.join(userDir,"test_cred.json"); - localfilesystem.init({userDir:userDir, flowFile:flowFilePath}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir, flowFile:flowFilePath,getUserSettings: () => {{}}}, mockRuntime).then(function() { fs.existsSync(credFile).should.be.false(); @@ -426,7 +426,7 @@ describe('storage/localfilesystem', function() { var credFile = path.join(userDir,"test_cred.json"); var credFileBackup = path.join(userDir,".test_cred.json.backup"); - localfilesystem.init({userDir:userDir, flowFile:flowFilePath}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir, flowFile:flowFilePath,getUserSettings: () => {{}}}, mockRuntime).then(function() { fs.writeFileSync(credFile,"{}","utf8"); @@ -452,7 +452,7 @@ describe('storage/localfilesystem', function() { var flowFilePath = path.join(userDir,flowFile); var credFile = path.join(userDir,"test_cred.json"); - localfilesystem.init({userDir:userDir, flowFile:flowFilePath, flowFilePretty:true}, mockRuntime).then(function() { + localfilesystem.init({userDir:userDir, flowFile:flowFilePath, flowFilePretty:true,getUserSettings: () => {{}}}, mockRuntime).then(function() { fs.existsSync(credFile).should.be.false();