Socket
Socket
Sign inDemoInstall

redux-orm

Package Overview
Dependencies
7
Maintainers
4
Versions
70
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.16.2 to 0.17.0-rc.0

ambient.d.ts

9

.eslintrc.js
module.exports = {
extends: ["airbnb-base", "plugin:prettier/recommended"],
parser: "babel-eslint",
extends: [
"airbnb-base",
"plugin:prettier/recommended",
// "plugin:@typescript-eslint/recommended", // enables TS linting
],
parser: "@typescript-eslint/parser",
plugins: ["@typescript-eslint"],
rules: {

@@ -5,0 +10,0 @@ "max-len": 0,

**Minor changes before v1.0.0 can include breaking changes.**
### 0.16.2
* Fix upsert when virtual fields have not been passed during creation: Don't attempt to delete from non-existing index. ([#543](https://github.com/redux-orm/redux-orm/pull/543))
* Fix failing deletion of many-to-many fields with custom accessor names. ([#552](https://github.com/redux-orm/redux-orm/pull/552))
* Update Babel-related dependencies. ([#544](https://github.com/redux-orm/redux-orm/pull/544))
### 0.16.1

@@ -4,0 +10,0 @@

@@ -1,2 +0,2 @@

!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("ReduxOrm",[],t):"object"==typeof exports?exports.ReduxOrm=t():e.ReduxOrm=t()}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=35)}([function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}e.exports=function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),e}},function(e,t){e.exports=function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}},function(e,t){function n(t){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?e.exports=n=function(e){return typeof e}:e.exports=n=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(t)}e.exports=n},function(e,t,n){var r=n(15),o=n(16),s=n(17),i=n(18);e.exports=function(e){return r(e)||o(e)||s(e)||i()}},function(e,t,n){"use strict";function r(e,t){return e===t}function o(e,t,n){if(null===t||null===n||t.length!==n.length)return!1;for(var r=t.length,o=0;o<r;o++)if(!e(t[o],n[o]))return!1;return!0}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r,n=null,s=null;return function(){return o(t,n,arguments)||(s=e.apply(null,arguments)),n=arguments,s}}function i(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return"function"==typeof e}))){var n=t.map((function(e){return typeof e})).join(", ");throw new Error("Selector creators expect all input-selectors to be functions, instead received the following types: ["+n+"]")}return t}function a(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return function(){for(var t=arguments.length,r=Array(t),o=0;o<t;o++)r[o]=arguments[o];var a=0,c=r.pop(),u=i(r),l=e.apply(void 0,[function(){return a++,c.apply(null,arguments)}].concat(n)),d=s((function(){for(var e=[],t=u.length,n=0;n<t;n++)e.push(u[n].apply(null,arguments));return l.apply(null,e)}));return d.resultFunc=c,d.recomputations=function(){return a},d.resetRecomputations=function(){return a=0},d}}t.__esModule=!0,t.defaultMemoize=s,t.createSelectorCreator=a,t.createStructuredSelector=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:c;if("object"!=typeof e)throw new Error("createStructuredSelector expects first argument to be an object where each property is a selector, instead received a "+typeof e);var n=Object.keys(e);return t(n.map((function(t){return e[t]})),(function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.reduce((function(e,t,r){return e[n[r]]=t,e}),{})}))};var c=t.createSelector=a(s)},function(e,t,n){!function(e,t){"use strict";function n(e){return"string"==typeof e||"number"==typeof e}var r=function(){function e(){this._cache={}}var t=e.prototype;return t.set=function(e,t){this._cache[e]=t},t.get=function(e){return this._cache[e]},t.remove=function(e){delete this._cache[e]},t.clear=function(){this._cache={}},t.isValidCacheKey=function(e){return n(e)},e}(),o=r,s=function(){return!0};function i(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return function(e,r){if("function"==typeof r)throw new Error('[re-reselect] Second argument "options" must be an object. Please use "options.selectorCreator" to provide a custom selectorCreator.');var i={};"function"==typeof e?Object.assign(i,r,{keySelector:e}):Object.assign(i,e);var a=0,c=n.pop(),u=Array.isArray(n[0])?n[0]:[].concat(n);n.push((function(){return a++,c.apply(void 0,arguments)}));var l=i.cacheObject||new o,d=i.selectorCreator||t.createSelector,h=l.isValidCacheKey||s;i.keySelectorCreator&&(i.keySelector=i.keySelectorCreator({keySelector:i.keySelector,inputSelectors:u,resultFunc:c}));var f=function(){var e=i.keySelector.apply(i,arguments);if(h(e)){var t=l.get(e);return void 0===t&&(t=d.apply(void 0,n),l.set(e,t)),t.apply(void 0,arguments)}console.warn('[re-reselect] Invalid cache key "'+e+'" has been returned by keySelector function.')};return f.getMatchingSelector=function(){var e=i.keySelector.apply(i,arguments);return l.get(e)},f.removeMatchingSelector=function(){var e=i.keySelector.apply(i,arguments);l.remove(e)},f.clearCache=function(){l.clear()},f.resultFunc=c,f.dependencies=u,f.cache=l,f.recomputations=function(){return a},f.resetRecomputations=function(){return a=0},f.keySelector=i.keySelector,f}}function a(e){if(void 0===e)throw new Error('Missing the required property "cacheSize".');if(!Number.isInteger(e)||e<=0)throw new Error('The "cacheSize" property must be a positive integer value.')}var c=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache={},this._cacheOrdering=[],this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache[e]=t,this._cacheOrdering.push(e),this._cacheOrdering.length>this._cacheSize){var n=this._cacheOrdering[0];this.remove(n)}},t.get=function(e){return this._cache[e]},t.remove=function(e){var t=this._cacheOrdering.indexOf(e);t>-1&&this._cacheOrdering.splice(t,1),delete this._cache[e]},t.clear=function(){this._cache={},this._cacheOrdering=[]},t.isValidCacheKey=function(e){return n(e)},e}(),u=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache={},this._cacheOrdering=[],this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache[e]=t,this._registerCacheHit(e),this._cacheOrdering.length>this._cacheSize){var n=this._cacheOrdering[0];this.remove(n)}},t.get=function(e){return this._registerCacheHit(e),this._cache[e]},t.remove=function(e){this._deleteCacheHit(e),delete this._cache[e]},t.clear=function(){this._cache={},this._cacheOrdering=[]},t._registerCacheHit=function(e){this._deleteCacheHit(e),this._cacheOrdering.push(e)},t._deleteCacheHit=function(e){var t=this._cacheOrdering.indexOf(e);t>-1&&this._cacheOrdering.splice(t,1)},t.isValidCacheKey=function(e){return n(e)},e}(),l=function(){function e(){this._cache=new Map}var t=e.prototype;return t.set=function(e,t){this._cache.set(e,t)},t.get=function(e){return this._cache.get(e)},t.remove=function(e){this._cache.delete(e)},t.clear=function(){this._cache.clear()},e}(),d=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache=new Map,this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache.set(e,t),this._cache.size>this._cacheSize){var n=this._cache.keys().next().value;this.remove(n)}},t.get=function(e){return this._cache.get(e)},t.remove=function(e){this._cache.delete(e)},t.clear=function(){this._cache.clear()},e}(),h=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache=new Map,this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache.set(e,t),this._cache.size>this._cacheSize){var n=this._cache.keys().next().value;this.remove(n)}},t.get=function(e){var t=this._cache.get(e);return this._cache.has(e)&&(this.remove(e),this._cache.set(e,t)),t},t.remove=function(e){this._cache.delete(e)},t.clear=function(){this._cache.clear()},e}();e.FifoCacheObject=c,e.FifoMapCache=d,e.FifoObjectCache=c,e.FlatCacheObject=r,e.FlatMapCache=l,e.FlatObjectCache=r,e.LruCacheObject=h,e.LruMapCache=h,e.LruObjectCache=u,e.createStructuredCachedSelector=function(e){return t.createStructuredSelector(e,i)},e.default=i,Object.defineProperty(e,"__esModule",{value:!0})}(t,n(4))},function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}},function(e,t,n){var r=n(19),o=n(8),s=n(20),i=n(21),a=n(22),c=n(23),u=n(9);e.exports=function(e,t,n){var l=-1;t=r(t.length?t:[u],a(o));var d=s(e,(function(e,n,o){return{criteria:r(t,(function(t){return t(e)})),index:++l,value:e}}));return i(d,(function(e,t){return c(e,t,n)}))}},function(e,t){e.exports=function(e){return e}},function(e,t){e.exports=function(e){return e}},function(e,t){var n=Array.isArray;e.exports=n},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t,n){var r=n(7),o=n(10);e.exports=function(e,t,n,s){return null==e?[]:(o(t)||(t=null==t?[]:[t]),o(n=s?void 0:n)||(n=null==n?[]:[n]),r(e,t,n))}},function(e,t,n){var r=n(26),o=n(27),s=n(8),i=n(10),a=n(28);e.exports=function(e,t){return(i(e)?r:o)(e,a(s(t,3)))}},function(e,t,n){var r=n(29),o=n(7),s=n(30),i=n(34),a=s((function(e,t){if(null==e)return[];var n=t.length;return n>1&&i(e,t[0],t[1])?t=[]:n>2&&i(t[0],t[1],t[2])&&(t=[t[0]]),o(e,r(t,1),[])}));e.exports=a},function(e,t,n){var r=n(6);e.exports=function(e){if(Array.isArray(e))return r(e)}},function(e,t){e.exports=function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}},function(e,t,n){var r=n(6);e.exports=function(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}},function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}},function(e,t){e.exports=function(e,t){var n=e.length;for(e.sort(t);n--;)e[n]=e[n].value;return e}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,n){var r=n(24);e.exports=function(e,t,n){for(var o=-1,s=e.criteria,i=t.criteria,a=s.length,c=n.length;++o<a;){var u=r(s[o],i[o]);if(u)return o>=c?u:u*("desc"==n[o]?-1:1)}return e.index-t.index}},function(e,t,n){var r=n(25);e.exports=function(e,t){if(e!==t){var n=void 0!==e,o=null===e,s=e==e,i=r(e),a=void 0!==t,c=null===t,u=t==t,l=r(t);if(!c&&!l&&!i&&e>t||i&&a&&u&&!c&&!l||o&&a&&u||!n&&u||!s)return 1;if(!o&&!i&&!l&&e<t||l&&n&&s&&!o&&!i||c&&n&&s||!a&&s||!u)return-1}return 0}},function(e,t){e.exports=function(){return!1}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t){var n="Expected a function";e.exports=function(e){if("function"!=typeof e)throw new TypeError(n);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}},function(e,t){e.exports=function(e){return e&&e.length?e[0]:void 0}},function(e,t,n){var r=n(9),o=n(31),s=n(33);e.exports=function(e,t){return s(o(e,t,r),e+"")}},function(e,t,n){var r=n(32),o=Math.max;e.exports=function(e,t,n){return t=o(void 0===t?e.length-1:t,0),function(){for(var s=arguments,i=-1,a=o(s.length-t,0),c=Array(a);++i<a;)c[i]=s[t+i];i=-1;for(var u=Array(t+1);++i<t;)u[i]=s[i];return u[t]=n(c),r(e,this,u)}}},function(e,t){e.exports=function(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}},function(e,t){e.exports=function(e){return e}},function(e,t){e.exports=function(){return!1}},function(e,t,n){"use strict";n.r(t);var r=n(0),o=n.n(r),s=n(3),i=n.n(s),a=n(2),c=n.n(a);function u(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function l(e){return function t(n){return 0===arguments.length||u(n)?t:e.apply(this,arguments)}}function d(e,t){switch(e){case 0:return function(){return t.apply(this,arguments)};case 1:return function(e){return t.apply(this,arguments)};case 2:return function(e,n){return t.apply(this,arguments)};case 3:return function(e,n,r){return t.apply(this,arguments)};case 4:return function(e,n,r,o){return t.apply(this,arguments)};case 5:return function(e,n,r,o,s){return t.apply(this,arguments)};case 6:return function(e,n,r,o,s,i){return t.apply(this,arguments)};case 7:return function(e,n,r,o,s,i,a){return t.apply(this,arguments)};case 8:return function(e,n,r,o,s,i,a,c){return t.apply(this,arguments)};case 9:return function(e,n,r,o,s,i,a,c,u){return t.apply(this,arguments)};case 10:return function(e,n,r,o,s,i,a,c,u,l){return t.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}function h(e){return function t(n,r){switch(arguments.length){case 0:return t;case 1:return u(n)?t:l((function(t){return e(n,t)}));default:return u(n)&&u(r)?t:u(n)?l((function(t){return e(t,r)})):u(r)?l((function(t){return e(n,t)})):e(n,r)}}}var f=h((function(e,t){return 1===e?l(t):d(e,function e(t,n,r){return function(){for(var o=[],s=0,i=t,a=0;a<n.length||s<arguments.length;){var c;a<n.length&&(!u(n[a])||s>=arguments.length)?c=n[a]:(c=arguments[s],s+=1),o[a]=c,u(c)||(i-=1),a+=1}return i<=0?r.apply(this,o):d(i,e(t,o,r))}}(e,[],t))})),p=l((function(e){return f(e.length,e)})),m={"@@functional/placeholder":!0};function y(e,t){for(var n in e)e.hasOwnProperty(n)&&t(e[n],n)}var g="@@_______immutableOpsOwnerID";function b(e,t){return!!t&&e[g]===t}var w="function"==typeof Symbol?function(){return Symbol("ownerID")}:function(){return{}};function v(e,t){return t&&function(e,t){Object.defineProperty(e,g,{value:t,configurable:!0,enumerable:!1})}(e,t),e}function _(e){return e instanceof Array?e:[e]}var M=".";function O(e){return"string"==typeof e?-1===e.indexOf(M)?[e]:e.split(M):e}function N(e,t,n){return n[e]=t,n}function S(e,t,n){var r=_(t);return e?r.forEach((function(t){y(t,(function(t,r){var o;e&&n.hasOwnProperty(r)?(o="object"===c()(t)?S(e,[t],n[r]):t,n[r]=o):n[r]=t}))})):Object.assign.apply(Object,[n].concat(i()(r))),n}var k=S.bind(null,!1),E=S.bind(null,!0);function j(e,t){return _(e).forEach((function(e){delete t[e]})),t}function x(e,t,n){return e[n]!==t[n]}function F(e,t,n,r){if(b(r,t))return S(e,n,r);var o=_(n),s=!1,i=r,a=function(){s||(s=!0,v(i=Object.assign({},r),t))};return o.forEach((function(n){y(n,(function(o,s){if(e&&r.hasOwnProperty(s)){var u=i[s];if("object"===c()(o)&&!(o instanceof Array)){if(x(i,n,s)){var l=F(e,t,o,u);l!==u&&(a(),i[s]=l)}return!0}}x(i,n,s)&&(a(),i[s]=o)}))})),i}var A=F.bind(null,!0);function C(e,t,n,r){if(b(r,e))return N(t,n,r);if(r[t]===n)return r;var o=function(e){for(var t=new Array(e.length),n=0;n<e.length;n++)t[n]=e[n];return t}(r);return o[t]=n,v(o,e),o}function I(e,t){for(var n=0,r=0;n<t.length;){e(t[n],r)?n++:t.splice(n,1),r++}return t}function R(e,t,n,r){var o=_(n);return r.splice.apply(r,[e,t].concat(i()(o))),r}function D(e,t,n){return R(e,0,t,n)}function $(e,t,n,r,o){if(b(o,e))return R(t,n,r,o);var s=_(r),a=o.slice();return v(a,e),a.splice.apply(a,[t,n].concat(i()(s))),a}function T(e,t,n,r){return b(r,e)?D(t,n,r):$(e,t,0,n,r)}var P={merge:F.bind(null,!1),deepMerge:A,omit:function(e,t,n){if(b(n,e))return j(t,n);var r=_(t).filter((function(e){return n.hasOwnProperty(e)}));if(0===r.length)return n;var o=Object.assign({},n);return r.forEach((function(e){delete o[e]})),v(o,e),o},setIn:function(e,t,n,r){var o=O(t),s=function(e,t){for(var n=O(e),r=t,o=0;o<n.length;o++){var s=r[n[o]];if(o===n.length-1)return s;if("object"!==c()(s))return;r=s}}(o,r);if(n===s)return r;var i,a=o.length,u=i=b(r,e)?r:Object.assign(v({},e),r);return o.forEach((function(t,r){if(r!==a-1){var s=i[t],u=c()(s);if("object"!==u){if("undefined"===u){var l=v({},e);return i[t]=l,void(i=l)}var d="".concat(o[r-1],".").concat(t);throw new Error("A non-object value was encountered when traversing setIn path at ".concat(d,"."))}if(b(s,e))i=s;else{var h=v({},e);i[t]=Object.assign(h,s),i=h}}else i[t]=n})),u},insert:T,push:function(e,t,n){return T(e,n.length,t,n)},filter:function(e,t,n){if(b(n,e))return I(t,n);var r=n.filter(t);return r.length===n.length?n:(v(r,e),r)},splice:$,set:function(e,t,n,r){if(function(e){return e&&"object"===c()(e)&&"number"==typeof e.length&&e.length>=0&&e.length%1==0}(r))return C(e,t,n,r);if(b(r,e))return N(t,n,r);if(r[t]===n)return r;var o=Object.assign({},r);return v(o,e),o[t]=n,o}},B={merge:k,deepMerge:E,omit:j,setIn:function(e,t,n){for(var r=O(e),o=r.length,s=!1,i=0,a=n,u=r[i];!s;)if(i===o-1)a[u]=t,s=!0;else{var l=c()(a[u]);if("undefined"===l){var d={};v(d,null),a[u]=d}else if("object"!==l){var h="".concat(r[i-1],".").concat(u);throw new Error("A non-object value was encountered when traversing setIn path at ".concat(h,"."))}a=a[u],u=r[++i]}return n},insert:D,push:function(e,t){var n=_(e);return t.push.apply(t,i()(n)),t},filter:I,splice:R,set:N};var U=function(){var e=Object.assign({},P);y(e,(function(t,n){e[n]=p(t.bind(null,null))}));var t=Object.assign({},B);y(t,(function(e,n){t[n]=p(e)}));var n=Object.assign({},P);return y(n,(function(e,t){n[t]=p(e)})),Object.assign(e,{mutable:t,batch:n,batched:function(e,t){var n,r;"function"==typeof e?(r=e,n=w()):(n=e,r=t);var o=Object.assign({},P);return y(o,(function(e,t){o[t]=p(e.bind(null,n))})),r(o)},__:m,getBatchToken:w})}();const V="REDUX_ORM_UPDATE",q="REDUX_ORM_DELETE",z="REDUX_ORM_CREATE",L="REDUX_ORM_FILTER",Q="REDUX_ORM_EXCLUDE",X="SUCCESS",H=Symbol("REDUX_ORM_ALL_INSTANCES"),Y=(e,t)=>void 0===t?H:t;function K(e){return("function"==typeof console.warn?console.warn.bind(console):console.log.bind(console))(e)}function G(e,t){return e+((n=t).charAt(0).toUpperCase()+n.slice(1));var n}function J(e){return`from${e}Id`}function W(e){return`to${e}Id`}function Z(e){return function(...t){return this.getQuerySet()[e](...t)}}function ee(e){return function(){return this.getQuerySet()[e]}}function te(e,t){const n=t.sharedMethods.slice();!function(e,t){let n=e;for(;n!==Function.prototype;)t(n),n=Object.getPrototypeOf(n)}(t,t=>{for(let r=0;r<n.length;r++){let o=!1;const s=n[r],i=Object.getOwnPropertyDescriptor(t.prototype,s);void 0!==i&&(void 0!==i.get?(i.get=ee(s),Object.defineProperty(e,s,i)):e[s]=Z(s),o=!0),o&&n.splice(r--,1)}})}function ne(e){return null!=e&&"function"==typeof e.getId?e.getId():e}const{getBatchToken:re}=U;function oe({type:e,payload:t},n){if(e!==L)return!1;if("object"!=typeof t)return!1;if(!t.hasOwnProperty(n))return!1;const r=t[n];return null!==r&&void 0!==r}function se(e,t){return Object.entries(e).reduce((e,[n,r])=>(e[n]=t(r),e),{})}function ie(e){return e&&"string"!=typeof e?e.modelName:e}const ae=function(){function e(e,t,n){Object.assign(this,{modelClass:e,clauses:t||[]}),this._opts=n}e.addSharedMethod=function(e){this.sharedMethods=this.sharedMethods.concat(e)};var t=e.prototype;return t._new=function(e,t){const n={...this._opts,...t};return new this.constructor(this.modelClass,e,n)},t.toString=function(){return this._evaluate(),`QuerySet contents:\n - ${this.rows.map(({id:e})=>this.modelClass.withId(e).toString()).join("\n - ")}`},t.toRefArray=function(){return this._evaluate()},t.toModelArray=function(){const{modelClass:e}=this;return this._evaluate().map(t=>new e(t))},t.count=function(){return this._evaluate(),this.rows.length},t.exists=function(){return Boolean(this.count())},t.at=function(e){const{modelClass:t}=this,n=this._evaluate();if(e>=0&&e<n.length)return new t(n[e])},t.first=function(){return this.at(0)},t.last=function(){const e=this._evaluate();return this.at(e.length-1)},t.all=function(){return this._new(this.clauses)},t.filter=function(e){const t="object"==typeof e?se(e,ne):e,n={type:L,payload:t};return this._new(this.clauses.concat(n))},t.exclude=function(e){const t="object"==typeof e?se(e,ne):e,n={type:Q,payload:t};return this._new(this.clauses.concat(n))},t._evaluate=function(){if(void 0===this.modelClass.session)throw new Error([`Tried to query the ${this.modelClass.modelName} model's table without a session. `,"Create a session using `session = orm.session()` and use ",`\`session["${this.modelClass.modelName}"]\` for querying instead.`].join(""));if(!this._evaluated){const{session:e,modelName:t}=this.modelClass,n={table:t,clauses:this.clauses};this.rows=e.query(n).rows,this._evaluated=!0}return this.rows},t.orderBy=function(e,t){const n={type:"REDUX_ORM_ORDER_BY",payload:[e,t]};return this._new(this.clauses.concat(n))},t.update=function(e){const{session:t,modelName:n}=this.modelClass;t.applyUpdate({action:V,query:{table:n,clauses:this.clauses},payload:e}),this._evaluated=!1},t.delete=function(){const{session:e,modelName:t}=this.modelClass;this.toModelArray().forEach(e=>e._onDelete()),e.applyUpdate({action:q,query:{table:t,clauses:this.clauses}}),this._evaluated=!1},t.map=function(){throw new Error("`QuerySet.prototype.map` has been removed. Call `.toModelArray()` or `.toRefArray()` first to map.")},t.forEach=function(){throw new Error("`QuerySet.prototype.forEach` has been removed. Call `.toModelArray()` or `.toRefArray()` first to iterate.")},o()(e,[{key:"withModels",get:function(){throw new Error("`QuerySet.prototype.withModels` has been removed. Use `.toModelArray()` or predicate functions that instantiate Models from refs, e.g. `new Model(ref)`.")}},{key:"withRefs",get:function(){K("`QuerySet.prototype.withRefs` has been deprecated. Query building operates on refs only now.")}}]),e}();ae.sharedMethods=["count","at","all","last","first","filter","exclude","orderBy","update","delete"];var ce=ae;var ue=function(){function e(e,t,n,r,o){this.schema=e,this.db=t,this.state=n||t.getEmptyState(),this.initialState=this.state,this.withMutations=Boolean(r),this.batchToken=o||w(),this.modelData={},this.models=e.getModelClasses(),this.sessionBoundModels=this.models.map(e=>{function t(){return Reflect.construct(e,arguments,t)}return Reflect.setPrototypeOf(t.prototype,e.prototype),Reflect.setPrototypeOf(t,e),Object.defineProperty(this,e.modelName,{get:()=>t}),t.connect(this),t})}var t=e.prototype;return t.getDataForModel=function(e){return this.modelData[e]||(this.modelData[e]={}),this.modelData[e]},t.getModelData=function(){return this.modelData},t.markAccessed=function(e,t){const n=this.getDataForModel(e);n.accessedInstances||(n.accessedInstances={}),t.forEach(e=>{n.accessedInstances[e]=!0})},t.markFullTableScanned=function(e){this.getDataForModel(e).fullTableScanned=!0},t.markAccessedIndexes=function(e){e.forEach(([e,t,n])=>{const r=this.getDataForModel(e);r.accessedIndexes||(r.accessedIndexes={}),r.accessedIndexes[t]=[...r.accessedIndexes[t]||[],n]})},t.applyUpdate=function(e){const t=this._getTransaction(e),n=this.db.update(e,t,this.state),{status:r,state:o,payload:s}=n;if(r!==X)throw new Error(`Applying update failed with status ${r}. Payload: ${s}`);return this.state=o,s},t.query=function(e){const t=this.db.query(e,this.state);return this._markAccessedByQuery(e,t),t},t._getTransaction=function(e){const{withMutations:t}=this,{action:n}=e;let{batchToken:r}=this;return[V,q].includes(n)&&(r=w()),{batchToken:r,withMutations:t}},t._markAccessedByQuery=function(e,t){const{table:n,clauses:r}=e,{rows:o}=t,{idAttribute:s}=this[n],i=new Set(o.map(e=>e[s])),a=r.some(e=>!!oe(e,s)&&(i.add(e.payload[s]),!0)),c=[],{indexes:u}=this.state[n];r.forEach(e=>{Object.keys(u).forEach(t=>{if(!oe(e,t))return;const r=e.payload[t];c.push([n,t,r])})}),a?this.markAccessed(n,i):c.length?(this.markAccessed(n,i),this.markAccessedIndexes(c)):this.markFullTableScanned(n)},t.getNextState=function(){return K("`Session.prototype.getNextState` has been deprecated. Access the `Session.prototype.state` property instead."),this.state},t.reduce=function(){throw new Error("`Session.prototype.reduce` has been removed. The Redux integration API is now decoupled from ORM and Session - see the 0.9 migration guide in the GitHub repo.")},o()(e,[{key:"accessedModelInstances",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.accessedInstances&&(e[t]=n.accessedInstances),e),{})}},{key:"fullTableScannedModels",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.fullTableScanned&&e.push(t),e),[])}},{key:"accessedIndexes",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.accessedIndexes&&(e[t]=n.accessedIndexes),e),{})}}]),e}(),le=n(1),de=n.n(le);var he=function(e){function t(){return e.apply(this,arguments)||this}de()(t,e);var n=t.prototype;return n.installForwardsDescriptor=function(){Object.defineProperty(this.model.prototype,this.fieldName,this.field.createForwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},n.installForwardsVirtualField=function(){this.model.virtualFields[this.fieldName]=this.field.createForwardsVirtualField(this.fieldName,this.model,this.toModel,this.throughModel)},n.installBackwardsDescriptor=function(){if(Object.getOwnPropertyDescriptor(this.toModel.prototype,this.backwardsFieldName))throw new Error((e=this.model.modelName,t=this.fieldName,n=this.toModel.modelName,[`Reverse field ${this.backwardsFieldName} already defined`,` on model ${n}. To fix, set a custom related`,` name on ${e}.${t}.`].join("")));var e,t,n;Object.defineProperty(this.toModel.prototype,this.backwardsFieldName,this.field.createBackwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},n.installBackwardsVirtualField=function(){this.toModel.virtualFields[this.backwardsFieldName]=this.field.createBackwardsVirtualField(this.fieldName,this.model,this.toModel,this.throughModel)},t}(function(){function e(e){this.field=e.field,this.fieldName=e.fieldName,this.model=e.model,this.orm=e.orm,this.field.references(this.model)&&(this.field.toModelName="this")}return e.prototype.run=function(){this.installForwardsDescriptor(),this.field.installsForwardsVirtualField&&this.installForwardsVirtualField(),this.field.installsBackwardsDescriptor&&this.installBackwardsDescriptor(),this.field.installsBackwardsVirtualField&&this.installBackwardsVirtualField()},o()(e,[{key:"toModel",get:function(){if(void 0===this._toModel){const{toModelName:e}=this.field;this._toModel=e?"this"===e?this.model:this.orm.get(e):null}return this._toModel}},{key:"throughModel",get:function(){if(void 0===this._throughModel){const e=this.field.getThroughModelName(this.fieldName,this.model);this._throughModel=e?this.orm.get(e):null}return this._throughModel}},{key:"backwardsFieldName",get:function(){return this.field.getBackwardsFieldName(this.model)}}]),e}());var fe=function(){function e(){}var t=e.prototype;return t.getClass=function(){return this.constructor},t.references=function(e){return!1},t.getThroughModelName=function(e,t){return null},o()(e,[{key:"installerClass",get:function(){return he}},{key:"installsForwardsVirtualField",get:function(){return!1}},{key:"installsBackwardsDescriptor",get:function(){return!1}},{key:"installsBackwardsVirtualField",get:function(){return!1}},{key:"index",get:function(){return!1}}]),e}();function pe(e,t){return{get(){const{session:{[t]:n}}=this.getClass(),{[e]:r}=this._fields;return n.withId(r)},set(t){this.update({[e]:ne(t)})}}}function me(e,t,n,r,o){return{get(){const{session:{[e]:s,[t]:i,[n]:a}}=this.getClass(),c=o?i:s,u=o?s:i,l=o?r.to:r.from,d=o?r.from:r.to,h=this.getId(),f=a.filter({[l]:h}),p=new Set(f.toRefArray().map(e=>e[d])),m=u.filter(e=>p.has(e[u.idAttribute]));return m.add=function(...e){const t=new Set(e.map(ne)),n=f.filter(e=>t.has(e[d]));if(n.exists()){const e=n.toRefArray().map(e=>e[d]);throw new Error(`Tried to add already existing ${u.modelName} id(s) ${e} to the ${c.modelName} instance with id ${h}`)}t.forEach(e=>{a.create({[d]:e,[l]:h})})},m.clear=function(){f.delete()},m.remove=function(...e){const t=new Set(e.map(ne)),n=f.filter(e=>t.has(e[d]));if(n.count()!==t.size){const e=n.toRefArray().map(e=>e[d]),r=[...t].filter(t=>!e.includes(t));throw new Error(`Tried to delete non-existing ${u.modelName} id(s) ${r} from the ${c.modelName} instance with id ${h}`)}n.delete()},m},set(){throw new Error("Tried setting a M2M field. Please use the related QuerySet methods add, remove and clear.")}}}var ye=function(e){function t(t){var n;return(n=e.call(this)||this).opts=t||{},n.opts.hasOwnProperty("getDefault")&&(n.getDefault=n.opts.getDefault),n}return de()(t,e),t.prototype.createForwardsDescriptor=function(e,t){return function(e){return{get(){return this._fields[e]},set(t){return this.set(e,t)},enumerable:!0,configurable:!0}}(e)},t}(fe);var ge=function(e){function t(...t){var n;if(n=e.call(this)||this,1===t.length&&"object"==typeof t[0]){const e=t[0];n.toModelName=ie(e.to),n.relatedName=e.relatedName,n.through=ie(e.through),n.throughFields=e.throughFields,n.as=e.as}else[n.toModelName,n.relatedName]=[ie(t[0]),t[1]];return n}de()(t,e);var n=t.prototype;return n.getBackwardsFieldName=function(e){return this.relatedName||e.modelName.toLowerCase()+"Set"},n.createBackwardsVirtualField=function(e,t,n,r){return new(this.getClass())(t.modelName,e)},n.references=function(e){return this.toModelName===e.modelName},o()(t,[{key:"installsBackwardsVirtualField",get:function(){return!0}},{key:"installsBackwardsDescriptor",get:function(){return!0}},{key:"installerClass",get:function(){return function(e){function t(){return e.apply(this,arguments)||this}return de()(t,e),t.prototype.installForwardsDescriptor=function(){Object.defineProperty(this.model.prototype,this.field.as||this.fieldName,this.field.createForwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},t}(he)}}]),t}(fe);var be=function(e){function t(){return e.apply(this,arguments)||this}de()(t,e);var n=t.prototype;return n.createForwardsDescriptor=function(e,t,n,r){return pe(e,n.modelName)},n.createBackwardsDescriptor=function(e,t,n,r){return o=e,s=t.modelName,{get(){const{session:{[s]:e}}=this.getClass();return e.filter({[o]:this.getId()})},set(){throw new Error("Can't mutate a reverse many-to-one relation.")}};var o,s},o()(t,[{key:"index",get:function(){return!0}}]),t}(ge);var we=function(e){function t(){return e.apply(this,arguments)||this}de()(t,e);var n=t.prototype;return n.getDefault=function(){return[]},n.getThroughModelName=function(e,t){return this.through||G(t.modelName,e)},n.createForwardsDescriptor=function(e,t,n,r){return me(t.modelName,n.modelName,r.modelName,this.getThroughFields(e,t,n,r),!1)},n.createBackwardsDescriptor=function(e,t,n,r){return me(t.modelName,n.modelName,r.modelName,this.getThroughFields(e,t,n,r),!0)},n.createBackwardsVirtualField=function(e,t,n,r){return new(this.getClass())({to:t.modelName,relatedName:e,through:r.modelName,throughFields:this.getThroughFields(e,t,n,r)})},n.createForwardsVirtualField=function(e,t,n,r){return new(this.getClass())({to:n.modelName,relatedName:e,through:this.through,throughFields:this.getThroughFields(e,t,n,r),as:this.as})},n.getThroughFields=function(e,t,n,r){if(this.throughFields){const[e,t]=this.throughFields,o=r.fields[e];return{to:o.references(n)?e:t,from:o.references(n)?t:e}}if(t.modelName===n.modelName)return{to:W(n.modelName),from:J(t.modelName)};const o=e=>Object.keys(r.fields).find(t=>r.fields[t].references(e));return{to:o(n),from:o(t)}},o()(t,[{key:"installsForwardsVirtualField",get:function(){return!0}}]),t}(ge);var ve=function(e){function t(){return e.apply(this,arguments)||this}de()(t,e);var n=t.prototype;return n.getBackwardsFieldName=function(e){return this.relatedName||e.modelName.toLowerCase()},n.createForwardsDescriptor=function(e,t,n,r){return function(...e){return pe(...e)}(e,n.modelName)},n.createBackwardsDescriptor=function(e,t,n,r){return o=e,s=t.modelName,{get(){const{session:{[s]:e}}=this.getClass();return e.get({[o]:this.getId()})},set(){throw new Error("Can't mutate a reverse one-to-one relation.")}};var o,s},t}(ge);function _e(e){return new ye(e)}function Me(...e){return new be(...e)}function Oe(...e){return new we(...e)}function Ne(...e){return new ve(...e)}function Se(e){const t=e.getClass(),{idAttribute:n,modelName:r}=t;return{table:r,clauses:[{type:L,payload:{[n]:e.getId()}}]}}const ke=function(){function e(e){this._initFields(e)}var t=e.prototype;return t._initFields=function(e){const t=Object(e);this._fields={...t},Object.keys(t).forEach(e=>{e in this||Object.defineProperty(this,e,{get:()=>this._fields[e],set:t=>this.set(e,t),configurable:!0,enumerable:!0})})},e.toString=function(){return`ModelClass: ${this.modelName}`},e.options=function(){return{}},e.markAccessed=function(e){if(void 0===this._session)throw new Error([`Tried to mark rows of the ${this.modelName} model as accessed without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markAccessed\` instead.`].join(""));this.session.markAccessed(this.modelName,e)},e.markFullTableScanned=function(){if(void 0===this._session)throw new Error([`Tried to mark the ${this.modelName} model as full table scanned without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markFullTableScanned\` instead.`].join(""));this.session.markFullTableScanned(this.modelName)},e.markAccessedIndexes=function(e){if(void 0===this._session)throw new Error([`Tried to mark indexes for the ${this.modelName} model as accessed without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markAccessedIndexes\` instead.`].join(""));this.session.markAccessedIndexes(e.map(([e,t])=>[this.modelName,e,t]))},e.connect=function(e){if(!(e instanceof ue))throw new Error("A model can only be connected to instances of Session.");this._session=e},e.getQuerySet=function(){const{querySetClass:e}=this;return new e(this)},e.invalidateClassCache=function(){this.isSetUp=void 0,this.virtualFields={}},e.tableOptions=function(){return"function"==typeof this.backend?(K("`Model.backend` has been deprecated. Please rename to `.options`."),this.backend()):this.backend?(K("`Model.backend` has been deprecated. Please rename to `.options`."),this.backend):"function"==typeof this.options?this.options():this.options},e.create=function(e){if(void 0===this._session)throw new Error([`Tried to create a ${this.modelName} model instance without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].create\` instead.`].join(""));const t={...e},n={},r=Object.keys(this.fields),o=Object.keys(this.virtualFields);r.forEach(r=>{const o=this.fields[r],s=e.hasOwnProperty(r);if(o instanceof we)s&&(n[r]=e[r],o.as||delete t[r]);else if(s){const n=e[r];t[r]=ne(n)}else o.getDefault&&(t[r]=o.getDefault())}),o.forEach(r=>{if(!n.hasOwnProperty(r)){const o=this.virtualFields[r];e.hasOwnProperty(r)&&o instanceof we&&(n[r]=e[r],delete t[r])}});const s=new this(this.session.applyUpdate({action:z,table:this.modelName,payload:t}));return s._refreshMany2Many(n),s},e.upsert=function(e){if(void 0===this.session)throw new Error([`Tried to upsert a ${this.modelName} model instance without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].upsert\` instead.`].join(""));const{idAttribute:t}=this;if(e.hasOwnProperty(t)){const n=e[t];if(this.idExists(n)){const t=this.withId(n);return t.update(e),t}}return this.create(e)},e.withId=function(e){return this.get({[this.idAttribute]:e})},e.idExists=function(e){return this.exists({[this.idAttribute]:e})},e.exists=function(e){if(void 0===this.session)throw new Error([`Tried to check if a ${this.modelName} model instance exists without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].exists\` instead.`].join(""));return Boolean(this._findDatabaseRows(e).length)},e.get=function(e){const t=this._findDatabaseRows(e);if(0===t.length)return null;if(t.length>1)throw new Error(`Expected to find a single row in \`${this.modelName}.get\`. Found ${t.length}.`);return new this(t[0])},t.getClass=function(){return this.constructor},t.getId=function(){return this._fields[this.getClass().idAttribute]},e._findDatabaseRows=function(e){const t={table:this.modelName};return e&&(t.clauses=[{type:L,payload:e}]),this.session.query(t).rows},t.toString=function(){const e=this.getClass();return`${e.modelName}: {${Object.keys(e.fields).map(t=>{if(e.fields[t]instanceof we){return`${t}: [${this[t].toModelArray().map(e=>e.getId()).join(", ")}]`}return`${t}: ${this._fields[t]}`}).join(", ")}}`},t.equals=function(e){return function(e,t){const n=Object.entries(Object(e));return n.length===Object.keys(t).length&&n.every(([e,n])=>t.hasOwnProperty(e)&&t[e]===n)}(this._fields,e._fields)},t.set=function(e,t){this.update({[e]:t})},t.update=function(e){const t=this.getClass();if(void 0===t.session)throw new Error([`Tried to update a ${t.modelName} model instance without a session. `,"You cannot call `.update` on an instance that you did not receive from the database."].join(""));const n={...e},{fields:r,virtualFields:o}=t,s={};for(const e in n){if(r.hasOwnProperty(e)){const t=r[e];t instanceof be||t instanceof ve?n[e]=ne(n[e]):t instanceof we&&(s[e]=n[e],t.as||delete n[e])}else if(o.hasOwnProperty(e)){o[e]instanceof we&&(s[e]=n[e],delete n[e])}}const i={...this._fields,...n},a=new t(i);this.equals(a)||(this._initFields(i),t.session.applyUpdate({action:V,query:Se(this),payload:n})),this._refreshMany2Many(s)},t.refreshFromState=function(){this._initFields(this.ref)},t.delete=function(){const e=this.getClass();if(void 0===e.session)throw new Error([`Tried to delete a ${e.modelName} model instance without a session. `,"You cannot call `.delete` on an instance that you did not receive from the database."].join(""));this._onDelete(),e.session.applyUpdate({action:q,query:Se(this)})},t._refreshMany2Many=function(e){const t=this.getClass(),{fields:n,virtualFields:r,modelName:o}=t;Object.keys(e).forEach(s=>{const i=!n.hasOwnProperty(s),a=r[s],c=e[s];if(!Array.isArray(c))throw new TypeError(`Failed to resolve many-to-many relationship: ${o}[${s}] must be an array (passed: ${c})`);const u=c.map(ne),l=[...new Set(u)];if(u.length!==l.length)throw new Error(`Found duplicate id(s) when passing "${u}" to ${t.modelName}.${s} value`);const d=a.through||G(t.modelName,s),h=t.session[d];let f,p;i?({from:p,to:f}=a.throughFields):({from:f,to:p}=a.throughFields);const m=function(e,t){const n=e.filter(e=>t.includes(e)),r=e.filter(e=>!n.includes(e)),o=t.filter(e=>!n.includes(e));return r.length||o.length?{delete:r,add:o}:null}(h.filter(e=>e[f]===this[t.idAttribute]).toRefArray().map(e=>e[p]),u);if(m){const{delete:e,add:t}=m;e.length>0&&this[a.as||s].remove(...e),t.length>0&&this[a.as||s].add(...t)}})},t._onDelete=function(){const{virtualFields:e}=this.getClass();for(const t in e){const n=e[t];if(n instanceof we){this[n.as||t].clear()}else if(n instanceof be){const e=this[t];e.exists()&&e.update({[n.relatedName]:null})}else n instanceof ve&&null!==this[t]&&(this[t][n.relatedName]=null)}},e.hasId=function(e){return console.warn("`Model.hasId` has been deprecated. Please use `Model.idExists` instead."),this.idExists(e)},t.getNextState=function(){throw new Error("`Model.prototype.getNextState` has been removed. See the 0.9 migration guide on the GitHub repo.")},o()(e,[{key:"ref",get:function(){const e=this.getClass();return e._findDatabaseRows({[e.idAttribute]:this.getId()})[0]}}],[{key:"idAttribute",get:function(){if(void 0===this._session)throw new Error([`Tried to get the ${this.modelName} model's id attribute without a session. `,"Create a session using `session = orm.session()` and access ",`\`session["${this.modelName}"].idAttribute\` instead.`].join(""));return this.session.db.describe(this.modelName).idAttribute}},{key:"session",get:function(){return this._session}},{key:"query",get:function(){return this.getQuerySet()}}]),e}();ke.fields={id:_e()},ke.virtualFields={},ke.querySetClass=ce;var Ee=ke,je=n(11),xe=n.n(je),Fe=n(12),Ae=n.n(Fe),Ce=n(13),Ie=n.n(Ce),Re=n(14),De=n.n(Re);const $e={idAttribute:"id",arrName:"items",mapName:"itemsById",fields:{}};var Te=function(){function e(e){Object.assign(this,$e,e)}var t=e.prototype;return t.accessId=function(e,t){return e[this.mapName][t]},t.accessIds=function(e,t){const n=e[this.mapName];return t.map(e=>n[e])},t.idExists=function(e,t){return e[this.mapName].hasOwnProperty(t)},t.accessIdList=function(e){return e[this.arrName]},t.accessList=function(e){return this.accessIds(e,this.accessIdList(e))},t.getMaxId=function(e){return this.getMeta(e,"maxId")},t.setMaxId=function(e,t,n){return this.setMeta(e,t,"maxId",n)},t.nextId=function(e){return e+1},t.getEmptyState=function(){return{...{[this.arrName]:[],[this.mapName]:{}},indexes:Object.keys(this.fields).filter(e=>e!==this.idAttribute).filter(e=>this.fields[e].index).reduce((e,t)=>({...e,[t]:{}}),{}),meta:{}}},t.setMeta=function(e,t,n,r){const{batchToken:o,withMutations:s}=e;if(s){return U.mutable.setIn(["meta",n],r,t)}return U.batch.setIn(o,["meta",n],r,t)},t.getMeta=function(e,t){return e.meta[t]},t.query=function(e,t){if(0===t.length)return this.accessList(e);const{idAttribute:n}=this,r=De()(t,e=>oe(e,n)?1:function({type:e}){return[L,Q].includes(e)}(e)?2:3),o=(t,r)=>{const{type:s,payload:i}=r;if(!t){if(oe(r,n)){const t=i[n],s=Object.keys(i).reduce((e,t)=>(t!==n&&(e[t]=i[t]),e),{}),a=this.idExists(e,t)?[t]:[];return Object.keys(s).length?o(this.accessIds(e,a),{...r,payload:s}):this.accessIds(e,a)}if(s===L&&"object"==typeof i){const t=Object.entries(e.indexes),n=[],s=[];if(t.forEach(([e,t])=>{oe(r,e)&&t.hasOwnProperty(i[e])&&(n.push(t[i[e]]),s.push(e))}),n.length){const t=n.pop(),a=n.reduce((e,t)=>{const n=new Set(t);return e.filter(Set.prototype.has,n)},t),c=Object.keys(i).reduce((e,t)=>(s.includes(t)||(e[t]=i[t]),e),{});return Object.keys(c).length?o(this.accessIds(e,a),{...r,payload:c}):this.accessIds(e,a)}}return o(this.accessList(e),r)}switch(s){case L:return xe()(t,i);case Q:return Ie()(t,i);case"REDUX_ORM_ORDER_BY":{const[e,n]=i;return Ae()(t,e,function(e){if(void 0===e)return;const t=e=>["desc",!1].includes(e)?"desc":"asc";return Array.isArray(e)?e.map(t):t(e)}(n))}default:return t}};return r.reduce(o,void 0)},t.insert=function(e,t,n){const{batchToken:r,withMutations:o}=e,s=n.hasOwnProperty(this.idAttribute);let i=t;const[a,c]=function(e,t){let n,r,o=e;return void 0===o&&(o=-1),void 0===t?(n=o+1,r=n):(n=Math.max(o+1,t),r=t),[n,r]}(this.getMaxId(t),n[this.idAttribute]);i=this.setMaxId(e,t,a);const u=s?n:U.batch.set(r,this.idAttribute,c,n),l=Object.keys(i.indexes).filter(e=>n.hasOwnProperty(e)&&null!==n[e]).map(e=>[e,n[e]]);if(o)return U.mutable.push(c,i[this.arrName]),U.mutable.set(c,u,i[this.mapName]),l.forEach(([e,t])=>{const n=i.indexes[e];n.hasOwnProperty(t)?U.mutable.push(c,n[t]):U.mutable.set(t,[c],n)}),{state:i,created:u};const d=U.batch.merge(r,l.reduce((e,[t,n])=>(e[t]=U.batch.merge(r,{[n]:U.batch.push(r,c,e[t][n]||[])},e[t]),e),{...i.indexes}),i.indexes);return{state:U.batch.merge(r,{[this.arrName]:U.batch.push(r,c,i[this.arrName]),[this.mapName]:U.batch.merge(r,{[c]:u},i[this.mapName]),indexes:d},i),created:u}},t.update=function(e,t,n,r){const{batchToken:o,withMutations:s}=e,i=s?U.mutable.set:U.batch.set(o),a=Object.keys(t.indexes).filter(e=>r.hasOwnProperty(e)),c=[],u=[],l=n.reduce((e,t)=>{const n=a.reduce((e,n)=>({...e,[n]:t[n]}),{}),l=(e=>{return(s?U.mutable.merge:U.batch.merge(o))(r,e)})(t),d=a.reduce((e,t)=>({...e,[t]:l[t]}),{}),h=l[this.idAttribute],f=i(h,l,e);return a.forEach(e=>{const{[e]:t}=n,{[e]:r}=d;t!==r&&(null!=t&&u.push([e,t,h]),null!==r&&c.push([e,r,h]))}),f},t[this.mapName]);let d=t.indexes;return s?(u.forEach(([e,t,n])=>{const r=d[e][t],o=r.indexOf(n);U.mutable.splice(o,1,[],r)}),c.forEach(([e,t,n])=>{U.mutable.push(n,d[e][t])})):(c.length&&(d=U.batch.merge(o,c.reduce((e,[t,n,r])=>(e[t]=U.batch.merge(o,{[n]:U.batch.push(o,r,e[t][n]||[])},e[t]),e),{...d}),d)),u.length&&(d=U.batch.merge(o,u.reduce((e,[t,n,r])=>(e[t]=U.batch.merge(o,{[n]:U.batch.filter(o,e=>e!==r,e[t][n])},e[t]),e),{...d}),d))),U.batch.merge(o,{[this.mapName]:l,indexes:d},t)},t.delete=function(e,t,n){const{batchToken:r,withMutations:o}=e,{arrName:s,mapName:i}=this,a=t[s],c=n.map(e=>e[this.idAttribute]);if(o)return c.forEach(e=>{const n=a.indexOf(e);U.mutable.splice(n,1,[],a),U.mutable.omit(e,t[i])}),Object.values(t.indexes).forEach(e=>Object.values(e).forEach(e=>c.forEach(t=>{const n=e.indexOf(t);-1!==n&&U.mutable.splice(n,1,[],e)}))),t;const u=U.batch.merge(r,Object.entries(t.indexes).reduce((e,[t,n])=>(e[t]=U.batch.merge(r,Object.entries(n).reduce((e,[t,n])=>(e[t]=U.batch.filter(r,e=>!c.includes(e),n),e),{...e[t]}),e[t]),e),{...t.indexes}),t.indexes);return U.batch.merge(r,{[s]:U.batch.filter(r,e=>!c.includes(e),t[s]),[i]:U.batch.omit(r,c,t[i]),indexes:U.batch.merge(r,u,t.indexes)},t)},e}();const Pe={};function Be(e,t,n){const{table:r,clauses:o}=t;return{rows:e[r].query(n[r],o)}}function Ue(e,t,n,r){const{action:o,payload:s}=t;let i,a,c;if(o===z){({table:i}=t);const o=e[i],u=r[i],l=o.insert(n,u,s);a=l.state,c=l.created}else{const{query:u}=t;({table:i}=u);const{rows:l}=Be(e,u,r),d=e[i],h=r[i];if(o===V)a=d.update(n,h,l,s),c=Be(e,u,r).rows;else{if(o!==q)throw new Error(`Database received unknown update type: ${o}`);a=d.delete(n,h,l),c=l}}const u=function(e,t,n,r){const{batchToken:o,withMutations:s}=n;return s?(r[e]=t,r):U.batch.set(o,e,t,r)}(i,a,n,r);return{status:X,state:u,payload:c}}Object.defineProperty(Pe,"@@_______REDUX_ORM_STATE_FLAG",{enumerable:!0,value:!0});var Ve=function(e){const{tables:t}=e,n=Object.entries(t).reduce((e,[t,n])=>({...e,[t]:new Te(n)}),{});return{getEmptyState:()=>Object.entries(n).reduce((e,[t,n])=>({...e,[t]:n.getEmptyState()}),Pe),query:Be.bind(null,n),update:Ue.bind(null,n),describe:e=>n[e]}};let qe=function(){function e({parent:e,orm:t}){this._parent=e,this._orm=t,this.keySelector=Y}return o()(e,[{key:"cachePath",get:function(){return[...this._parent?this._parent.cachePath:[],this.key]}},{key:"orm",get:function(){return this._orm}},{key:"parent",get:function(){return this._parent}}]),e}(),ze=function(e){function t({model:t,...n}){var r;return(r=e.call(this,n)||this)._model=t,r}return de()(t,e),o()(t,[{key:"resultFunc",get:function(){return(e,t,...n)=>{const{[this._model.modelName]:r}=e;return void 0===t?r.all().toModelArray().map(t=>this.valueForInstance(t,e,...n)):Array.isArray(t)?t.map(t=>this.valueForInstance(r.withId(t),e,...n)):this.valueForInstance(r.withId(t),e,...n)}}},{key:"model",get:function(){return this._model}}]),t}(qe);function Le(e,t){return t}let Qe=function(e){function t({field:t,selector:n,...r}){var o;return(o=e.call(this,r)||this)._field=t,o._selector=n,o}return de()(t,e),t.prototype.createResultFunc=function(e){const{idAttribute:t}=this._parent.toModel;return(n,...r)=>{const o=e(n,...r),s=Le(n,...r),i=e=>null===e?null:e.map(e=>this._selector(n,e[t]));return void 0===s||Array.isArray(s)?o.map(i):i(o)}},o()(t,[{key:"selector",get:function(){return this._selector},set:function(e){this._selector=e}},{key:"key",get:function(){return this._selector}}]),t}(ze),Xe=function(e){function t({model:t,...n}){var r;return(r=e.call(this,n)||this)._model=t,r}return de()(t,e),o()(t,[{key:"key",get:function(){return this._model.modelName}},{key:"dependencies",get:function(){return[this._orm,Le]}},{key:"resultFunc",get:function(){return({[this._model.modelName]:e},t)=>{if(void 0===t)return e.all().toRefArray();if(Array.isArray(t))return t.map(t=>{const n=e.withId(t);return n?n.ref:null});const n=e.withId(t);return n?n.ref:null}}},{key:"model",get:function(){return this._model}}]),t}(qe),He=function(e){function t({field:t,fieldModel:n,accessorName:r,isVirtual:o,...s}){var i;return(i=e.call(this,s)||this)._field=t,i._fieldModel=n,i._accessorName=r,i._isVirtual=o,i}de()(t,e);var n=t.prototype;return n.valueForInstance=function(e,t){if(!e)return null;let n;if(this._parent instanceof Xe)n=e[this._accessorName];else{const{[this._parent.toModelName]:r}=t,o=this._parent.valueForInstance(e,t),s=o?new r(o):null;n=s?s[this._accessorName]:null}return n instanceof Ee?n.ref:n instanceof ce?n.toRefArray():n},n.map=function(e){if(e instanceof Xe)throw this.toModelName===e.model.modelName?new Error(`Cannot select models in a \`map()\` call. If you just want the \`${this._accessorName}\` as a ref array then you can simply drop the \`map()\`. Otherwise make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`):new Error(`Cannot select \`${e.model.modelName}\` models in this \`map()\` call. Make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`);if(e instanceof t||e instanceof Qe){if(this.toModelName!==e.model.modelName)throw new Error(`Cannot select fields of the \`${e.model.modelName}\` model in this \`map()\` call. Make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`)}else if(!e||"function"!=typeof e||!e.recomputations)throw new Error(`\`map()\` requires a selector as an input. Received: ${JSON.stringify(e)} of type ${typeof e}`);if(!(this._field instanceof be||this._field instanceof we))throw new Error("Cannot map selectors for non-collection fields");return new Qe({parent:this,model:this._model,orm:this._orm,field:this._field,selector:e})},o()(t,[{key:"key",get:function(){return this._accessorName}},{key:"dependencies",get:function(){return[this._orm,Le]}},{key:"toModelName",get:function(){return"this"===this._field.toModelName?this._fieldModel.modelName:this._field.toModelName}},{key:"toModel",get:function(){return this._orm.getDatabase().describe(this.toModelName)}}]),t}(ze);function Ye({parent:e,model:t,field:n,fieldModel:r,accessorName:o,orm:s,isVirtual:i}){const a=new He({parent:e,model:t,field:n,fieldModel:r,accessorName:o,orm:s,isVirtual:i});if(!(n instanceof ge))return a;if(e instanceof He&&(e._field instanceof be&&e._isVirtual||e._field instanceof we))throw new Error(`Cannot create a selector for \`${e._accessorName}.${o}\` because \`${e._accessorName}\` is a collection field.`);const{toModelName:c}=n,u=s.get("this"===c?t.modelName:c);return Object.entries(u.fields).forEach(([e,n])=>{const r=n.as||e;Object.defineProperty(a,r,{get:()=>Ye({parent:a,model:t,fieldModel:u,field:n,accessorName:r,orm:s,isVirtual:!1})})}),Object.entries(u.virtualFields).forEach(([e,n])=>{const r=n.as||e;a.hasOwnProperty(r)||Object.defineProperty(a,r,{get:()=>Ye({parent:a,model:t,fieldModel:u,field:n,accessorName:r,orm:s,isVirtual:!0})})}),a}const Ke={createDatabase:Ve},Ge=["indexes","meta"],Je=e=>Ge.includes(e);let We=function(){function e(e){const{createDatabase:t}={...Ke,...e||{}};this.createDatabase=t,this.registry=[],this.implicitThroughModels=[],this.installedFields={},this.stateSelector=e?e.stateSelector:null}var t=e.prototype;return t.register=function(...e){e.forEach(e=>{if(void 0===e.modelName)throw new Error("A model was passed that doesn't have a modelName set");e.invalidateClassCache(),this.registerManyToManyModelsFor(e),this.registry.push(e),Object.defineProperty(this,e.modelName,{get:()=>(this._setupModelPrototypes(this.registry),function({model:e,orm:t}){const n=new Xe({parent:null,orm:t,model:e});return Object.entries(e.fields).forEach(([r,o])=>{const s=o.as||r;Object.defineProperty(n,s,{get:()=>Ye({parent:n,model:e,fieldModel:e,field:o,accessorName:s,orm:t,isVirtual:!1})})}),Object.entries(e.virtualFields).forEach(([r,o])=>{const s=o.as||r;n.hasOwnProperty(s)||Object.defineProperty(n,s,{get:()=>Ye({parent:n,model:e,fieldModel:e,field:o,accessorName:s,orm:t,isVirtual:!0})})}),n}({model:e,orm:this}))})})},t.registerManyToManyModelsFor=function(e){const{fields:t}=e,n=e.modelName;Object.entries(t).forEach(([e,t])=>{if(!(t instanceof we))return;let r;r="this"===t.toModelName?n:t.toModelName;const s=n===r,i=J(n),a=W(r);if(t.through){if(s&&!t.throughFields)throw new Error("Self-referencing many-to-many relationship at "+`"${n}.${e}" using custom `+`model "${t.through}" has no `+"throughFields key. Cannot determine which fields reference the instances partaking in the relationship.")}else{const t=function(e){function t(){return e.apply(this,arguments)||this}return de()(t,e),t}(Ee);t.modelName=G(n,e);const c=function(e){function t(){return e.apply(this,arguments)||this}return de()(t,e),o()(t,[{key:"installsBackwardsVirtualField",get:function(){return!1}},{key:"installsBackwardsDescriptor",get:function(){return!1}}]),t}(be),u=s?c:be;t.fields={id:_e(),[i]:new u(n),[a]:new u(r)},t.invalidateClassCache(),this.implicitThroughModels.push(t)}})},t.get=function(e){const t=this.registry.concat(this.implicitThroughModels),n=Object.values(t).find(t=>t.modelName===e);if(void 0===n)throw new Error(`Did not find model ${e} from registry.`);return n},t.getModelClasses=function(){return this._setupModelPrototypes(this.registry),this._setupModelPrototypes(this.implicitThroughModels),this.registry.concat(this.implicitThroughModels)},t.generateSchemaSpec=function(){return{tables:this.getModelClasses().reduce((e,t)=>{const n=t.modelName,r=t.tableOptions();return Object.keys(r).filter(Je).forEach(e=>{throw new Error(`Reserved keyword \`${e}\` used in ${n}.options.`)}),e[n]={fields:{...t.fields},...r},e},{})}},t.getDatabase=function(){return this.db||(this.db=this.createDatabase(this.generateSchemaSpec())),this.db},t.getEmptyState=function(){return this.getDatabase().getEmptyState()},t.session=function(e){return new ue(this,this.getDatabase(),e)},t.mutableSession=function(e){return new ue(this,this.getDatabase(),e,!0)},t._setupModelPrototypes=function(e){e.filter(e=>!e.isSetUp).forEach(e=>{const{fields:t,modelName:n,querySetClass:r}=e;Object.entries(t).forEach(([t,r])=>{if(!(r instanceof fe))throw new Error(`${n}.${t} is of type "${typeof r}" `+"but must be an instance of Field. Please use the `attr`, `fk`, `oneToOne` and `many` functions to define fields.");this._isFieldInstalled(n,t)||(this._installField(r,t,e),this._setFieldInstalled(n,t))}),te(e,r),e.isSetUp=!0})},t._isFieldInstalled=function(e,t){return!!this.installedFields.hasOwnProperty(e)&&!!this.installedFields[e][t]},t._setFieldInstalled=function(e,t){this.installedFields.hasOwnProperty(e)||(this.installedFields[e]={}),this.installedFields[e][t]=!0},t._installField=function(e,t,n){new(0,e.installerClass)({field:e,fieldName:t,model:n,orm:this}).run()},t.withMutations=function(e){return K("`ORM.prototype.withMutations` has been deprecated. Use `ORM.prototype.mutableSession` instead."),this.mutableSession(e)},t.from=function(e){return K("`ORM.prototype.from` has been deprecated. Use `ORM.prototype.session` instead."),this.session(e)},t.getDefaultState=function(){return K("`ORM.prototype.getDefaultState` has been deprecated. Use `ORM.prototype.getEmptyState` instead."),this.getEmptyState()},t.define=function(){throw new Error("`ORM.prototype.define` has been removed. Please define a Model class.")},e}();var Ze=n(4),et=n(5),tt=n.n(et);const nt=(e,t)=>e===t,rt=e=>e&&"object"==typeof e&&e.hasOwnProperty("@@_______REDUX_ORM_STATE_FLAG"),ot=(e,t,n)=>t.every((t,r)=>rt(t)&&rt(e[r])||n(t,e[r])),st=(e,t,n)=>{const{accessedInstances:r}=e;return Object.entries(r).every(([r,o])=>{if(e.ormState[r]===t[r])return!0;const{mapName:s}=n.getDatabase().describe(r),{[s]:i}=e.ormState[r],{[s]:a}=t[r];return((e,t,n)=>e.every(e=>t[e]===n[e]))(Object.keys(o),i,a)})},it=(e,t)=>{const{accessedIndexes:n}=e;return Object.entries(n).every(([n,r])=>Object.entries(r).every(([r,o])=>o.every(o=>e.ormState[n].indexes[r][o]===t[n].indexes[r][o])))},at=(e,t)=>e.fullTableScannedModels.every(n=>e.ormState[n]===t[n]);function ct(e,t=nt,n){let r={result:null,args:null,ormState:null,fullTableScannedModels:[],accessedInstances:{},accessedIndexes:{}};return(...o)=>{const[s,...i]=o;if(Boolean(r.args)&&ot(r.args,i,t)&&at(r,s)&&it(r,s)&&st(r,s,n))return r.result;const a=n.session(s),c=i.map(e=>rt(e)?a:e),u=e.apply(null,c);return r={args:i,result:u,ormState:s,accessedInstances:a.accessedModelInstances,accessedIndexes:a.accessedIndexes,fullTableScannedModels:a.fullTableScannedModels},u}}function ut(e,t){e.sessionBoundModels.forEach(n=>{"function"==typeof n.reducer&&n.reducer(t,n,e)})}function lt(e,t=ut){return(n,r)=>{const o=e.session(n||e.getEmptyState());return t(o,r),o.state}}function dt(e){return e instanceof We?e:e instanceof qe&&e._orm}const ht=new Map,ft=Symbol.for("REDUX_ORM_SELECTOR");function pt(e){if("function"==typeof e)return e;if(e instanceof We)return e.stateSelector;if(e instanceof Qe&&(e.selector=pt(e.selector)),e instanceof qe){const{orm:t,cachePath:n}=e;let r;ht.has(t)||ht.set(t,new Map),r=ht.get(t);for(let e=0;e<n.length;++e){const t=n[e];r.has(t)||r.set(t,new Map),r=r.get(t)}if(r&&r.has(ft))return r.get(ft);const o=function e(t){if(t instanceof Qe){const n=e(t.parent);return t.createResultFunc(n)}return tt()(t.dependencies,t.resultFunc)({keySelector:t.keySelector,cacheObject:new et.FlatMapCache,selectorCreator:mt})}(e);return r.set(ft,o),o}throw new Error(`Failed to interpret selector argument: ${JSON.stringify(e)} of type ${typeof e}`)}function mt(...e){if(!e.length)throw new Error("Cannot create a selector without arguments.");const t=e.pop(),n=Array.isArray(e[0])?e[0]:e,r=n.map(dt).find(Boolean),o=n.map(pt);if("function"==typeof t){if(!r)throw new Error("Failed to resolve the current ORM database state. Please pass an ORM instance or an ORM selector as an argument to `createSelector()`.");if(!r.stateSelector)throw new Error("Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function.");if("function"!=typeof r.stateSelector)throw new Error(`Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's \`stateSelector\`. Received: ${JSON.stringify(r.stateSelector)} of type ${typeof r.stateSelector}`);return Object(Ze.createSelectorCreator)(ct,void 0,r)([r.stateSelector,...o],t)}if(t instanceof We)throw new Error("ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelector()`.");return o.length&&console.warn("Your input selectors will be ignored: the passed result function does not require any input."),pt(t)}n.d(t,"Schema",(function(){return yt})),n.d(t,"Backend",(function(){return gt})),n.d(t,"Attribute",(function(){return ye})),n.d(t,"QuerySet",(function(){return ce})),n.d(t,"Model",(function(){return Ee})),n.d(t,"ORM",(function(){return We})),n.d(t,"Session",(function(){return ue})),n.d(t,"ForeignKey",(function(){return be})),n.d(t,"ManyToMany",(function(){return we})),n.d(t,"OneToOne",(function(){return ve})),n.d(t,"fk",(function(){return Me})),n.d(t,"many",(function(){return Oe})),n.d(t,"attr",(function(){return _e})),n.d(t,"oneToOne",(function(){return Ne})),n.d(t,"createReducer",(function(){return lt})),n.d(t,"createSelector",(function(){return mt}));const yt=function(){throw new Error("Schema has been renamed to ORM. Please import ORM instead of Schema from Redux-ORM.")},gt=function(){throw new Error("Having a custom Backend instance is now unsupported. Documentation for database customization is upcoming, for now please look at the db folder in the source.")};t.default=Ee}])}));
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("ReduxOrm",[],t):"object"==typeof exports?exports.ReduxOrm=t():e.ReduxOrm=t()}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=41)}([function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}e.exports=function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(5);e.exports=function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){function n(t){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?(e.exports=n=function(e){return typeof e},e.exports.default=e.exports,e.exports.__esModule=!0):(e.exports=n=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.default=e.exports,e.exports.__esModule=!0),n(t)}e.exports=n,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){"use strict";function r(e,t){return e===t}function o(e,t,n){if(null===t||null===n||t.length!==n.length)return!1;for(var r=t.length,o=0;o<r;o++)if(!e(t[o],n[o]))return!1;return!0}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r,n=null,s=null;return function(){return o(t,n,arguments)||(s=e.apply(null,arguments)),n=arguments,s}}function i(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return"function"==typeof e}))){var n=t.map((function(e){return typeof e})).join(", ");throw new Error("Selector creators expect all input-selectors to be functions, instead received the following types: ["+n+"]")}return t}function a(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return function(){for(var t=arguments.length,r=Array(t),o=0;o<t;o++)r[o]=arguments[o];var a=0,c=r.pop(),u=i(r),l=e.apply(void 0,[function(){return a++,c.apply(null,arguments)}].concat(n)),d=s((function(){for(var e=[],t=u.length,n=0;n<t;n++)e.push(u[n].apply(null,arguments));return l.apply(null,e)}));return d.resultFunc=c,d.recomputations=function(){return a},d.resetRecomputations=function(){return a=0},d}}t.__esModule=!0,t.defaultMemoize=s,t.createSelectorCreator=a,t.createStructuredSelector=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:c;if("object"!=typeof e)throw new Error("createStructuredSelector expects first argument to be an object where each property is a selector, instead received a "+typeof e);var n=Object.keys(e);return t(n.map((function(t){return e[t]})),(function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.reduce((function(e,t,r){return e[n[r]]=t,e}),{})}))};var c=t.createSelector=a(s)},function(e,t,n){var r=n(16),o=n(17),s=n(18),i=n(19);e.exports=function(e){return r(e)||o(e)||s(e)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){function n(t,r){return e.exports=n=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},e.exports.default=e.exports,e.exports.__esModule=!0,n(t,r)}e.exports=n,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){var n=Array.isArray;e.exports=n},function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(20),o=n(21),s=n(9),i=n(22),a=n(23),c=n(24),u=n(25),l=n(10),d=n(6);e.exports=function(e,t,n){t=t.length?r(t,(function(e){return d(e)?function(t){return o(t,1===e.length?e[0]:e)}:e})):[l];var f=-1;t=r(t,c(s));var h=i(e,(function(e,n,o){return{criteria:r(t,(function(t){return t(e)})),index:++f,value:e}}));return a(h,(function(e,t){return u(e,t,n)}))}},function(e,t){e.exports=function(e){return e}},function(e,t){e.exports=function(e){return e}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t,n){var r=n(8),o=n(6);e.exports=function(e,t,n,s){return null==e?[]:(o(t)||(t=null==t?[]:[t]),o(n=s?void 0:n)||(n=null==n?[]:[n]),r(e,t,n))}},function(e,t,n){var r=n(28),o=n(29),s=n(9),i=n(6),a=n(30);e.exports=function(e,t){return(i(e)?r:o)(e,a(s(t,3)))}},function(e,t,n){var r=n(31),o=n(8),s=n(32),i=n(36),a=s((function(e,t){if(null==e)return[];var n=t.length;return n>1&&i(e,t[0],t[1])?t=[]:n>2&&i(t[0],t[1],t[2])&&(t=[t[0]]),o(e,r(t,1),[])}));e.exports=a},function(e,t,n){var r=n(37),o=n(5),s=n(38),i=n(39);function a(t){var n="function"==typeof Map?new Map:void 0;return e.exports=a=function(e){if(null===e||!s(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==n){if(n.has(e))return n.get(e);n.set(e,t)}function t(){return i(e,arguments,r(this).constructor)}return t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),o(t,e)},e.exports.default=e.exports,e.exports.__esModule=!0,a(t)}e.exports=a,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(7);e.exports=function(e){if(Array.isArray(e))return r(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(7);e.exports=function(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}},function(e,t){e.exports=function(e,t){var n=e.length;for(e.sort(t);n--;)e[n]=e[n].value;return e}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,n){var r=n(26);e.exports=function(e,t,n){for(var o=-1,s=e.criteria,i=t.criteria,a=s.length,c=n.length;++o<a;){var u=r(s[o],i[o]);if(u)return o>=c?u:u*("desc"==n[o]?-1:1)}return e.index-t.index}},function(e,t,n){var r=n(27);e.exports=function(e,t){if(e!==t){var n=void 0!==e,o=null===e,s=e==e,i=r(e),a=void 0!==t,c=null===t,u=t==t,l=r(t);if(!c&&!l&&!i&&e>t||i&&a&&u&&!c&&!l||o&&a&&u||!n&&u||!s)return 1;if(!o&&!i&&!l&&e<t||l&&n&&s&&!o&&!i||c&&n&&s||!a&&s||!u)return-1}return 0}},function(e,t){e.exports=function(){return!1}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw new TypeError("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}},function(e,t){e.exports=function(e){return e&&e.length?e[0]:void 0}},function(e,t,n){var r=n(10),o=n(33),s=n(35);e.exports=function(e,t){return s(o(e,t,r),e+"")}},function(e,t,n){var r=n(34),o=Math.max;e.exports=function(e,t,n){return t=o(void 0===t?e.length-1:t,0),function(){for(var s=arguments,i=-1,a=o(s.length-t,0),c=Array(a);++i<a;)c[i]=s[t+i];i=-1;for(var u=Array(t+1);++i<t;)u[i]=s[i];return u[t]=n(c),r(e,this,u)}}},function(e,t){e.exports=function(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}},function(e,t){e.exports=function(e){return e}},function(e,t){e.exports=function(){return!1}},function(e,t){function n(t){return e.exports=n=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.default=e.exports,e.exports.__esModule=!0,n(t)}e.exports=n,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e){return-1!==Function.toString.call(e).indexOf("[native code]")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(5),o=n(40);function s(t,n,i){return o()?(e.exports=s=Reflect.construct,e.exports.default=e.exports,e.exports.__esModule=!0):(e.exports=s=function(e,t,n){var o=[null];o.push.apply(o,t);var s=new(Function.bind.apply(e,o));return n&&r(s,n.prototype),s},e.exports.default=e.exports,e.exports.__esModule=!0),s.apply(null,arguments)}e.exports=s,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){"use strict";n.r(t),n.d(t,"Attribute",(function(){return he})),n.d(t,"QuerySet",(function(){return se})),n.d(t,"Model",(function(){return Oe})),n.d(t,"ORM",(function(){return Ge})),n.d(t,"Schema",(function(){return bt})),n.d(t,"Backend",(function(){return wt})),n.d(t,"Session",(function(){return ie})),n.d(t,"ForeignKey",(function(){return me})),n.d(t,"ManyToMany",(function(){return ye})),n.d(t,"OneToOne",(function(){return ge})),n.d(t,"fk",(function(){return we})),n.d(t,"many",(function(){return _e})),n.d(t,"attr",(function(){return be})),n.d(t,"oneToOne",(function(){return ve})),n.d(t,"createReducer",(function(){return ut})),n.d(t,"createSelector",(function(){return yt})),n.d(t,"createSelectorFor",(function(){return gt}));var r=n(0),o=n.n(r),s=n(4),i=n.n(s),a=n(2),c=n.n(a);function u(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function l(e){return function t(n){return 0===arguments.length||u(n)?t:e.apply(this,arguments)}}function d(e,t){switch(e){case 0:return function(){return t.apply(this,arguments)};case 1:return function(e){return t.apply(this,arguments)};case 2:return function(e,n){return t.apply(this,arguments)};case 3:return function(e,n,r){return t.apply(this,arguments)};case 4:return function(e,n,r,o){return t.apply(this,arguments)};case 5:return function(e,n,r,o,s){return t.apply(this,arguments)};case 6:return function(e,n,r,o,s,i){return t.apply(this,arguments)};case 7:return function(e,n,r,o,s,i,a){return t.apply(this,arguments)};case 8:return function(e,n,r,o,s,i,a,c){return t.apply(this,arguments)};case 9:return function(e,n,r,o,s,i,a,c,u){return t.apply(this,arguments)};case 10:return function(e,n,r,o,s,i,a,c,u,l){return t.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}function f(e){return function t(n,r){switch(arguments.length){case 0:return t;case 1:return u(n)?t:l((function(t){return e(n,t)}));default:return u(n)&&u(r)?t:u(n)?l((function(t){return e(t,r)})):u(r)?l((function(t){return e(n,t)})):e(n,r)}}}var h=f((function(e,t){return 1===e?l(t):d(e,function e(t,n,r){return function(){for(var o=[],s=0,i=t,a=0;a<n.length||s<arguments.length;){var c;a<n.length&&(!u(n[a])||s>=arguments.length)?c=n[a]:(c=arguments[s],s+=1),o[a]=c,u(c)||(i-=1),a+=1}return i<=0?r.apply(this,o):d(i,e(t,o,r))}}(e,[],t))})),p=l((function(e){return h(e.length,e)})),m={"@@functional/placeholder":!0};function y(e,t){for(var n in e)e.hasOwnProperty(n)&&t(e[n],n)}function g(e,t){return!!t&&e["@@_______immutableOpsOwnerID"]===t}var b="function"==typeof Symbol?function(){return Symbol("ownerID")}:function(){return{}};function w(e,t){return t&&function(e,t){Object.defineProperty(e,"@@_______immutableOpsOwnerID",{value:t,configurable:!0,enumerable:!1})}(e,t),e}function _(e){return e instanceof Array?e:[e]}function v(e){return"string"==typeof e?-1===e.indexOf(".")?[e]:e.split("."):e}function M(e,t,n){return n[e]=t,n}function x(e,t,n){var r=_(t);return e?r.forEach((function(t){y(t,(function(t,r){var o;e&&n.hasOwnProperty(r)?(o="object"===c()(t)?x(e,[t],n[r]):t,n[r]=o):n[r]=t}))})):Object.assign.apply(Object,[n].concat(i()(r))),n}var O=x.bind(null,!1),N=x.bind(null,!0);function S(e,t){return _(e).forEach((function(e){delete t[e]})),t}function E(e,t,n){return e[n]!==t[n]}function F(e,t,n,r){if(g(r,t))return x(e,n,r);var o=_(n),s=!1,i=r,a=function(){s||(s=!0,w(i=Object.assign({},r),t))};return o.forEach((function(n){y(n,(function(o,s){if(e&&r.hasOwnProperty(s)){var u=i[s];if("object"===c()(o)&&!(o instanceof Array)){if(E(i,n,s)){var l=F(e,t,o,u);l!==u&&(a(),i[s]=l)}return!0}}E(i,n,s)&&(a(),i[s]=o)}))})),i}var k=F.bind(null,!0);function j(e,t,n,r){if(g(r,e))return M(t,n,r);if(r[t]===n)return r;var o=function(e){for(var t=new Array(e.length),n=0;n<e.length;n++)t[n]=e[n];return t}(r);return o[t]=n,w(o,e),o}function R(e,t){for(var n=0,r=0;n<t.length;){e(t[n],r)?n++:t.splice(n,1),r++}return t}function A(e,t,n,r){var o=_(n);return r.splice.apply(r,[e,t].concat(i()(o))),r}function I(e,t,n){return A(e,0,t,n)}function T(e,t,n,r,o){if(g(o,e))return A(t,n,r,o);var s=_(r),a=o.slice();return w(a,e),a.splice.apply(a,[t,n].concat(i()(s))),a}function D(e,t,n,r){return g(r,e)?I(t,n,r):T(e,t,0,n,r)}var C={merge:F.bind(null,!1),deepMerge:k,omit:function(e,t,n){if(g(n,e))return S(t,n);var r=_(t).filter((function(e){return n.hasOwnProperty(e)}));if(0===r.length)return n;var o=Object.assign({},n);return r.forEach((function(e){delete o[e]})),w(o,e),o},setIn:function(e,t,n,r){var o=v(t),s=function(e,t){for(var n=v(e),r=t,o=0;o<n.length;o++){var s=r[n[o]];if(o===n.length-1)return s;if("object"!==c()(s))return;r=s}}(o,r);if(n===s)return r;var i,a=o.length,u=i=g(r,e)?r:Object.assign(w({},e),r);return o.forEach((function(t,r){if(r!==a-1){var s=i[t],u=c()(s);if("object"!==u){if("undefined"===u){var l=w({},e);return i[t]=l,void(i=l)}var d="".concat(o[r-1],".").concat(t);throw new Error("A non-object value was encountered when traversing setIn path at ".concat(d,"."))}if(g(s,e))i=s;else{var f=w({},e);i[t]=Object.assign(f,s),i=f}}else i[t]=n})),u},insert:D,push:function(e,t,n){return D(e,n.length,t,n)},filter:function(e,t,n){if(g(n,e))return R(t,n);var r=n.filter(t);return r.length===n.length?n:(w(r,e),r)},splice:T,set:function(e,t,n,r){if(function(e){return e&&"object"===c()(e)&&"number"==typeof e.length&&e.length>=0&&e.length%1==0}(r))return j(e,t,n,r);if(g(r,e))return M(t,n,r);if(r[t]===n)return r;var o=Object.assign({},r);return w(o,e),o[t]=n,o}},P={merge:O,deepMerge:N,omit:S,setIn:function(e,t,n){for(var r=v(e),o=r.length,s=!1,i=0,a=n,u=r[i];!s;)if(i===o-1)a[u]=t,s=!0;else{var l=c()(a[u]);if("undefined"===l){var d={};w(d,null),a[u]=d}else if("object"!==l){var f="".concat(r[i-1],".").concat(u);throw new Error("A non-object value was encountered when traversing setIn path at ".concat(f,"."))}a=a[u],u=r[++i]}return n},insert:I,push:function(e,t){var n=_(e);return t.push.apply(t,i()(n)),t},filter:R,splice:A,set:M};var $=function(){var e=Object.assign({},C);y(e,(function(t,n){e[n]=p(t.bind(null,null))}));var t=Object.assign({},P);y(t,(function(e,n){t[n]=p(e)}));var n=Object.assign({},C);return y(n,(function(e,t){n[t]=p(e)})),Object.assign(e,{mutable:t,batch:n,batched:function(e,t){var n,r;"function"==typeof e?(r=e,n=b()):(n=e,r=t);var o=Object.assign({},C);return y(o,(function(e,t){o[t]=p(e.bind(null,n))})),r(o)},__:m,getBatchToken:b})}();const B="REDUX_ORM_UPDATE",U="REDUX_ORM_DELETE",q="REDUX_ORM_FILTER",V="REDUX_ORM_EXCLUDE",X=Symbol("REDUX_ORM_ALL_INSTANCES"),L=(e,t)=>void 0===t?X:t,Q=Object.freeze([]);function Y(e){return("function"==typeof console.warn?console.warn.bind(console):console.log.bind(console))(e)}function K(e,t){return e+((n=t).charAt(0).toUpperCase()+n.slice(1));var n}function z(e){return`from${e}Id`}function G(e){return`to${e}Id`}function J(e){return function(...t){return this.getQuerySet()[e](...t)}}function H(e){return function(){return this.getQuerySet()[e]}}function Z(e,t){const n=t.sharedMethods.slice();!function(e,t){let n=e;for(;n!==Function.prototype;)t(n),n=Object.getPrototypeOf(n)}(t,t=>{for(let r=0;r<n.length;r++){let o=!1;const s=n[r],i=Object.getOwnPropertyDescriptor(t.prototype,s);void 0!==i&&(void 0!==i.get?(i.get=H(s),Object.defineProperty(e,s,i)):e[s]=J(s),o=!0),o&&n.splice(r--,1)}})}function W(e){return null!=e&&"function"==typeof e.getId?e.getId():e}const{getBatchToken:ee}=$;function te({type:e,payload:t},n){if(e!==q)return!1;if("object"!=typeof t)return!1;if(!t.hasOwnProperty(n))return!1;const r=t[n];return null!==r&&void 0!==r}function ne(e,t){return Object.entries(e).reduce((e,[n,r])=>(e[n]=t(r),e),{})}function re(e){return e&&"string"!=typeof e?e.modelName:e}const oe=function(){function e(e,t,n){Object.assign(this,{modelClass:e,clauses:t||[]}),this._opts=n}e.addSharedMethod=function(e){this.sharedMethods=this.sharedMethods.concat(e)};var t=e.prototype;return t._new=function(e,t){const n={...this._opts,...t};return new this.constructor(this.modelClass,e,n)},t.toString=function(){this._evaluate();return"QuerySet contents:\n - "+this.rows.map(({id:e})=>this.modelClass.withId(e).toString()).join("\n - ")},t.toRefArray=function(){const e=this._evaluate();return 0===e.length?Q:e},t.toModelArray=function(){const{modelClass:e}=this,t=this._evaluate();return 0===t.length?Q:t.map(t=>new e(t))},t.count=function(){return this._evaluate(),this.rows.length},t.exists=function(){return Boolean(this.count())},t.at=function(e){const{modelClass:t}=this,n=this._evaluate();if(e>=0&&e<n.length)return new t(n[e])},t.first=function(){return this.at(0)},t.last=function(){const e=this._evaluate();return this.at(e.length-1)},t.all=function(){return this._new(this.clauses)},t.filter=function(e){const t="object"==typeof e?ne(e,W):e,n={type:q,payload:t};return this._new(this.clauses.concat(n))},t.exclude=function(e){const t="object"==typeof e?ne(e,W):e,n={type:V,payload:t};return this._new(this.clauses.concat(n))},t._evaluate=function(){if(void 0===this.modelClass.session)throw new Error([`Tried to query the ${this.modelClass.modelName} model's table without a session. `,"Create a session using `session = orm.session()` and use ",`\`session["${this.modelClass.modelName}"]\` for querying instead.`].join(""));if(!this._evaluated){const{session:e,modelName:t}=this.modelClass,n={table:t,clauses:this.clauses};this.rows=e.query(n).rows,this._evaluated=!0}return this.rows},t.orderBy=function(e,t){const n={type:"REDUX_ORM_ORDER_BY",payload:[e,t]};return this._new(this.clauses.concat(n))},t.update=function(e){const{session:t,modelName:n}=this.modelClass;t.applyUpdate({action:B,query:{table:n,clauses:this.clauses},payload:e}),this._evaluated=!1},t.delete=function(){const{session:e,modelName:t}=this.modelClass;this.toModelArray().forEach(e=>e._onDelete()),e.applyUpdate({action:U,query:{table:t,clauses:this.clauses}}),this._evaluated=!1},t.map=function(){throw new Error("`QuerySet.prototype.map` has been removed. Call `.toModelArray()` or `.toRefArray()` first to map.")},t.forEach=function(){throw new Error("`QuerySet.prototype.forEach` has been removed. Call `.toModelArray()` or `.toRefArray()` first to iterate.")},o()(e,[{key:"withModels",get:function(){throw new Error("`QuerySet.prototype.withModels` has been removed. Use `.toModelArray()` or predicate functions that instantiate Models from refs, e.g. `new Model(ref)`.")}},{key:"withRefs",get:function(){Y("`QuerySet.prototype.withRefs` has been deprecated. Query building operates on refs only now.")}}]),e}();oe.sharedMethods=["count","at","all","last","first","filter","exclude","orderBy","update","delete"];var se=oe;var ie=function(){function e(e,t,n,r,o){this.schema=e,this.db=t,this.state=n||t.getEmptyState(),this.initialState=this.state,this.withMutations=Boolean(r),this.batchToken=o||b(),this.modelData={},this.models=e.getModelClasses(),this.sessionBoundModels=this.models.map(e=>{function t(){return Reflect.construct(e,arguments,t)}return Reflect.setPrototypeOf(t.prototype,e.prototype),Reflect.setPrototypeOf(t,e),Object.defineProperty(this,e.modelName,{get:()=>t}),t.connect(this),t})}var t=e.prototype;return t.getDataForModel=function(e){return this.modelData[e]||(this.modelData[e]={}),this.modelData[e]},t.getModelData=function(){return this.modelData},t.markAccessed=function(e,t){const n=this.getDataForModel(e);n.accessedInstances||(n.accessedInstances={}),t.forEach(e=>{n.accessedInstances[e]=!0})},t.markFullTableScanned=function(e){this.getDataForModel(e).fullTableScanned=!0},t.markAccessedIndexes=function(e){e.forEach(([e,t,n])=>{const r=this.getDataForModel(e);r.accessedIndexes||(r.accessedIndexes={}),r.accessedIndexes[t]=[...r.accessedIndexes[t]||[],n]})},t.applyUpdate=function(e){const t=this._getTransaction(e),n=this.db.update(e,t,this.state),{status:r,state:o,payload:s}=n;if("SUCCESS"!==r)throw new Error(`Applying update failed with status ${r}. Payload: ${s}`);return this.state=o,s},t.query=function(e){const t=this.db.query(e,this.state);return this._markAccessedByQuery(e,t),t},t._getTransaction=function(e){const{withMutations:t}=this,{action:n}=e;let{batchToken:r}=this;return[B,U].includes(n)&&(r=b()),{batchToken:r,withMutations:t}},t._markAccessedByQuery=function(e,t){const{table:n,clauses:r}=e,{rows:o}=t,{idAttribute:s}=this[n],i=new Set(o.map(e=>e[s])),a=r.some(e=>!!te(e,s)&&(i.add(e.payload[s]),!0)),c=[],{indexes:u}=this.state[n];r.forEach(e=>{Object.keys(u).forEach(t=>{if(!te(e,t))return;const r=e.payload[t];c.push([n,t,r])})}),a?this.markAccessed(n,i):c.length?(this.markAccessed(n,i),this.markAccessedIndexes(c)):this.markFullTableScanned(n)},t.getNextState=function(){return Y("`Session.prototype.getNextState` has been deprecated. Access the `Session.prototype.state` property instead."),this.state},t.reduce=function(){throw new Error("`Session.prototype.reduce` has been removed. The Redux integration API is now decoupled from ORM and Session - see the 0.9 migration guide in the GitHub repo.")},o()(e,[{key:"accessedModelInstances",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.accessedInstances&&(e[t]=n.accessedInstances),e),{})}},{key:"fullTableScannedModels",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.fullTableScanned&&e.push(t),e),[])}},{key:"accessedIndexes",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.accessedIndexes&&(e[t]=n.accessedIndexes),e),{})}}]),e}(),ae=n(1),ce=n.n(ae);var ue=function(e){function t(){return e.apply(this,arguments)||this}ce()(t,e);var n=t.prototype;return n.installForwardsDescriptor=function(){Object.defineProperty(this.model.prototype,this.fieldName,this.field.createForwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},n.installForwardsVirtualField=function(){this.model.virtualFields[this.fieldName]=this.field.createForwardsVirtualField(this.fieldName,this.model,this.toModel,this.throughModel)},n.installBackwardsDescriptor=function(){if(Object.getOwnPropertyDescriptor(this.toModel.prototype,this.backwardsFieldName))throw new Error((e=this.model.modelName,t=this.fieldName,n=this.toModel.modelName,[`Reverse field ${this.backwardsFieldName} already defined`,` on model ${n}. To fix, set a custom related`,` name on ${e}.${t}.`].join("")));var e,t,n;Object.defineProperty(this.toModel.prototype,this.backwardsFieldName,this.field.createBackwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},n.installBackwardsVirtualField=function(){this.toModel.virtualFields[this.backwardsFieldName]=this.field.createBackwardsVirtualField(this.fieldName,this.model,this.toModel,this.throughModel)},t}(function(){function e(e){this.field=e.field,this.fieldName=e.fieldName,this.model=e.model,this.orm=e.orm,this.field.references(this.model)&&(this.field.toModelName="this")}return e.prototype.run=function(){this.installForwardsDescriptor(),this.field.installsForwardsVirtualField&&this.installForwardsVirtualField(),this.field.installsBackwardsDescriptor&&this.installBackwardsDescriptor(),this.field.installsBackwardsVirtualField&&this.installBackwardsVirtualField()},o()(e,[{key:"toModel",get:function(){if(void 0===this._toModel){const{toModelName:e}=this.field;this._toModel=e?"this"===e?this.model:this.orm.get(e):null}return this._toModel}},{key:"throughModel",get:function(){if(void 0===this._throughModel){const e=this.field.getThroughModelName(this.fieldName,this.model);this._throughModel=e?this.orm.get(e):null}return this._throughModel}},{key:"backwardsFieldName",get:function(){return this.field.getBackwardsFieldName(this.model)}}]),e}());var le=function(){function e(){}var t=e.prototype;return t.getClass=function(){return this.constructor},t.references=function(e){return!1},t.getThroughModelName=function(e,t){return null},o()(e,[{key:"installerClass",get:function(){return ue}},{key:"installsForwardsVirtualField",get:function(){return!1}},{key:"installsBackwardsDescriptor",get:function(){return!1}},{key:"installsBackwardsVirtualField",get:function(){return!1}},{key:"index",get:function(){return!1}}]),e}();function de(e,t){return{get(){const{session:{[t]:n}}=this.getClass(),{[e]:r}=this._fields;return n.withId(r)},set(t){this.update({[e]:W(t)})}}}function fe(e,t,n,r,o){return{get(){const{session:{[e]:s,[t]:i,[n]:a}}=this.getClass(),c=o?i:s,u=o?s:i,l=o?r.to:r.from,d=o?r.from:r.to,f=this.getId(),h=a.filter({[l]:f}),p=new Set(h.toRefArray().map(e=>e[d])),m=u.filter(e=>p.has(e[u.idAttribute]));return m.add=function(...e){const t=new Set(e.map(W)),n=h.filter(e=>t.has(e[d]));if(n.exists()){const e=n.toRefArray().map(e=>e[d]);throw new Error(`Tried to add already existing ${u.modelName} id(s) ${e} to the ${c.modelName} instance with id ${f}`)}t.forEach(e=>{a.create({[d]:e,[l]:f})})},m.clear=function(){h.delete()},m.remove=function(...e){const t=new Set(e.map(W)),n=h.filter(e=>t.has(e[d]));if(n.count()!==t.size){const e=n.toRefArray().map(e=>e[d]),r=[...t].filter(t=>!e.includes(t));throw new Error(`Tried to delete non-existing ${u.modelName} id(s) ${r} from the ${c.modelName} instance with id ${f}`)}n.delete()},m},set(){throw new Error("Tried setting a M2M field. Please use the related QuerySet methods add, remove and clear.")}}}var he=function(e){function t(t){var n;return(n=e.call(this)||this).opts=t||{},n.opts.hasOwnProperty("getDefault")&&(n.getDefault=n.opts.getDefault),n}return ce()(t,e),t.prototype.createForwardsDescriptor=function(e,t){return function(e){return{get(){return this._fields[e]},set(t){return this.set(e,t)},enumerable:!0,configurable:!0}}(e)},t}(le);var pe=function(e){function t(...t){var n;if(n=e.call(this)||this,1===t.length&&"object"==typeof t[0]){const e=t[0];n.toModelName=re(e.to),n.relatedName=e.relatedName,n.through=re(e.through),n.throughFields=e.throughFields,n.as=e.as}else[n.toModelName,n.relatedName]=[re(t[0]),t[1]];return n}ce()(t,e);var n=t.prototype;return n.getBackwardsFieldName=function(e){return this.relatedName||e.modelName.toLowerCase()+"Set"},n.createBackwardsVirtualField=function(e,t,n,r){return new(this.getClass())(t.modelName,e)},n.references=function(e){return this.toModelName===e.modelName},o()(t,[{key:"installsBackwardsVirtualField",get:function(){return!0}},{key:"installsBackwardsDescriptor",get:function(){return!0}},{key:"installerClass",get:function(){return function(e){function t(){return e.apply(this,arguments)||this}return ce()(t,e),t.prototype.installForwardsDescriptor=function(){Object.defineProperty(this.model.prototype,this.field.as||this.fieldName,this.field.createForwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},t}(ue)}}]),t}(le);var me=function(e){function t(){return e.apply(this,arguments)||this}ce()(t,e);var n=t.prototype;return n.createForwardsDescriptor=function(e,t,n,r){return de(e,n.modelName)},n.createBackwardsDescriptor=function(e,t,n,r){return o=e,s=t.modelName,{get(){const{session:{[s]:e}}=this.getClass();return e.filter({[o]:this.getId()})},set(){throw new Error("Can't mutate a reverse many-to-one relation.")}};var o,s},o()(t,[{key:"index",get:function(){return!0}}]),t}(pe);var ye=function(e){function t(){return e.apply(this,arguments)||this}ce()(t,e);var n=t.prototype;return n.getDefault=function(){return[]},n.getThroughModelName=function(e,t){return this.through||K(t.modelName,e)},n.createForwardsDescriptor=function(e,t,n,r){return fe(t.modelName,n.modelName,r.modelName,this.getThroughFields(e,t,n,r),!1)},n.createBackwardsDescriptor=function(e,t,n,r){return fe(t.modelName,n.modelName,r.modelName,this.getThroughFields(e,t,n,r),!0)},n.createBackwardsVirtualField=function(e,t,n,r){return new(this.getClass())({to:t.modelName,relatedName:e,through:r.modelName,throughFields:this.getThroughFields(e,t,n,r)})},n.createForwardsVirtualField=function(e,t,n,r){return new(this.getClass())({to:n.modelName,relatedName:e,through:this.through,throughFields:this.getThroughFields(e,t,n,r),as:this.as})},n.getThroughFields=function(e,t,n,r){if(this.throughFields){const[e,t]=this.throughFields,o=r.fields[e];return{to:o.references(n)?e:t,from:o.references(n)?t:e}}if(t.modelName===n.modelName)return{to:G(n.modelName),from:z(t.modelName)};const o=e=>Object.keys(r.fields).find(t=>r.fields[t].references(e));return{to:o(n),from:o(t)}},o()(t,[{key:"installsForwardsVirtualField",get:function(){return!0}}]),t}(pe);var ge=function(e){function t(){return e.apply(this,arguments)||this}ce()(t,e);var n=t.prototype;return n.getBackwardsFieldName=function(e){return this.relatedName||e.modelName.toLowerCase()},n.createForwardsDescriptor=function(e,t,n,r){return function(...e){return de(...e)}(e,n.modelName)},n.createBackwardsDescriptor=function(e,t,n,r){return o=e,s=t.modelName,{get(){const{session:{[s]:e}}=this.getClass();return e.get({[o]:this.getId()})},set(){throw new Error("Can't mutate a reverse one-to-one relation.")}};var o,s},t}(pe);function be(e){return new he(e)}function we(...e){return new me(...e)}function _e(...e){return new ye(...e)}function ve(...e){return new ge(...e)}function Me(e){const t=e.getClass(),{idAttribute:n,modelName:r}=t;return{table:r,clauses:[{type:q,payload:{[n]:e.getId()}}]}}const xe=function(){function e(e){this._initFields(e)}var t=e.prototype;return t._initFields=function(e){const t=Object(e);this._fields={...t},Object.keys(t).forEach(e=>{e in this||Object.defineProperty(this,e,{get:()=>this._fields[e],set:t=>this.set(e,t),configurable:!0,enumerable:!0})})},e.toString=function(){return"ModelClass: "+this.modelName},e.options=function(){return{}},e.markAccessed=function(e){if(void 0===this._session)throw new Error([`Tried to mark rows of the ${this.modelName} model as accessed without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markAccessed\` instead.`].join(""));this.session.markAccessed(this.modelName,e)},e.markFullTableScanned=function(){if(void 0===this._session)throw new Error([`Tried to mark the ${this.modelName} model as full table scanned without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markFullTableScanned\` instead.`].join(""));this.session.markFullTableScanned(this.modelName)},e.markAccessedIndexes=function(e){if(void 0===this._session)throw new Error([`Tried to mark indexes for the ${this.modelName} model as accessed without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markAccessedIndexes\` instead.`].join(""));this.session.markAccessedIndexes(e.map(([e,t])=>[this.modelName,e,t]))},e.connect=function(e){if(!(e instanceof ie))throw new Error("A model can only be connected to instances of Session.");this._session=e},e.getQuerySet=function(){const{querySetClass:e}=this;return new e(this)},e.invalidateClassCache=function(){this.isSetUp=void 0,this.virtualFields={}},e.tableOptions=function(){return"function"==typeof this.backend?(Y("`Model.backend` has been deprecated. Please rename to `.options`."),this.backend()):this.backend?(Y("`Model.backend` has been deprecated. Please rename to `.options`."),this.backend):"function"==typeof this.options?this.options():this.options},e.create=function(e){if(void 0===this._session)throw new Error([`Tried to create a ${this.modelName} model instance without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].create\` instead.`].join(""));const t={...e},n={},r=Object.keys(this.fields),o=Object.keys(this.virtualFields);r.forEach(r=>{const o=this.fields[r],s=e.hasOwnProperty(r);if(o instanceof ye)s&&(n[r]=e[r],o.as||delete t[r]);else if(s){const n=e[r];t[r]=W(n)}else o.getDefault&&(t[r]=o.getDefault())}),o.forEach(r=>{if(!n.hasOwnProperty(r)){const o=this.virtualFields[r];e.hasOwnProperty(r)&&o instanceof ye&&(n[r]=e[r],delete t[r])}});const s=new this(this.session.applyUpdate({action:"REDUX_ORM_CREATE",table:this.modelName,payload:t}));return s._refreshMany2Many(n),s},e.upsert=function(e){if(void 0===this.session)throw new Error([`Tried to upsert a ${this.modelName} model instance without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].upsert\` instead.`].join(""));const{idAttribute:t}=this;if(e.hasOwnProperty(t)){const n=e[t];if(this.idExists(n)){const t=this.withId(n);return t.update(e),t}}return this.create(e)},e.withId=function(e){return this.get({[this.idAttribute]:e})},e.idExists=function(e){return this.exists({[this.idAttribute]:e})},e.exists=function(e){if(void 0===this.session)throw new Error([`Tried to check if a ${this.modelName} model instance exists without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].exists\` instead.`].join(""));return Boolean(this._findDatabaseRows(e).length)},e.get=function(e){const t=this._findDatabaseRows(e);if(0===t.length)return null;if(t.length>1)throw new Error(`Expected to find a single row in \`${this.modelName}.get\`. Found ${t.length}.`);return new this(t[0])},t.getClass=function(){return this.constructor},t.getId=function(){return this._fields[this.getClass().idAttribute]},e._findDatabaseRows=function(e){const t={table:this.modelName};return e&&(t.clauses=[{type:q,payload:e}]),this.session.query(t).rows},t.toString=function(){const e=this.getClass();return`${e.modelName}: {${Object.keys(e.fields).map(t=>{if(e.fields[t]instanceof ye){return`${t}: [${this[t].toModelArray().map(e=>e.getId()).join(", ")}]`}return`${t}: ${this._fields[t]}`}).join(", ")}}`},t.equals=function(e){return function(e,t){const n=Object.entries(Object(e));return n.length===Object.keys(t).length&&n.every(([e,n])=>t.hasOwnProperty(e)&&t[e]===n)}(this._fields,e._fields)},t.set=function(e,t){this.update({[e]:t})},t.update=function(e){const t=this.getClass();if(void 0===t.session)throw new Error([`Tried to update a ${t.modelName} model instance without a session. `,"You cannot call `.update` on an instance that you did not receive from the database."].join(""));const n={...e},{fields:r,virtualFields:o}=t,s={};for(const e in n){if(r.hasOwnProperty(e)){const t=r[e];t instanceof me||t instanceof ge?n[e]=W(n[e]):t instanceof ye&&(s[e]=n[e],t.as||delete n[e])}else if(o.hasOwnProperty(e)){o[e]instanceof ye&&(s[e]=n[e],delete n[e])}}const i={...this._fields,...n},a=new t(i);this.equals(a)||(this._initFields(i),t.session.applyUpdate({action:B,query:Me(this),payload:n})),this._refreshMany2Many(s)},t.refreshFromState=function(){this._initFields(this.ref)},t.delete=function(){const e=this.getClass();if(void 0===e.session)throw new Error([`Tried to delete a ${e.modelName} model instance without a session. `,"You cannot call `.delete` on an instance that you did not receive from the database."].join(""));this._onDelete(),e.session.applyUpdate({action:U,query:Me(this)})},t._refreshMany2Many=function(e){const t=this.getClass(),{fields:n,virtualFields:r,modelName:o}=t;Object.keys(e).forEach(s=>{const i=!n.hasOwnProperty(s),a=r[s],c=e[s];if(!Array.isArray(c))throw new TypeError(`Failed to resolve many-to-many relationship: ${o}[${s}] must be an array (passed: ${c})`);const u=c.map(W),l=[...new Set(u)];if(u.length!==l.length)throw new Error(`Found duplicate id(s) when passing "${u}" to ${t.modelName}.${s} value`);const d=a.through||K(t.modelName,s),f=t.session[d];let h,p;i?({from:p,to:h}=a.throughFields):({from:h,to:p}=a.throughFields);const m=function(e,t){const n=e.filter(e=>t.includes(e)),r=e.filter(e=>!n.includes(e)),o=t.filter(e=>!n.includes(e));return r.length||o.length?{delete:r,add:o}:null}(f.filter(e=>e[h]===this[t.idAttribute]).toRefArray().map(e=>e[p]),u);if(m){const{delete:e,add:t}=m;e.length>0&&this[a.as||s].remove(...e),t.length>0&&this[a.as||s].add(...t)}})},t._onDelete=function(){const{virtualFields:e}=this.getClass();for(const t in e){const n=e[t];if(n instanceof ye){this[n.as||t].clear()}else if(n instanceof me){const e=this[t];e.exists()&&e.update({[n.relatedName]:null})}else n instanceof ge&&null!==this[t]&&(this[t][n.relatedName]=null)}},e.hasId=function(e){return console.warn("`Model.hasId` has been deprecated. Please use `Model.idExists` instead."),this.idExists(e)},t.getNextState=function(){throw new Error("`Model.prototype.getNextState` has been removed. See the 0.9 migration guide on the GitHub repo.")},o()(e,[{key:"ref",get:function(){const e=this.getClass();return e._findDatabaseRows({[e.idAttribute]:this.getId()})[0]}}],[{key:"idAttribute",get:function(){if(void 0===this._session)throw new Error([`Tried to get the ${this.modelName} model's id attribute without a session. `,"Create a session using `session = orm.session()` and access ",`\`session["${this.modelName}"].idAttribute\` instead.`].join(""));return this.session.db.describe(this.modelName).idAttribute}},{key:"session",get:function(){return this._session}},{key:"query",get:function(){return this.getQuerySet()}}]),e}();xe.fields={id:be()},xe.virtualFields={},xe.querySetClass=se;var Oe=xe,Ne=n(11),Se=n.n(Ne),Ee=n(12),Fe=n.n(Ee),ke=n(13),je=n.n(ke),Re=n(14),Ae=n.n(Re);const Ie={idAttribute:"id",arrName:"items",mapName:"itemsById",fields:{}};var Te=function(){function e(e){Object.assign(this,Ie,e)}var t=e.prototype;return t.accessId=function(e,t){return e[this.mapName][t]},t.accessIds=function(e,t){const n=e[this.mapName];return t.map(e=>n[e])},t.idExists=function(e,t){return e[this.mapName].hasOwnProperty(t)},t.accessIdList=function(e){return e[this.arrName]},t.accessList=function(e){return this.accessIds(e,this.accessIdList(e))},t.getMaxId=function(e){return this.getMeta(e,"maxId")},t.setMaxId=function(e,t,n){return this.setMeta(e,t,"maxId",n)},t.nextId=function(e){return e+1},t.getEmptyState=function(){return{...{[this.arrName]:[],[this.mapName]:{}},indexes:Object.keys(this.fields).filter(e=>e!==this.idAttribute).filter(e=>this.fields[e].index).reduce((e,t)=>({...e,[t]:{}}),{}),meta:{}}},t.setMeta=function(e,t,n,r){const{batchToken:o,withMutations:s}=e;if(s){return $.mutable.setIn(["meta",n],r,t)}return $.batch.setIn(o,["meta",n],r,t)},t.getMeta=function(e,t){return e.meta[t]},t.query=function(e,t){if(0===t.length)return this.accessList(e);const{idAttribute:n}=this,r=Ae()(t,e=>te(e,n)?1:function({type:e}){return[q,V].includes(e)}(e)?2:3),o=(t,r)=>{const{type:s,payload:i}=r;if(!t){if(te(r,n)){const t=i[n],s=Object.keys(i).reduce((e,t)=>(t!==n&&(e[t]=i[t]),e),{}),a=this.idExists(e,t)?[t]:[];return Object.keys(s).length?o(this.accessIds(e,a),{...r,payload:s}):this.accessIds(e,a)}if(s===q&&"object"==typeof i){const t=Object.entries(e.indexes),n=[],s=[];if(t.forEach(([e,t])=>{te(r,e)&&t.hasOwnProperty(i[e])&&(n.push(t[i[e]]),s.push(e))}),n.length){const t=n.pop(),a=n.reduce((e,t)=>{const n=new Set(t);return e.filter(Set.prototype.has,n)},t),c=Object.keys(i).reduce((e,t)=>(s.includes(t)||(e[t]=i[t]),e),{});return Object.keys(c).length?o(this.accessIds(e,a),{...r,payload:c}):this.accessIds(e,a)}}return o(this.accessList(e),r)}switch(s){case q:return Se()(t,i);case V:return je()(t,i);case"REDUX_ORM_ORDER_BY":{const[e,n]=i;return Fe()(t,e,function(e){if(void 0===e)return;const t=e=>["desc",!1].includes(e)?"desc":"asc";return Array.isArray(e)?e.map(t):t(e)}(n))}default:return t}};return r.reduce(o,void 0)},t.insert=function(e,t,n){const{batchToken:r,withMutations:o}=e,s=n.hasOwnProperty(this.idAttribute);let i=t;const[a,c]=function(e,t){let n,r,o=e;return void 0===o&&(o=-1),void 0===t?(n=o+1,r=n):(n=Math.max(o+1,t),r=t),[n,r]}(this.getMaxId(t),n[this.idAttribute]);i=this.setMaxId(e,t,a);const u=s?n:$.batch.set(r,this.idAttribute,c,n),l=Object.keys(i.indexes).filter(e=>n.hasOwnProperty(e)&&null!==n[e]).map(e=>[e,n[e]]);if(o)return $.mutable.push(c,i[this.arrName]),$.mutable.set(c,u,i[this.mapName]),l.forEach(([e,t])=>{const n=i.indexes[e];n.hasOwnProperty(t)?$.mutable.push(c,n[t]):$.mutable.set(t,[c],n)}),{state:i,created:u};const d=$.batch.merge(r,l.reduce((e,[t,n])=>(e[t]=$.batch.merge(r,{[n]:$.batch.push(r,c,e[t][n]||[])},e[t]),e),{...i.indexes}),i.indexes);return{state:$.batch.merge(r,{[this.arrName]:$.batch.push(r,c,i[this.arrName]),[this.mapName]:$.batch.merge(r,{[c]:u},i[this.mapName]),indexes:d},i),created:u}},t.update=function(e,t,n,r){const{batchToken:o,withMutations:s}=e,i=s?$.mutable.set:$.batch.set(o),a=Object.keys(t.indexes).filter(e=>r.hasOwnProperty(e)),c=[],u=[],l=n.reduce((e,t)=>{const n=a.reduce((e,n)=>({...e,[n]:t[n]}),{}),l=(e=>(s?$.mutable.merge:$.batch.merge(o))(r,e))(t),d=a.reduce((e,t)=>({...e,[t]:l[t]}),{}),f=l[this.idAttribute],h=i(f,l,e);return a.forEach(e=>{const{[e]:t}=n,{[e]:r}=d;t!==r&&(null!=t&&u.push([e,t,f]),null!==r&&c.push([e,r,f]))}),h},t[this.mapName]);let d=t.indexes;return s?(u.forEach(([e,t,n])=>{const r=d[e][t],o=r.indexOf(n);$.mutable.splice(o,1,[],r)}),c.forEach(([e,t,n])=>{$.mutable.push(n,d[e][t])})):(c.length&&(d=$.batch.merge(o,c.reduce((e,[t,n,r])=>(e[t]=$.batch.merge(o,{[n]:$.batch.push(o,r,e[t][n]||[])},e[t]),e),{...d}),d)),u.length&&(d=$.batch.merge(o,u.reduce((e,[t,n,r])=>(e[t]=$.batch.merge(o,{[n]:$.batch.filter(o,e=>e!==r,e[t][n])},e[t]),e),{...d}),d))),$.batch.merge(o,{[this.mapName]:l,indexes:d},t)},t.delete=function(e,t,n){const{batchToken:r,withMutations:o}=e,{arrName:s,mapName:i}=this,a=t[s],c=n.map(e=>e[this.idAttribute]);if(o)return c.forEach(e=>{const n=a.indexOf(e);$.mutable.splice(n,1,[],a),$.mutable.omit(e,t[i])}),Object.values(t.indexes).forEach(e=>Object.values(e).forEach(e=>c.forEach(t=>{const n=e.indexOf(t);-1!==n&&$.mutable.splice(n,1,[],e)}))),t;const u=$.batch.merge(r,Object.entries(t.indexes).reduce((e,[t,n])=>(e[t]=$.batch.merge(r,Object.entries(n).reduce((e,[t,n])=>(e[t]=$.batch.filter(r,e=>!c.includes(e),n),e),{...e[t]}),e[t]),e),{...t.indexes}),t.indexes);return $.batch.merge(r,{[s]:$.batch.filter(r,e=>!c.includes(e),t[s]),[i]:$.batch.omit(r,c,t[i]),indexes:$.batch.merge(r,u,t.indexes)},t)},e}();const De={};function Ce(e,t,n){const{table:r,clauses:o}=t;return{rows:e[r].query(n[r],o)}}function Pe(e,t,n,r){const{action:o,payload:s}=t;let i,a,c;if("REDUX_ORM_CREATE"===o){({table:i}=t);const o=e[i],u=r[i],l=o.insert(n,u,s);a=l.state,c=l.created}else{const{query:u}=t;({table:i}=u);const{rows:l}=Ce(e,u,r),d=e[i],f=r[i];if(o===B)a=d.update(n,f,l,s),c=Ce(e,u,r).rows;else{if(o!==U)throw new Error("Database received unknown update type: "+o);a=d.delete(n,f,l),c=l}}return{status:"SUCCESS",state:function(e,t,n,r){const{batchToken:o,withMutations:s}=n;return s?(r[e]=t,r):$.batch.set(o,e,t,r)}(i,a,n,r),payload:c}}Object.defineProperty(De,"@@_______REDUX_ORM_STATE_FLAG",{enumerable:!0,value:!0});var $e=function(e){const{tables:t}=e,n=Object.entries(t).reduce((e,[t,n])=>({...e,[t]:new Te(n)}),{});return{getEmptyState:()=>Object.entries(n).reduce((e,[t,n])=>({...e,[t]:n.getEmptyState()}),De),query:Ce.bind(null,n),update:Pe.bind(null,n),describe:e=>n[e]}};let Be=function(){function e({parent:e,orm:t}){this._parent=e,this._orm=t,this.keySelector=L}return o()(e,[{key:"cachePath",get:function(){return[...this._parent?this._parent.cachePath:[],this.key]}},{key:"orm",get:function(){return this._orm}},{key:"parent",get:function(){return this._parent}}]),e}();function Ue(e,t){return t}let qe=function(e){function t({model:t,...n}){var r;return(r=e.call(this,n)||this)._model=t,r}ce()(t,e);var n=t.prototype;return n.valueForInstance=function(e,t,n){throw new Error("Not implemented")},n.valueForRef=function(e,t,n){const{[this._model.modelName]:r}=t;return this.valueForInstance(r.withId(e[r.idAttribute]),t,n)},n.modelIs=function(e){return e===this._model.modelName},o()(t,[{key:"dependencies",get:function(){return[e=>e,this._orm,Ue]}},{key:"resultFunc",get:function(){return function(e,t,n){const{[this._model.modelName]:r}=t;return void 0===n?r.all().toModelArray().map(n=>this.valueForInstance(n,t,e)):Array.isArray(n)?n.map(n=>this.valueForInstance(r.withId(n),t,e)):this.valueForInstance(r.withId(n),t,e)}}},{key:"model",get:function(){return this._model}}]),t}(Be),Ve=function(e){function t({field:t,selector:n,...r}){var o;return(o=e.call(this,r)||this)._field=t,o._selector=n,o}ce()(t,e);var n=t.prototype;return n.createResultFunc=function(e){return function(t,n,r){const o=e(t,r);return null===o?null:void 0===r||Array.isArray(r)?o.map(e=>null===e?null:e.map(e=>null===e?null:this.valueForRef(e,null,t))):o.map(e=>this.valueForRef(e,null,t))}},n.valueForRef=function(e,t,n){const{idAttribute:r}=this._parent.toModel;return this._selector(n,e[r])},o()(t,[{key:"selector",get:function(){return this._selector},set:function(e){this._selector=e}},{key:"key",get:function(){return this._selector}}]),t}(qe),Xe=function(e){function t({model:t,...n}){var r;return(r=e.call(this,n)||this)._model=t,r}ce()(t,e);var n=t.prototype;return n.valueForRef=function(e,t){return e},n.modelIs=function(e){return e===this._model.modelName},o()(t,[{key:"key",get:function(){return this._model.modelName}},{key:"dependencies",get:function(){return[e=>e,this._orm,Ue]}},{key:"resultFunc",get:function(){return function(e,t,n){const{[this._model.modelName]:r}=t;if(void 0===n)return r.all().toRefArray();if(Array.isArray(n))return n.map(e=>{const t=r.withId(e);return t?t.ref:null});const o=r.withId(n);return o?o.ref:null}}},{key:"model",get:function(){return this._model}}]),t}(Be),Le=function(e){function t({field:t,fieldModel:n,accessorName:r,isVirtual:o,...s}){var i;return(i=e.call(this,s)||this)._field=t,i._fieldModel=n,i._accessorName=r,i._isVirtual=o,i}ce()(t,e);var n=t.prototype;return n.valueForInstance=function(e,t,n){if(!e)return null;let r;if(this._parent instanceof Xe)r=e[this._accessorName];else{const{[this._parent.toModelName]:o}=t,s=this._parent.valueForInstance(e,t,n),i=s?new o(s):null;r=i?i[this._accessorName]:null}return r instanceof Oe?r.ref:r instanceof se?r.toRefArray():r},n.map=function(e){if(e instanceof Xe)throw this.toModelName===e.model.modelName?new Error(`Cannot select models in a \`map()\` call. If you just want the \`${this._accessorName}\` as a ref array then you can simply drop the \`map()\`. Otherwise make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`):new Error(`Cannot select \`${e.model.modelName}\` models in this \`map()\` call. Make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`);if(e instanceof t||e instanceof Ve){if(this.toModelName!==e.model.modelName)throw new Error(`Cannot select fields of the \`${e.model.modelName}\` model in this \`map()\` call. Make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`)}else if(!e||"function"!=typeof e||!e.recomputations)throw new Error(`\`map()\` requires a selector as an input. Received: ${JSON.stringify(e)} of type ${typeof e}`);if(!(this._field instanceof me||this._field instanceof ye))throw new Error("Cannot map selectors for non-collection fields");return new Ve({parent:this,model:this._model,orm:this._orm,field:this._field,selector:e})},o()(t,[{key:"key",get:function(){return this._accessorName}},{key:"toModelName",get:function(){return"this"===this._field.toModelName?this._fieldModel.modelName:this._field.toModelName}},{key:"toModel",get:function(){return this._orm.getDatabase().describe(this.toModelName)}}]),t}(qe);function Qe({parent:e,model:t,field:n,fieldModel:r,accessorName:o,orm:s,isVirtual:i}){const a=new Le({parent:e,model:t,field:n,fieldModel:r,accessorName:o,orm:s,isVirtual:i});if(!(n instanceof pe))return a;if(e instanceof Le&&(e._field instanceof me&&e._isVirtual||e._field instanceof ye))throw new Error(`Cannot create a selector for \`${e._accessorName}.${o}\` because \`${e._accessorName}\` is a collection field.`);const{toModelName:c}=n,u=s.get("this"===c?t.modelName:c);return Object.entries(u.fields).forEach(([e,n])=>{const r=n.as||e;Object.defineProperty(a,r,{get:()=>Qe({parent:a,model:t,fieldModel:u,field:n,accessorName:r,orm:s,isVirtual:!1})})}),Object.entries(u.virtualFields).forEach(([e,n])=>{const r=n.as||e;a.hasOwnProperty(r)||Object.defineProperty(a,r,{get:()=>Qe({parent:a,model:t,fieldModel:u,field:n,accessorName:r,orm:s,isVirtual:!0})})}),a}const Ye={createDatabase:$e},Ke=["indexes","meta"],ze=e=>Ke.includes(e);let Ge=function(){function e(e){const{createDatabase:t}={...Ye,...e||{}};this.createDatabase=t,this.registry=[],this.implicitThroughModels=[],this.installedFields={},this.stateSelector=e?e.stateSelector:null}var t=e.prototype;return t.register=function(...e){e.forEach(e=>{if(void 0===e.modelName)throw new Error("A model was passed that doesn't have a modelName set");e.invalidateClassCache(),this.registerManyToManyModelsFor(e),this.registry.push(e),Object.defineProperty(this,e.modelName,{get:()=>(this._setupModelPrototypes(this.registry),function({model:e,orm:t}){const n=new Xe({parent:null,orm:t,model:e});return Object.entries(e.fields).forEach(([r,o])=>{const s=o.as||r;Object.defineProperty(n,s,{get:()=>Qe({parent:n,model:e,fieldModel:e,field:o,accessorName:s,orm:t,isVirtual:!1})})}),Object.entries(e.virtualFields).forEach(([r,o])=>{const s=o.as||r;n.hasOwnProperty(s)||Object.defineProperty(n,s,{get:()=>Qe({parent:n,model:e,fieldModel:e,field:o,accessorName:s,orm:t,isVirtual:!0})})}),n}({model:e,orm:this}))})})},t.registerManyToManyModelsFor=function(e){const{fields:t}=e,n=e.modelName;Object.entries(t).forEach(([e,t])=>{if(!(t instanceof ye))return;let r;r="this"===t.toModelName?n:t.toModelName;const s=n===r,i=z(n),a=G(r);if(t.through){if(s&&!t.throughFields)throw new Error(`Self-referencing many-to-many relationship at "${n}.${e}" using custom model "${t.through}" has no throughFields key. Cannot determine which fields reference the instances partaking in the relationship.`)}else{const t=function(e){function t(){return e.apply(this,arguments)||this}return ce()(t,e),t}(Oe);t.modelName=K(n,e);const c=function(e){function t(){return e.apply(this,arguments)||this}return ce()(t,e),o()(t,[{key:"installsBackwardsVirtualField",get:function(){return!1}},{key:"installsBackwardsDescriptor",get:function(){return!1}}]),t}(me),u=s?c:me;t.fields={id:be(),[i]:new u(n),[a]:new u(r)},t.invalidateClassCache(),this.implicitThroughModels.push(t)}})},t.get=function(e){const t=this.registry.concat(this.implicitThroughModels),n=Object.values(t).find(t=>t.modelName===e);if(void 0===n)throw new Error(`Did not find model ${e} from registry.`);return n},t.getModelClasses=function(){return this._setupModelPrototypes(this.registry),this._setupModelPrototypes(this.implicitThroughModels),this.registry.concat(this.implicitThroughModels)},t.generateSchemaSpec=function(){return{tables:this.getModelClasses().reduce((e,t)=>{const n=t.modelName,r=t.tableOptions();return Object.keys(r).filter(ze).forEach(e=>{throw new Error(`Reserved keyword \`${e}\` used in ${n}.options.`)}),e[n]={fields:{...t.fields},...r},e},{})}},t.getDatabase=function(){return this.db||(this.db=this.createDatabase(this.generateSchemaSpec())),this.db},t.getEmptyState=function(){return this.getDatabase().getEmptyState()},t.session=function(e){return new ie(this,this.getDatabase(),e)},t.mutableSession=function(e){return new ie(this,this.getDatabase(),e,!0)},t._setupModelPrototypes=function(e){e.filter(e=>!e.isSetUp).forEach(e=>{const{fields:t,modelName:n,querySetClass:r}=e;Object.entries(t).forEach(([t,r])=>{if(!(r instanceof le))throw new Error(`${n}.${t} is of type "${typeof r}" but must be an instance of Field. Please use the \`attr\`, \`fk\`, \`oneToOne\` and \`many\` functions to define fields.`);this._isFieldInstalled(n,t)||(this._installField(r,t,e),this._setFieldInstalled(n,t))}),Z(e,r),e.isSetUp=!0})},t._isFieldInstalled=function(e,t){return!!this.installedFields.hasOwnProperty(e)&&!!this.installedFields[e][t]},t._setFieldInstalled=function(e,t){this.installedFields.hasOwnProperty(e)||(this.installedFields[e]={}),this.installedFields[e][t]=!0},t._installField=function(e,t,n){new(0,e.installerClass)({field:e,fieldName:t,model:n,orm:this}).run()},t.withMutations=function(e){return Y("`ORM.prototype.withMutations` has been deprecated. Use `ORM.prototype.mutableSession` instead."),this.mutableSession(e)},t.from=function(e){return Y("`ORM.prototype.from` has been deprecated. Use `ORM.prototype.session` instead."),this.session(e)},t.getDefaultState=function(){return Y("`ORM.prototype.getDefaultState` has been deprecated. Use `ORM.prototype.getEmptyState` instead."),this.getEmptyState()},t.define=function(){throw new Error("`ORM.prototype.define` has been removed. Please define a Model class.")},e}();var Je=n(3),He=n(15);const Ze=(e,t)=>e===t,We=e=>e&&"object"==typeof e&&e.hasOwnProperty("@@_______REDUX_ORM_STATE_FLAG"),et=(e,t,n)=>t.every((t,r)=>We(t)&&We(e[r])||n(t,e[r])),tt=(e,t,n)=>{const{accessedInstances:r}=e;return Object.entries(r).every(([r,o])=>{if(e.ormState[r]===t[r])return!0;const{mapName:s}=n.getDatabase().describe(r),{[s]:i}=e.ormState[r],{[s]:a}=t[r],c=Object.keys(o);return u=i,l=a,c.every(e=>u[e]===l[e]);var u,l})},nt=(e,t)=>{const{accessedIndexes:n}=e;return Object.entries(n).every(([n,r])=>Object.entries(r).every(([r,o])=>o.every(o=>e.ormState[n].indexes[r][o]===t[n].indexes[r][o])))},rt=(e,t)=>e.fullTableScannedModels.every(n=>e.ormState[n]===t[n]),ot={result:null,ormState:null,fullTableScannedModels:[],accessedInstances:{},accessedIndexes:{},calledBefore:!1};function st(e,t){const n={...ot,args:null};return(...r)=>{const[o,...s]=r;if(n.calledBefore&&et(n.args,s,Ze)&&rt(n,o)&&nt(n,o)&&tt(n,o,t))return n.result;const i=t.session(o),a=s.map(e=>We(e)?i:e),c=e.apply(null,a);return n.result=c,n.args=s,n.ormState=o,n.accessedInstances=i.accessedModelInstances,n.accessedIndexes=i.accessedIndexes,n.fullTableScannedModels=i.fullTableScannedModels,n.calledBefore=!0,c}}let it=function(e){function t(){return e.apply(this,arguments)||this}ce()(t,e);var n=t.prototype;return n.getFromCacheKeys=function(e){let t=this;for(const n of e){if(t.has(n)){t=t.get(n);continue}const e=new Map([["@@_______REDUX_ORM_MEMOIZATION_STATE",{...ot}]]);t.set(n,e),t=e}return t},n.getState=function(e){const t=this.getFromCacheKeys(e);return t?t.get("@@_______REDUX_ORM_MEMOIZATION_STATE"):null},t}(n.n(He)()(Map));function at(e,t,n){const r=new it([["@@_______REDUX_ORM_MEMOIZATION_STATE",{...ot}]]);return(...o)=>{const[s,i,...a]=o,c=a.slice(Math.max(0,n)),u=r.getState([i]);if(u.calledBefore&&et(u.argsToCompare,c,Ze)&&rt(u,s)&&nt(u,s)&&tt(u,s,t))return u.result;const l=t.session(s),d=a.map(e=>We(e)?l:e),f=e.apply(null,d);return u.result=f,u.ormState=s,u.accessedInstances=l.accessedModelInstances,u.accessedIndexes=l.accessedIndexes,u.fullTableScannedModels=l.fullTableScannedModels,u.calledBefore=!0,u.argsToCompare=c,f}}function ct(e,t){e.sessionBoundModels.forEach(n=>{"function"==typeof n.reducer&&n.reducer(t,n,e)})}function ut(e,t=ct){return(n,r)=>{const o=e.session(n||e.getEmptyState());return t(o,r),o.state}}function lt(e){if(!(e instanceof Xe||e instanceof qe))throw new Error("createSelectorFromSpecFor requires a ModelSelectorSpec or a ModelBasedSelectorSpec as its sole argument.");const{orm:t,model:{modelName:n}}=e,r=t[n];return function(e){if(!e||!(e instanceof Xe||e instanceof qe))throw new Error("createSelectorFromSpecFor(X)(Y) requires Y to be a ModelSelectorSpec or a ModelBasedSelectorSpec.");if(!e.modelIs(n)){const e=pt(arg);return t=>e(t)}if(e instanceof Ve){const n=e.parent.toModelName,r=t[n];return e.selector=mt(r)(e.selector),Object(Je.createSelectorCreator)(at,e.orm,3)([t.stateSelector,Ue,e=>e,t.stateSelector,Ue],(t,n,r)=>{const o=e.parent.resultFunc(t,n,r);return null===o?null:void 0===r||Array.isArray(r)?o.map(r=>null===r?null:r.map(r=>null===r?null:e.valueForRef(r,n,t))):o.map(r=>null===r?null:e.valueForRef(r,n,t))})}return Object(Je.createSelectorCreator)(at,t,3)([t.stateSelector,Ue,e=>e,t.stateSelector,Ue],(t,n,o)=>{const s=r.resultFunc(t,n,o);return null===s?null:Array.isArray(s)?s.map(r=>null===r?null:e.valueForRef(r,n,t)):e.valueForRef(s,n,t)})}}function dt(e){return e instanceof Ge?e:e instanceof Be&&e._orm}const ft=new Map,ht=Symbol.for("REDUX_ORM_SELECTOR");function pt(e){if("function"==typeof e)return e;if(e instanceof Ge)return e.stateSelector;if(e instanceof Ve&&(e.selector=pt(e.selector)),e instanceof Be){const{orm:t,cachePath:n}=e;let r;ft.has(t)||ft.set(t,new Map);r=ft.get(t);for(let e=0;e<n.length;++e){const t=n[e];r.has(t)||r.set(t,new Map),r=r.get(t)}if(r&&r.has(ht))return r.get(ht);const o=function e(t){if(t instanceof Ve){const n=e(t.parent),r=t.createResultFunc(n);return(e,n)=>r.call(t,e,null,n)}if(t instanceof Xe||t instanceof qe){const e=t.orm[t.model.modelName];return Object(Je.createSelectorCreator)(at,t.orm,t.dependencies.length)([t.orm.stateSelector,Ue,...t.dependencies.map(mt(e))],(...e)=>t.resultFunc.apply(t,e))}throw new Error("Unknown selector spec")}(e);return r.set(ht,o),o}throw new Error(`Failed to interpret selector argument: ${JSON.stringify(e)} of type ${typeof e}`)}function mt(e){if(!(e instanceof Xe))throw new Error("`toSelectorFor(orm.Model)` takes a model selector spec as its single argument.");return function(t){return"function"==typeof t?t:t instanceof Ge?t.stateSelector:t instanceof Xe||t instanceof qe?lt(e)(t):pt(t)}}function yt(...e){if(!e.length)throw new Error("Cannot create a selector without arguments.");const t=e.pop(),n=Array.isArray(e[0])?e[0]:e,r=n.map(dt).find(Boolean),o=n.map(pt);if("function"==typeof t){if(!r)throw new Error("Failed to resolve the current ORM database state. Please pass an ORM instance or an ORM selector as an argument to `createSelector()`.");if(!r.stateSelector)throw new Error("Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function.");if("function"!=typeof r.stateSelector)throw new Error(`Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's \`stateSelector\`. Received: ${JSON.stringify(r.stateSelector)} of type ${typeof r.stateSelector}`);return Object(Je.createSelectorCreator)(st,r)([r.stateSelector,...o],t)}if(t instanceof Ge)throw new Error("ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelector()`.");return o.length&&console.warn("Your input selectors will be ignored: the passed result function does not require any input."),pt(t)}function gt(e){if(!e)throw new Error("`createSelectorFor()` takes one argument of the form `orm.Model`, e.g. `orm.Book`.");if(!(e instanceof Xe))throw new Error("The argument you passed to `createSelectorFor(orm.Model)` must be a model selector specification, e.g. `orm.Book`.");return function(...t){if(!t.length)throw new Error("Cannot create a selector without arguments.");const n=t.pop(),r=Array.isArray(t[0])?t[0]:t,o=e.orm,s=r.map(mt(e));if("function"==typeof n){if(!o.stateSelector)throw new Error("Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function.");if("function"!=typeof o.stateSelector)throw new Error(`Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's \`stateSelector\`. Received: ${JSON.stringify(o.stateSelector)} of type ${typeof o.stateSelector}`);const t=r.map(t=>"function"==typeof t&&t.hasOwnProperty("@@_______REDUX_ORM_KEYED_SELECTOR")&&t["@@_______REDUX_ORM_KEYED_SELECTOR"]===e.model.modelName||(t instanceof Xe||t instanceof qe)&&t.modelIs(e.model.modelName)),i=Object(Je.createSelectorCreator)(at,o,2)([o.stateSelector,Ue,Ue,pt(e),...s],(e,r,...o)=>null===r?null:void 0===e||Array.isArray(e)?r.map((e,r)=>null===e?null:n.apply(null,o.map((e,n)=>t[n]?e[r]:e))):n.apply(null,o));return i["@@_______REDUX_ORM_KEYED_SELECTOR"]=e.model.modelName,i}if(n instanceof Ge)throw new Error("ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelectorFor()`.");return s.length&&console.warn("Your input selectors will be ignored: the passed result function does not require any input."),pt(n)}}const bt=function(){throw new Error("Schema has been renamed to ORM. Please import ORM instead of Schema from Redux-ORM.")},wt=function(){throw new Error("Having a custom Backend instance is now unsupported. Documentation for database customization is upcoming, for now please look at the db folder in the source.")};t.default=Oe}])}));
//# sourceMappingURL=redux-orm.min.js.map

