UNPKG

fusionjs

Version:

FusionJS is a JS toolkit that provides library/framework agnostic tools

1 lines 5.2 kB
"use strict";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 s=0;s<t.length;s++){var a=t[s];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,s,a){return s&&e(t.prototype,s),a&&e(t,a),t}}();Object.defineProperty(exports,"__esModule",{value:!0});var Field_1=require("./Field"),FusionStore_1=require("../store/FusionStore"),FusionModel=function(){function e(t){_classCallCheck(this,e),this._isInitialised=!1,this.path="",this._associatedStores={},this.data=t}return _createClass(e,[{key:"init",value:function(){return this._setFields(),this._setUpHasManyRelationship(),this._setUpHasOneRelationship(),this.data&&this.set(this.data),this._isInitialised=!0,this}},{key:"setData",value:function(e){e&&(this.set(e),this.data=e)}},{key:"toObject",value:function(){var e=this,t={};return Object.keys(this._keys).forEach(function(s){t[s]=e._keys[s].get(s)}),this._hasManyKeys.forEach(function(s){t[s]=e[s]().toObject()}),this._hasOneKeys.forEach(function(s){t[s]=e[s]().toObject()}),t}},{key:"query",value:function(e){var t=this;console.warn("query method is experimental and not yet fully supported, and is likely to change!");var s=Object.keys(e)[0],a=this.get(s),n=[];return a===e[s]&&n.push(this),this._hasManyKeys.forEach(function(s){var a=t[s](),i=n.concat(a.query(e));i&&i.length>0&&(n=n.concat(a.query(e)))},this),this._hasOneKeys.forEach(function(s){var a=t[s]();n=n.concat(a.query(e))},this),n}},{key:"get",value:function(e){return"undefined"!=typeof e&&null!==e?this._keys[e].get():this._getAll()}},{key:"_getAll",value:function(){var e=this,t={},s=Object.keys(this._keys);return s.length>0&&s.forEach(function(s){t[s]=e.get(s)},this),t}},{key:"set",value:function(e,t){var s=this;return t||e instanceof String?this._keys.hasOwnProperty(e)&&this._setData(e,t):Object.keys(e).forEach(function(t){s._keys.hasOwnProperty(t)?s._setData(t,e[t]):s._hasOneKeys.indexOf(t)>-1&&e[t]?s._setAssociatedModelData(e,t):s._hasManyKeys.indexOf(t)>-1&&e[t]&&s._setAssociatedStoreData(e,t)}),this}},{key:"_setPath",value:function(e){this.path+=e}},{key:"equals",value:function(e){return this._isEqual(e)}},{key:"deepEquals",value:function(e){return this._isEqual(e,!0)}},{key:"strictEqual",value:function(e){var t=this===e;return t?this._isEqual(e,!0):t}},{key:"_isEqual",value:function(e,t){var s=this,a=!0,n=void 0,i=void 0;return n=this.get(),i=e.get(),Object.keys(n).some(function(e){return a=n[e]===i[e],!a}),t&&(this.hasMany&&this._hasManyKeys.some(function(n){return a=s[n]()._isEqual(e[n](),t),!a}),this.hasOne&&this._hasOneKeys.some(function(n){return a=s[n]()._isEqual(e[n](),t),!a})),a}},{key:"reset",value:function(){var e=this,t=Object.keys(this._keys),s=this._hasManyKeys,a=this._hasOneKeys;t.forEach(function(t){e._keys[t].set(null)},this),s.forEach(function(t){var s=e[t]&&e[t]();s&&s.reset()},this),a.forEach(function(t){var s=e[t]&&e[t]();s&&s.reset()},this)}},{key:"find",value:function(e){var t=this,s=e.path.split("/").reduce(function(e,s){var a=s.split("$");return e=e||t,1===a.length?e[s]&&e[s]()||e:a.reduce(function(t,s){return t&&s?e[t]().get()[s]:t[s]()})});return s.path===e.path?s:null}},{key:"_setData",value:function(e,t){this._keys[e].set(t)}},{key:"_setAssociatedModelData",value:function(e,t){var s={name:t,model:null,data:null};this.hasOne.some(function(a){if(a.name===t)return s.name=a.name,s.model=a.model,s.data=e[t],!1},this),"function"==typeof this[s.name]?this[s.name]().set(s.data):this._createAssociatedModel(s)}},{key:"_createAssociatedModel",value:function(e){this[e.name]=function(){return"undefined"==typeof this._associatedStores[e.name]&&(this._associatedStores[e.name]=new e.model({data:e.data,path:this.path+"/"+e.name}),this._associatedStores[e.name]._setPath(this.path+"/"+e.name)),this._associatedStores[e.name]}}},{key:"_setAssociatedStoreData",value:function(e,t){var s={name:t,model:null,data:null};this.hasMany.some(function(a){if(a.name===t)return s.name=a.name,s.model=a.model,s.data=e[t],!0},this),"function"==typeof this[s.name]?this[s.name]().set(s.data):this._createAssociatedStore(s)}},{key:"_createAssociatedStore",value:function(e){var t=this;this[e.name]=function(){return"undefined"==typeof t._associatedStores[e.name]&&(t._associatedStores[e.name]=new FusionStore_1.FusionStore({model:e.model,data:e.data,path:t.path+"/"+e.name})),t._associatedStores[e.name]}}},{key:"_setFields",value:function(){var e=this.fields||[];if(0===e.length)throw new Error("No fields defined");this._keys=e.reduce(function(e,t){return e[t.name]=new Field_1.Field(t),e},{})}},{key:"_setUpHasManyRelationship",value:function(){var e=this,t=this.hasMany;this._hasManyKeys=[],"undefined"!=typeof t&&null!==t&&(this.hasMany=t,t.forEach(function(t){e._hasManyKeys.push(t.name),e._createAssociatedStore(t)},this))}},{key:"_setUpHasOneRelationship",value:function(){var e=this,t=this.hasOne;this._hasOneKeys=[],"undefined"!=typeof t&&null!==t&&(this.hasOne=t,t.forEach(function(t){e._hasOneKeys.push(t.name),e._createAssociatedModel(t)},this))}}]),e}();exports.FusionModel=FusionModel;