datasource: copy settings object in constructor

Fix DataSource constructor to create a shallow copy of the settings
object provided by the caller. This prevents surprising behavior
where changes made to `ds.settings` were picked up by the provided
config object, as observed e.g. in tests of our MongoDB connector.
This commit is contained in:
Miroslav Bajtoš 2019-05-10 14:56:02 +02:00
parent de4718d5b8
commit ef0257e338
No known key found for this signature in database
GPG Key ID: 6F2304BA9361C7E3
2 changed files with 15 additions and 0 deletions

View File

@ -126,6 +126,12 @@ function DataSource(name, settings, modelBuilder) {
settings = utils.parseSettings(settings); 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.modelBuilder = modelBuilder || new ModelBuilder();
this.models = this.modelBuilder.models; this.models = this.modelBuilder.models;
this.definitions = this.modelBuilder.definitions; this.definitions = this.modelBuilder.definitions;

View File

@ -9,6 +9,15 @@ const should = require('./init.js');
const DataSource = require('../lib/datasource.js').DataSource; const DataSource = require('../lib/datasource.js').DataSource;
describe('DataSource', function() { 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() { it('reports helpful error when connector init throws', function() {
const throwingConnector = { const throwingConnector = {
name: 'loopback-connector-throwing', name: 'loopback-connector-throwing',