@@ -10,7 +10,10 @@ export var UPDATE = "REDUX_ORM_UPDATE";

export var STATE_FLAG = "@@_______REDUX_ORM_STATE_FLAG"; // for caching selectors based on their ID argument
export var STATE_FLAG = "@@_______REDUX_ORM_STATE_FLAG"; // for detecting keyed selectors and storing the corresponding model
export var KEYED_SELECTOR_MARKER = "@@_______REDUX_ORM_KEYED_SELECTOR"; // for caching selectors based on their ID argument
export var ALL_INSTANCES = Symbol("REDUX_ORM_ALL_INSTANCES");
export var ID_ARG_KEY_SELECTOR = function ID_ARG_KEY_SELECTOR(_state, idArg) {
return typeof idArg === "undefined" ? ALL_INSTANCES : idArg;
};
};
export var EMPTY_ARRAY = Object.freeze([]);
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

@@ -6,0 +6,0 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

@@ -5,3 +5,3 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

@@ -8,0 +8,0 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

@@ -5,3 +5,3 @@ import QuerySet from "./QuerySet";

import Session from "./Session";
import { createReducer, createSelector } from "./redux";
import { createReducer, createSelector, createSelectorFor } from "./redux";
import ForeignKey from "./fields/ForeignKey";

@@ -18,3 +18,3 @@ import ManyToMany from "./fields/ManyToMany";

