diff --git a/data-model.js b/data-model.js index c1350ce..4f60737 100644 --- a/data-model.js +++ b/data-model.js @@ -1,5 +1,6 @@ // MOST Web Framework 2.0 Codename Blueshift BSD-3-Clause license Copyright (c) 2017-2022, THEMOST LP All rights reserved var _ = require('lodash'); +var {cloneDeep} = require('lodash'); var {sprintf} = require('sprintf-js'); var Symbol = require('symbol'); var pluralize = require('pluralize'); @@ -580,10 +581,11 @@ DataModel.prototype.initialize = function() { * @returns {DataModel} Returns a new DataModel instance */ DataModel.prototype.clone = function(context) { - var result = new DataModel(this); - if (context) - result.context = context; - return result; + // create new instance + var cloned = new DataModel(cloneDeep(this)).silent(this.isSilent()); + // set context or this model context + cloned.context = context || this.context; + return cloned; }; /** * @this DataModel diff --git a/package-lock.json b/package-lock.json index 21a888b..a955346 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@themost/data", - "version": "2.17.0", + "version": "2.17.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@themost/data", - "version": "2.17.0", + "version": "2.17.1", "license": "BSD-3-Clause", "dependencies": { "@themost/events": "^1.0.5", diff --git a/package.json b/package.json index 1ef2bf3..b623d5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@themost/data", - "version": "2.17.0", + "version": "2.17.1", "description": "MOST Web Framework Codename Blueshift - Data module", "main": "index.js", "scripts": { diff --git a/spec/DataModel.spec.ts b/spec/DataModel.spec.ts index 60c6b8f..a36059f 100644 --- a/spec/DataModel.spec.ts +++ b/spec/DataModel.spec.ts @@ -94,4 +94,16 @@ describe('DataModel', () => { expect(model.caching).toBe('none'); }); + it('should clone model', () => { + const model = context.model('Employee').silent(); + expect(model).toBeTruthy(); + const cloned = model.clone(); + expect(cloned instanceof DataModel); + expect(cloned.name).toEqual(model.name); + // change something to parent + model.caching = 'always'; + expect(cloned.caching).not.toBe(model.caching); + expect(cloned.isSilent()).toBeTruthy(); + }); + });