diff --git a/src/model.js b/src/model.js index efb689e..bed36e3 100644 --- a/src/model.js +++ b/src/model.js @@ -28,14 +28,25 @@ export default class Model { /** * Generates map with page urls as keys and page object as values - * @param {Object[]} arr - array of page objects + * @param {Object[]} pages - array of page objects * @returns {Object} * @private */ static _generateUrlPageMap(pages) { return pages.reduce((prev, page) => { - prev[page.url] = page; - return prev; + return _.set(prev, page.url, page); + }, {}); + } + + /** + * Generates map with page urls as keys and page order indexes as values + * @param {Object[]} pages - array of page objects + * @returns {Object} + * @private + */ + static _generateUrlOrderMap(pages) { + return pages.reduce((prev, page, index) => { + return _.set(prev, page.url, index); }, {}); } @@ -181,6 +192,15 @@ export default class Model { return _.merge(oldModel[url], newModel[url]); }, this)) ); + + // Restore original pages order in current model + const orderMap = this.constructor._generateUrlOrderMap(currentModel); + this.setPages( + this.getPages().sort((a, b) => { + return orderMap[a.url] - orderMap[b.url]; + }) + ); + return this; } diff --git a/test/src/model.test.js b/test/src/model.test.js index b12d425..d42250a 100644 --- a/test/src/model.test.js +++ b/test/src/model.test.js @@ -136,6 +136,13 @@ describe('Model', function() { model.merge(oldModel, newModel); model.getChanges().removed.should.eql([{type: 'page', url: '/url2'}]); }); + + it('should respect initial pages order', function() { + model.merge(oldModel, newModel); + model.getPages()[0].url.should.equal('/url1'); + model.getPages()[1].url.should.equal('/url3'); + model.getPages()[2].url.should.equal('/url4'); + }); }); });