Skip to content
This repository has been archived by the owner on Dec 19, 2017. It is now read-only.

Commit

Permalink
add shallow merge (extend) and use to prevent leaky params (#58)
Browse files Browse the repository at this point in the history
close #56
  • Loading branch information
caseyWebb committed Jun 4, 2016
1 parent e1374b7 commit 727cc6d
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 95 deletions.
56 changes: 28 additions & 28 deletions dist/ko-component-router.js
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ return /******/ (function(modules) { // webpackBootstrap

var _require = __webpack_require__(9);

var merge = _require.merge;
var extend = _require.extend;

var Context = function () {
function Context(bindingCtx, config) {
Expand Down Expand Up @@ -388,10 +388,9 @@ return /******/ (function(modules) { // webpackBootstrap
};

if (state === false && samePage) {
merge(toCtx, { state: fromCtx.state }, false);
extend(toCtx, { state: fromCtx.state }, false);
} else if (!this.config.persistState && state) {
toCtx.state = {};
merge(toCtx.state, state, false, true);
toCtx.state = state;
}

if (this.config.persistState) {
Expand Down Expand Up @@ -420,7 +419,7 @@ return /******/ (function(modules) { // webpackBootstrap

var el = this.config.el.getElementsByClassName('component-wrapper')[0];
delete toCtx.query;
merge(this, toCtx);
extend(this, toCtx);
if (query) {
this.query.update(query, pathname);
}
Expand Down Expand Up @@ -1273,43 +1272,37 @@ return /******/ (function(modules) { // webpackBootstrap
return mappedObj;
}

function merge(dest, src) {
function extend(dest, src) {
var createAsObservable = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
var prune = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];

if (!src) {
return prune ? undefined : dest;
}
var _shallow = arguments.length <= 3 || arguments[3] === undefined ? true : arguments[3];

var props = Object.keys(src);

if (prune) {
for (var prop in dest) {
if (props.indexOf(prop) < 0) {
props.push(prop);
}
}
}

var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;

try {
for (var _iterator = props[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var _prop = _step.value;
var prop = _step.value;

if (isUndefined(dest[_prop])) dest[_prop] = createAsObservable ? fromJS(src[_prop]) : src[_prop];else if (ko.isWritableObservable(dest[_prop])) {
if (!deepEquals(dest[_prop](), src[_prop])) {
dest[_prop](src[_prop]);
if (isUndefined(dest[prop])) {
dest[prop] = createAsObservable ? fromJS(src[prop]) : src[prop];
} else if (ko.isWritableObservable(dest[prop])) {
if (!deepEquals(dest[prop](), src[prop])) {
dest[prop](src[prop]);
}
} else if (isUndefined(src[_prop])) dest[_prop] = undefined;else if (src[_prop].constructor === Object) {
if (prune) {
dest[_prop] = {};
} else if (isUndefined(src[prop])) {
dest[prop] = undefined;
} else if (src[prop].constructor === Object) {
if (_shallow) {
dest[prop] = {};
}

merge(dest[_prop], src[_prop], createAsObservable);
} else dest[_prop] = src[_prop];
extend(dest[prop], src[prop], createAsObservable);
} else {
dest[prop] = src[prop];
}
}
} catch (err) {
_didIteratorError = true;
Expand All @@ -1329,6 +1322,12 @@ return /******/ (function(modules) { // webpackBootstrap
return dest;
}

function merge(dest, src) {
var createAsObservable = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];

extend(dest, src, createAsObservable, false);
}

function deepEquals(foo, bar) {
if (foo === null || bar === null) {
return foo === null && bar === null;
Expand Down Expand Up @@ -1447,6 +1446,7 @@ return /******/ (function(modules) { // webpackBootstrap
module.exports = {
decodeURLEncodedURIComponent: decodeURLEncodedURIComponent,
mapKeys: mapKeys,
extend: extend,
merge: merge,
deepEquals: deepEquals,
identity: identity,
Expand Down
4 changes: 2 additions & 2 deletions dist/ko-component-router.min.js

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions example/dist/bundle.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion example/dist/bundle.js.map

Large diffs are not rendered by default.

9 changes: 4 additions & 5 deletions lib/context.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ var stateFactory = require('./state').factory;

var _require = require('./utils');

var merge = _require.merge;
var extend = _require.extend;

var Context = function () {
function Context(bindingCtx, config) {
Expand Down Expand Up @@ -131,10 +131,9 @@ var Context = function () {
};

if (state === false && samePage) {
merge(toCtx, { state: fromCtx.state }, false);
extend(toCtx, { state: fromCtx.state }, false);
} else if (!this.config.persistState && state) {
toCtx.state = {};
merge(toCtx.state, state, false, true);
toCtx.state = state;
}

if (this.config.persistState) {
Expand Down Expand Up @@ -163,7 +162,7 @@ var Context = function () {

var el = this.config.el.getElementsByClassName('component-wrapper')[0];
delete toCtx.query;
merge(this, toCtx);
extend(this, toCtx);
if (query) {
this.query.update(query, pathname);
}
Expand Down
47 changes: 24 additions & 23 deletions lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,43 +19,37 @@ function mapKeys(obj, fn) {
return mappedObj;
}

function merge(dest, src) {
function extend(dest, src) {
var createAsObservable = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
var prune = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];

if (!src) {
return prune ? undefined : dest;
}
var _shallow = arguments.length <= 3 || arguments[3] === undefined ? true : arguments[3];

var props = Object.keys(src);

if (prune) {
for (var prop in dest) {
if (props.indexOf(prop) < 0) {
props.push(prop);
}
}
}

var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;

try {
for (var _iterator = props[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var _prop = _step.value;
var prop = _step.value;

if (isUndefined(dest[_prop])) dest[_prop] = createAsObservable ? fromJS(src[_prop]) : src[_prop];else if (ko.isWritableObservable(dest[_prop])) {
if (!deepEquals(dest[_prop](), src[_prop])) {
dest[_prop](src[_prop]);
if (isUndefined(dest[prop])) {
dest[prop] = createAsObservable ? fromJS(src[prop]) : src[prop];
} else if (ko.isWritableObservable(dest[prop])) {
if (!deepEquals(dest[prop](), src[prop])) {
dest[prop](src[prop]);
}
} else if (isUndefined(src[_prop])) dest[_prop] = undefined;else if (src[_prop].constructor === Object) {
if (prune) {
dest[_prop] = {};
} else if (isUndefined(src[prop])) {
dest[prop] = undefined;
} else if (src[prop].constructor === Object) {
if (_shallow) {
dest[prop] = {};
}

merge(dest[_prop], src[_prop], createAsObservable);
} else dest[_prop] = src[_prop];
extend(dest[prop], src[prop], createAsObservable);
} else {
dest[prop] = src[prop];
}
}
} catch (err) {
_didIteratorError = true;
Expand All @@ -75,6 +69,12 @@ function merge(dest, src) {
return dest;
}

function merge(dest, src) {
var createAsObservable = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];

extend(dest, src, createAsObservable, false);
}

function deepEquals(foo, bar) {
if (foo === null || bar === null) {
return foo === null && bar === null;
Expand Down Expand Up @@ -193,6 +193,7 @@ function isPrimitiveOrDate(obj) {
module.exports = {
decodeURLEncodedURIComponent: decodeURLEncodedURIComponent,
mapKeys: mapKeys,
extend: extend,
merge: merge,
deepEquals: deepEquals,
identity: identity,
Expand Down
9 changes: 4 additions & 5 deletions src/context.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const ko = require('knockout')
const qs = require('qs')
const queryFactory = require('./query').factory
const stateFactory = require('./state').factory
const { merge } = require('./utils')
const { extend } = require('./utils')

class Context {
constructor(bindingCtx, config) {
Expand Down Expand Up @@ -107,10 +107,9 @@ class Context {
}

if (state === false && samePage) {
merge(toCtx, { state: fromCtx.state }, false)
extend(toCtx, { state: fromCtx.state }, false)
} else if (!this.config.persistState && state) {
toCtx.state = {}
merge(toCtx.state, state, false, true)
toCtx.state = state
}

if (this.config.persistState) {
Expand Down Expand Up @@ -140,7 +139,7 @@ class Context {
function complete(animate) {
const el = this.config.el.getElementsByClassName('component-wrapper')[0]
delete toCtx.query
merge(this, toCtx)
extend(this, toCtx)
if (query) {
this.query.update(query, pathname)
}
Expand Down
41 changes: 14 additions & 27 deletions src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,49 +13,35 @@ function mapKeys(obj, fn) {
return mappedObj
}

function merge(dest, src, createAsObservable = true, prune = false) {
if (!src) {
return prune ? undefined : dest
}

function extend(dest, src, createAsObservable = true, _shallow = true) {
const props = Object.keys(src)

if (prune) {
for (const prop in dest) {
if (props.indexOf(prop) < 0) {
props.push(prop)
}
}
}

for (const prop of props) {
if (isUndefined(dest[prop]))
if (isUndefined(dest[prop])) {
dest[prop] = createAsObservable ? fromJS(src[prop]) : src[prop]

else if (ko.isWritableObservable(dest[prop])) {
} else if (ko.isWritableObservable(dest[prop])) {
if (!deepEquals(dest[prop](), src[prop])) {
dest[prop](src[prop])
}
}

else if (isUndefined(src[prop]))
} else if (isUndefined(src[prop])) {
dest[prop] = undefined

else if (src[prop].constructor === Object) {
if (prune) {
} else if (src[prop].constructor === Object) {
if (_shallow) {
dest[prop] = {}
}

merge(dest[prop], src[prop], createAsObservable)
}

else
extend(dest[prop], src[prop], createAsObservable)
} else {
dest[prop] = src[prop]
}
}

return dest
}

function merge(dest, src, createAsObservable = true) {
extend(dest, src, createAsObservable, false)
}

function deepEquals(foo, bar) {
if (foo === null || bar === null) {
return foo === null && bar === null
Expand Down Expand Up @@ -142,6 +128,7 @@ function isPrimitiveOrDate(obj) {
module.exports = {
decodeURLEncodedURIComponent,
mapKeys,
extend,
merge,
deepEquals,
identity,
Expand Down

0 comments on commit 727cc6d

Please sign in to comment.