Comparing version 1.2.3 to 1.3.0
@@ -63,3 +63,3 @@ (function webpackUniversalModuleDefinition(root, factory) { | ||
"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t["default"]=e,t}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}();Object.defineProperty(exports,"__esModule",{value:!0});var _immutable=__webpack_require__(2),I=_interopRequireWildcard(_immutable),_Queue=__webpack_require__(3),_Queue2=_interopRequireDefault(_Queue),noop=function(){},Domain=function(){function e(t,i){_classCallCheck(this,e),this.view=null,this.data=null,this._actionNames=null,this._claimView(t),this._claimActions(i)}return _createClass(e,[{key:"_claimView",value:function(e){if(!e.isReactor)throw new Error("view is not inheriting Reactor type");this.view=e,e.isData&&(this.data=e)}},{key:"_claimActions",value:function(e){var t=this;this._actionNames=e?Object.keys(e):[],this._actionNames.forEach(function(i){if(t[i])throw new Error('"'+i+'" is reserved for Domain interface');t[i]=_Queue2["default"].createAction(e[i],t)})}},{key:"subscribe",value:function(e){return this.view.subscribe(e)}},{key:"destroy",value:function(){var e=this;this.view.destroy(),this.view=null,this.data=null,_Queue2["default"].rejectContext(this),this._actionNames.forEach(function(t){e[t]=noop}),this._actionNames=null}},{key:"structure",get:function(){return this.view&&this.view.structure}},{key:"isDomain",get:function(){return!0}}]),e}();exports["default"]=Domain; | ||
"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t["default"]=e,t}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}();Object.defineProperty(exports,"__esModule",{value:!0});var _immutable=__webpack_require__(2),I=_interopRequireWildcard(_immutable),_Queue=__webpack_require__(3),_Queue2=_interopRequireDefault(_Queue),noop=function(){},Domain=function(){function e(t,i){_classCallCheck(this,e),this.view=null,this.data=null,this._actionNames=null,this._claimView(t),this._claimActions(i)}return _createClass(e,[{key:"_claimView",value:function(e){if(!e.isReactor)throw new Error("view is not inheriting Reactor type");this.view=e,e.isData&&(this.data=e)}},{key:"_claimActions",value:function(e){var t=this;this._actionNames=e?Object.keys(e):[],this._actionNames.forEach(function(i){if(t[i])throw new Error('"'+i+'" is reserved for Domain interface');t[i]=_Queue2["default"].createAction(e[i],t)})}},{key:"read",value:function(){return this.view?this.view.read():void 0}},{key:"subscribe",value:function(e){return this.view.subscribe(e)}},{key:"destroy",value:function(){var e=this;this.view.destroy(),this.view=null,this.data=null,_Queue2["default"].rejectContext(this),this._actionNames.forEach(function(t){e[t]=noop}),this._actionNames=null}},{key:"structure",get:function(){return this.view&&this.view.structure}},{key:"isDomain",get:function(){return!0}}]),e}();exports["default"]=Domain; | ||
@@ -76,3 +76,3 @@ /***/ }, | ||
"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r["default"]=e,r}function createAction(e,r){return function(){for(var n=arguments.length,u=Array(n),t=0;n>t;t++)u[t]=arguments[t];appendToQueue(e,r,u),run()}}function appendToQueue(e,r,n){queue=queue.add({action:e,context:r,args:n})}function shiftFromQueue(){var e=queue.first();return queue=queue.rest(),e}function rejectContext(e){queue=queue.filter(function(r){return r.context!==e})}function run(){if(!isRunning){for(isRunning=!0;queue.count()>0;)try{runFirst()}catch(e){console.error("Immview.Queue run - Error occured while running running a function"),console.error(e.message)}isRunning=!1}}function runFirst(){var e=shiftFromQueue(),r=e.context,n=e.action,u=e.args;n.apply(r,u)}Object.defineProperty(exports,"__esModule",{value:!0});var _immutable=__webpack_require__(2),I=_interopRequireWildcard(_immutable),isRunning=!1,queue=I.OrderedSet();exports["default"]={createAction:createAction,rejectContext:rejectContext}; | ||
"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var n={};if(null!=e)for(var u in e)Object.prototype.hasOwnProperty.call(e,u)&&(n[u]=e[u]);return n["default"]=e,n}function createAction(e,n){return function(){for(var u=arguments.length,r=Array(u),t=0;u>t;t++)r[t]=arguments[t];appendAndRunQueue(e,n,r)}}function appendToQueue(e,n,u){queue=queue.add({action:e,context:n,args:u})}function appendAndRunQueue(e,n,u){appendToQueue(e,n,u),run()}function shiftFromQueue(){var e=queue.first();return queue=queue.rest(),e}function rejectContext(e){queue=queue.filter(function(n){return n.context!==e})}function run(){if(!isRunning){for(isRunning=!0;queue.count()>0;)try{runFirst()}catch(e){console.error("Immview.Queue run - Error occured while running running a function"),console.error(e.message)}isRunning=!1}}function runFirst(){var e=shiftFromQueue(),n=e.context,u=e.action,r=e.args;u.apply(n,r)}Object.defineProperty(exports,"__esModule",{value:!0});var _immutable=__webpack_require__(2),I=_interopRequireWildcard(_immutable),isRunning=!1,queue=I.OrderedSet();exports["default"]={createAction:createAction,rejectContext:rejectContext,appendAndRunQueue:appendAndRunQueue}; | ||
@@ -83,3 +83,3 @@ /***/ }, | ||
"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r["default"]=e,r}function _classCallCheck(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,r){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!r||"object"!=typeof r&&"function"!=typeof r?e:r}function _inherits(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Super expression must either be null or a function, not "+typeof r);e.prototype=Object.create(r&&r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),r&&(Object.setPrototypeOf?Object.setPrototypeOf(e,r):e.__proto__=r)}var _createClass=function(){function e(e,r){for(var t=0;t<r.length;t++){var n=r[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(r,t,n){return t&&e(r.prototype,t),n&&e(r,n),r}}();Object.defineProperty(exports,"__esModule",{value:!0});var _immutable=__webpack_require__(2),I=_interopRequireWildcard(_immutable),_Reactor2=__webpack_require__(5),_Reactor3=_interopRequireDefault(_Reactor2),_require=__webpack_require__(6),immutableWriteWrapper=_require.immutableWriteWrapper,immutableReadWrapper=_require.immutableReadWrapper,Data=function(e){function r(e){_classCallCheck(this,r);var t=_possibleConstructorReturn(this,Object.getPrototypeOf(r).call(this));return immutableReadWrapper(t),immutableWriteWrapper(t),I.Iterable.isIterable(e)?t.digest(e):t.digest(I.fromJS(e)),t}return _inherits(r,e),_createClass(r,[{key:"process",value:function(e){return e}},{key:"destroy",value:function(){this.structure=null,this.reactors=null}},{key:"isData",get:function(){return!0}}]),r}(_Reactor3["default"]);exports["default"]=Data; | ||
"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var u=t[r];u.enumerable=u.enumerable||!1,u.configurable=!0,"value"in u&&(u.writable=!0),Object.defineProperty(e,u.key,u)}}return function(t,r,u){return r&&e(t.prototype,r),u&&e(t,u),t}}();Object.defineProperty(exports,"__esModule",{value:!0});var _immutable=__webpack_require__(2),I=_interopRequireWildcard(_immutable),_Queue=__webpack_require__(3),_Queue2=_interopRequireDefault(_Queue),_Reactor2=__webpack_require__(5),_Reactor3=_interopRequireDefault(_Reactor2),_require=__webpack_require__(6),immutableWriteWrapper=_require.immutableWriteWrapper,immutableReadWrapper=_require.immutableReadWrapper,Data=function(e){function t(e){_classCallCheck(this,t);var r=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this));return immutableReadWrapper(r),immutableWriteWrapper(r),I.Iterable.isIterable(e)?r.digest(e):r.digest(I.fromJS(e)),r}return _inherits(t,e),_createClass(t,[{key:"process",value:function(e){return e}},{key:"destroy",value:function(){this.structure=null,this.reactors=null}},{key:"write",value:function(e){"function"==typeof e?_Queue2["default"].appendAndRunQueue(function(){this.digest(e.apply(this,[this.read()]))},this,[e]):_Queue2["default"].appendAndRunQueue(this.digest,this,[e])}},{key:"isData",get:function(){return!0}}]),t}(_Reactor3["default"]);exports["default"]=Data; | ||
@@ -90,3 +90,3 @@ /***/ }, | ||
"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r["default"]=e,r}function _classCallCheck(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function hasValue(e){return void 0!==e&&null!==e}var _createClass=function(){function e(e,r){for(var t=0;t<r.length;t++){var u=r[t];u.enumerable=u.enumerable||!1,u.configurable=!0,"value"in u&&(u.writable=!0),Object.defineProperty(e,u.key,u)}}return function(r,t,u){return t&&e(r.prototype,t),u&&e(r,u),r}}();Object.defineProperty(exports,"__esModule",{value:!0});var _immutable=__webpack_require__(2),I=_interopRequireWildcard(_immutable),Reactor=function(){function e(){_classCallCheck(this,e),this.reactors=I.Set(),this.structure=void 0}return _createClass(e,[{key:"subscribe",value:function(e){var r=this;return this.reactors=this.reactors.add(e),e(this.structure),function(){r.reactors=r.reactors["delete"](e)}}},{key:"process",value:function(){throw new Error("abstract")}},{key:"digest",value:function(e){var r=this.process(e);!hasValue(r)||hasValue(this.structure)&&I.is(r,this.structure)!==!1||(this.structure=r,this.flush())}},{key:"flush",value:function(){var e=this;this.reactors.forEach(function(r){return r(e.structure)})}},{key:"destroy",value:function(){throw new Error("abstract")}},{key:"isReactor",get:function(){return!0}}]),e}();exports["default"]=Reactor; | ||
"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r["default"]=e,r}function _classCallCheck(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function hasValue(e){return void 0!==e&&null!==e}var _createClass=function(){function e(e,r){for(var t=0;t<r.length;t++){var u=r[t];u.enumerable=u.enumerable||!1,u.configurable=!0,"value"in u&&(u.writable=!0),Object.defineProperty(e,u.key,u)}}return function(r,t,u){return t&&e(r.prototype,t),u&&e(r,u),r}}();Object.defineProperty(exports,"__esModule",{value:!0});var _immutable=__webpack_require__(2),I=_interopRequireWildcard(_immutable),Reactor=function(){function e(){_classCallCheck(this,e),this.reactors=I.Set(),this.structure=void 0}return _createClass(e,[{key:"subscribe",value:function(e){var r=this;return this.reactors=this.reactors.add(e),e(this.structure),function(){r.reactors=r.reactors["delete"](e)}}},{key:"process",value:function(){throw new Error("abstract")}},{key:"digest",value:function(e){var r=this.process(e);!hasValue(r)||hasValue(this.structure)&&I.is(r,this.structure)!==!1||(this.structure=r,this.flush())}},{key:"flush",value:function(){var e=this;this.reactors.forEach(function(r){return r(e.structure)})}},{key:"destroy",value:function(){throw new Error("abstract")}},{key:"read",value:function(){return this.structure}},{key:"isReactor",get:function(){return!0}}]),e}();exports["default"]=Reactor; | ||
@@ -93,0 +93,0 @@ /***/ }, |
{ | ||
"name": "immview", | ||
"version": "1.2.3", | ||
"version": "1.3.0", | ||
"description": "", | ||
@@ -5,0 +5,0 @@ "main": "dist/immview.js", |
155
readme.md
@@ -9,5 +9,5 @@ # immview | ||
## Compounds | ||
### Compounds | ||
### Downstream | ||
#### Downstream | ||
@@ -22,3 +22,3 @@ **Data** is independent data source class. Allows direct changes. | ||
### Upstream | ||
#### Upstream | ||
@@ -31,2 +31,4 @@ **Domain** is wrapper for both **Data** and **View**, gathering actions so they are executed in queued fashion as well. | ||
Immview is registered on NPM. | ||
```bash | ||
@@ -39,2 +41,3 @@ npm i immview --save | ||
```javascript | ||
// immview has no default export | ||
import * as IV from 'immview'; | ||
@@ -90,8 +93,45 @@ | ||
> Data have both read and write functions (list below). | ||
Data have both read and write functions (list below). | ||
> Write functions are queued with Domain actions. | ||
Write functions are queued with Domain actions. | ||
> An initialData object can be object any Immutable.js data structure. Plain objects will be transformed to Immutable.js data structures. | ||
An **initialData** object can be object any Immutable.js data structure. Plain objects will be transformed to Immutable.js data structures. | ||
### Data::read() => Immutable.Iterable | ||
Method used to retrieve current structure holden by the Data. | ||
```javascript | ||
//Example | ||
let d = new Data({a: 1}); | ||
d.read().get('a'); // = 1 | ||
``` | ||
### Data::write(change: Immutable.Iterable ) => void | ||
### Data::write(change: (currentStructure) => Immutable.Iterable) => void | ||
Method used to store new Immutable data structure. | ||
**change** parameter: | ||
- is any Immutable data structure that should replace current one. If passed value is either undefined or null, replacement will not occur. | ||
- is a function that should return Immutable data structure that should replace current one. If function returns undefined or null, replacement will not occur. | ||
This function will not return changed structure so chaining will not be possible. It is because if this the change is requested mid queue run, it will be postponed and executed after all currently queued commands. | ||
```javascript | ||
//Example | ||
let d = new Data({a:1}); | ||
d.write(d.read().set('b', 2)); | ||
``` | ||
```javascript | ||
//Example | ||
let d = new Data({a:1}); | ||
d.write(structure => structure.set('b', 2)); | ||
``` | ||
### Data::subscribe( reaction: (data) => void ) | ||
Registers a function called every time when the Data changes value that it holds. | ||
## View | ||
@@ -127,5 +167,12 @@ | ||
> A View instance has only read functions (list below). | ||
> A processor function result can be any Immutable.js data structure. | ||
A View instance has only read functions (list below). | ||
A processor function result can be any Immutable.js data structure. | ||
### View::read() => Immutable.Iterable | ||
Method used to retrieve current structure holden by the View. | ||
### View::subscribe( reaction: (data) => void ) | ||
Registers a function called every time when the View changes value that it holds. | ||
## Domain | ||
@@ -160,87 +207,9 @@ | ||
## Read functions | ||
- equals | ||
- hashCode | ||
- get | ||
- has | ||
- includes | ||
- first | ||
- last | ||
- getIn | ||
- hasIn | ||
- toJS | ||
- toObject | ||
- toArray | ||
- toMap | ||
- toOrderedMap | ||
- toSet | ||
- toOrderedSet | ||
- toList | ||
- toStack | ||
- toSeq | ||
- toKeyedSeq | ||
- toIndexedSeq | ||
- toSetSeq | ||
- keys | ||
- values | ||
- entries | ||
- keySeq | ||
- valueSeq | ||
- entrySeq | ||
- map | ||
- filter | ||
- filterNot | ||
- reverse | ||
- sort | ||
- sortBy | ||
- groupBy | ||
- forEach | ||
- slice | ||
- rest | ||
- butLast | ||
- skip | ||
- skipLast | ||
- skipWhile | ||
- skipUntil | ||
- take | ||
- takeLast | ||
- takeWhile | ||
- takeUntil | ||
- concat | ||
- flatten | ||
- flatMap | ||
- reduce | ||
- reduceRight | ||
- every | ||
- some | ||
- join | ||
- isEmpty | ||
- count | ||
- countBy | ||
- find | ||
- findLast | ||
- findEntry | ||
- findLastEntry | ||
- max | ||
- maxBy | ||
- min | ||
- minBy | ||
- isSubset | ||
- isSuperset | ||
### Domain::read() => Immutable.Iterable | ||
## Write functions | ||
- set | ||
- delete | ||
- update | ||
- merge | ||
- mergeDeep | ||
- setIn | ||
- deleteIn | ||
- updateIn | ||
- mergeIn | ||
- mergeDeepIn | ||
- add | ||
- clear | ||
- union | ||
- intersect | ||
- substract | ||
Method used to retrieve current structure holden by the Domain's View or Data. | ||
> Although **Domain** can be created using **Data**, Domain won't be having **write** method available to discourage writing directly from dependent instances. | ||
### Domain::subscribe( reaction: (data) => void ) | ||
Registers a function called every time when the Domain's View or Data changes value that it holds. |
import * as I from 'immutable'; | ||
import Queue from './Queue'; | ||
import Reactor from './Reactor.js'; | ||
@@ -38,2 +39,12 @@ | ||
write(change) { | ||
if (typeof change === 'function') { | ||
Queue.appendAndRunQueue(function updateStructure() { | ||
this.digest(change.apply(this, [this.read()])); | ||
}, this, [change]); | ||
} else { | ||
Queue.appendAndRunQueue(this.digest, this, [change]); | ||
} | ||
} | ||
} |
@@ -5,3 +5,4 @@ import * as I from 'immutable'; | ||
let noop = () => {}; | ||
let noop = () => { | ||
}; | ||
@@ -14,7 +15,13 @@ export default class Domain { | ||
constructor(view, actions) { | ||
/** @type {View} */ | ||
/** | ||
* @private | ||
* @type {View} */ | ||
this.view = null; | ||
/** @type {Data} */ | ||
/** | ||
* @private | ||
* @type {Data} */ | ||
this.data = null; | ||
/** @type {String[]} */ | ||
/** | ||
* @private | ||
* @type {String[]} */ | ||
this._actionNames = null; | ||
@@ -54,2 +61,13 @@ | ||
read() { | ||
if (this.view) { | ||
return this.view.read(); | ||
} | ||
} | ||
// no write method now and in the future | ||
// as it would encourage developers | ||
// to modify domain data | ||
// outside of the domain scope | ||
get isDomain() { | ||
@@ -56,0 +74,0 @@ return true; |
import Queue from './Queue'; | ||
/** | ||
* @deprecated | ||
* @description this module is meant for deprecation in next major | ||
*/ | ||
/** | ||
* adds read methods to `that` | ||
@@ -5,0 +10,0 @@ * that enable reading from its structure |
@@ -14,4 +14,3 @@ import * as I from 'immutable'; | ||
return (...args) => { | ||
appendToQueue(action, context, args); | ||
run(); | ||
appendAndRunQueue(action, context, args); | ||
}; | ||
@@ -34,2 +33,7 @@ } | ||
function appendAndRunQueue(action, context, args) { | ||
appendToQueue(action, context, args); | ||
run(); | ||
} | ||
/** | ||
@@ -91,2 +95,3 @@ * Removes and returns first action from the queue and | ||
rejectContext, | ||
appendAndRunQueue, | ||
}; |
@@ -12,3 +12,10 @@ import * as I from 'immutable'; | ||
constructor() { | ||
/** | ||
* @private | ||
*/ | ||
this.reactors = I.Set(); | ||
/** | ||
* @private | ||
* @type {I.Iterable} | ||
*/ | ||
this.structure = undefined; //yet declared | ||
@@ -53,2 +60,6 @@ } | ||
} | ||
read() { | ||
return this.structure; | ||
} | ||
} |
@@ -0,1 +1,2 @@ | ||
import Queue from '../src/Queue.js'; | ||
import Data from '../src/Data'; | ||
@@ -17,12 +18,35 @@ import * as I from 'immutable'; | ||
it('can be read from', function () { | ||
expect(d.get('a')).toBe(1); | ||
expect(d.getIn(['b', 'c'])).toBe(2); | ||
expect(d.toJS()).toEqual({ a: 1, b: { c: 2 } }); | ||
expect(d.read().get('a')).toBe(1); | ||
expect(d.read().getIn(['b', 'c'])).toBe(2); | ||
expect(d.read().toJS()).toEqual({ a: 1, b: { c: 2 } }); | ||
}); | ||
it('can be written to', function () { | ||
d.set('d', 3); | ||
expect(d.get('d')).toBe(3); | ||
it('can be written to with a new data', function () { | ||
d.write(d.read().setIn(['b', 'c'], 3)); | ||
d.write(d.read().set('d', 3)); | ||
expect(d.read().getIn(['b', 'c'])).toBe(3); | ||
expect(d.read().get('d')).toBe(3); | ||
}); | ||
it('can be written to with a new data', function () { | ||
Queue.appendAndRunQueue(function () { | ||
//this time both writes will be executed after current command execution | ||
d.write(d.read().setIn(['b', 'c'], 3)); | ||
d.write(d.read().set('d', 3)); | ||
}); | ||
// with a value only last write | ||
// requested during one queue command or outside of queue | ||
// will last | ||
expect(d.read().getIn(['b', 'c'])).toBe(2); | ||
expect(d.read().get('d')).toBe(3); | ||
}); | ||
it('can be written to with a function returning data', function () { | ||
d.write(v => v.setIn(['b', 'c'], 3)); | ||
d.write(v => v.set('d', 3)); | ||
expect(d.read().getIn(['b', 'c'])).toBe(3); | ||
expect(d.read().get('d')).toBe(3); | ||
}); | ||
it('can be subscribed to', function (done) { | ||
@@ -40,3 +64,3 @@ let forthVal; | ||
forthVal = 3; | ||
d.set('d', forthVal); | ||
d.write(d.read().set('d', forthVal)); | ||
}); | ||
@@ -57,11 +81,11 @@ | ||
expect(reactions).toBe(1); // subscription -> fake reaction | ||
d.update(() => getDataMap().set('d', 3)); // change -> reaction | ||
d.write(getDataMap().set('d', 3)); // change -> reaction | ||
expect(reactions).toBe(2); | ||
d.update(() => getDataMap().set('d', 3)); // no change -> no reaction | ||
d.write(getDataMap().set('d', 3)); // no change -> no reaction | ||
expect(reactions).toBe(2); | ||
d.update(() => getDataMap().set('d', 4)); // change -> reaction | ||
d.write(getDataMap().set('d', 4)); // change -> reaction | ||
expect(reactions).toBe(3); | ||
}); | ||
it('can be unsubscribed from', function (done) { | ||
it('can be unsubscribed from', function () { | ||
var reactions = 0; | ||
@@ -72,3 +96,3 @@ var unsub = d.subscribe(() => { | ||
d.set('d', 3); // change -> reaction | ||
d.write(d.read().set('d', 3)); // change -> reaction | ||
expect(reactions).toBe(2); | ||
@@ -78,7 +102,5 @@ | ||
d.set('d', 5); // change -> no reaction | ||
d.write(d.read().set('d', 5)); // change -> no reaction | ||
expect(reactions).toBe(2); | ||
done(); | ||
}); | ||
}); |
@@ -21,6 +21,6 @@ import Domain from '../src/Domain'; | ||
// so it is just informative | ||
expect(d.get('a')).toBe(1); | ||
expect(d.read().get('a')).toBe(1); | ||
let dmn = new Domain(d); | ||
expect(dmn.structure.get('a')).toBe(1); | ||
expect(dmn.read().get('a')).toBe(1); | ||
}); | ||
@@ -32,6 +32,6 @@ | ||
let v = new View(d, data => data); | ||
expect(d.get('a')).toBe(1); | ||
expect(d.read().get('a')).toBe(1); | ||
let dmn2 = new Domain(v); | ||
expect(dmn2.structure.get('a')).toBe(1); | ||
expect(dmn2.read().get('a')).toBe(1); | ||
}); | ||
@@ -73,3 +73,3 @@ | ||
dmn.data.set('a', 2); | ||
d.write(v => v.set('a', 2)); | ||
@@ -76,0 +76,0 @@ expect(testVar).toBe(3); |
@@ -9,20 +9,20 @@ import Domain from '../src/Domain'; | ||
it('can be created from a Data', function () { | ||
var aData = new Data({a: 1}); | ||
var aData = new Data({ a: 1 }); | ||
var resultView = new View(aData, i=>i); | ||
expect(resultView.get('a')).toBe(1); | ||
expect(resultView.read().get('a')).toBe(1); | ||
}); | ||
it('can be created from a View', function () { | ||
var aData = new Data({a: 1}); | ||
var aData = new Data({ a: 1 }); | ||
var aView = new View(aData, i=>i); | ||
var resultView = new View(aView, i=>i); | ||
expect(resultView.get('a')).toBe(1); | ||
expect(resultView.read().get('a')).toBe(1); | ||
}); | ||
it('can be created from a Domain', function () { | ||
var aData = new Data({a: 1}); | ||
var aData = new Data({ a: 1 }); | ||
var aView = new View(aData, i=>i); | ||
var aDomain = new Domain(aView, {}); | ||
var resultView = new View(aDomain, i=>i); | ||
expect(resultView.get('a')).toBe(1); | ||
expect(resultView.read().get('a')).toBe(1); | ||
}); | ||
@@ -45,14 +45,14 @@ | ||
it('can be read from / is a result of processing data', function () { | ||
expect(v.get('a')).toBe(1); | ||
expect(v.get('d')).toBe(3); | ||
expect(v.read().get('a')).toBe(1); | ||
expect(v.read().get('d')).toBe(3); | ||
}); | ||
it('cannot be written to', function () { | ||
expect(()=>v.set('a', 1)).toThrow(); | ||
expect(() => v.write(v => v.set('a', 1))).toThrow(); | ||
}); | ||
it('is reacting to new data', function () { | ||
expect(v.toJS()).toEqual({ a: 1, b: { c: 2 }, d: 3 }); | ||
d.set('e', 4); | ||
expect(v.toJS()).toEqual({ a: 1, b: { c: 2 }, d: 3, e: 4 }); | ||
expect(v.read().toJS()).toEqual({ a: 1, b: { c: 2 }, d: 3 }); | ||
d.write(v => v.set('e', 4)); | ||
expect(v.read().toJS()).toEqual({ a: 1, b: { c: 2 }, d: 3, e: 4 }); | ||
}); | ||
@@ -62,13 +62,13 @@ | ||
expect(vReactions).toBe(1); | ||
d.set('e', 4); | ||
d.write(v => v.set('e', 4)); | ||
expect(vReactions).toBe(2); | ||
d.set('e', 4); | ||
d.write(v => v.set('e', 4)); | ||
expect(vReactions).toBe(2); | ||
d.delete('e'); | ||
d.write(v => v.delete('e')); | ||
expect(vReactions).toBe(3); | ||
d.delete('e'); | ||
d.write(v => v.delete('e')); | ||
expect(vReactions).toBe(3); | ||
d.setIn(['e', 'f'], 6); | ||
d.write(v => v.setIn(['e', 'f'], 6)); | ||
expect(vReactions).toBe(4); | ||
expect(v.getIn(['e', 'f'])).toBe(6); | ||
expect(v.read().getIn(['e', 'f'])).toBe(6); | ||
}); | ||
@@ -81,8 +81,8 @@ | ||
var v2 = new View({ d1, d2 }); | ||
expect(v2.toJS()).toEqual({ | ||
expect(v2.read().toJS()).toEqual({ | ||
d1: { a: 1 }, | ||
d2: { a: 2 }, | ||
}); | ||
d2.set('a', 3); | ||
expect(v2.toJS()).toEqual({ | ||
d2.write(v => v.set('a', 3)); | ||
expect(v2.read().toJS()).toEqual({ | ||
d1: { a: 1 }, | ||
@@ -102,8 +102,8 @@ d2: { a: 3 }, | ||
}); | ||
expect(v2.toJS()).toEqual({ | ||
expect(v2.read().toJS()).toEqual({ | ||
a: { a: 1 }, | ||
b: { a: 2 }, | ||
}); | ||
d2.set('a', 3); | ||
expect(v2.toJS()).toEqual({ | ||
d2.write(v => v.set('a', 3)); | ||
expect(v2.read().toJS()).toEqual({ | ||
a: { a: 1 }, | ||
@@ -110,0 +110,0 @@ b: { a: 3 }, |
Sorry, the diff of this file is not supported yet
83471
1018
209