diff --git a/lib/datasource.js b/lib/datasource.js index 018661cc..2603e5b8 100644 --- a/lib/datasource.js +++ b/lib/datasource.js @@ -126,6 +126,12 @@ function DataSource(name, settings, modelBuilder) { settings = utils.parseSettings(settings); } + // Shallow-clone the settings so that updates to `ds.settings` + // do not modify the original object provided via constructor arguments + if (settings) settings = Object.assign({}, settings); + // It's possible to provide settings object via the "name" arg too! + if (typeof name === 'object') name = Object.assign({}, name); + this.modelBuilder = modelBuilder || new ModelBuilder(); this.models = this.modelBuilder.models; this.definitions = this.modelBuilder.definitions; diff --git a/test/datasource.test.js b/test/datasource.test.js index 89e291e6..7ab5adb7 100644 --- a/test/datasource.test.js +++ b/test/datasource.test.js @@ -9,6 +9,15 @@ const should = require('./init.js'); const DataSource = require('../lib/datasource.js').DataSource; describe('DataSource', function() { + it('clones settings to prevent surprising changes in passed args', () => { + const config = {connector: 'memory'}; + + const ds = new DataSource(config); + ds.settings.extra = true; + + config.should.eql({connector: 'memory'}); + }); + it('reports helpful error when connector init throws', function() { const throwingConnector = { name: 'loopback-connector-throwing',