export { Attribute, QuerySet, Model, ORM, Schema, Backend, Session, ForeignKey, ManyToMany, OneToOne, fk, many, attr, oneToOne, createReducer, createSelector };
export { Attribute, QuerySet, Model, ORM, Schema, Backend, Session, ForeignKey, ManyToMany, OneToOne, fk, many, attr, oneToOne, createReducer, createSelector, createSelectorFor };
export default Model;

@@ -0,3 +1,17 @@

import _inheritsLoose from "@babel/runtime/helpers/inheritsLoose";
import _wrapNativeSuper from "@babel/runtime/helpers/wrapNativeSuper";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import _typeof from "@babel/runtime/helpers/typeof";
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
import { STATE_FLAG } from "./constants";

@@ -73,2 +87,43 @@

};
var MEMOIZATION_STATE_KEY = "@@_______REDUX_ORM_MEMOIZATION_STATE";
var MEMOIZATION_STATE = {
/* Result of the previous function call */
result: null,
/**
* Snapshot of the previous database.
*
* Lets us know how the tables looked like
* during the previous function call.
*/
ormState: null,
/**
* Names of models whose tables have been scanned completely
* during previous function call (contains only model names)
* Format example: ['Book']
*/
fullTableScannedModels: [],
/**
* Map of which model instances have been accessed
* during previous function call.
* Contains only PKs of accessed instances.
* Format example: { Book: { 1: true, 3: true } }
*/
accessedInstances: {},
/**
* Map of which attribute indexes have been accessed
* during previous function call.
* Contains only attributes that were actually filtered on.
* Author.withId(3).books would add 3 to the authorId index below.
* Format example: { Book: { authorId: [1, 2], publisherId: [5] } }
*/
accessedIndexes: {},
/* Whether the selector has been called */
calledBefore: false
};
/**

@@ -110,4 +165,2 @@ * A memoizer to use with redux-orm

* @param {Function} func - function to memoize
* @param {Function} argEqualityCheck - equality check function to use with normal
* selector args
* @param {ORM} orm - a redux-orm ORM instance

@@ -117,48 +170,119 @@ * @return {Function} `func` memoized.

export function memoize(func, orm) {
var previous = _objectSpread(_objectSpread({}, MEMOIZATION_STATE), {}, {
args: null
});
export function memoize(func) {
var argEqualityCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultEqualityCheck;
var orm = arguments.length > 2 ? arguments[2] : undefined;
var previous = {
/* Result of the previous function call */
result: null,
return function () {
for (var _len = arguments.length, stateAndArgs = new Array(_len), _key = 0; _key < _len; _key++) {
stateAndArgs[_key] = arguments[_key];
}
/* Arguments to the previous function call (excluding ORM state) */
args: null,
/**
* Snapshot of the previous database.
*
* Lets us know how the tables looked like
* during the previous function call.
* The first argument to this function needs to be
* the ORM's reducer state in the user's Redux store.
*/
ormState: null,
var ormState = stateAndArgs[0],
args = stateAndArgs.slice(1);
if (previous.calledBefore && argsAreEqual(previous.args, args, defaultEqualityCheck) && fullTableScannedModelsAreEqual(previous, ormState) && accessedIndexesAreEqual(previous, ormState) && accessedModelInstancesAreEqual(previous, ormState, orm)) {
/**
* None of this selector's dependencies have changed
* since the last time that we called it.
*/
return previous.result;
}
/**
* Names of models whose tables have been scanned completely
* during previous function call (contains only model names)
* Format example: ['Book']
* Start a session so that the selector can access the database.
* Make this session immutable. This way we can find out if
* the operations that the selector performs are cacheable.
*/
fullTableScannedModels: [],
var session = orm.session(ormState);
/* Replace all ORM state arguments by the session above */
var argsWithSession = args.map(function (arg) {
return isOrmState(arg) ? session : arg;
});
/* This is where we call the actual function */
var result = func.apply(null, argsWithSession); // eslint-disable-line prefer-spread
/**
* Map of which model instances have been accessed
* during previous function call.
* Contains only PKs of accessed instances.
* Format example: { Book: { 1: true, 3: true } }
* The metadata for the previous call are no longer valid.
* Update cached values.
*/
accessedInstances: {},
/**
* Map of which attribute indexes have been accessed
* during previous function call.
* Contains only attributes that were actually filtered on.
* Author.withId(3).books would add 3 to the authorId index below.
* Format example: { Book: { authorId: [1, 2], publisherId: [5] } }
*/
accessedIndexes: {}
previous.result = result;
previous.args = args;
/* Redux state slice for session.state */
previous.ormState = ormState;
/* Rows retrieved by resolved primary key */
previous.accessedInstances = session.accessedModelInstances;
/* Foreign key indexes that were used to speed up queries */
previous.accessedIndexes = session.accessedIndexes;
/* Tables that had to be scanned completely */
previous.fullTableScannedModels = session.fullTableScannedModels;
/* Whether the selector has been called */
previous.calledBefore = true;
return result;
};
}
var PreviousCalls = /*#__PURE__*/function (_Map) {
_inheritsLoose(PreviousCalls, _Map);
function PreviousCalls() {
return _Map.apply(this, arguments) || this;
}
var _proto = PreviousCalls.prototype;
_proto.getFromCacheKeys = function getFromCacheKeys(cacheKeys) {
var level = this;
var _iterator = _createForOfIteratorHelper(cacheKeys),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var key = _step.value;
if (level.has(key)) {
level = level.get(key);
continue;
}
var newLevel = new Map([[MEMOIZATION_STATE_KEY, _objectSpread({}, MEMOIZATION_STATE)]]);
level.set(key, newLevel);
level = newLevel;
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return level;
};
_proto.getState = function getState(cacheKeys) {
var call = this.getFromCacheKeys(cacheKeys);
return call ? call.get(MEMOIZATION_STATE_KEY) : null;
};
return PreviousCalls;
}( /*#__PURE__*/_wrapNativeSuper(Map));
export function memoizeByKey(func, orm, ignoreDependenciesCount) {
var previousCalls = new PreviousCalls([[MEMOIZATION_STATE_KEY, _objectSpread({}, MEMOIZATION_STATE)]]);
return function () {
for (var _len = arguments.length, stateAndArgs = new Array(_len), _key = 0; _key < _len; _key++) {
stateAndArgs[_key] = arguments[_key];
for (var _len2 = arguments.length, stateAndKeysAndArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
stateAndKeysAndArgs[_key2] = arguments[_key2];
}

@@ -170,7 +294,11 @@

*/
var ormState = stateAndArgs[0],
args = stateAndArgs.slice(1);
var selectorWasCalledBefore = Boolean(previous.args);
var ormState = stateAndKeysAndArgs[0],
cacheKeys = stateAndKeysAndArgs[1],
args = stateAndKeysAndArgs.slice(2);
/** Ignore the first `ignoreDependenciesCount` dependencies. */
if (selectorWasCalledBefore && argsAreEqual(previous.args, args, argEqualityCheck) && fullTableScannedModelsAreEqual(previous, ormState) && accessedIndexesAreEqual(previous, ormState) && accessedModelInstancesAreEqual(previous, ormState, orm)) {
var argsToCompare = args.slice(Math.max(0, ignoreDependenciesCount));
var previous = previousCalls.getState([cacheKeys]);
if (previous.calledBefore && argsAreEqual(previous.argsToCompare, argsToCompare, defaultEqualityCheck) && fullTableScannedModelsAreEqual(previous, ormState) && accessedIndexesAreEqual(previous, ormState) && accessedModelInstancesAreEqual(previous, ormState, orm)) {
/**

@@ -204,23 +332,21 @@ * None of this selector's dependencies have changed

previous = {
/* Arguments that were passed to the selector */
args: args,
previous.result = result;
/* Redux state slice for session.state */
/* Selector result */
result: result,
previous.ormState = ormState;
/* Rows retrieved by resolved primary key */
/* Redux state slice for session.state */
ormState: ormState,
previous.accessedInstances = session.accessedModelInstances;
/* Foreign key indexes that were used to speed up queries */
/* Rows retrieved by resolved primary key */
accessedInstances: session.accessedModelInstances,
previous.accessedIndexes = session.accessedIndexes;
/* Tables that had to be scanned completely */
/* Foreign key indexes that were used to speed up queries */
accessedIndexes: session.accessedIndexes,
previous.fullTableScannedModels = session.fullTableScannedModels;
/* Whether the selector has been called */
/* Tables that had to be scanned completely */
fullTableScannedModels: session.fullTableScannedModels
};
previous.calledBefore = true;
previous.argsToCompare = argsToCompare;
return result;
};
}

@@ -6,3 +6,3 @@ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

@@ -9,0 +9,0 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

@@ -7,3 +7,3 @@ import _typeof from "@babel/runtime/helpers/typeof";

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

@@ -10,0 +10,0 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

@@ -5,3 +5,3 @@ import _typeof from "@babel/runtime/helpers/typeof";

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

@@ -11,3 +11,3 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

import { normalizeEntity, warnDeprecated, mapValues } from "./utils";
import { UPDATE, DELETE, FILTER, EXCLUDE, ORDER_BY } from "./constants";
import { UPDATE, DELETE, FILTER, EXCLUDE, ORDER_BY, EMPTY_ARRAY } from "./constants";
/**

@@ -85,3 +85,9 @@ * This class is used to build and make queries to the database

_proto.toRefArray = function toRefArray() {
return this._evaluate();
var arr = this._evaluate();
if (arr.length === 0) {
return EMPTY_ARRAY;
}
return arr;
}

@@ -96,3 +102,10 @@ /**

var ModelClass = this.modelClass;
return this._evaluate().map(function (props) {
var arr = this._evaluate();
if (arr.length === 0) {
return EMPTY_ARRAY;
}
return arr.map(function (props) {
return new ModelClass(props);

@@ -99,0 +112,0 @@ });

@@ -0,9 +1,12 @@

import _typeof from "@babel/runtime/helpers/typeof";
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
import _typeof from "@babel/runtime/helpers/typeof";
import { createSelectorCreator } from "reselect";
import createCachedSelector, { FlatMapCache } from "re-reselect";
import { memoize } from "./memoize";
import { memoize, memoizeByKey } from "./memoize";
import { ORM } from "./ORM";
import SelectorSpec from "./selectors/SelectorSpec";
import MapSelectorSpec from "./selectors/MapSelectorSpec";
import ModelSelectorSpec from "./selectors/ModelSelectorSpec";
import ModelBasedSelectorSpec from "./selectors/ModelBasedSelectorSpec";
import idArgSelector from "./selectors/idArgSelector";
import { KEYED_SELECTOR_MARKER } from "./constants";
/**

@@ -48,2 +51,4 @@ * @module redux

/**
* Turns a selector specification into its corresponding selector function.
*
* @private

@@ -56,13 +61,115 @@ * @param {SelectorSpec} spec

var parentSelector = createSelectorFromSpec(spec.parent);
return spec.createResultFunc(parentSelector);
var resultFunc = spec.createResultFunc(parentSelector);
return function (state, idArg) {
return resultFunc.call(spec, state, null, idArg);
};
}
return createCachedSelector(spec.dependencies, spec.resultFunc)({
keySelector: spec.keySelector,
cacheObject: new FlatMapCache(),
selectorCreator: createSelector // eslint-disable-line no-use-before-define
if (spec instanceof ModelSelectorSpec || spec instanceof ModelBasedSelectorSpec) {
var modelSpec = spec.orm[spec.model.modelName];
return createSelectorCreator(memoizeByKey, spec.orm, spec.dependencies.length)([spec.orm.stateSelector, idArgSelector].concat(_toConsumableArray(spec.dependencies.map(toSelectorFor(modelSpec)))), function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
});
return spec.resultFunc.apply(spec, args);
});
}
throw new Error("Unknown selector spec");
}
/**
* Turns a selector specification into its corresponding selector function.
*
* @param {ModelSelectorSpec|ModelBasedSelectorSpec}
* @private
* @param {SelectorSpec} spec
*/
function createSelectorFromSpecFor(modelOrModelBasedSpec) {
if (!(modelOrModelBasedSpec instanceof ModelSelectorSpec) && !(modelOrModelBasedSpec instanceof ModelBasedSelectorSpec)) {
throw new Error("createSelectorFromSpecFor requires a ModelSelectorSpec or a ModelBasedSelectorSpec as its sole argument.");
}
var orm = modelOrModelBasedSpec.orm,
modelName = modelOrModelBasedSpec.model.modelName;
var modelSpec = orm[modelName];
return function (spec) {
if (!spec || !(spec instanceof ModelSelectorSpec || spec instanceof ModelBasedSelectorSpec)) {
throw new Error("createSelectorFromSpecFor(X)(Y) requires Y to be a ModelSelectorSpec or a ModelBasedSelectorSpec.");
}
if (!spec.modelIs(modelName)) {
/**
* This causes user arguments not to affect the dependency.
* So arguments meant for the model-based selector `spec` don't also get
* passed to other model-based selector dependencies.
*
* Example:
* const similarAuthors = createSelectorFor(orm.Book)(
* orm.Book.genre,
* orm.Author,
* (genre, allAuthors) =>
* allAuthors.books.filter({ genre }).count() > 0
* );
*
* This causes `similarAuthors(state, 1)` to only resolve
* the genre of the book with ID 1, but not the author with ID 1.
* Instead, the `orm.Author` resultFunc will receive no arguments.
*/
var selector = toSelector(arg);
return function (state) {
return selector(state);
};
}
if (spec instanceof MapSelectorSpec) {
var parentToModelName = spec.parent.toModelName;
var parentToModelSpec = orm[parentToModelName];
spec.selector = toSelectorFor(parentToModelSpec)(spec.selector);
return createSelectorCreator(memoizeByKey, spec.orm, 3)([orm.stateSelector, idArgSelector, function (state) {
return state;
}, orm.stateSelector, idArgSelector], function (state, session, idArg) {
var parentResult = spec.parent.resultFunc(state, session, idArg);
if (parentResult === null) {
return null;
}
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return parentResult.map(function (refArray) {
return refArray === null ? null : refArray.map(function (parentRef) {
return parentRef === null ? null : spec.valueForRef(parentRef, session, state);
});
});
}
return parentResult.map(function (ref) {
return ref === null ? null : spec.valueForRef(ref, session, state);
});
});
} // Map arg.resultFunc by model using arg.modelSelectorSpec
return createSelectorCreator(memoizeByKey, orm, 3)([orm.stateSelector, idArgSelector, function (state) {
return state;
}, orm.stateSelector, idArgSelector], function (state, session, idArg) {
var refOrRefs = modelSpec.resultFunc(state, session, idArg);
if (refOrRefs === null) {
return null;
}
if (Array.isArray(refOrRefs)) {
return refOrRefs.map(function (ref) {
return ref === null ? null : spec.valueForRef(ref, session, state);
});
}
return spec.valueForRef(refOrRefs, session, state);
});
};
}
/**
* Tries to find ORM instance using the argument.

@@ -90,4 +197,14 @@ * @private

/**
* Turns any argument into a selector function if possible.
*
* ORM instances become functions returning the ORM's state.
*
* Selector specs become actual selector functions. If possible
* their cached version is retrieved instead of creating new ones.
* Ordinary functions are kept the same.
*
* @private
* @param {function|ORM|SelectorSpec} arg
* @return {function}
* @throws {Error} if argument is invalid
*/

@@ -152,2 +269,28 @@

}
function toSelectorFor(spec) {
if (!(spec instanceof ModelSelectorSpec)) {
throw new Error("`toSelectorFor(orm.Model)` takes a model selector spec as its single argument.");
}
return function (arg) {
if (typeof arg === "function") {
return arg;
}
if (arg instanceof ORM) {
return arg.stateSelector;
}
if (arg instanceof ModelSelectorSpec || arg instanceof ModelBasedSelectorSpec) {
return createSelectorFromSpecFor(spec)(arg);
}
/**
* All other args are treated as regular selectors.
*/
return toSelector(arg);
};
}
/**

@@ -233,4 +376,4 @@ * Returns a memoized selector based on passed arguments.

export function createSelector() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}

@@ -256,3 +399,3 @@

return createSelectorCreator(memoize, undefined, orm)([orm.stateSelector].concat(_toConsumableArray(inputFuncs)), resultArg);
return createSelectorCreator(memoize, orm)([orm.stateSelector].concat(_toConsumableArray(inputFuncs)), resultArg);
}

@@ -269,2 +412,82 @@

return toSelector(resultArg);
}
/**
* Creates a selector whose results will be cached by the second argument
* passed to it.
*/
export function createSelectorFor(spec) {
if (!spec) {
throw new Error("`createSelectorFor()` takes one argument of the form `orm.Model`, e.g. `orm.Book`.");
}
if (!(spec instanceof ModelSelectorSpec)) {
throw new Error("The argument you passed to `createSelectorFor(orm.Model)` must be a model selector specification, e.g. `orm.Book`.");
}
return function () {
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
if (!args.length) {
throw new Error("Cannot create a selector without arguments.");
}
var resultArg = args.pop();
var dependencies = Array.isArray(args[0]) ? args[0] : args;
var orm = spec.orm;
var inputFuncs = dependencies.map(toSelectorFor(spec));
if (typeof resultArg === "function") {
if (!orm.stateSelector) {
throw new Error("Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function.");
} else if (typeof orm.stateSelector !== "function") {
throw new Error("Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's `stateSelector`. Received: ".concat(JSON.stringify(orm.stateSelector), " of type ").concat(_typeof(orm.stateSelector)));
}
var dependencyIsForModelRef = dependencies.map(function (dep) {
return typeof dep === "function" && dep.hasOwnProperty(KEYED_SELECTOR_MARKER) && dep[KEYED_SELECTOR_MARKER] === spec.model.modelName || (dep instanceof ModelSelectorSpec || dep instanceof ModelBasedSelectorSpec) && dep.modelIs(spec.model.modelName);
});
var selector = createSelectorCreator(memoizeByKey, orm, // the additional argument refOrRefs to be ignored
2)([// for wrapping the selector in a session
orm.stateSelector, // idArg for cache key
idArgSelector, // returns refOrRefs below
idArgSelector, toSelector(spec)].concat(_toConsumableArray(inputFuncs)), function (idArg, refOrRefs) {
for (var _len4 = arguments.length, args = new Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) {
args[_key4 - 2] = arguments[_key4];
}
if (refOrRefs === null) {
return null;
}
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return refOrRefs.map(function (ref, refIdx) {
if (ref === null) {
return null;
}
return resultArg.apply(null, args.map(function (arg, i) {
return dependencyIsForModelRef[i] ? arg[refIdx] : arg;
}));
});
}
return resultArg.apply(null, args);
});
selector[KEYED_SELECTOR_MARKER] = spec.model.modelName;
return selector;
}
if (resultArg instanceof ORM) {
throw new Error("ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelectorFor()`.");
}
if (inputFuncs.length) {
console.warn("Your input selectors will be ignored: the passed result function does not require any input.");
}
return toSelector(resultArg);
};
}

@@ -8,3 +8,2 @@ import _typeof from "@babel/runtime/helpers/typeof";

import ModelBasedSelectorSpec from "./ModelBasedSelectorSpec";
import idArgSelector from "./idArgSelector";
import QuerySet from "../QuerySet";

@@ -37,3 +36,3 @@ import Model from "../Model";

_proto.valueForInstance = function valueForInstance(instance, session) {
_proto.valueForInstance = function valueForInstance(instance, session, state) {
if (!instance) {

@@ -52,3 +51,3 @@ return null;

var parentRef = this._parent.valueForInstance(instance, session);
var parentRef = this._parent.valueForInstance(instance, session, state);

@@ -104,7 +103,2 @@ var parentInstance = parentRef ? new ParentToModel(parentRef) : null;

}, {
key: "dependencies",
get: function get() {
return [this._orm, idArgSelector];
}
}, {
key: "toModelName",

@@ -111,0 +105,0 @@ get: function get() {

@@ -5,3 +5,2 @@ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";

import ModelBasedSelectorSpec from "./ModelBasedSelectorSpec";
import idArgSelector from "./idArgSelector";

@@ -23,14 +22,11 @@ var MapSelectorSpec = /*#__PURE__*/function (_ModelBasedSelectorSp) {

}
/** Result for createSelectorFromSpec, not createSelectorFromSpecFor! */
var _proto = MapSelectorSpec.prototype;
_proto.createResultFunc = function createResultFunc(parentSelector) {
var _this2 = this;
return function mapSelectorResult(state, _session, idArg) {
var _this2 = this;
var idAttribute = this._parent.toModel.idAttribute;
return function (state) {
for (var _len = arguments.length, other = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
other[_key - 1] = arguments[_key];
}
/**

@@ -41,24 +37,27 @@ * The parent selector should return a ref array

*/
var parentResult = parentSelector.apply(void 0, [state].concat(other));
var idArg = idArgSelector.apply(void 0, [state].concat(other));
var parentResult = parentSelector(state, idArg);
var single = function single(refArray) {
if (refArray === null) {
// an intermediate field could not be resolved
return null;
}
if (parentResult === null) {
return null;
}
return refArray.map(function (ref) {
return _this2._selector(state, ref[idAttribute]);
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return parentResult.map(function (refArray) {
return refArray === null ? null : refArray.map(function (ref) {
return ref === null ? null : _this2.valueForRef(ref, null, state);
});
});
};
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return parentResult.map(single);
}
return single(parentResult);
return parentResult.map(function (ref) {
return _this2.valueForRef(ref, null, state);
});
};
};
_proto.valueForRef = function valueForRef(ref, _session, state) {
var idAttribute = this._parent.toModel.idAttribute;
return this._selector(state, ref[idAttribute]);
};
_createClass(MapSelectorSpec, [{

@@ -65,0 +64,0 @@ key: "selector",

@@ -5,2 +5,6 @@ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";

import SelectorSpec from "./SelectorSpec";
import idArgSelector from "./idArgSelector";
/**
* @abstract
*/

@@ -21,17 +25,36 @@ var ModelBasedSelectorSpec = /*#__PURE__*/function (_SelectorSpec) {

var _proto = ModelBasedSelectorSpec.prototype;
/** @abstract */
_proto.valueForInstance = function valueForInstance(_instance, _session, _state) {
throw new Error("Not implemented");
};
_proto.valueForRef = function valueForRef(ref, session, state) {
var ModelClass = session[this._model.modelName];
return this.valueForInstance(ModelClass.withId(ref[ModelClass.idAttribute]), session, state);
};
_proto.modelIs = function modelIs(modelName) {
return modelName === this._model.modelName;
};
_createClass(ModelBasedSelectorSpec, [{
key: "dependencies",
get: function get() {
return [function (state) {
return state;
}, this._orm, idArgSelector];
}
}, {
key: "resultFunc",
get: function get() {
var _this2 = this;
return function modelBasedSelectorResult(state, session, idArg) {
var _this2 = this;
return function (session, idArg) {
for (var _len = arguments.length, other = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
other[_key - 2] = arguments[_key];
}
var ModelClass = session[this._model.modelName];
var ModelClass = session[_this2._model.modelName];
if (typeof idArg === "undefined") {
return ModelClass.all().toModelArray().map(function (instance) {
return _this2.valueForInstance.apply(_this2, [instance, session].concat(other));
return _this2.valueForInstance(instance, session, state);
});

@@ -42,7 +65,7 @@ }

return idArg.map(function (id) {
return _this2.valueForInstance.apply(_this2, [ModelClass.withId(id), session].concat(other));
return _this2.valueForInstance(ModelClass.withId(id), session, state);
});
}
return _this2.valueForInstance.apply(_this2, [ModelClass.withId(idArg), session].concat(other));
return this.valueForInstance(ModelClass.withId(idArg), session, state);
};

@@ -49,0 +72,0 @@ }

@@ -21,2 +21,12 @@ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";

var _proto = ModelSelectorSpec.prototype;
_proto.valueForRef = function valueForRef(ref, _session) {
return ref;
};
_proto.modelIs = function modelIs(modelName) {
return modelName === this._model.modelName;
};
_createClass(ModelSelectorSpec, [{

@@ -30,3 +40,5 @@ key: "key",

get: function get() {
return [this._orm, idArgSelector];
return [function (state) {
return state;
}, this._orm, idArgSelector];
}

@@ -36,7 +48,5 @@ }, {

get: function get() {
var _this2 = this;
return function modelSelectorResult(_state, session, idArg) {
var ModelClass = session[this._model.modelName];
return function (_ref2, idArg) {
var ModelClass = _ref2[_this2._model.modelName];
if (typeof idArg === "undefined") {

@@ -43,0 +53,0 @@ return ModelClass.all().toRefArray();

@@ -6,3 +6,3 @@ "use strict";

});
exports.ID_ARG_KEY_SELECTOR = exports.ALL_INSTANCES = exports.STATE_FLAG = exports.FAILURE = exports.SUCCESS = exports.ORDER_BY = exports.EXCLUDE = exports.FILTER = exports.CREATE = exports.DELETE = exports.UPDATE = void 0;
exports.EMPTY_ARRAY = exports.ID_ARG_KEY_SELECTOR = exports.ALL_INSTANCES = exports.KEYED_SELECTOR_MARKER = exports.STATE_FLAG = exports.FAILURE = exports.SUCCESS = exports.ORDER_BY = exports.EXCLUDE = exports.FILTER = exports.CREATE = exports.DELETE = exports.UPDATE = void 0;
var UPDATE = "REDUX_ORM_UPDATE";

@@ -25,5 +25,8 @@ exports.UPDATE = UPDATE;

exports.FAILURE = FAILURE;
var STATE_FLAG = "@@_______REDUX_ORM_STATE_FLAG"; // for caching selectors based on their ID argument
var STATE_FLAG = "@@_______REDUX_ORM_STATE_FLAG"; // for detecting keyed selectors and storing the corresponding model
exports.STATE_FLAG = STATE_FLAG;
var KEYED_SELECTOR_MARKER = "@@_______REDUX_ORM_KEYED_SELECTOR"; // for caching selectors based on their ID argument
exports.KEYED_SELECTOR_MARKER = KEYED_SELECTOR_MARKER;
var ALL_INSTANCES = Symbol("REDUX_ORM_ALL_INSTANCES");

@@ -36,2 +39,4 @@ exports.ALL_INSTANCES = ALL_INSTANCES;

exports.ID_ARG_KEY_SELECTOR = ID_ARG_KEY_SELECTOR;
exports.ID_ARG_KEY_SELECTOR = ID_ARG_KEY_SELECTOR;
var EMPTY_ARRAY = Object.freeze([]);
exports.EMPTY_ARRAY = EMPTY_ARRAY;

@@ -21,3 +21,3 @@ "use strict";

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

@@ -24,0 +24,0 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

@@ -30,3 +30,3 @@ "use strict";

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

@@ -33,0 +33,0 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

@@ -44,2 +44,8 @@ "use strict";

});
Object.defineProperty(exports, "createSelectorFor", {
enumerable: true,
get: function get() {
return _redux.createSelectorFor;
}
});
Object.defineProperty(exports, "ForeignKey", {

@@ -46,0 +52,0 @@ enumerable: true,

@@ -9,4 +9,11 @@ "use strict";

exports.memoize = memoize;
exports.memoizeByKey = memoizeByKey;
exports.eqCheck = void 0;
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));

@@ -18,2 +25,12 @@

function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var defaultEqualityCheck = function defaultEqualityCheck(a, b) {

@@ -88,2 +105,43 @@ return a === b;

};
var MEMOIZATION_STATE_KEY = "@@_______REDUX_ORM_MEMOIZATION_STATE";
var MEMOIZATION_STATE = {
/* Result of the previous function call */
result: null,
/**
* Snapshot of the previous database.
*
* Lets us know how the tables looked like
* during the previous function call.
*/
ormState: null,
/**
* Names of models whose tables have been scanned completely
* during previous function call (contains only model names)
* Format example: ['Book']
*/
fullTableScannedModels: [],
/**
* Map of which model instances have been accessed
* during previous function call.
* Contains only PKs of accessed instances.
* Format example: { Book: { 1: true, 3: true } }
*/
accessedInstances: {},
/**
* Map of which attribute indexes have been accessed
* during previous function call.
* Contains only attributes that were actually filtered on.
* Author.withId(3).books would add 3 to the authorId index below.
* Format example: { Book: { authorId: [1, 2], publisherId: [5] } }
*/
accessedIndexes: {},
/* Whether the selector has been called */
calledBefore: false
};
/**

@@ -125,4 +183,2 @@ * A memoizer to use with redux-orm

* @param {Function} func - function to memoize
* @param {Function} argEqualityCheck - equality check function to use with normal
* selector args
* @param {ORM} orm - a redux-orm ORM instance

@@ -132,48 +188,119 @@ * @return {Function} `func` memoized.

function memoize(func, orm) {
var previous = _objectSpread(_objectSpread({}, MEMOIZATION_STATE), {}, {
args: null
});
function memoize(func) {
var argEqualityCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultEqualityCheck;
var orm = arguments.length > 2 ? arguments[2] : undefined;
var previous = {
/* Result of the previous function call */
result: null,
return function () {
for (var _len = arguments.length, stateAndArgs = new Array(_len), _key = 0; _key < _len; _key++) {
stateAndArgs[_key] = arguments[_key];
}
/* Arguments to the previous function call (excluding ORM state) */
args: null,
/**
* Snapshot of the previous database.
*
* Lets us know how the tables looked like
* during the previous function call.
* The first argument to this function needs to be
* the ORM's reducer state in the user's Redux store.
*/
ormState: null,
var ormState = stateAndArgs[0],
args = stateAndArgs.slice(1);
if (previous.calledBefore && argsAreEqual(previous.args, args, defaultEqualityCheck) && fullTableScannedModelsAreEqual(previous, ormState) && accessedIndexesAreEqual(previous, ormState) && accessedModelInstancesAreEqual(previous, ormState, orm)) {
/**
* None of this selector's dependencies have changed
* since the last time that we called it.
*/
return previous.result;
}
/**
* Names of models whose tables have been scanned completely
* during previous function call (contains only model names)
* Format example: ['Book']
* Start a session so that the selector can access the database.
* Make this session immutable. This way we can find out if
* the operations that the selector performs are cacheable.
*/
fullTableScannedModels: [],
var session = orm.session(ormState);
/* Replace all ORM state arguments by the session above */
var argsWithSession = args.map(function (arg) {
return isOrmState(arg) ? session : arg;
});
/* This is where we call the actual function */
var result = func.apply(null, argsWithSession); // eslint-disable-line prefer-spread
/**
* Map of which model instances have been accessed
* during previous function call.
* Contains only PKs of accessed instances.
* Format example: { Book: { 1: true, 3: true } }
* The metadata for the previous call are no longer valid.
* Update cached values.
*/
accessedInstances: {},
/**
* Map of which attribute indexes have been accessed
* during previous function call.
* Contains only attributes that were actually filtered on.
* Author.withId(3).books would add 3 to the authorId index below.
* Format example: { Book: { authorId: [1, 2], publisherId: [5] } }
*/
accessedIndexes: {}
previous.result = result;
previous.args = args;
/* Redux state slice for session.state */
previous.ormState = ormState;
/* Rows retrieved by resolved primary key */
previous.accessedInstances = session.accessedModelInstances;
/* Foreign key indexes that were used to speed up queries */
previous.accessedIndexes = session.accessedIndexes;
/* Tables that had to be scanned completely */
previous.fullTableScannedModels = session.fullTableScannedModels;
/* Whether the selector has been called */
previous.calledBefore = true;
return result;
};
}
var PreviousCalls = /*#__PURE__*/function (_Map) {
(0, _inheritsLoose2["default"])(PreviousCalls, _Map);
function PreviousCalls() {
return _Map.apply(this, arguments) || this;
}
var _proto = PreviousCalls.prototype;
_proto.getFromCacheKeys = function getFromCacheKeys(cacheKeys) {
var level = this;
var _iterator = _createForOfIteratorHelper(cacheKeys),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var key = _step.value;
if (level.has(key)) {
level = level.get(key);
continue;
}
var newLevel = new Map([[MEMOIZATION_STATE_KEY, _objectSpread({}, MEMOIZATION_STATE)]]);
level.set(key, newLevel);
level = newLevel;
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return level;
};
_proto.getState = function getState(cacheKeys) {
var call = this.getFromCacheKeys(cacheKeys);
return call ? call.get(MEMOIZATION_STATE_KEY) : null;
};
return PreviousCalls;
}( /*#__PURE__*/(0, _wrapNativeSuper2["default"])(Map));
function memoizeByKey(func, orm, ignoreDependenciesCount) {
var previousCalls = new PreviousCalls([[MEMOIZATION_STATE_KEY, _objectSpread({}, MEMOIZATION_STATE)]]);
return function () {
for (var _len = arguments.length, stateAndArgs = new Array(_len), _key = 0; _key < _len; _key++) {
stateAndArgs[_key] = arguments[_key];
for (var _len2 = arguments.length, stateAndKeysAndArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
stateAndKeysAndArgs[_key2] = arguments[_key2];
}

@@ -185,7 +312,11 @@

*/
var ormState = stateAndArgs[0],
args = stateAndArgs.slice(1);
var selectorWasCalledBefore = Boolean(previous.args);
var ormState = stateAndKeysAndArgs[0],
cacheKeys = stateAndKeysAndArgs[1],
args = stateAndKeysAndArgs.slice(2);
/** Ignore the first `ignoreDependenciesCount` dependencies. */
if (selectorWasCalledBefore && argsAreEqual(previous.args, args, argEqualityCheck) && fullTableScannedModelsAreEqual(previous, ormState) && accessedIndexesAreEqual(previous, ormState) && accessedModelInstancesAreEqual(previous, ormState, orm)) {
var argsToCompare = args.slice(Math.max(0, ignoreDependenciesCount));
var previous = previousCalls.getState([cacheKeys]);
if (previous.calledBefore && argsAreEqual(previous.argsToCompare, argsToCompare, defaultEqualityCheck) && fullTableScannedModelsAreEqual(previous, ormState) && accessedIndexesAreEqual(previous, ormState) && accessedModelInstancesAreEqual(previous, ormState, orm)) {
/**

@@ -219,23 +350,21 @@ * None of this selector's dependencies have changed

previous = {
/* Arguments that were passed to the selector */
args: args,
previous.result = result;
/* Redux state slice for session.state */
/* Selector result */
result: result,
previous.ormState = ormState;
/* Rows retrieved by resolved primary key */
/* Redux state slice for session.state */
ormState: ormState,
previous.accessedInstances = session.accessedModelInstances;
/* Foreign key indexes that were used to speed up queries */
/* Rows retrieved by resolved primary key */
accessedInstances: session.accessedModelInstances,
previous.accessedIndexes = session.accessedIndexes;
/* Tables that had to be scanned completely */
/* Foreign key indexes that were used to speed up queries */
accessedIndexes: session.accessedIndexes,
previous.fullTableScannedModels = session.fullTableScannedModels;
/* Whether the selector has been called */
/* Tables that had to be scanned completely */
fullTableScannedModels: session.fullTableScannedModels
};
previous.calledBefore = true;
previous.argsToCompare = argsToCompare;
return result;
};
}

@@ -34,3 +34,3 @@ "use strict";

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

@@ -37,0 +37,0 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

@@ -39,3 +39,3 @@ "use strict";

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

@@ -42,0 +42,0 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

@@ -20,3 +20,3 @@ "use strict";

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

@@ -96,3 +96,9 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

_proto.toRefArray = function toRefArray() {
return this._evaluate();
var arr = this._evaluate();
if (arr.length === 0) {
return _constants.EMPTY_ARRAY;
}
return arr;
}

@@ -107,3 +113,10 @@ /**

var ModelClass = this.modelClass;
return this._evaluate().map(function (props) {
var arr = this._evaluate();
if (arr.length === 0) {
return _constants.EMPTY_ARRAY;
}
return arr.map(function (props) {
return new ModelClass(props);

@@ -110,0 +123,0 @@ });

"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

@@ -13,11 +11,10 @@

exports.createSelector = createSelector;
exports.createSelectorFor = createSelectorFor;
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _reselect = require("reselect");
var _reReselect = _interopRequireWildcard(require("re-reselect"));
var _memoize = require("./memoize");

@@ -31,2 +28,10 @@

var _ModelSelectorSpec = _interopRequireDefault(require("./selectors/ModelSelectorSpec"));
var _ModelBasedSelectorSpec = _interopRequireDefault(require("./selectors/ModelBasedSelectorSpec"));
var _idArgSelector = _interopRequireDefault(require("./selectors/idArgSelector"));
var _constants = require("./constants");
/**

@@ -71,2 +76,4 @@ * @module redux

/**
* Turns a selector specification into its corresponding selector function.
*
* @private

@@ -80,13 +87,115 @@ * @param {SelectorSpec} spec

var parentSelector = createSelectorFromSpec(spec.parent);
return spec.createResultFunc(parentSelector);
var resultFunc = spec.createResultFunc(parentSelector);
return function (state, idArg) {
return resultFunc.call(spec, state, null, idArg);
};
}
return (0, _reReselect["default"])(spec.dependencies, spec.resultFunc)({
keySelector: spec.keySelector,
cacheObject: new _reReselect.FlatMapCache(),
selectorCreator: createSelector // eslint-disable-line no-use-before-define
if (spec instanceof _ModelSelectorSpec["default"] || spec instanceof _ModelBasedSelectorSpec["default"]) {
var modelSpec = spec.orm[spec.model.modelName];
return (0, _reselect.createSelectorCreator)(_memoize.memoizeByKey, spec.orm, spec.dependencies.length)([spec.orm.stateSelector, _idArgSelector["default"]].concat((0, _toConsumableArray2["default"])(spec.dependencies.map(toSelectorFor(modelSpec)))), function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
});
return spec.resultFunc.apply(spec, args);
});
}
throw new Error("Unknown selector spec");
}
/**
* Turns a selector specification into its corresponding selector function.
*
* @param {ModelSelectorSpec|ModelBasedSelectorSpec}
* @private
* @param {SelectorSpec} spec
*/
function createSelectorFromSpecFor(modelOrModelBasedSpec) {
if (!(modelOrModelBasedSpec instanceof _ModelSelectorSpec["default"]) && !(modelOrModelBasedSpec instanceof _ModelBasedSelectorSpec["default"])) {
throw new Error("createSelectorFromSpecFor requires a ModelSelectorSpec or a ModelBasedSelectorSpec as its sole argument.");
}
var orm = modelOrModelBasedSpec.orm,
modelName = modelOrModelBasedSpec.model.modelName;
var modelSpec = orm[modelName];
return function (spec) {
if (!spec || !(spec instanceof _ModelSelectorSpec["default"] || spec instanceof _ModelBasedSelectorSpec["default"])) {
throw new Error("createSelectorFromSpecFor(X)(Y) requires Y to be a ModelSelectorSpec or a ModelBasedSelectorSpec.");
}
if (!spec.modelIs(modelName)) {
/**
* This causes user arguments not to affect the dependency.
* So arguments meant for the model-based selector `spec` don't also get
* passed to other model-based selector dependencies.
*
* Example:
* const similarAuthors = createSelectorFor(orm.Book)(
* orm.Book.genre,
* orm.Author,
* (genre, allAuthors) =>
* allAuthors.books.filter({ genre }).count() > 0
* );
*
* This causes `similarAuthors(state, 1)` to only resolve
* the genre of the book with ID 1, but not the author with ID 1.
* Instead, the `orm.Author` resultFunc will receive no arguments.
*/
var selector = toSelector(arg);
return function (state) {
return selector(state);
};
}
if (spec instanceof _MapSelectorSpec["default"]) {
var parentToModelName = spec.parent.toModelName;
var parentToModelSpec = orm[parentToModelName];
spec.selector = toSelectorFor(parentToModelSpec)(spec.selector);
return (0, _reselect.createSelectorCreator)(_memoize.memoizeByKey, spec.orm, 3)([orm.stateSelector, _idArgSelector["default"], function (state) {
return state;
}, orm.stateSelector, _idArgSelector["default"]], function (state, session, idArg) {
var parentResult = spec.parent.resultFunc(state, session, idArg);
if (parentResult === null) {
return null;
}
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return parentResult.map(function (refArray) {
return refArray === null ? null : refArray.map(function (parentRef) {
return parentRef === null ? null : spec.valueForRef(parentRef, session, state);
});
});
}
return parentResult.map(function (ref) {
return ref === null ? null : spec.valueForRef(ref, session, state);
});
});
} // Map arg.resultFunc by model using arg.modelSelectorSpec
return (0, _reselect.createSelectorCreator)(_memoize.memoizeByKey, orm, 3)([orm.stateSelector, _idArgSelector["default"], function (state) {
return state;
}, orm.stateSelector, _idArgSelector["default"]], function (state, session, idArg) {
var refOrRefs = modelSpec.resultFunc(state, session, idArg);
if (refOrRefs === null) {
return null;
}
if (Array.isArray(refOrRefs)) {
return refOrRefs.map(function (ref) {
return ref === null ? null : spec.valueForRef(ref, session, state);
});
}
return spec.valueForRef(refOrRefs, session, state);
});
};
}
/**
* Tries to find ORM instance using the argument.

@@ -114,4 +223,14 @@ * @private

/**
* Turns any argument into a selector function if possible.
*
* ORM instances become functions returning the ORM's state.
*
* Selector specs become actual selector functions. If possible
* their cached version is retrieved instead of creating new ones.
* Ordinary functions are kept the same.
*
* @private
* @param {function|ORM|SelectorSpec} arg
* @return {function}
* @throws {Error} if argument is invalid
*/

@@ -176,2 +295,28 @@

}
function toSelectorFor(spec) {
if (!(spec instanceof _ModelSelectorSpec["default"])) {
throw new Error("`toSelectorFor(orm.Model)` takes a model selector spec as its single argument.");
}
return function (arg) {
if (typeof arg === "function") {
return arg;
}
if (arg instanceof _ORM.ORM) {
return arg.stateSelector;
}
if (arg instanceof _ModelSelectorSpec["default"] || arg instanceof _ModelBasedSelectorSpec["default"]) {
return createSelectorFromSpecFor(spec)(arg);
}
/**
* All other args are treated as regular selectors.
*/
return toSelector(arg);
};
}
/**

@@ -257,4 +402,4 @@ * Returns a memoized selector based on passed arguments.

function createSelector() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}

@@ -280,3 +425,3 @@

return (0, _reselect.createSelectorCreator)(_memoize.memoize, undefined, orm)([orm.stateSelector].concat((0, _toConsumableArray2["default"])(inputFuncs)), resultArg);
return (0, _reselect.createSelectorCreator)(_memoize.memoize, orm)([orm.stateSelector].concat((0, _toConsumableArray2["default"])(inputFuncs)), resultArg);
}

@@ -293,2 +438,83 @@

return toSelector(resultArg);
}
/**
* Creates a selector whose results will be cached by the second argument
* passed to it.
*/
function createSelectorFor(spec) {
if (!spec) {
throw new Error("`createSelectorFor()` takes one argument of the form `orm.Model`, e.g. `orm.Book`.");
}
if (!(spec instanceof _ModelSelectorSpec["default"])) {
throw new Error("The argument you passed to `createSelectorFor(orm.Model)` must be a model selector specification, e.g. `orm.Book`.");
}
return function () {
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
if (!args.length) {
throw new Error("Cannot create a selector without arguments.");
}
var resultArg = args.pop();
var dependencies = Array.isArray(args[0]) ? args[0] : args;
var orm = spec.orm;
var inputFuncs = dependencies.map(toSelectorFor(spec));
if (typeof resultArg === "function") {
if (!orm.stateSelector) {
throw new Error("Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function.");
} else if (typeof orm.stateSelector !== "function") {
throw new Error("Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's `stateSelector`. Received: ".concat(JSON.stringify(orm.stateSelector), " of type ").concat((0, _typeof2["default"])(orm.stateSelector)));
}
var dependencyIsForModelRef = dependencies.map(function (dep) {
return typeof dep === "function" && dep.hasOwnProperty(_constants.KEYED_SELECTOR_MARKER) && dep[_constants.KEYED_SELECTOR_MARKER] === spec.model.modelName || (dep instanceof _ModelSelectorSpec["default"] || dep instanceof _ModelBasedSelectorSpec["default"]) && dep.modelIs(spec.model.modelName);
});
var selector = (0, _reselect.createSelectorCreator)(_memoize.memoizeByKey, orm, // the additional argument refOrRefs to be ignored
2)([// for wrapping the selector in a session
orm.stateSelector, // idArg for cache key
_idArgSelector["default"], // returns refOrRefs below
_idArgSelector["default"], toSelector(spec)].concat((0, _toConsumableArray2["default"])(inputFuncs)), function (idArg, refOrRefs) {
for (var _len4 = arguments.length, args = new Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) {
args[_key4 - 2] = arguments[_key4];
}
if (refOrRefs === null) {
return null;
}
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return refOrRefs.map(function (ref, refIdx) {
if (ref === null) {
return null;
}
return resultArg.apply(null, args.map(function (arg, i) {
return dependencyIsForModelRef[i] ? arg[refIdx] : arg;
}));
});
}
return resultArg.apply(null, args);
});
selector[_constants.KEYED_SELECTOR_MARKER] = spec.model.modelName;
return selector;
}
if (resultArg instanceof _ORM.ORM) {
throw new Error("ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelectorFor()`.");
}
if (inputFuncs.length) {
console.warn("Your input selectors will be ignored: the passed result function does not require any input.");
}
return toSelector(resultArg);
};
}

@@ -24,4 +24,2 @@ "use strict";

var _idArgSelector = _interopRequireDefault(require("./idArgSelector"));
var _QuerySet = _interopRequireDefault(require("../QuerySet"));

@@ -56,3 +54,3 @@

_proto.valueForInstance = function valueForInstance(instance, session) {
_proto.valueForInstance = function valueForInstance(instance, session, state) {
if (!instance) {

@@ -71,3 +69,3 @@ return null;

var parentRef = this._parent.valueForInstance(instance, session);
var parentRef = this._parent.valueForInstance(instance, session, state);

@@ -123,7 +121,2 @@ var parentInstance = parentRef ? new ParentToModel(parentRef) : null;

}, {
key: "dependencies",
get: function get() {
return [this._orm, _idArgSelector["default"]];
}
}, {
key: "toModelName",

@@ -130,0 +123,0 @@ get: function get() {

@@ -18,4 +18,2 @@ "use strict";

var _idArgSelector = _interopRequireDefault(require("./idArgSelector"));
var MapSelectorSpec = /*#__PURE__*/function (_ModelBasedSelectorSp) {

@@ -35,14 +33,11 @@ (0, _inheritsLoose2["default"])(MapSelectorSpec, _ModelBasedSelectorSp);

}
/** Result for createSelectorFromSpec, not createSelectorFromSpecFor! */
var _proto = MapSelectorSpec.prototype;
_proto.createResultFunc = function createResultFunc(parentSelector) {
var _this2 = this;
return function mapSelectorResult(state, _session, idArg) {
var _this2 = this;
var idAttribute = this._parent.toModel.idAttribute;
return function (state) {
for (var _len = arguments.length, other = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
other[_key - 1] = arguments[_key];
}
/**

@@ -53,25 +48,27 @@ * The parent selector should return a ref array

*/
var parentResult = parentSelector.apply(void 0, [state].concat(other));
var parentResult = parentSelector(state, idArg);
var idArg = _idArgSelector["default"].apply(void 0, [state].concat(other));
if (parentResult === null) {
return null;
}
var single = function single(refArray) {
if (refArray === null) {
// an intermediate field could not be resolved
return null;
}
return refArray.map(function (ref) {
return _this2._selector(state, ref[idAttribute]);
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return parentResult.map(function (refArray) {
return refArray === null ? null : refArray.map(function (ref) {
return ref === null ? null : _this2.valueForRef(ref, null, state);
});
});
};
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return parentResult.map(single);
}
return single(parentResult);
return parentResult.map(function (ref) {
return _this2.valueForRef(ref, null, state);
});
};
};
_proto.valueForRef = function valueForRef(ref, _session, state) {
var idAttribute = this._parent.toModel.idAttribute;
return this._selector(state, ref[idAttribute]);
};
(0, _createClass2["default"])(MapSelectorSpec, [{

@@ -78,0 +75,0 @@ key: "selector",

@@ -18,2 +18,7 @@ "use strict";

var _idArgSelector = _interopRequireDefault(require("./idArgSelector"));
/**
* @abstract
*/
var ModelBasedSelectorSpec = /*#__PURE__*/function (_SelectorSpec) {

@@ -32,17 +37,36 @@ (0, _inheritsLoose2["default"])(ModelBasedSelectorSpec, _SelectorSpec);

var _proto = ModelBasedSelectorSpec.prototype;
/** @abstract */
_proto.valueForInstance = function valueForInstance(_instance, _session, _state) {
throw new Error("Not implemented");
};
_proto.valueForRef = function valueForRef(ref, session, state) {
var ModelClass = session[this._model.modelName];
return this.valueForInstance(ModelClass.withId(ref[ModelClass.idAttribute]), session, state);
};
_proto.modelIs = function modelIs(modelName) {
return modelName === this._model.modelName;
};
(0, _createClass2["default"])(ModelBasedSelectorSpec, [{
key: "dependencies",
get: function get() {
return [function (state) {
return state;
}, this._orm, _idArgSelector["default"]];
}
}, {
key: "resultFunc",
get: function get() {
var _this2 = this;
return function modelBasedSelectorResult(state, session, idArg) {
var _this2 = this;
return function (session, idArg) {
for (var _len = arguments.length, other = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
other[_key - 2] = arguments[_key];
}
var ModelClass = session[this._model.modelName];
var ModelClass = session[_this2._model.modelName];
if (typeof idArg === "undefined") {
return ModelClass.all().toModelArray().map(function (instance) {
return _this2.valueForInstance.apply(_this2, [instance, session].concat(other));
return _this2.valueForInstance(instance, session, state);
});

@@ -53,7 +77,7 @@ }

return idArg.map(function (id) {
return _this2.valueForInstance.apply(_this2, [ModelClass.withId(id), session].concat(other));
return _this2.valueForInstance(ModelClass.withId(id), session, state);
});
}
return _this2.valueForInstance.apply(_this2, [ModelClass.withId(idArg), session].concat(other));
return this.valueForInstance(ModelClass.withId(idArg), session, state);
};

@@ -60,0 +84,0 @@ }

@@ -33,2 +33,12 @@ "use strict";

var _proto = ModelSelectorSpec.prototype;
_proto.valueForRef = function valueForRef(ref, _session) {
return ref;
};
_proto.modelIs = function modelIs(modelName) {
return modelName === this._model.modelName;
};
(0, _createClass2["default"])(ModelSelectorSpec, [{

@@ -42,3 +52,5 @@ key: "key",

get: function get() {
return [this._orm, _idArgSelector["default"]];
return [function (state) {
return state;
}, this._orm, _idArgSelector["default"]];
}

@@ -48,7 +60,5 @@ }, {

get: function get() {
var _this2 = this;
return function modelSelectorResult(_state, session, idArg) {
var ModelClass = session[this._model.modelName];
return function (_ref2, idArg) {
var ModelClass = _ref2[_this2._model.modelName];
if (typeof idArg === "undefined") {

@@ -55,0 +65,0 @@ return ModelClass.all().toRefArray();

{
"name": "redux-orm",
"version": "0.16.2",
"version": "0.17.0-rc.0",
"description": "Simple ORM to manage and query your state trees",
"main": "lib/index.js",
"module": "es/index.js",
"jsnext:main": "src/index.js",
"jsnext:main": "jsnext/index.js",
"types": "types/index.d.ts",
"sideEffects": false,

@@ -14,4 +15,7 @@ "scripts": {

"test:perf": "jest --config=jest.perf.config.js",
"transpile:cjs": "cross-env BABEL_ENV=cjs babel src --out-dir lib --ignore */test",
"transpile:es": "cross-env BABEL_ENV=es babel src --out-dir es --ignore */test",
"transpile": "run-p transpile:*",
"transpile:cjs": "cross-env BABEL_ENV=cjs babel src --out-dir lib --extensions .js,.ts --ignore */test,**/*.d.ts",
"transpile:es": "cross-env BABEL_ENV=es babel src --out-dir es --extensions .js,.ts --ignore */test,**/*.d.ts",
"transpile:jsnext": "cross-env BABEL_ENV=jsnext babel src --out-dir jsnext --extensions .js,.ts --ignore */test,**/*.d.ts",
"transpile:types": "cross-env BABEL_ENV=cjs babel src --out-dir types --extensions .ts --ignore */test --keep-file-extension",
"build:umd": "webpack --config webpack.dev.js",

@@ -21,13 +25,17 @@ "build:umd:min": "webpack --config webpack.prod.js",

"build:api-docs": "gulp api-docs",
"build": "npm run clean && npm run transpile:cjs && npm run transpile:es && npm run build:umd && npm run build:umd:min && npm run build:docs",
"pub": "npm run ensure-clean-tree && npm run ensure-version-not-published && npm run lint && npm run test && npm run build && npm run test:es5 && npm publish && git push origin && npm run clean",
"pub:next": "npm run ensure-clean-tree && npm run ensure-version-not-published && npm run lint && npm run test && npm run build && npm run test:es5 && npm publish --tag next && git push origin && npm run clean",
"build": "run-s clean transpile && run-p build:umd build:umd:min",
"pub": "run-s ensure-clean-tree ensure-version-not-published lint test build test:es5 && npm publish && git push origin && npm run clean",
"pub:next": "run-s ensure-clean-tree ensure-version-not-published lint test build test:es5 && npm publish --tag next && git push origin && npm run clean",
"ensure-version-not-published": "[ -z \"$(npm info $(npm list | head -n 1 | cut -d ' ' -f1) 2> /dev/null)\" ] || (echo \"Error: $(npm list | head -n 1 | cut -d ' ' -f1) has already been published.\" && false)",
"ensure-clean-tree": "[ -z \"$(git status -s)\" ] || (echo \"Error: There are uncommitted changes in the git repostory.\" && false)",
"lint": "eslint src",
"clean": "rimraf lib es dist docs coverage"
"lint": "run-p lint:*",
"lint:es": "eslint src",
"lint:dts": "dtslint src --expectOnly",
"clean": "rimraf lib es jsnext types dist docs coverage"
},
"keywords": [
"redux",
"orm"
"orm",
"state",
"immutable"
],

@@ -45,56 +53,64 @@ "author": "Tommi Kaikkonen <tommi.kaikkonen@aalto.fi>",

"devDependencies": {
"@babel/cli": "^7.10.5",
"@babel/core": "^7.11.1",
"@babel/plugin-proposal-class-properties": "^7.10.4",
"@babel/plugin-proposal-decorators": "^7.10.5",
"@babel/plugin-proposal-export-namespace-from": "^7.10.4",
"@babel/plugin-proposal-function-sent": "^7.10.4",
"@babel/plugin-proposal-json-strings": "^7.10.4",
"@babel/plugin-proposal-numeric-separator": "^7.10.4",
"@babel/plugin-proposal-throw-expressions": "^7.10.4",
"@babel/cli": "^7.13.0",
"@babel/core": "^7.13.8",
"@babel/plugin-proposal-class-properties": "^7.13.0",
"@babel/plugin-proposal-decorators": "^7.13.5",
"@babel/plugin-proposal-export-namespace-from": "^7.12.13",
"@babel/plugin-proposal-function-sent": "^7.12.13",
"@babel/plugin-proposal-json-strings": "^7.13.8",
"@babel/plugin-proposal-numeric-separator": "^7.12.13",
"@babel/plugin-proposal-throw-expressions": "^7.12.13",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-syntax-import-meta": "^7.10.4",
"@babel/plugin-transform-classes": "^7.10.4",
"@babel/plugin-transform-destructuring": "^7.10.4",
"@babel/plugin-transform-modules-commonjs": "^7.10.4",
"@babel/plugin-transform-runtime": "^7.11.0",
"@babel/preset-env": "^7.11.0",
"@babel/register": "^7.10.5",
"@types/jsdoc-to-markdown": "^4.0.0",
"@babel/plugin-transform-classes": "^7.13.0",
"@babel/plugin-transform-destructuring": "^7.13.0",
"@babel/plugin-transform-modules-commonjs": "^7.13.8",
"@babel/plugin-transform-runtime": "^7.13.9",
"@babel/preset-env": "^7.13.9",
"@babel/preset-typescript": "^7.13.0",
"@babel/register": "^7.13.8",
"@types/jest": "^26.0.23",
"@types/jsdoc-to-markdown": "^6.0.0",
"@typescript-eslint/eslint-plugin": "^4.22.1",
"@typescript-eslint/parser": "^4.22.1",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "^10.1.0",
"babel-jest": "^24.9.0",
"babel-loader": "^8.1.0",
"babel-jest": "^26.6.3",
"babel-loader": "^8.2.2",
"babel-plugin-lodash": "^3.3.4",
"codecov": "^3.6.1",
"cross-env": "^6.0.3",
"codecov": "^3.8.1",
"cross-env": "^7.0.3",
"deep-freeze": "0.0.1",
"eslint": "^6.8.0",
"eslint-config-airbnb-base": "^14.0.0",
"eslint-config-prettier": "^6.9.0",
"eslint-plugin-import": "^2.20.0",
"eslint-plugin-jest": "^23.6.0",
"eslint-plugin-prettier": "^3.1.2",
"dtslint": "^4.0.9",
"eslint": "^7.25.0",
"eslint-config-airbnb-base": "^14.2.1",
"eslint-config-prettier": "^6.15.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jest": "^23.20.0",
"eslint-plugin-prettier": "^3.3.1",
"gulp": "^4.0.2",
"gulp-clean": "^0.4.0",
"jest": "^24.9.0",
"jest-cli": "^24.9.0",
"jsdoc": "^3.6.3",
"jsdoc-to-markdown": "^5.0.3",
"lodash-webpack-plugin": "^0.11.5",
"prettier": "^1.19.1",
"jest": "^26.6.3",
"jest-cli": "^26.6.3",
"jsdoc": "^3.6.6",
"jsdoc-to-markdown": "^6.0.1",
"lodash-webpack-plugin": "^0.11.6",
"npm-run-all": "^4.1.5",
"prettier": "^2.2.1",
"redux": "^4.0.5",
"redux-persist": "^6.0.0",
"rimraf": "^3.0.0",
"webpack": "^4.41.5",
"webpack-cli": "^3.3.10",
"webpack-merge": "^4.2.2"
"rimraf": "^3.0.2",
"ts-jest": "^26.5.5",
"typescript": "^4.2.4",
"webpack": "^4.46.0",
"webpack-cli": "^3.3.12",
"webpack-merge": "^5.7.3"
},
"dependencies": {
"@babel/runtime": "^7.11.2",
"@babel/runtime": "^7.13.9",
"immutable-ops": "^0.7.0",
"lodash": "^4.17.15",
"re-reselect": "^3.4.0",
"lodash": "^4.17.21",
"re-reselect": "^4.0.0",
"reselect": "^3.0.1"
}
}

@@ -14,2 +14,4 @@ export const UPDATE = "REDUX_ORM_UPDATE";

export const STATE_FLAG = "@@_______REDUX_ORM_STATE_FLAG";
// for detecting keyed selectors and storing the corresponding model
export const KEYED_SELECTOR_MARKER = "@@_______REDUX_ORM_KEYED_SELECTOR";

@@ -20,1 +22,3 @@ // for caching selectors based on their ID argument

typeof idArg === "undefined" ? ALL_INSTANCES : idArg;
export const EMPTY_ARRAY = Object.freeze([]);

@@ -108,3 +108,3 @@ import ops from "immutable-ops";

// Used to inspect the schema.
describe: tableName => tables[tableName],
describe: (tableName) => tables[tableName],
};

@@ -111,0 +111,0 @@ }

@@ -66,3 +66,3 @@ import ops from "immutable-ops";

}
const convert = order => {
const convert = (order) => {
if (["desc", false].includes(order)) {

@@ -111,3 +111,3 @@ return "desc";

const map = branch[this.mapName];
return ids.map(id => map[id]);
return ids.map((id) => map[id]);
}

@@ -149,4 +149,4 @@

const attrIndexes = Object.keys(this.fields)
.filter(attr => attr !== this.idAttribute)
.filter(attr => this.fields[attr].index)
.filter((attr) => attr !== this.idAttribute)
.filter((attr) => this.fields[attr].index)
.reduce(

@@ -187,3 +187,3 @@ (indexes, attr) => ({

const optimallyOrderedClauses = sortBy(clauses, clause => {
const optimallyOrderedClauses = sortBy(clauses, (clause) => {
if (clauseFiltersByAttribute(clause, idAttribute)) {

@@ -351,5 +351,6 @@ return 1;

.filter(
fkAttr => entry.hasOwnProperty(fkAttr) && entry[fkAttr] !== null
(fkAttr) =>
entry.hasOwnProperty(fkAttr) && entry[fkAttr] !== null
)
.map(fkAttr => [fkAttr, entry[fkAttr]]);
.map((fkAttr) => [fkAttr, entry[fkAttr]]);

@@ -435,3 +436,3 @@ if (withMutations) {

const mergeObjInto = row => {
const mergeObjInto = (row) => {
const merge = withMutations

@@ -445,3 +446,3 @@ ? ops.mutable.merge

const indexedAttrs = Object.keys(branch.indexes).filter(attr =>
const indexedAttrs = Object.keys(branch.indexes).filter((attr) =>
mergeObj.hasOwnProperty(attr)

@@ -470,3 +471,3 @@ );

const nextRow = set(id, result, map);
indexedAttrs.forEach(attr => {
indexedAttrs.forEach((attr) => {
const { [attr]: prevValue } = prevAttrValues;

@@ -534,3 +535,3 @@ const { [attr]: nextValue } = nextAttrValues;

batchToken,
rowId => rowId !== id,
(rowId) => rowId !== id,
indexMap[attr][value]

@@ -573,5 +574,5 @@ ),

const idsToDelete = rows.map(row => row[this.idAttribute]);
const idsToDelete = rows.map((row) => row[this.idAttribute]);
if (withMutations) {
idsToDelete.forEach(id => {
idsToDelete.forEach((id) => {
const idx = arr.indexOf(id);

@@ -582,5 +583,5 @@ ops.mutable.splice(idx, 1, [], arr);

// delete ids from all indexes
Object.values(branch.indexes).forEach(attrIndex =>
Object.values(attrIndex).forEach(valueIndex =>
idsToDelete.forEach(id => {
Object.values(branch.indexes).forEach((attrIndex) =>
Object.values(attrIndex).forEach((valueIndex) =>
idsToDelete.forEach((id) => {
const idx = valueIndex.indexOf(id);

@@ -606,3 +607,3 @@ if (idx !== -1) {

batchToken,
id => !idsToDelete.includes(id),
(id) => !idsToDelete.includes(id),
valueIndex

@@ -628,3 +629,3 @@ );

batchToken,
id => !idsToDelete.includes(id),
(id) => !idsToDelete.includes(id),
branch[arrName]

@@ -631,0 +632,0 @@ ),

@@ -169,3 +169,3 @@ import { normalizeEntity } from "./utils";

const referencedOtherIds = new Set(
throughQs.toRefArray().map(obj => obj[otherReferencingField])
throughQs.toRefArray().map((obj) => obj[otherReferencingField])
);

@@ -177,3 +177,3 @@

*/
const qs = OtherModel.filter(otherModelInstance =>
const qs = OtherModel.filter((otherModelInstance) =>
referencedOtherIds.has(

@@ -195,3 +195,3 @@ otherModelInstance[OtherModel.idAttribute]

const existingQs = throughQs.filter(through =>
const existingQs = throughQs.filter((through) =>
idsToAdd.has(through[otherReferencingField])

@@ -203,3 +203,3 @@ );

.toRefArray()
.map(through => through[otherReferencingField]);
.map((through) => through[otherReferencingField]);

@@ -211,3 +211,3 @@ throw new Error(

idsToAdd.forEach(id => {
idsToAdd.forEach((id) => {
ThroughModel.create({

@@ -243,3 +243,3 @@ [otherReferencingField]: id,

const entitiesToDelete = throughQs.filter(through =>
const entitiesToDelete = throughQs.filter((through) =>
idsToRemove.has(through[otherReferencingField])

@@ -252,6 +252,6 @@ );

.toRefArray()
.map(through => through[otherReferencingField]);
.map((through) => through[otherReferencingField]);
const unexistingIds = [...idsToRemove].filter(
id => !entitiesToDeleteIds.includes(id)
(id) => !entitiesToDeleteIds.includes(id)
);

@@ -258,0 +258,0 @@

@@ -101,4 +101,4 @@ import RelationalField from "./RelationalField";

*/
const throughModelFieldReferencing = otherModel =>
Object.keys(throughModel.fields).find(someFieldName =>
const throughModelFieldReferencing = (otherModel) =>
Object.keys(throughModel.fields).find((someFieldName) =>
throughModel.fields[someFieldName].references(otherModel)

@@ -105,0 +105,0 @@ );

@@ -5,3 +5,3 @@ import QuerySet from "./QuerySet";

import Session from "./Session";
import { createReducer, createSelector } from "./redux";
import { createReducer, createSelector, createSelectorFor } from "./redux";
import ForeignKey from "./fields/ForeignKey";

@@ -40,4 +40,5 @@ import ManyToMany from "./fields/ManyToMany";

createSelector,
createSelectorFor,
};
export default Model;

@@ -6,3 +6,3 @@ import { STATE_FLAG } from "./constants";

const isOrmState = arg =>
const isOrmState = (arg) =>
arg && typeof arg === "object" && arg.hasOwnProperty(STATE_FLAG);

@@ -18,3 +18,3 @@

const rowsAreEqual = (ids, rowsA, rowsB) =>
ids.every(id => rowsA[id] === rowsB[id]);
ids.every((id) => rowsA[id] === rowsB[id]);

@@ -46,3 +46,3 @@ const accessedModelInstancesAreEqual = (previous, ormState, orm) => {

values.every(
value =>
(value) =>
previous.ormState[modelName].indexes[column][value] ===

@@ -57,5 +57,41 @@ ormState[modelName].indexes[column][value]

previous.fullTableScannedModels.every(
modelName => previous.ormState[modelName] === ormState[modelName]
(modelName) => previous.ormState[modelName] === ormState[modelName]
);
const MEMOIZATION_STATE_KEY = "@@_______REDUX_ORM_MEMOIZATION_STATE";
const MEMOIZATION_STATE = {
/* Result of the previous function call */
result: null,
/**
* Snapshot of the previous database.
*
* Lets us know how the tables looked like
* during the previous function call.
*/
ormState: null,
/**
* Names of models whose tables have been scanned completely
* during previous function call (contains only model names)
* Format example: ['Book']
*/
fullTableScannedModels: [],
/**
* Map of which model instances have been accessed
* during previous function call.
* Contains only PKs of accessed instances.
* Format example: { Book: { 1: true, 3: true } }
*/
accessedInstances: {},
/**
* Map of which attribute indexes have been accessed
* during previous function call.
* Contains only attributes that were actually filtered on.
* Author.withId(3).books would add 3 to the authorId index below.
* Format example: { Book: { authorId: [1, 2], publisherId: [5] } }
*/
accessedIndexes: {},
/* Whether the selector has been called */
calledBefore: false,
};
/**

@@ -97,44 +133,93 @@ * A memoizer to use with redux-orm

* @param {Function} func - function to memoize
* @param {Function} argEqualityCheck - equality check function to use with normal
* selector args
* @param {ORM} orm - a redux-orm ORM instance
* @return {Function} `func` memoized.
*/
export function memoize(func, argEqualityCheck = defaultEqualityCheck, orm) {
let previous = {
/* Result of the previous function call */
result: null,
/* Arguments to the previous function call (excluding ORM state) */
args: null,
export function memoize(func, orm) {
const previous = { ...MEMOIZATION_STATE, args: null };
return (...stateAndArgs) => {
/**
* Snapshot of the previous database.
*
* Lets us know how the tables looked like
* during the previous function call.
* The first argument to this function needs to be
* the ORM's reducer state in the user's Redux store.
*/
ormState: null,
const [ormState, ...args] = stateAndArgs;
if (
previous.calledBefore &&
argsAreEqual(previous.args, args, defaultEqualityCheck) &&
fullTableScannedModelsAreEqual(previous, ormState) &&
accessedIndexesAreEqual(previous, ormState) &&
accessedModelInstancesAreEqual(previous, ormState, orm)
) {
/**
* None of this selector's dependencies have changed
* since the last time that we called it.
*/
return previous.result;
}
/**
* Names of models whose tables have been scanned completely
* during previous function call (contains only model names)
* Format example: ['Book']
* Start a session so that the selector can access the database.
* Make this session immutable. This way we can find out if
* the operations that the selector performs are cacheable.
*/
fullTableScannedModels: [],
const session = orm.session(ormState);
/* Replace all ORM state arguments by the session above */
const argsWithSession = args.map((arg) =>
isOrmState(arg) ? session : arg
);
/* This is where we call the actual function */
const result = func.apply(null, argsWithSession); // eslint-disable-line prefer-spread
/**
* Map of which model instances have been accessed
* during previous function call.
* Contains only PKs of accessed instances.
* Format example: { Book: { 1: true, 3: true } }
* The metadata for the previous call are no longer valid.
* Update cached values.
*/
accessedInstances: {},
/**
* Map of which attribute indexes have been accessed
* during previous function call.
* Contains only attributes that were actually filtered on.
* Author.withId(3).books would add 3 to the authorId index below.
* Format example: { Book: { authorId: [1, 2], publisherId: [5] } }
*/
accessedIndexes: {},
previous.result = result;
previous.args = args;
/* Redux state slice for session.state */
previous.ormState = ormState;
/* Rows retrieved by resolved primary key */
previous.accessedInstances = session.accessedModelInstances;
/* Foreign key indexes that were used to speed up queries */
previous.accessedIndexes = session.accessedIndexes;
/* Tables that had to be scanned completely */
previous.fullTableScannedModels = session.fullTableScannedModels;
/* Whether the selector has been called */
previous.calledBefore = true;
return result;
};
}
return (...stateAndArgs) => {
class PreviousCalls extends Map {
getFromCacheKeys(cacheKeys) {
let level = this;
for (const key of cacheKeys) {
if (level.has(key)) {
level = level.get(key);
continue;
}
const newLevel = new Map([
[MEMOIZATION_STATE_KEY, { ...MEMOIZATION_STATE }],
]);
level.set(key, newLevel);
level = newLevel;
}
return level;
}
getState(cacheKeys) {
const call = this.getFromCacheKeys(cacheKeys);
return call ? call.get(MEMOIZATION_STATE_KEY) : null;
}
}
export function memoizeByKey(func, orm, ignoreDependenciesCount) {
const previousCalls = new PreviousCalls([
[MEMOIZATION_STATE_KEY, { ...MEMOIZATION_STATE }],
]);
return (...stateAndKeysAndArgs) => {
/**

@@ -144,8 +229,15 @@ * The first argument to this function needs to be

*/
const [ormState, ...args] = stateAndArgs;
const [ormState, cacheKeys, ...args] = stateAndKeysAndArgs;
/** Ignore the first `ignoreDependenciesCount` dependencies. */
const argsToCompare = args.slice(Math.max(0, ignoreDependenciesCount));
const selectorWasCalledBefore = Boolean(previous.args);
const previous = previousCalls.getState([cacheKeys]);
if (
selectorWasCalledBefore &&
argsAreEqual(previous.args, args, argEqualityCheck) &&
previous.calledBefore &&
argsAreEqual(
previous.argsToCompare,
argsToCompare,
defaultEqualityCheck
) &&
fullTableScannedModelsAreEqual(previous, ormState) &&

@@ -169,3 +261,3 @@ accessedIndexesAreEqual(previous, ormState) &&

/* Replace all ORM state arguments by the session above */
const argsWithSession = args.map(arg =>
const argsWithSession = args.map((arg) =>
isOrmState(arg) ? session : arg

@@ -181,16 +273,14 @@ );

*/
previous = {
/* Arguments that were passed to the selector */
args,
/* Selector result */
result,
/* Redux state slice for session.state */
ormState,
/* Rows retrieved by resolved primary key */
accessedInstances: session.accessedModelInstances,
/* Foreign key indexes that were used to speed up queries */
accessedIndexes: session.accessedIndexes,
/* Tables that had to be scanned completely */
fullTableScannedModels: session.fullTableScannedModels,
};
previous.result = result;
/* Redux state slice for session.state */
previous.ormState = ormState;
/* Rows retrieved by resolved primary key */
previous.accessedInstances = session.accessedModelInstances;
/* Foreign key indexes that were used to speed up queries */
previous.accessedIndexes = session.accessedIndexes;
/* Tables that had to be scanned completely */
previous.fullTableScannedModels = session.fullTableScannedModels;
/* Whether the selector has been called */
previous.calledBefore = true;
previous.argsToCompare = argsToCompare;

@@ -197,0 +287,0 @@ return result;

@@ -74,3 +74,3 @@ import Session from "./Session";

Object.keys(propsObj).forEach(fieldName => {
Object.keys(propsObj).forEach((fieldName) => {
// In this case, we got a prop that wasn't defined as a field.

@@ -84,3 +84,3 @@ // Assuming it's an arbitrary data field, making an instance-specific

get: () => this._fields[fieldName],
set: value => this.set(fieldName, value),
set: (value) => this.set(fieldName, value),
configurable: true,

@@ -297,3 +297,3 @@ enumerable: true,

declaredFieldNames.forEach(key => {
declaredFieldNames.forEach((key) => {
const field = this.fields[key];

@@ -326,3 +326,3 @@ const valuePassed = userProps.hasOwnProperty(key);

// add backward many-many if required
declaredVirtualFieldNames.forEach(key => {
declaredVirtualFieldNames.forEach((key) => {
if (!m2mRelations.hasOwnProperty(key)) {

@@ -534,3 +534,3 @@ const field = this.virtualFields[key];

const fields = fieldNames
.map(fieldName => {
.map((fieldName) => {
const field = ThisModel.fields[fieldName];

@@ -540,3 +540,3 @@ if (field instanceof ManyToMany) {

.toModelArray()
.map(model => model.getId());
.map((model) => model.getId());
return `${fieldName}: [${ids.join(", ")}]`;

@@ -706,3 +706,3 @@ }

Object.keys(relations).forEach(name => {
Object.keys(relations).forEach((name) => {
const reverse = !fields.hasOwnProperty(name);

@@ -741,6 +741,6 @@ const field = virtualFields[name];

const currentIds = ThroughModel.filter(
through => through[fromField] === this[ThisModel.idAttribute]
(through) => through[fromField] === this[ThisModel.idAttribute]
)
.toRefArray()
.map(ref => ref[toField]);
.map((ref) => ref[toField]);

@@ -747,0 +747,0 @@ const diffActions = arrayDiffActions(currentIds, normalizedNewIds);

@@ -25,3 +25,3 @@ /* eslint-disable max-classes-per-file */

const RESERVED_TABLE_OPTIONS = ["indexes", "meta"];
const isReservedTableOption = word => RESERVED_TABLE_OPTIONS.includes(word);
const isReservedTableOption = (word) => RESERVED_TABLE_OPTIONS.includes(word);

@@ -72,3 +72,3 @@ /**

register(...models) {
models.forEach(model => {
models.forEach((model) => {
if (model.modelName === undefined) {

@@ -168,3 +168,3 @@ throw new Error(

const found = Object.values(allModels).find(
model => model.modelName === modelName
(model) => model.modelName === modelName
);

@@ -191,3 +191,3 @@

.filter(isReservedTableOption)
.forEach(key => {
.forEach((key) => {
throw new Error(

@@ -246,4 +246,4 @@ `Reserved keyword \`${key}\` used in ${tableName}.options.`

models
.filter(model => !model.isSetUp)
.forEach(model => {
.filter((model) => !model.isSetUp)
.forEach((model) => {
const { fields, modelName, querySetClass } = model;

@@ -250,0 +250,0 @@ Object.entries(fields).forEach(([fieldName, field]) => {

import { normalizeEntity, warnDeprecated, mapValues } from "./utils";
import { UPDATE, DELETE, FILTER, EXCLUDE, ORDER_BY } from "./constants";
import {
UPDATE,
DELETE,
FILTER,
EXCLUDE,
ORDER_BY,
EMPTY_ARRAY,
} from "./constants";

@@ -69,3 +76,7 @@ /**

toRefArray() {
return this._evaluate();
const arr = this._evaluate();
if (arr.length === 0) {
return EMPTY_ARRAY;
}
return arr;
}

@@ -79,3 +90,7 @@

const { modelClass: ModelClass } = this;
return this._evaluate().map(props => new ModelClass(props));
const arr = this._evaluate();
if (arr.length === 0) {
return EMPTY_ARRAY;
}
return arr.map((props) => new ModelClass(props));
}

@@ -292,3 +307,3 @@

this.toModelArray().forEach(
model => model._onDelete() // eslint-disable-line no-underscore-dangle
(model) => model._onDelete() // eslint-disable-line no-underscore-dangle
);

@@ -295,0 +310,0 @@

import { createSelectorCreator } from "reselect";
import createCachedSelector, { FlatMapCache } from "re-reselect";
import { memoize } from "./memoize";
import { memoize, memoizeByKey } from "./memoize";

@@ -9,3 +8,8 @@ import { ORM } from "./ORM";

import MapSelectorSpec from "./selectors/MapSelectorSpec";
import ModelSelectorSpec from "./selectors/ModelSelectorSpec";
import ModelBasedSelectorSpec from "./selectors/ModelBasedSelectorSpec";
import idArgSelector from "./selectors/idArgSelector";
import { KEYED_SELECTOR_MARKER } from "./constants";
/**

@@ -23,3 +27,3 @@ * @module redux

export function defaultUpdater(session, action) {
session.sessionBoundModels.forEach(modelClass => {
session.sessionBoundModels.forEach((modelClass) => {
if (typeof modelClass.reducer === "function") {

@@ -50,2 +54,4 @@ // This calls this.applyUpdate to update this.state

/**
* Turns a selector specification into its corresponding selector function.
*
* @private

@@ -57,15 +63,160 @@ * @param {SelectorSpec} spec

const parentSelector = createSelectorFromSpec(spec.parent);
return spec.createResultFunc(parentSelector);
const resultFunc = spec.createResultFunc(parentSelector);
return (state, idArg) => resultFunc.call(spec, state, null, idArg);
}
return createCachedSelector(
spec.dependencies,
spec.resultFunc
)({
keySelector: spec.keySelector,
cacheObject: new FlatMapCache(),
selectorCreator: createSelector, // eslint-disable-line no-use-before-define
});
if (
spec instanceof ModelSelectorSpec ||
spec instanceof ModelBasedSelectorSpec
) {
const modelSpec = spec.orm[spec.model.modelName];
return createSelectorCreator(
memoizeByKey,
spec.orm,
spec.dependencies.length
)(
[
spec.orm.stateSelector,
idArgSelector,
...spec.dependencies.map(toSelectorFor(modelSpec)),
],
(...args) => spec.resultFunc.apply(spec, args)
);
}
throw new Error("Unknown selector spec");
}
/**
* Turns a selector specification into its corresponding selector function.
*
* @param {ModelSelectorSpec|ModelBasedSelectorSpec}
* @private
* @param {SelectorSpec} spec
*/
function createSelectorFromSpecFor(modelOrModelBasedSpec) {
if (
!(modelOrModelBasedSpec instanceof ModelSelectorSpec) &&
!(modelOrModelBasedSpec instanceof ModelBasedSelectorSpec)
) {
throw new Error(
"createSelectorFromSpecFor requires a ModelSelectorSpec or a ModelBasedSelectorSpec as its sole argument."
);
}
const {
orm,
model: { modelName },
} = modelOrModelBasedSpec;
const modelSpec = orm[modelName];
return function (spec) {
if (
!spec ||
!(
spec instanceof ModelSelectorSpec ||
spec instanceof ModelBasedSelectorSpec
)
) {
throw new Error(
"createSelectorFromSpecFor(X)(Y) requires Y to be a ModelSelectorSpec or a ModelBasedSelectorSpec."
);
}
if (!spec.modelIs(modelName)) {
/**
* This causes user arguments not to affect the dependency.
* So arguments meant for the model-based selector `spec` don't also get
* passed to other model-based selector dependencies.
*
* Example:
* const similarAuthors = createSelectorFor(orm.Book)(
* orm.Book.genre,
* orm.Author,
* (genre, allAuthors) =>
* allAuthors.books.filter({ genre }).count() > 0
* );
*
* This causes `similarAuthors(state, 1)` to only resolve
* the genre of the book with ID 1, but not the author with ID 1.
* Instead, the `orm.Author` resultFunc will receive no arguments.
*/
const selector = toSelector(arg);
return (state) => selector(state);
}
if (spec instanceof MapSelectorSpec) {
const parentToModelName = spec.parent.toModelName;
const parentToModelSpec = orm[parentToModelName];
spec.selector = toSelectorFor(parentToModelSpec)(spec.selector);
return createSelectorCreator(
memoizeByKey,
spec.orm,
3
)(
[
orm.stateSelector,
idArgSelector,
(state) => state,
orm.stateSelector,
idArgSelector,
],
(state, session, idArg) => {
const parentResult = spec.parent.resultFunc(
state,
session,
idArg
);
if (parentResult === null) {
return null;
}
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return parentResult.map((refArray) =>
refArray === null
? null
: refArray.map((parentRef) =>
parentRef === null
? null
: spec.valueForRef(
parentRef,
session,
state
)
)
);
}
return parentResult.map((ref) =>
ref === null
? null
: spec.valueForRef(ref, session, state)
);
}
);
}
// Map arg.resultFunc by model using arg.modelSelectorSpec
return createSelectorCreator(
memoizeByKey,
orm,
3
)(
[
orm.stateSelector,
idArgSelector,
(state) => state,
orm.stateSelector,
idArgSelector,
],
(state, session, idArg) => {
const refOrRefs = modelSpec.resultFunc(state, session, idArg);
if (refOrRefs === null) {
return null;
}
if (Array.isArray(refOrRefs)) {
return refOrRefs.map((ref) =>
ref === null
? null
: spec.valueForRef(ref, session, state)
);
}
return spec.valueForRef(refOrRefs, session, state);
}
);
};
}
/**
* Tries to find ORM instance using the argument.

@@ -90,4 +241,14 @@ * @private

/**
* Turns any argument into a selector function if possible.
*
* ORM instances become functions returning the ORM's state.
*
* Selector specs become actual selector functions. If possible
* their cached version is retrieved instead of creating new ones.
* Ordinary functions are kept the same.
*
* @private
* @param {function|ORM|SelectorSpec} arg
* @return {function}
* @throws {Error} if argument is invalid
*/

@@ -147,2 +308,28 @@ function toSelector(arg) {

function toSelectorFor(spec) {
if (!(spec instanceof ModelSelectorSpec)) {
throw new Error(
"`toSelectorFor(orm.Model)` takes a model selector spec as its single argument."
);
}
return function (arg) {
if (typeof arg === "function") {
return arg;
}
if (arg instanceof ORM) {
return arg.stateSelector;
}
if (
arg instanceof ModelSelectorSpec ||
arg instanceof ModelBasedSelectorSpec
) {
return createSelectorFromSpecFor(spec)(arg);
}
/**
* All other args are treated as regular selectors.
*/
return toSelector(arg);
};
}
/**

@@ -253,7 +440,6 @@ * Returns a memoized selector based on passed arguments.

return createSelectorCreator(
memoize,
undefined,
orm
)([orm.stateSelector, ...inputFuncs], resultArg);
return createSelectorCreator(memoize, orm)(
[orm.stateSelector, ...inputFuncs],
resultArg
);
}

@@ -274,1 +460,109 @@

}
/**
* Creates a selector whose results will be cached by the second argument
* passed to it.
*/
export function createSelectorFor(spec) {
if (!spec) {
throw new Error(
"`createSelectorFor()` takes one argument of the form `orm.Model`, e.g. `orm.Book`."
);
}
if (!(spec instanceof ModelSelectorSpec)) {
throw new Error(
"The argument you passed to `createSelectorFor(orm.Model)` must be a model selector specification, e.g. `orm.Book`."
);
}
return function (...args) {
if (!args.length) {
throw new Error("Cannot create a selector without arguments.");
}
const resultArg = args.pop();
const dependencies = Array.isArray(args[0]) ? args[0] : args;
const orm = spec.orm;
const inputFuncs = dependencies.map(toSelectorFor(spec));
if (typeof resultArg === "function") {
if (!orm.stateSelector) {
throw new Error(
"Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function."
);
} else if (typeof orm.stateSelector !== "function") {
throw new Error(
`Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's \`stateSelector\`. Received: ${JSON.stringify(
orm.stateSelector
)} of type ${typeof orm.stateSelector}`
);
}
const dependencyIsForModelRef = dependencies.map(
(dep) =>
(typeof dep === "function" &&
dep.hasOwnProperty(KEYED_SELECTOR_MARKER) &&
dep[KEYED_SELECTOR_MARKER] === spec.model.modelName) ||
((dep instanceof ModelSelectorSpec ||
dep instanceof ModelBasedSelectorSpec) &&
dep.modelIs(spec.model.modelName))
);
const selector = createSelectorCreator(
memoizeByKey,
orm,
// the additional argument refOrRefs to be ignored
2
)(
[
// for wrapping the selector in a session
orm.stateSelector,
// idArg for cache key
idArgSelector,
// returns refOrRefs below
idArgSelector,
toSelector(spec),
// user input functions
...inputFuncs,
],
(idArg, refOrRefs, ...args) => {
if (refOrRefs === null) {
return null;
}
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return refOrRefs.map((ref, refIdx) => {
if (ref === null) {
return null;
}
return resultArg.apply(
null,
args.map((arg, i) =>
dependencyIsForModelRef[i]
? arg[refIdx]
: arg
)
);
});
}
return resultArg.apply(null, args);
}
);
selector[KEYED_SELECTOR_MARKER] = spec.model.modelName;
return selector;
}
if (resultArg instanceof ORM) {
throw new Error(
"ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelectorFor()`."
);
}
if (inputFuncs.length) {
console.warn(
"Your input selectors will be ignored: the passed result function does not require any input."
);
}
return toSelector(resultArg);
};
}

@@ -25,7 +25,3 @@ import MapSelectorSpec from "./MapSelectorSpec";

get dependencies() {
return [this._orm, idArgSelector];
}
valueForInstance(instance, session) {
valueForInstance(instance, session, state) {
if (!instance) {

@@ -41,3 +37,7 @@ return null;

const { [this._parent.toModelName]: ParentToModel } = session;
const parentRef = this._parent.valueForInstance(instance, session);
const parentRef = this._parent.valueForInstance(
instance,
session,
state
);
const parentInstance = parentRef

@@ -44,0 +44,0 @@ ? new ParentToModel(parentRef)

@@ -11,5 +11,5 @@ import ModelBasedSelectorSpec from "./ModelBasedSelectorSpec";

/** Result for createSelectorFromSpec, not createSelectorFromSpecFor! */
createResultFunc(parentSelector) {
const { idAttribute } = this._parent.toModel;
return (state, ...other) => {
return function mapSelectorResult(state, _session, idArg) {
/**

@@ -20,20 +20,28 @@ * The parent selector should return a ref array

*/
const parentResult = parentSelector(state, ...other);
const idArg = idArgSelector(state, ...other);
const single = refArray => {
if (refArray === null) {
// an intermediate field could not be resolved
return null;
}
return refArray.map(ref =>
this._selector(state, ref[idAttribute])
const parentResult = parentSelector(state, idArg);
if (parentResult === null) {
return null;
}
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return parentResult.map((refArray) =>
refArray === null
? null
: refArray.map((ref) =>
ref === null
? null
: this.valueForRef(ref, null, state)
)
);
};
if (typeof idArg === "undefined" || Array.isArray(idArg)) {
return parentResult.map(single);
}
return single(parentResult);
return parentResult.map((ref) =>
this.valueForRef(ref, null, state)
);
};
}
valueForRef(ref, _session, state) {
const { idAttribute } = this._parent.toModel;
return this._selector(state, ref[idAttribute]);
}
get selector() {

@@ -40,0 +48,0 @@ return this._selector;

import SelectorSpec from "./SelectorSpec";
import idArgSelector from "./idArgSelector";
/**
* @abstract
*/
export default class ModelBasedSelectorSpec extends SelectorSpec {

@@ -9,4 +13,8 @@ constructor({ model, ...other }) {

get dependencies() {
return [(state) => state, this._orm, idArgSelector];
}
get resultFunc() {
return (session, idArg, ...other) => {
return function modelBasedSelectorResult(state, session, idArg) {
const { [this._model.modelName]: ModelClass } = session;

@@ -16,13 +24,9 @@ if (typeof idArg === "undefined") {

.toModelArray()
.map(instance =>
this.valueForInstance(instance, session, ...other)
.map((instance) =>
this.valueForInstance(instance, session, state)
);
}
if (Array.isArray(idArg)) {
return idArg.map(id =>
this.valueForInstance(
ModelClass.withId(id),
session,
...other
)
return idArg.map((id) =>
this.valueForInstance(ModelClass.withId(id), session, state)
);

@@ -33,3 +37,3 @@ }

session,
...other
state
);

@@ -39,5 +43,23 @@ };

/** @abstract */
valueForInstance(_instance, _session, _state) {
throw new Error("Not implemented");
}
valueForRef(ref, session, state) {
const { [this._model.modelName]: ModelClass } = session;
return this.valueForInstance(
ModelClass.withId(ref[ModelClass.idAttribute]),
session,
state
);
}
get model() {
return this._model;
}
modelIs(modelName) {
return modelName === this._model.modelName;
}
}

@@ -15,7 +15,8 @@ import SelectorSpec from "./SelectorSpec";

get dependencies() {
return [this._orm, idArgSelector];
return [(state) => state, this._orm, idArgSelector];
}
get resultFunc() {
return ({ [this._model.modelName]: ModelClass }, idArg) => {
return function modelSelectorResult(_state, session, idArg) {
const { [this._model.modelName]: ModelClass } = session;
if (typeof idArg === "undefined") {

@@ -25,3 +26,3 @@ return ModelClass.all().toRefArray();

if (Array.isArray(idArg)) {
return idArg.map(id => {
return idArg.map((id) => {
const instance = ModelClass.withId(id);

@@ -36,5 +37,13 @@ return instance ? instance.ref : null;

valueForRef(ref, _session) {
return ref;
}
get model() {
return this._model;
}
modelIs(modelName) {
return modelName === this._model.modelName;
}
}

@@ -29,3 +29,3 @@ import { getBatchToken } from "immutable-ops";

this.sessionBoundModels = this.models.map(modelClass => {
this.sessionBoundModels = this.models.map((modelClass) => {
function SessionBoundModel() {

@@ -69,3 +69,3 @@ return Reflect.construct(

}
modelIds.forEach(id => {
modelIds.forEach((id) => {
data.accessedInstances[id] = true;

@@ -175,5 +175,5 @@ });

const { idAttribute } = this[table];
const accessedIds = new Set(rows.map(row => row[idAttribute]));
const accessedIds = new Set(rows.map((row) => row[idAttribute]));
const anyClauseFilteredByPk = clauses.some(clause => {
const anyClauseFilteredByPk = clauses.some((clause) => {
if (!clauseFiltersByAttribute(clause, idAttribute)) {

@@ -192,4 +192,4 @@ return false;

const { indexes } = this.state[table];
clauses.forEach(clause => {
Object.keys(indexes).forEach(attr => {
clauses.forEach((clause) => {
Object.keys(indexes).forEach((attr) => {
if (!clauseFiltersByAttribute(clause, attr)) {

@@ -196,0 +196,0 @@ return;

@@ -102,3 +102,3 @@ import ops from "immutable-ops";

// chain for querySet.
forEachSuperClass(querySetClass, cls => {
forEachSuperClass(querySetClass, (cls) => {
for (let i = 0; i < leftToDefine.length; i++) {

@@ -179,5 +179,5 @@ let defined = false;

function arrayDiffActions(sourceArr, targetArr) {
const itemsInBoth = sourceArr.filter(item => targetArr.includes(item));
const deleteItems = sourceArr.filter(item => !itemsInBoth.includes(item));
const addItems = targetArr.filter(item => !itemsInBoth.includes(item));
const itemsInBoth = sourceArr.filter((item) => targetArr.includes(item));
const deleteItems = sourceArr.filter((item) => !itemsInBoth.includes(item));
const addItems = targetArr.filter((item) => !itemsInBoth.includes(item));

@@ -184,0 +184,0 @@ if (deleteItems.length || addItems.length) {

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc