diff --git a/dist/index.js b/dist/index.js index 8f1a4d4d..a6a6686e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).Nested={})}(this,function(s){"use strict";function a(t,e){for(var n in e)e.hasOwnProperty(n)&&!t.hasOwnProperty(n)&&(t[n]=e[n]);if(2( dest : T, ...sources : Object[] ) : T\nexport function defaults< T >( dest : T, source : Object ) : T {\n for( var name in source ) {\n if( source.hasOwnProperty( name ) && !dest.hasOwnProperty( name ) ) {\n dest[ name ] = source[ name ];\n }\n }\n\n if( arguments.length > 2 ){\n for( let i = 2; i < arguments.length; i++ ){\n const other = arguments[ i ];\n other && defaults( dest, other );\n }\n }\n\n return dest;\n}\n\n/** Check if value is raw JSON */\nexport function isValidJSON( value : any ) : boolean {\n if( value === null ){\n return true;\n }\n\n switch( typeof value ){\n case 'number' :\n case 'string' :\n case 'boolean' :\n return true;\n\n case 'object':\n var proto = Object.getPrototypeOf( value );\n\n if( proto === Object.prototype || proto === Array.prototype ){\n return every( value, isValidJSON );\n }\n }\n\n return false;\n}\n\n/** Get the base class constructor function.\n * @param Class Subclass constructor function.\n * @returns Base class constructor function.\n */\nexport function getBaseClass( Class : Function ) {\n return Object.getPrototypeOf( Class.prototype ).constructor\n}\n\nexport function assignToClassProto( Class, definition : T, ...names : K[] ) : void {\n for( let name of names ){\n const value = definition[ name ];\n value === void 0 || ( Class.prototype[ name ] = value );\n }\n}\n\n/** Checks whenever given object is an empty hash `{}` */\nexport function isEmpty( obj : {} ) : boolean {\n if( obj ){\n for( let key in obj ){\n if( obj.hasOwnProperty( key ) ){\n return false;\n }\n }\n }\n\n return true;\n}\n\nexport type Iteratee = ( value : any, key? : string | number ) => any;\n\nfunction someArray( arr : any[], fun : Iteratee ) : any {\n let result;\n\n for( let i = 0; i < arr.length; i++ ){\n if( result = fun( arr[ i ], i ) ){\n return result;\n }\n }\n}\n\nfunction someObject( obj : {}, fun : Iteratee ) : any {\n let result;\n\n for( let key in obj ){\n if( obj.hasOwnProperty( key ) ){\n if( result = fun( obj[ key ], key ) ){\n return result;\n }\n }\n }\n}\n\n/** Similar to underscore `_.some` */\nexport function some( obj, fun : Iteratee ) : any {\n if( Object.getPrototypeOf( obj ) === ArrayProto ){\n return someArray( obj, fun );\n }\n else{\n return someObject( obj, fun );\n }\n}\n\n/** Similar to underscore `_.every` */\nexport function every( obj : { }, predicate : Iteratee ) : boolean {\n return !some( obj, x => !predicate( x ) );\n}\n\n/** Similar to `getOwnPropertyDescriptor`, but traverse the whole prototype chain. */\nexport function getPropertyDescriptor( obj : {}, prop : string ) : PropertyDescriptor {\n let desc : PropertyDescriptor;\n\n for( let proto = obj; !desc && proto; proto = Object.getPrototypeOf( proto ) ) {\n desc = Object.getOwnPropertyDescriptor( proto, prop );\n }\n\n return desc;\n}\n\n/** Similar to underscore `_.omit` */\nexport function omit( source : {}, ...rest : string[] ) : {}\nexport function omit( source ) : {} {\n const dest = {}, discard = {};\n\n for( let i = 1; i < arguments.length; i ++ ){\n discard[ arguments[ i ] ] = true;\n }\n\n for( var name in source ) {\n if( !discard.hasOwnProperty( name ) && source.hasOwnProperty( name ) ) {\n dest[ name ] = source[ name ];\n }\n }\n\n return dest;\n}\n\n/** map `source` object properties with a given function, and assign the result to the `dest` object.\n * When `fun` returns `undefined`, skip this value. \n */\nexport function transform< A, B >( dest : { [ key : string ] : A }, source : { [ key : string ] : B }, fun : ( value : B, key : string ) => A | void ) : { [ key : string ] : A } {\n for( var name in source ) {\n if( source.hasOwnProperty( name ) ) {\n var value = fun( source[ name ], name );\n value === void 0 || ( dest[ name ] = < A >value );\n }\n }\n\n return dest;\n}\n\nexport function fastAssign< A >( dest : A, source : {} ) : A {\n for( var name in source ) {\n dest[ name ] = source[ name ];\n }\n\n return dest;\n}\n\nexport function fastDefaults< A >( dest : A, source : {} ) : A {\n for( var name in source ) {\n if( dest[ name ] === void 0 ){\n dest[ name ] = source[ name ];\n }\n }\n\n return dest;\n}\n\n/** Similar to underscore `_.extend` and `Object.assign` */\nexport function assign< T >( dest : T, ...sources : Object[] ) : T\nexport function assign< T >( dest : T, source : Object ) : T {\n for( var name in source ) {\n if( source.hasOwnProperty( name ) ) {\n dest[ name ] = source[ name ];\n }\n }\n\n if( arguments.length > 2 ){\n for( let i = 2; i < arguments.length; i++ ){\n const other = arguments[ i ];\n other && assign( dest, other );\n }\n }\n\n return dest;\n}\n\n/** Similar to underscore `_.keys` */\nexport function keys( o : any ) : string[]{\n return o ? Object.keys( o ) : [];\n}\n\n/** Similar to underscore `_.once` */\nexport function once( func : Function ) : Function {\n var memo, first = true;\n return function() {\n if ( first ) {\n first = false;\n memo = func.apply(this, arguments);\n func = null;\n }\n return memo;\n };\n}\n\nconst ArrayProto = Array.prototype,\n DateProto = Date.prototype,\n ObjectProto = Object.prototype;\n\n/**\n * Determine whenever two values are not equal, deeply traversing \n * arrays and plain JS objects (hashes). Dates are compared by enclosed timestamps, all other\n * values are compared with strict comparison.\n */\nexport function notEqual( a : any, b : any) : boolean {\n if( a === b ) return false;\n\n if( a && b && typeof a == 'object' && typeof b == 'object' ) {\n const protoA = Object.getPrototypeOf( a );\n\n if( protoA !== Object.getPrototypeOf( b ) ) return true;\n\n switch( protoA ){\n case DateProto : return +a !== +b;\n case ArrayProto : return arraysNotEqual( a, b );\n case ObjectProto :\n case null:\n return objectsNotEqual( a, b );\n }\n }\n\n return true;\n}\n\nfunction objectsNotEqual( a, b ) {\n const keysA = Object.keys( a );\n\n if( keysA.length !== Object.keys( b ).length ) return true;\n\n for( let i = 0; i < keysA.length; i++ ) {\n const key = keysA[ i ];\n\n if( !b.hasOwnProperty( key ) || notEqual( a[ key ], b[ key ] ) ) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction arraysNotEqual( a, b ) {\n if( a.length !== b.length ) return true;\n\n for( let i = 0; i < a.length; i++ ) {\n if( notEqual( a[ i ], b[ i ] ) ) return true;\n }\n\n return false;\n}\n\n/**\n * Create an object without Object prototype members except hasOwnProperty.\n * @param obj - optional parameter to populate the hash map from.\n */\nconst HashProto = Object.create( null );\nHashProto.hasOwnProperty = ObjectProto.hasOwnProperty;\n\nexport function hashMap( obj? ){\n const hash = Object.create( HashProto );\n return obj ? assign( hash, obj ) : hash;\n}","import { once as _once } from './tools'\n\n/*******************\n * Prebuilt events map, used for optimized bulk event subscriptions.\n *\n * const events = new EventMap({\n * 'change' : true, // Resend this event from self as it is.\n * 'change:attr' : 'localTargetFunction',\n * 'executedInTargetContext' : function(){ ... }\n * 'executedInNativeContext' : '^props.handler'\n * })\n */\nexport interface EventsDefinition {\n [ events : string ] : Function | string | boolean\n}\n\n\nexport class EventMap {\n handlers : EventDescriptor[] = [];\n\n constructor( map? : EventsDefinition | EventMap ){\n if( map ){\n if( map instanceof EventMap ){\n this.handlers = map.handlers.slice();\n }\n else{\n map && this.addEventsMap( map );\n }\n }\n }\n\n merge( map : EventMap ){\n this.handlers = this.handlers.concat( map.handlers );\n }\n\n addEventsMap( map : EventsDefinition ){\n for( let names in map ){\n this.addEvent( names, map[ names ] )\n }\n }\n\n bubbleEvents( names : string ){\n for( let name of names.split( eventSplitter ) ){\n this.addEvent( name, getBubblingHandler( name ) );\n }\n }\n\n addEvent( names : string, callback : Function | string | boolean ){\n const { handlers } = this;\n\n for( let name of names.split( eventSplitter ) ){\n handlers.push( new EventDescriptor( name, callback ) );\n }\n }\n\n subscribe( target : {}, source : EventSource ){\n for( let event of this.handlers ){\n on( source, event.name, event.callback, target );\n }\n }\n\n unsubscribe( target : {}, source : EventSource ){\n for( let event of this.handlers ){\n off( source, event.name, event.callback, target );\n }\n }\n}\n\nexport class EventDescriptor {\n callback : Function\n\n constructor(\n public name : string,\n callback : Function | string | boolean\n ){\n if( callback === true ){\n this.callback = getBubblingHandler( name );\n }\n else if( typeof callback === 'string' ){\n this.callback =\n function localCallback(){\n const handler = this[ callback ];\n handler && handler.apply( this, arguments );\n };\n }\n else{\n this.callback = callback;\n }\n }\n}\n\nconst _bubblingHandlers = {};\n\nfunction getBubblingHandler( event : string ){\n return _bubblingHandlers[ event ] || (\n _bubblingHandlers[ event ] = function( a?, b?, c?, d?, e? ){\n if( d !== void 0 || e !== void 0 ) trigger5( this, event, a, b, c, d, e );\n if( c !== void 0 ) trigger3( this, event, a, b, c );\n else trigger2( this, event, a, b );\n }\n );\n}\n\nexport interface HandlersByEvent {\n [ name : string ] : EventHandler\n}\n\nexport class EventHandler {\n constructor( public callback : Callback, public context : any, public next = null ){}\n}\n\nfunction listOff( _events : HandlersByEvent, name : string, callback : Callback, context : any ){\n const head = _events[ name ];\n\n let filteredHead, prev;\n\n for( let ev = head; ev; ev = ev.next ){\n // Element must be kept\n if( ( callback && callback !== ev.callback && callback !== ev.callback._callback ) ||\n ( context && context !== ev.context ) ){\n \n prev = ev;\n filteredHead || ( filteredHead = ev );\n }\n // Element must be skipped\n else{\n if( prev ) prev.next = ev.next;\n }\n }\n\n if( head !== filteredHead ) _events[ name ] = filteredHead;\n}\n\nfunction listSend2( head : EventHandler, a, b ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b );\n}\n\nfunction listSend3( head : EventHandler, a, b, c ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c );\n}\n\nfunction listSend4( head : EventHandler, a, b, c, d ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d );\n}\n\nfunction listSend5( head : EventHandler, a, b, c, d, e ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d, e );\n}\n\nfunction listSend6( head : EventHandler, a, b, c, d, e, f ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d, e, f );\n}\n\nexport interface Callback extends Function {\n _callback? : Function\n}\n\n/** @internal */\nexport function on( source : EventSource, name : string, callback : Callback, context? : any ) : void {\n if( callback ){\n const _events = source._events || ( source._events = Object.create( null ) );\n _events[ name ] = new EventHandler( callback, context, _events[ name ] );\n }\n}\n\n/** @internal */\nexport function once( source : EventSource, name : string, callback : Callback, context? : any ) : void {\n if( callback ){\n const once : Callback = _once( function(){\n off( source, name, once );\n callback.apply(this, arguments);\n });\n\n once._callback = callback;\n on( source, name, once, context );\n }\n}\n\n/** @internal */\nexport function off( source : EventSource, name? : string, callback? : Callback, context? : any ) : void {\n const { _events } = source;\n if( _events ){\n if( callback || context ) {\n if( name ){\n listOff( _events, name, callback, context );\n }\n else{\n for( let name in _events ){\n listOff( _events, name, callback, context );\n }\n }\n }\n else if( name ){\n _events[ name ] = void 0;\n }\n else{\n source._events = void 0;\n }\n }\n}\n\nexport interface EventSource {\n /** @internal */\n _events : HandlersByEvent\n}\n\nconst eventSplitter = /\\s+/;\n\n/** @internal */\nexport function strings( api : ApiEntry, source : EventSource, events : string, callback : Callback, context ){\n if( eventSplitter.test( events ) ){\n const names = events.split( eventSplitter );\n for( let name of names ) api( source, name, callback, context );\n }\n else api( source, events, callback, context );\n}\n\n/** @internal */\nexport type ApiEntry = ( source : EventSource, event : string, callback : Callback, context? : any ) => void\n\n/*********************************\n * Event-triggering API\n */\n\n/** @internal */\nexport function trigger2( self : EventSource, name : string, a, b ) : void {\n const { _events } = self;\n if( _events ){\n const queue = _events[ name ],\n { all } = _events;\n\n listSend2( queue, a, b );\n listSend3( all, name, a, b );\n }\n};\n\n/** @internal */\nexport function trigger3( self : EventSource, name : string, a, b, c ) : void{\n const { _events } = self;\n if( _events ){\n const queue = _events[ name ],\n { all } = _events;\n\n listSend3( queue, a, b, c );\n listSend4( all, name, a, b, c );\n }\n};\n\n/** @internal */\nexport function trigger5( self : EventSource, name : string, a, b, c, d, e ) : void{\n const { _events } = self;\n if( _events ){\n const queue = _events[ name ],\n { all } = _events;\n\n listSend5( queue, a, b, c, d, e );\n listSend6( all, name, a, b, c, d, e );\n }\n};","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","/*****************************************************************\n * Mixins engine and @define metaprogramming class extensions\n *\n * Vlad Balin & Volicon, (c) 2016-2017\n */\nimport { __extends } from 'tslib';\nimport { assign, defaults, getBaseClass, hashMap, transform } from './tools';\n\nexport interface Subclass< T > extends MixableConstructor {\n new ( ...args ) : T\n prototype : T\n}\n\nexport interface MixableConstructor extends Function{\n __super__? : object;\n mixins? : MixinsState;\n onExtend? : ( BaseClass : Function ) => void;\n onDefine? : ( definition : object, BaseClass : Function ) => void;\n define? : ( definition? : object, statics? : object ) => MixableConstructor;\n extend? : ( definition? : T, statics? : object ) => Subclass;\n}\n\nexport interface MixableDefinition {\n mixins? : Mixin[]\n}\n\n/**\n * Base class, holding metaprogramming class extensions.\n * Supports mixins and Class.define metaprogramming method.\n */\nexport class Mixable {\n static onExtend : ( BaseClass : Function ) => void;\n static onDefine : ( definition : object, BaseClass : Function ) => object; \n static __super__ : object\n static mixins : MixinsState;\n\n /** \n * Must be called after inheritance and before 'define'.\n */\n static define( protoProps : MixableDefinition = {}, staticProps? : object ) : MixableConstructor {\n const BaseClass : MixableConstructor = getBaseClass( this );\n\n // Assign statics.\n staticProps && assign( this, staticProps );\n\n // Extract and apply mixins from the definition.\n const { mixins, ...defineMixin } = protoProps;\n mixins && this.mixins.merge( mixins );\n\n // Unshift definition to the the prototype.\n this.mixins.mergeObject( this.prototype, defineMixin, true );\n\n // Unshift definition from statics to the prototype.\n this.mixins.mergeObject( this.prototype, this.mixins.getStaticDefinitions( BaseClass ), true );\n\n // Call onDefine hook, if it's present.\n this.onDefine && this.onDefine( this.mixins.definitions, BaseClass );\n \n // Apply merge rules to inherited members. No mixins can be added after this point.\n this.mixins.mergeInheritedMembers( BaseClass );\n\n return this;\n }\n\n /** Backbone-compatible extend method to be used in ES5 and for backward compatibility */\n static extend< T extends object>(spec? : T, statics? : {} ) : Subclass< T > {\n let TheSubclass : Subclass< T >;\n\n // 1. Create the subclass (ES5 compatibility shim).\n // If constructor function is given...\n if( spec && spec.hasOwnProperty( 'constructor' ) ){\n // ...we need to manually call internal TypeScript __extend function. Hack! Hack!\n TheSubclass = spec.constructor as any;\n __extends( TheSubclass, this );\n }\n // Otherwise, create the subclall in usual way.\n else{\n TheSubclass = class Subclass extends this {} as any;\n }\n\n predefine( TheSubclass );\n spec && TheSubclass.define( spec, statics );\n\n return TheSubclass;\n }\n}\n\n/** @decorator `@predefine` for forward definitions. Can be used with [[Mixable]] classes only.\n * Forwards the call to the [[Mixable.predefine]];\n */\nexport function predefine( Constructor : MixableConstructor ) : void {\n const BaseClass : MixableConstructor = getBaseClass( Constructor );\n\n // Legacy systems support\n Constructor.__super__ = BaseClass.prototype;\n \n // Initialize mixins structures...\n Constructor.define || MixinsState.get( Mixable ).populate( Constructor );\n\n // Make sure Ctor.mixins are ready before the callback...\n MixinsState.get( Constructor );\n\n // Call extend hook.\n Constructor.onExtend && Constructor.onExtend( BaseClass );\n}\n\n/** @decorator `@define` for metaprogramming magic. Can be used with [[Mixable]] classes only.\n * Forwards the call to [[Mixable.define]].\n */\nexport function define( ClassOrDefinition : Function ) : void;\nexport function define( ClassOrDefinition : object ) : ClassDecorator;\nexport function define( ClassOrDefinition : object | MixableConstructor ){\n // @define class\n if( typeof ClassOrDefinition === 'function' ){\n predefine( ClassOrDefinition );\n ( ClassOrDefinition as MixableConstructor ).define();\n }\n // @define({ prop : val, ... }) class\n else{\n return function( Ctor : MixableConstructor ){\n predefine( Ctor );\n Ctor.define( ClassOrDefinition );\n } as any;\n }\n}\n\nexport function definitions( rules : MixinMergeRules ) : ClassDecorator {\n return ( Class : Function ) => {\n const mixins = MixinsState.get( Class );\n mixins.definitionRules = defaults( hashMap(), rules, mixins.definitionRules );\n }\n}\n\n// Create simple property list decorator\nexport function propertyListDecorator( listName: string ) : PropertyDecorator {\n return function propList(proto, name : string) {\n const list = proto.hasOwnProperty( listName ) ?\n proto[ listName ] : (proto[ listName ] = (proto[ listName ] || []).slice()); \n\n list.push(name);\n }\n}\n\nexport function definitionDecorator( definitionKey, value ){\n return ( proto : object, name : string ) => {\n MixinsState\n .get( proto.constructor )\n .mergeObject( proto, {\n [ definitionKey ] : {\n [ name ] : value\n }\n });\n }\n}\n\nexport class MixinsState {\n mergeRules : MixinMergeRules;\n definitionRules : MixinMergeRules;\n definitions : object = {};\n appliedMixins : Mixin[];\n\n // Return mixins state for the class. Initialize if it's not exist.\n static get( Class ) : MixinsState {\n const { mixins } = Class;\n \n return mixins && Class === mixins.Class ? mixins :\n Class.mixins = new MixinsState( Class );\n }\n\n constructor( public Class : MixableConstructor ){\n const { mixins } = getBaseClass( Class );\n\n this.mergeRules = ( mixins && mixins.mergeRules ) || hashMap();\n this.definitionRules = ( mixins && mixins.definitionRules ) || hashMap();\n this.appliedMixins = ( mixins && mixins.appliedMixins ) || [];\n }\n\n getStaticDefinitions( BaseClass : Function ){\n const definitions = hashMap(),\n { Class } = this;\n\n return transform( definitions, this.definitionRules, ( rule, name ) =>{\n if( BaseClass[ name ] !== Class[ name ]){\n return Class[ name ];\n }\n });\n }\n\n merge( mixins : Mixin[] ){\n const proto = this.Class.prototype,\n { mergeRules } = this;\n\n // Copy applied mixins array as it's going to be updated.\n const appliedMixins = this.appliedMixins = this.appliedMixins.slice();\n\n // Apply mixins in sequence...\n for( let mixin of mixins ) {\n // Mixins array should be flattened.\n if( Array.isArray( mixin ) ) {\n this.merge( mixin );\n }\n // Don't apply mixins twice.\n else if( appliedMixins.indexOf( mixin ) < 0 ){\n appliedMixins.push( mixin );\n\n // For constructors, merge _both_ static and prototype members.\n if( typeof mixin === 'function' ){\n // Merge static members\n this.mergeObject( this.Class, mixin );\n\n // merge definitionRules and mergeRules\n const sourceMixins = ( mixin as any ).mixins;\n if( sourceMixins ){\n this.mergeRules = defaults( hashMap(), this.mergeRules, sourceMixins.mergeRules );\n this.definitionRules = defaults( hashMap(), this.definitionRules, sourceMixins.definitionRules );\n this.appliedMixins = this.appliedMixins.concat( sourceMixins.appliedMixins );\n }\n\n // Prototypes are merged according with rules.\n this.mergeObject( proto, mixin.prototype );\n }\n // Handle plain object mixins.\n else {\n this.mergeObject( proto, mixin );\n }\n }\n }\n }\n\n populate( ...ctors : Function[] ){\n for( let Ctor of ctors ) {\n MixinsState.get( Ctor ).merge([ this.Class ]);\n }\n }\n\n mergeObject( dest : object, source : object, unshift? : boolean ) {\n forEachOwnProp( source, name => {\n const sourceProp = Object.getOwnPropertyDescriptor( source, name );\n let rule : MixinMergeRule;\n\n if( rule = this.definitionRules[ name ] ){\n assignProperty( this.definitions, name, sourceProp, rule, unshift );\n }\n\n if( !rule || rule === mixinRules.protoValue ){\n assignProperty( dest, name, sourceProp, this.mergeRules[ name ], unshift );\n }\n });\n }\n\n mergeInheritedMembers( BaseClass : Function ){\n const { mergeRules, Class } = this;\n\n if( mergeRules ){\n const proto = Class.prototype,\n baseProto = BaseClass.prototype;\n\n for( let name in mergeRules ) {\n const rule = mergeRules[ name ];\n\n if( proto.hasOwnProperty( name ) && name in baseProto ){\n proto[ name ] = resolveRule( proto[ name ], baseProto[ name ], rule );\n }\n }\n }\n }\n}\n\nconst dontMix = {\n function : hashMap({\n length : true,\n prototype : true,\n caller : true,\n arguments : true,\n name : true,\n __super__ : true\n }),\n \n object : hashMap({\n constructor : true\n }) \n}\n\nfunction forEachOwnProp( object : object, fun : ( name : string ) => void ){\n const ignore = dontMix[ typeof object ];\n\n for( let name of Object.getOwnPropertyNames( object ) ) {\n ignore[ name ] || fun( name );\n }\n}\n\nexport interface MixinMergeRules {\n [ name : string ] : MixinMergeRule\n}\n\nexport type MixinMergeRule = ( a : any, b : any ) => any\nexport type Mixin = { [ key : string ] : any } | Function\n\n// @mixins( A, B, ... ) decorator.\nexport interface MixinRulesDecorator {\n ( rules : MixinMergeRules ) : ClassDecorator\n value( a : object, b : object) : object;\n protoValue( a : object, b : object) : object;\n merge( a : object, b : object ) : object;\n pipe( a: Function, b : Function ) : Function;\n defaults( a: Function, b : Function ) : Function;\n classFirst( a: Function, b : Function ) : Function;\n classLast( a: Function, b : Function ) : Function;\n every( a: Function, b : Function ) : Function;\n some( a: Function, b : Function ) : Function;\n}\n\nexport const mixins = ( ...list : Mixin[] ) => (\n ( Class : Function ) => MixinsState.get( Class ).merge( list )\n);\n\n// @mixinRules({ name : rule, ... }) decorator.\nexport const mixinRules = ( ( rules : MixinMergeRules ) => (\n ( Class : Function ) => {\n const mixins = MixinsState.get( Class );\n mixins.mergeRules = defaults( rules, mixins.mergeRules );\n }\n) ) as MixinRulesDecorator;\n\n// Pre-defined mixin merge rules\n\nmixinRules.value = ( a, b ) => a;\n\nmixinRules.protoValue = ( a, b ) => a;\n\n// Recursively merge members\nmixinRules.merge = ( a, b ) => defaults( {}, a, b );\n\n // Execute methods in pipe, with the class method executed last.\nmixinRules.pipe = ( a, b ) => (\n function( x : any ) : any {\n return a.call( this, b.call( this, x ) );\n }\n);\n\n // Assume methods return an object, and merge results with defaults (class method executed first)\nmixinRules.defaults = ( a : Function, b : Function ) => (\n function() : object {\n return defaults( a.apply( this, arguments ), b.apply( this, arguments ) );\n }\n);\n\n// Execute methods in sequence staring with the class method.\nmixinRules.classFirst = ( a : Function, b : Function ) => (\n function() : void {\n a.apply( this, arguments );\n b.apply( this, arguments );\n }\n);\n\n // Execute methods in sequence ending with the class method.\nmixinRules.classLast = ( a : Function, b : Function ) => (\n function() : void {\n b.apply( this, arguments );\n a.apply( this, arguments );\n }\n)\n\n // Execute methods in sequence returning the first falsy result.\nmixinRules.every = ( a : Function, b : Function ) =>(\n function() : any {\n return a.apply( this, arguments ) && b.apply( this, arguments );\n }\n);\n // Execute methods in sequence returning the first truthy result.\nmixinRules.some = ( a : Function, b : Function ) =>(\n function() : any {\n return a.apply( this, arguments ) || b.apply( this, arguments );\n }\n);\n\n/**\n * Helpers\n */\n\nfunction assignProperty( dest : object, name : string, sourceProp : PropertyDescriptor, rule : MixinMergeRule, unshift? : boolean ){\n// Destination prop is defined, thus the merge rules must be applied.\n if( dest.hasOwnProperty( name ) ){\n const destProp = Object.getOwnPropertyDescriptor( dest, name );\n\n if( destProp.configurable && 'value' in destProp ){\n dest[ name ] = unshift ?\n resolveRule( sourceProp.value, destProp.value, rule ) :\n resolveRule( destProp.value, sourceProp.value, rule ) ;\n }\n }\n // If destination is empty, just copy the prop over.\n else{\n Object.defineProperty( dest, name, sourceProp );\n }\n}\n\nfunction resolveRule( dest, source, rule : MixinMergeRule ){\n // When destination is empty, take the source.\n if( dest === void 0 ) return source;\n\n // In these cases we take non-empty destination:\n if( !rule || source === void 0 ) return dest;\n\n // In other cases we must merge values.\n return rule( dest, source );\n}","import * as _eventsApi from './eventsource';\nimport { EventMap, EventsDefinition, EventSource, HandlersByEvent } from './eventsource';\nimport { define, definitions, Mixable, MixableConstructor, mixinRules, MixinsState } from './mixins';\nimport { omit, transform } from './tools';\n\nconst { strings, on, off, once, trigger5, trigger2, trigger3 } = _eventsApi;\n\nlet _idCount = 0;\n\nfunction uniqueId() : string {\n return 'l' + _idCount++;\n}\n\nexport { EventMap, EventsDefinition };\n\nexport interface MessengerDefinition {\n _localEvents? : EventMap\n localEvents? : EventsDefinition\n properties? : PropertyMap\n [ name : string ] : any\n}\n\nexport interface PropertyMap {\n [ name : string ] : Property\n}\n\nexport type Property = PropertyDescriptor | ( () => any )\n\nexport interface MessengersByCid {\n [ cid : string ] : Messenger\n}\n\nexport type EventCallbacks = { [ events : string ] : EventCallback }\nexport type EventCallback = ( this : Context, ...args : any[] ) => void\n\n/*************************\n * Messenger is mixable class with capabilities of sending and receiving synchronous events.\n * This class itself can serve as both mixin and base class.\n */\n\n@define\n@definitions({\n properties : mixinRules.merge,\n localEvents : mixinRules.merge\n})\nexport class Messenger implements Mixable, EventSource {\n // Define extendable mixin static properties.\n /** @internal */\n static __super__ : object;\n static mixins : MixinsState;\n static onExtend : ( BaseClass : Function ) => void;\n static define : ( definition? : MessengerDefinition, statics? : object ) => MixableConstructor;\n static extend : ( definition? : MessengerDefinition, statics? : object ) => MixableConstructor;\n static onDefine({ localEvents, _localEvents, properties } : MessengerDefinition, BaseClass? : typeof Mixable ){\n // Handle localEvents definition\n if( localEvents || _localEvents ){\n const eventsMap = new EventMap( this.prototype._localEvents );\n\n localEvents && eventsMap.addEventsMap( localEvents );\n _localEvents && eventsMap.merge( _localEvents );\n \n this.prototype._localEvents = eventsMap;\n }\n\n // Handle properties definitions...\n if( properties ){\n Object.defineProperties( this.prototype, transform( {}, properties, toPropertyDescriptor ) );\n }\n }\n\n /** @internal */ \n _events : HandlersByEvent = void 0;\n\n /** @internal */ \n _listeningTo : MessengersByCid = void 0\n\n /** Unique client-only id. */\n cid : string\n\n /** @internal Prototype-only property to manage automatic local events subscription */ \n _localEvents : EventMap\n\n constructor(){\n this.cid = uniqueId();\n this.initialize.apply( this, arguments );\n\n // TODO: local events subscribe?\n }\n\n /** Method is called at the end of the constructor */\n initialize() : void {}\n \n on( events : string | EventCallbacks, callback?, context? ) : this {\n if( typeof events === 'string' ) strings( on, this, events, callback, context );\n else for( let name in events ) strings( on, this, name, events[ name ], context || callback );\n\n return this;\n }\n\n once( events : string | EventCallbacks, callback?, context? ) : this {\n if( typeof events === 'string' ) strings( once, this, events, callback, context );\n else for( let name in events ) strings( once, this, name, events[ name ], context || callback );\n\n return this;\n }\n\n off( events? : string | EventCallbacks, callback?, context? ) : this {\n if( !events ) off( this, void 0, callback, context );\n else if( typeof events === 'string' ) strings( off, this, events, callback, context );\n else for( let name in events ) strings( off, this, name, events[ name ], context || callback );\n\n return this;\n }\n\n // Trigger one or many events, firing all bound callbacks. Callbacks are\n // passed the same arguments as `trigger` is, apart from the event name\n // (unless you're listening on `\"all\"`, which will cause your callback to\n // receive the true name of the event as the first argument).\n trigger(name : string, a?, b?, c?, d?, e? ) : this {\n if( d !== void 0 || e !== void 0 ) trigger5( this, name, a, b, c, d, e );\n else if( c !== void 0 ) trigger3( this, name, a, b, c );\n else trigger2( this, name, a, b );\n return this;\n }\n\n listenTo( source : Messenger, a : string | EventCallbacks, b? : Function ) : this {\n if( source ){\n addReference( this, source );\n source.on( a, !b && typeof a === 'object' ? this : b, this );\n }\n\n return this;\n }\n\n listenToOnce( source : Messenger, a : string | EventCallbacks, b? : Function ) : this {\n if( source ){\n addReference( this, source );\n source.once( a, !b && typeof a === 'object' ? this : b, this );\n }\n\n return this;\n }\n\n stopListening( a_source? : Messenger, a? : string | EventCallbacks, b? : Function ) : this {\n const { _listeningTo } = this;\n if( _listeningTo ){\n const removeAll = !( a || b ),\n second = !b && typeof a === 'object' ? this : b;\n\n if( a_source ){\n const source = _listeningTo[ a_source.cid ];\n if( source ){\n if( removeAll ) delete _listeningTo[ a_source.cid ];\n source.off( a, second, this );\n }\n }\n else if( a_source == null ){\n for( let cid in _listeningTo ) _listeningTo[ cid ].off( a, second, this );\n\n if( removeAll ) ( this._listeningTo = void 0 );\n }\n }\n\n return this;\n }\n\n /**\n * Destructor. Stops messenger from listening to all objects,\n * and stop others from listening to the messenger. \n */\n _disposed : boolean\n\n dispose() : void {\n if( this._disposed ) return;\n\n this.stopListening();\n this.off();\n\n this._disposed = true;\n }\n}\n\n/**\n * Backbone 1.2 API conformant Events mixin.\n */\nexport const Events : Messenger = omit( Messenger.prototype, 'constructor', 'initialize' );\n\n/**\n * Messenger Private Helpers \n */\n\nfunction toPropertyDescriptor( x : Property ) : PropertyDescriptor {\n if( x ){\n return typeof x === 'function' ? { get : < () => any >x, configurable : true } : x;\n }\n}\n\nfunction addReference( listener : Messenger, source : Messenger ){\n const listeningTo = listener._listeningTo || (listener._listeningTo = Object.create( null ) ),\n cid = source.cid || ( source.cid = uniqueId() );\n\n listeningTo[ cid ] = source;\n}","import { Messenger } from './events'\nimport { define } from './mixins';\n\nexport type LogLevel = 'error' | 'warn' | 'debug' | 'info' | 'log';\nexport type LoggerEventHandler = ( topic : string, msg : string, props : object ) => void;\n\nexport const isProduction = typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'production',\n logEvents : LogLevel[] = isProduction ?\n [ 'error', 'info' ] :\n [ 'error', 'warn', 'debug', 'info', 'log' ];\n\n@define\nexport class Logger extends Messenger {\n counter : { [ level in LogLevel ]? : number } = {}\n\n // Log events of the given log level to the console, optionally filtered by topic\n logToConsole( level : LogLevel, filter? : RegExp ) : this {\n return this.on( level, ( topic, msg, props ) => {\n if( !filter || filter.test( topic ) ){\n const args = [ `[${topic}] ${msg}` ];\n \n for( let name in props ){\n args.push( `\\n\\t${name}:`, toString( props[ name ] ) );\n }\n \n console[ level ].apply( console, args );\n }\n });\n }\n\n // Fire exception on the events of the given log level, optionally filtered by topic\n throwOn( level : LogLevel, filter? : RegExp ) : this {\n return this.on( level, ( topic, msg, props ) => {\n if( !filter || filter.test( topic ) ){\n throw new Error( `[${topic}] ${msg}` );\n }\n });\n }\n\n // Count log events of the given level, optionally filtered by topic\n count( level : LogLevel, filter? : RegExp ) : this {\n return this.on( level, ( topic, msg, props ) => {\n if( !filter || filter.test( topic ) ){\n this.counter[ level ] = ( this.counter[ level ] || 0 ) + 1;\n }\n });\n }\n\n trigger : ( level : LogLevel, topic : string, message : string, props? : object ) => this;\n \n off : ( event? : LogLevel ) => this;\n\n\n on( handlers : { [ name in LogLevel ] : LoggerEventHandler } ) : this;\n on( handlers : LogLevel, handler : LoggerEventHandler ) : this;\n on( handlers : 'all', handler : ( level : LogLevel, topic : string, msg : string, props : object ) => void ) : this;\n on( a : any, b? : any ){\n return super.on( a, b );\n }\n}\n\n/**\n * Convert objects to the plain text friendly format.\n * primitives as in JSON.\n */\nlet toString = typeof window === 'undefined' ? \n something => {\n if( something && typeof something === 'object' ){\n const { __inner_state__ } = something,\n value = __inner_state__ || something,\n isArray = Array.isArray( value );\n\n const body = isArray ? `[ length = ${ value.length } ]` : `{ ${ Object.keys( value ).join( ', ' )} }`;\n\n return something.constructor.name + ' ' + body;\n }\n\n return JSON.stringify( something );\n }\n : x => x;\n\nexport const logger = new Logger();\n\nif( typeof console !== 'undefined' ) {\n for( let event of logEvents ){\n logger.logToConsole( event );\n }\n}\n\nexport const throwingLogger = new Logger();\nthrowingLogger.throwOn( 'error' ).throwOn( 'warn' );\n\nexport const log : typeof logger.trigger = logger.trigger.bind( logger );","export interface IONode {\n /** @internal */\n _endpoint : IOEndpoint\n\n /** @internal */\n _ioPromise : IOPromise< this >\n}\n\nexport interface IOPromise extends Promise {\n abort? : () => void\n}\n\nexport interface IOEndpoint {\n list( options : IOOptions, collection? ) : IOPromise\n create( json : any, options : IOOptions, record? ) : IOPromise\n update( id : string | number, json :any, options : IOOptions, record? ) : IOPromise\n read( id : string | number, options : IOOptions, record? ) : IOPromise\n destroy( id : string | number, options : IOOptions, record? ) : IOPromise\n subscribe( events : IOEvents, collection? ) : IOPromise\n unsubscribe( events : IOEvents, collection? ) : void\n}\n\nexport interface IOOptions {\n ioMethod? : 'save' | 'fetch'\n}\n\nexport interface IOEvents {\n updated? : ( json : any ) => void\n removed? : ( json : any ) => void\n}\n\nexport function getOwnerEndpoint( self ) : IOEndpoint {\n // Check if we are the member of the collection...\n const { collection } = self;\n if( collection ){\n return getOwnerEndpoint( collection );\n }\n\n // Now, if we're the member of the model...\n if( self._owner ){\n const { _endpoints } = self._owner;\n return _endpoints && _endpoints[ self._ownerKey ];\n }\n}\n\n/**\n * Create abortable promise.\n * Adds `promise.abort()` function which rejects the promise by default\n * initialize() function takes third optional argument `abort : ( resolve, reject ) => void`,\n * which can be used to add custom abort handling.\n */\ndeclare var Promise: PromiseConstructorLike;\n\nexport function createIOPromise( initialize : InitIOPromise ) : IOPromise{\n let resolve, reject, onAbort;\n\n function abort( fn ){\n onAbort = fn;\n }\n\n const promise : IOPromise = new Promise( ( a_resolve, a_reject ) =>{\n reject = a_reject;\n resolve = a_resolve;\n initialize( resolve, reject, abort );\n }) as IOPromise;\n\n promise.abort = () => {\n onAbort ? onAbort( resolve, reject ) : reject( new Error( \"I/O Aborted\" ) );\n }\n\n return promise;\n}\n\nexport type InitIOPromise = ( resolve : ( x? : any ) => void, reject : ( x? : any ) => void, abort? : ( fn : Function ) => void ) => void;\n\nexport function startIO( self : IONode, promise : IOPromise, options : IOOptions, thenDo : ( json : any ) => any ) : IOPromise {\n // Stop pending I/O first...\n abortIO( self );\n\n self._ioPromise = promise\n .then( resp => {\n self._ioPromise = null;\n \n const result = thenDo ? thenDo( resp ) : resp;\n \n triggerAndBubble( self, 'sync', self, resp, options );\n \n return result;\n } ) \n .catch( err => {\n self._ioPromise = null;\n \n // Overlaps with a new `error` event.\n triggerAndBubble( self, 'error', self, err, options );\n \n throw err;\n } ) as IOPromise;\n\n self._ioPromise.abort = promise.abort;\n\n return self._ioPromise;\n}\n\nexport function abortIO( self : IONode ){\n if( self._ioPromise && self._ioPromise.abort ){\n self._ioPromise.abort();\n self._ioPromise = null;\n }\n}\n\nexport function triggerAndBubble( eventSource, ...args ){\n eventSource.trigger.apply( eventSource, args );\n const { collection } = eventSource;\n collection && collection.trigger.apply( collection, args ); \n}","/**\n * Traversable objects and symbolic references\n */\nexport interface Traversable {\n getStore() : Traversable\n getOwner() : Traversable\n get( key : string ) : any \n}\n\nconst referenceMask = /\\^|(store\\.[^.]+)|([^.]+)/g;\n\n// Compile reference to function\nexport type ResolveReference = ( root : Traversable ) => any; \n\nexport class CompiledReference {\n resolve : ResolveReference\n tail : string\n local : boolean\n\n constructor( reference : string, splitTail : boolean = false ){\n const path = reference\n .match( referenceMask )\n .map( key => {\n if( key === '^' || key === 'owner' ) return 'getOwner()';\n\n if( key[ 0 ] === '~' ) return `getStore().get(\"${ key.substr( 1 ) }\")`;\n\n if( key.indexOf( 'store.' ) === 0 ) return `getStore().get(\"${ key.substr( 6 ) }\")`;\n \n return key;\n } );\n \n this.tail = splitTail && path.pop();\n this.local = !path.length;\n \n this.resolve = new Function( 'self', `\n var v = self.${ path.shift() };\n \n ${ path.map( x => `\n v = v && v.${ x };\n `).join('')}\n\n return v;\n ` );\n }\n}\n\nexport function resolveReference( root : Traversable, reference : string, action : ( object, key : string ) => any ) : any {\n const path = reference.match( referenceMask ),\n skip = path.length - 1;\n \n let self = root;\n\n for( var i = 0; i < skip; i++ ){\n const key = path[ i ];\n switch( key ){\n case '~' : self = self.getStore(); break;\n case '^' : self = self.getOwner(); break;\n default : self = self.get( key );\n }\n\n // Do nothing if object on the path doesn't exist.\n if( !self ) return;\n }\n\n return action( self, path[ skip ] );\n}","export interface ChildrenErrors {\n [ key : string ] : ValidationError | any\n} \n\nexport interface Validatable {\n /** @internal */\n _validateNested( errors : ChildrenErrors ) : number;\n \n validate( self : any ) : any\n get( key : string ) : any\n}\n\n// Validation error object.\nexport class ValidationError {\n // Invalid nested object keys \n nested : ChildrenErrors \n length : number\n\n // Local error\n error : any\n\n constructor( obj : Validatable ){\n this.length = obj._validateNested( this.nested = {} );\n\n if( this.error = obj.validate( obj ) ){\n this.length++;\n }\n }\n\n each( iteratee : ( value : any, key : string ) => void ) : void {\n const { error, nested } = this;\n\n if( error ) iteratee( error, null );\n\n for( const key in nested ){\n iteratee( nested[ key ], key );\n }\n }\n\n eachError( iteratee : ( error : any, key : string, object : Validatable ) => void, object : Validatable ) : void {\n this.each( ( value : any, key : string ) => {\n if( value instanceof ValidationError ){\n (value).eachError( iteratee, object.get( key ) );\n }\n else{\n iteratee( value, key, object );\n }\n });\n }\n}","import { abortIO, IOEndpoint, IONode, IOPromise } from './io-tools';\nimport { EventCallbacks, define, definitions, eventsApi, Logger, LogLevel, Messenger, MessengerDefinition, MessengersByCid, mixinRules, mixins, MixinsState, throwingLogger } from './object-plus';\nimport { resolveReference, Traversable } from './traversable';\nimport { ChildrenErrors, Validatable, ValidationError } from './validation';\n\nconst { trigger3, on, off } = eventsApi;\n/***\n * Abstract class implementing ownership tree, tho-phase transactions, and validation. \n * 1. createTransaction() - apply changes to an object tree, and if there are some events to send, transaction object is created.\n * 2. transaction.commit() - send and process all change events, and close transaction.\n */\n\n/** @private */\nexport interface TransactionalDefinition extends MessengerDefinition {\n endpoint? : IOEndpoint\n}\n\nexport enum ItemsBehavior {\n share = 0b0001,\n listen = 0b0010,\n persistent = 0b0100\n}\n\n// Transactional object interface\n\nexport interface Transactional extends Messenger {}\n\n@define\n@definitions({\n endpoint : mixinRules.value\n})\n@mixins( Messenger )\nexport abstract class Transactional implements Messenger, IONode, Validatable, Traversable {\n // Mixins are hard in TypeScript. We need to copy type signatures over...\n // Here goes 'Mixable' mixin.\n static endpoint : IOEndpoint;\n \n /** @internal */\n static __super__ : object;\n \n static mixins : MixinsState;\n static define : ( definition? : TransactionalDefinition, statics? : object ) => typeof Transactional;\n static extend : ( definition? : T, statics? : object ) => any;\n\n static onDefine( definitions : TransactionalDefinition, BaseClass : typeof Transactional ){\n if( definitions.endpoint ) this.prototype._endpoint = definitions.endpoint;\n Messenger.onDefine.call( this, definitions, BaseClass );\n };\n\n static onExtend( BaseClass : typeof Transactional ) : void {\n // Make sure we don't inherit class factories.\n if( BaseClass.create === this.create ) {\n this.create = Transactional.create;\n }\n }\n\n // Define extendable mixin static properties.\n static create( a : any, b? : any ) : Transactional {\n return new (this as any)( a, b );\n }\n\n // State accessor.\n /** @internal */\n readonly __inner_state__ : any;\n\n // Shared modifier (used by collections of shared models)\n /** @internal */\n _shared? : number; \n \n dispose() : void {\n if( this._disposed ) return;\n \n abortIO( this );\n this._owner = void 0;\n this._ownerKey = void 0;\n this.off();\n this.stopListening();\n this._disposed = true;\n }\n \n cidPrefix : string\n\n // Unique version token replaced on change\n /** @internal */\n _changeToken : {} = {}\n\n // true while inside of the transaction\n /** @internal */\n _transaction : boolean = false;\n\n // Holds current transaction's options, when in the middle of transaction and there're changes but is an unsent change event\n /** @internal */\n _isDirty : TransactionOptions = null;\n\n // Backreference set by owner (Record, Collection, or other object)\n /** @internal */\n _owner : Owner = void 0;\n\n // Key supplied by owner. Used by record to identify attribute key.\n // Only collections doesn't set the key, which is used to distinguish collections.\n /** @internal */ \n _ownerKey : string = void 0;\n\n // Name of the change event\n /** @internal */\n _changeEventName : string\n\n /**\n * Subsribe for the changes.\n */\n onChanges( handler : Function, target? : Messenger ){\n on( this, this._changeEventName, handler, target );\n }\n\n /**\n * Unsubscribe from changes.\n */\n offChanges( handler? : Function, target? : Messenger ){\n off( this, this._changeEventName, handler, target );\n }\n\n /**\n * Listen to changes event. \n */\n listenToChanges( target : Transactional, handler ){\n this.listenTo( target, target._changeEventName, handler );\n }\n\n constructor( cid : string | number ){\n this.cid = this.cidPrefix + cid;\n }\n\n // Deeply clone ownership subtree\n abstract clone( options? : CloneOptions ) : this\n \n // Execute given function in the scope of ad-hoc transaction.\n transaction( fun : ( self : this ) => void, options : TransactionOptions = {} ) : void{\n const isRoot = transactionApi.begin( this );\n const update = fun.call( this, this );\n update && this.set( update );\n isRoot && transactionApi.commit( this );\n }\n\n // Assign transactional object \"by value\", copying aggregated items.\n assignFrom( source : Transactional | Object ) : this {\n // Need to delay change events until change token willl by synced.\n this.transaction( () =>{\n this.set( ( source ).__inner_state__ || source, { merge : true } );\n\n // Synchronize change tokens\n const { _changeToken } = source as any;\n \n if( _changeToken ){\n this._changeToken = _changeToken;\n } \n });\n\n return this;\n }\n\n // Create object from JSON. Throw if validation fail.\n static from Transactional >( this : T, json : any, { strict, ...options } : { strict? : boolean } & TransactionOptions = {} ) : InstanceType{\n const obj : Transactional = ( this as any ).create( json, { ...options, logger : strict ? throwingLogger : void 0 } );\n\n if( strict && obj.validationError ){\n obj.eachValidationError( ( error, key, obj ) => {\n throw new Error( `${ obj.getClassName() }.${ key }: ${ error }` );\n });\n }\n\n return obj as any;\n }\n\n // Apply bulk object update without any notifications, and return open transaction.\n // Used internally to implement two-phase commit.\n // Returns null if there are no any changes.\n /** @internal */\n abstract _createTransaction( values : any, options? : TransactionOptions ) : Transaction | void\n\n // Apply bulk in-place object update in scope of ad-hoc transaction \n abstract set( values : any, options? : TransactionOptions ) : this;\n\n \n // Parse function applied when 'parse' option is set for transaction.\n parse( data : any, options? : TransactionOptions ) : any { return data }\n\n // Convert object to the serializable JSON structure\n abstract toJSON( options? : object ) : {}\n\n /*******************\n * Traversals and member access\n */\n \n // Get object member by its key.\n abstract get( key : string ) : any\n\n // Get object member by symbolic reference.\n deepGet( reference : string ) : any {\n return resolveReference( this, reference, ( object, key ) => object.get ? object.get( key ) : object[ key ] );\n }\n\n //_isCollection : boolean\n\n // Return owner skipping collections.\n getOwner() : Owner {\n return this._owner;\n }\n\n // Store used when owner chain store lookup failed. Static value in the prototype. \n /** @internal */\n _defaultStore : Transactional\n\n // Locate the closest store. Store object stops traversal by overriding this method. \n getStore() : Transactional {\n const { _owner } = this;\n return _owner ? _owner.getStore() : this._defaultStore;\n }\n\n\n /***************************************************\n * Iteration API\n */\n\n // Loop through the members. Must be efficiently implemented in container class.\n\n /** @internal */\n _endpoint : IOEndpoint\n \n /** @internal */\n _ioPromise : IOPromise\n\n hasPendingIO() : IOPromise { return this._ioPromise; }\n\n //fetch( options? : object ) : IOPromise { throw new Error( \"Not implemented\" ); }\n\n getEndpoint() : IOEndpoint {\n return getOwnerEndpoint( this ) || this._endpoint;\n }\n \n /*********************************\n * Validation API\n */\n\n // Lazily evaluated validation error\n /** @internal */\n _validationError : ValidationError = void 0\n\n // Validate ownership tree and return valudation error \n get validationError() : ValidationError {\n const error = this._validationError || ( this._validationError = new ValidationError( this ) );\n return error.length ? error : null; \n }\n\n // Validate nested members. Returns errors count.\n /** @internal */\n abstract _validateNested( errors : ChildrenErrors ) : number\n\n // Object-level validator. Returns validation error.\n validate( obj? : Transactional ) : any {}\n\n // Return validation error (or undefined) for nested object with the given key. \n getValidationError( key? : string ) : any {\n var error = this.validationError;\n return ( key ? error && error.nested[ key ] : error ) || null;\n }\n\n // Get validation error for the given symbolic reference.\n deepValidationError( reference : string ) : any {\n return resolveReference( this, reference, ( object, key ) => object.getValidationError( key ) );\n }\n\n // Iterate through all validation errors across the ownership tree.\n eachValidationError( iteratee : ( error : any, key : string, object : Transactional ) => void ) : void {\n const { validationError } = this;\n validationError && validationError.eachError( iteratee, this );\n }\n\n // Check whenever member with a given key is valid. \n isValid( key? : string ) : boolean {\n return !this.getValidationError( key );\n }\n\n valueOf() : Object { return this.cid; }\n toString(){ return this.cid; }\n\n // Get class name for an object instance. Works fine with ES6 classes definitions (not in IE).\n getClassName() : string {\n const { name } = this.constructor;\n if( name !== 'Subclass' ) return name;\n }\n\n // Logging interface for run time errors and warnings.\n /** @internal */\n abstract _log( level : LogLevel, topic : string, text : string, value : any, logger? : Logger ) : void\n}\n\nexport interface CloneOptions {\n // 'Pin store' shall assign this._defaultStore = this.getStore();\n pinStore? : boolean\n}\n\n// Owner must accept children update events. It's an only way children communicates with an owner.\n/** @private */\nexport interface Owner extends Traversable, Messenger {\n /** @internal */\n _onChildrenChange( child : Transactional, options : TransactionOptions ) : void;\n \n getOwner() : Owner\n getStore() : Transactional\n}\n\n// Transaction object used for two-phase commit protocol.\n// Must be implemented by subclasses.\n// Transaction must be created if there are actual changes and when markIsDirty returns true.\n/** @private */ \nexport interface Transaction {\n // Object transaction is being made on.\n object : Transactional\n\n // Send out change events, process update triggers, and close transaction.\n // Nested transactions must be marked with isNested flag (it suppress owner notification).\n commit( initiator? : Transactional )\n}\n\n// Options for distributed transaction \nexport interface TransactionOptions {\n // Invoke parsing \n parse? : boolean\n\n // Optional logger\n logger? : Logger\n\n // Suppress change notifications and update triggers\n silent? : boolean\n\n // Update existing transactional members in place, or skip the update (ignored by models)\n merge? : boolean // =true\n\n // Should collections remove elements in set (ignored by models) \n remove? : boolean // =true\n\n // Always replace enclosed objects with new instances\n reset? : boolean // = false\n\n // Do not dispose aggregated members\n unset? : boolean\n\n validate? : boolean\n\n // IO method name if the transaction is initiated as a result of IO operation\n ioMethod? : 'save' | 'fetch'\n\n // The hint for IOEndpoint\n // If `true`, `record.save()` will behave as \"upsert\" operation for the records having id.\n upsert? : boolean\n}\n\n/**\n * Low-level transactions API. Must be used like this:\n * const isRoot = begin( record );\n * ...\n * isRoot && commit( record, options );\n * \n * When committing nested transaction, the flag must be set to true. \n * commit( object, options, isNested ) \n */\n\nexport const transactionApi = {\n // Start transaction. Return true if it's the root one.\n /** @private */\n begin( object : Transactional ) : boolean {\n return object._transaction ? false : ( object._transaction = true ); \n },\n\n // Mark object having changes inside of the current transaction.\n // Returns true whenever there notifications are required.\n /** @private */\n markAsDirty( object : Transactional, options : TransactionOptions ) : boolean {\n // If silent option is in effect, don't set isDirty flag.\n const dirty = !options.silent;\n if( dirty ) object._isDirty = options;\n \n // Reset version token.\n object._changeToken = {};\n\n // Object is changed, so validation must happen again. Clear the cache.\n object._validationError = void 0;\n\n return dirty;\n },\n\n // Commit transaction. Send out change event and notify owner. Returns true if there were changes.\n // Must be executed for the root transaction only.\n /** @private */\n commit( object : Transactional, initiator? : Transactional ){\n let originalOptions = object._isDirty;\n\n if( originalOptions ){\n // Send the sequence of change events, handling chained handlers.\n while( object._isDirty ){\n const options = object._isDirty;\n object._isDirty = null; \n trigger3( object, object._changeEventName, object, options, initiator );\n }\n \n // Mark transaction as closed.\n object._transaction = false;\n\n // Notify owner on changes out of transaction scope. \n const { _owner } = object; \n if( _owner && _owner !== initiator ){ // If it's the nested transaction, owner is already aware there are some changes.\n _owner._onChildrenChange( object, originalOptions );\n }\n }\n else{\n // No changes. Silently close transaction.\n object._isDirty = null;\n object._transaction = false;\n }\n },\n\n /************************************\n * Ownership management\n */\n\n // Add reference to the record.\n /** @private */\n aquire( owner : Owner, child : Transactional, key? : string ) : void {\n if( child._owner ) throw new ReferenceError( 'Trying to aquire ownership for an object already having an owner' );\n\n child._owner = owner;\n child._ownerKey = key;\n },\n\n // Remove reference to the record.\n /** @private */\n free( owner : Owner, child : Transactional ) : void {\n if( owner === child._owner ){\n child._owner = void 0;\n child._ownerKey = void 0;\n }\n }\n}\n\nfunction getOwnerEndpoint( self : Transactional ) : IOEndpoint {\n // Check if we are the member of the collection...\n const { collection } = self as any;\n if( collection ){\n return getOwnerEndpoint( collection );\n }\n\n // Now, if we're the member of the model...\n if( self._owner ){\n const { _endpoints } = self._owner as any;\n return _endpoints && _endpoints[ self._ownerKey ];\n }\n}\n","import { eventsApi } from '../object-plus';\nimport { Owner, Transaction, Transactional, transactionApi, TransactionOptions } from \"../transactions\";\nconst { begin : _begin, markAsDirty : _markAsDirty, commit } = transactionApi;\n\nconst { trigger3 } = eventsApi;\n\nexport interface ConstructorsMixin {\n Attributes : AttributesConstructor\n AttributesCopy : AttributesCopyConstructor\n}\n\nexport interface ConstructorOptions extends TransactionOptions{\n clone? : boolean\n}\n\nexport type AttributesConstructor = new ( record : AttributesContainer, values : object, options : TransactionOptions ) => AttributesValues;\nexport type AttributesCopyConstructor = new ( values : object ) => AttributesValues;\n\nexport interface AttributesContainer extends Transactional, Owner, ConstructorsMixin {\n // Attribute descriptors.\n /** @internal */\n _attributes : AttributesDescriptors\n\n // Attribute values.\n attributes : AttributesValues\n\n // Previous attribute values.\n /** @internal */\n _previousAttributes : AttributesValues\n\n // Changed attributes cache. \n /** @internal */\n _changedAttributes : AttributesValues\n}\n\nexport interface AttributesValues {\n [ name : string ] : any\n}\n\nexport interface AttributesDescriptors {\n [ name : string ] : AttributeUpdatePipeline\n}\n\nexport interface AttributeUpdatePipeline{\n doUpdate( value, record : AttributesContainer, options : TransactionOptions, nested? : Transaction[] ) : boolean\n}\n\n // Optimized single attribute transactional update. To be called from attributes setters\n // options.silent === false, parse === false. \nexport function setAttribute( record : AttributesContainer, name : string, value : any ) : void {\n // Open the transaction.\n const isRoot = begin( record ),\n options = {};\n\n // Update attribute. \n if( record._attributes[ name ].doUpdate( value, record, options ) ){\n // Notify listeners on changes.\n markAsDirty( record, options );\n trigger3( record, 'change:' + name, record, record.attributes[ name ], options );\n }\n\n // Close the transaction.\n isRoot && commit( record );\n}\n\nfunction begin( record : AttributesContainer ){\n if( _begin( record ) ){\n record._previousAttributes = new record.AttributesCopy( record.attributes );\n record._changedAttributes = null;\n return true;\n }\n \n return false;\n}\n\nfunction markAsDirty( record : AttributesContainer, options : TransactionOptions ){\n // Need to recalculate changed attributes, when we have nested set in change:attr handler\n if( record._changedAttributes ){\n record._changedAttributes = null;\n }\n\n return _markAsDirty( record, options );\n}\n\n/**\n * TODO: There's an opportunity to create an optimized pipeline for primitive types and Date, which makes the majority\n * of attributes. It might create the major speedup.\n * \n * Create the dedicated pipeline for owned and shared attributes as well.\n * \n * Three elements of the pipeline:\n * - from constructor\n * - from assignment\n * - from `set`\n */\n\nexport const UpdateRecordMixin = {\n// Need to override it here, since begin/end transaction brackets are overriden. \n transaction( this : AttributesContainer, fun : ( self : AttributesContainer ) => void, options : TransactionOptions = {} ) : void{\n const isRoot = begin( this );\n fun.call( this, this );\n isRoot && commit( this );\n },\n \n // Handle nested changes. TODO: propagateChanges == false, same in transaction.\n _onChildrenChange( child : Transactional, options : TransactionOptions ) : void {\n const { _ownerKey } = child,\n attribute = this._attributes[ _ownerKey ];\n\n if( !attribute /* TODO: Must be an opposite, likely the bug */ || attribute.propagateChanges ) this.forceAttributeChange( _ownerKey, options );\n },\n\n // Simulate attribute change \n forceAttributeChange( key : string, options : TransactionOptions = {} ){\n // Touch an attribute in bounds of transaction\n const isRoot = begin( this );\n\n if( markAsDirty( this, options ) ){\n trigger3( this, 'change:' + key, this, this.attributes[ key ], options );\n }\n \n isRoot && commit( this );\n },\n\n _createTransaction( this : AttributesContainer, a_values : {}, options : TransactionOptions = {} ) : Transaction {\n const isRoot = begin( this ),\n changes : string[] = [],\n nested : RecordTransaction[]= [],\n { _attributes } = this,\n values = options.parse ? this.parse( a_values, options ) : a_values;\n\n let unknown;\n\n if( shouldBeAnObject( this, values, options ) ){\n for( let name in values ){\n const spec = _attributes[ name ];\n\n if( spec ){\n if( spec.doUpdate( values[ name ], this, options, nested ) ){\n changes.push( name );\n }\n }\n else{\n unknown || ( unknown = [] );\n unknown.push( `'${ name }'` );\n }\n }\n\n if( unknown ){\n unknownAttrsWarning( this, unknown, { values }, options );\n }\n }\n \n if( changes.length && markAsDirty( this, options ) ){\n return new RecordTransaction( this, isRoot, nested, changes );\n }\n \n // No changes, but there might be silent attributes with open transactions.\n for( let pendingTransaction of nested ){\n pendingTransaction.commit( this );\n }\n\n isRoot && commit( this );\n }\n};\n\nexport function unknownAttrsWarning( record : AttributesContainer, unknown : string[], props, options ){\n record._log( 'warn', 'Type-R:UnknownAttrs', `undefined attributes ${ unknown.join(', ')} are ignored.`, props, options.logger );\n}\n\n// One of the main performance tricks of Type-R.\n// Create loop unrolled constructors for internal attribute hash,\n// so the hidden class JIT optimization will be engaged and they will become static structs.\n// It dramatically improves record performance.\nexport function constructorsMixin( attrDefs : AttributesDescriptors ) : ConstructorsMixin {\n const attrs = Object.keys( attrDefs );\n\n const AttributesCopy : AttributesCopyConstructor = new Function( 'values', `\n ${ attrs.map( attr =>`\n this.${ attr } = values.${ attr };\n `).join( '' ) }\n `) as any;\n\n AttributesCopy.prototype = Object.prototype;\n\n const Attributes : AttributesConstructor = new Function( 'record', 'values', 'options', `\n var _attrs = record._attributes;\n\n ${ attrs.map( attr =>`\n this.${ attr } = _attrs.${ attr }.doInit( values.${ attr }, record, options );\n `).join( '' ) }\n `) as any;\n\n Attributes.prototype = Object.prototype;\n\n return { Attributes, AttributesCopy };\n}\n\nexport function shouldBeAnObject( record : AttributesContainer, values : object, options ){\n if( values && values.constructor === Object ) return true;\n\n record._log( 'error', 'Type-R:InvalidObject', 'update with non-object is ignored!', { values }, options.logger );\n return false;\n}\n\n// Transaction class. Implements two-phase transactions on object's tree. \n// Transaction must be created if there are actual changes and when markIsDirty returns true. \nexport class RecordTransaction implements Transaction {\n // open transaction\n constructor( public object : AttributesContainer,\n public isRoot : boolean,\n public nested : Transaction[],\n public changes : string[] ){}\n\n // commit transaction\n commit( initiator? : AttributesContainer ) : void {\n const { nested, object, changes } = this;\n\n // Commit all pending nested transactions...\n for( let transaction of nested ){ \n transaction.commit( object );\n }\n\n // Notify listeners on attribute changes...\n // Transaction is never created when silent option is set, so just send events out.\n const { attributes, _isDirty } = object;\n for( let key of changes ){\n trigger3( object, 'change:' + key, object, attributes[ key ], _isDirty );\n }\n\n this.isRoot && commit( object, initiator );\n }\n}","import { IOEndpoint } from '../../io-tools';\nimport { LogLevel, tools, Logger } from '../../object-plus';\nimport { TransactionOptions } from '../../transactions';\nimport { AttributesContainer, AttributeUpdatePipeline, RecordTransaction, setAttribute } from '../updates';\n\nconst { notEqual, assign} = tools;\n\nexport type Transform = ( this : AnyType, next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) => any;\nexport type ChangeHandler = ( this : AnyType, next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) => void;\n\nexport interface AttributeOptions {\n _metatype? : typeof AnyType\n validate? : ( record : AttributesContainer, value : any, key : string ) => any\n isRequired? : boolean\n changeEvents? : boolean\n\n endpoint? : IOEndpoint\n\n type? : Function\n value? : any\n hasCustomDefault? : boolean\n\n parse? : Parse\n toJSON? : AttributeToJSON\n \n getHooks? : GetHook[]\n transforms? : Transform[]\n changeHandlers? : ChangeHandler[]\n\n _onChange? : ChangeAttrHandler\n}\n\nexport type Parse = ( value : any, key : string ) => any;\nexport type GetHook = ( value : any, key : string ) => any;\nexport type AttributeToJSON = ( value : any, key : string ) => any\nexport type AttributeParse = ( value : any, key : string ) => any\nexport type ChangeAttrHandler = ( ( value : any, attr : string ) => void ) | string;\n\n// TODO: interface differs from options, do something obout it\nconst emptyOptions : TransactionOptions = {};\n\n/**\n * Typeless attribute. Is the base class for all other attributes.\n */\nexport class AnyType implements AttributeUpdatePipeline {\n // Factory method to create attribute from options \n static create : ( options : AttributeOptions, name : string ) => AnyType;\n \n /**\n * Update pipeline functions\n * =========================\n *\n * Stage 0. canBeUpdated( value )\n * - presence of this function implies attribute's ability to update in place.\n */\n canBeUpdated( prev, next, options : TransactionOptions ) : any {}\n\n /**\n * Stage 1. Transform stage\n */\n transform( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) : any { return next; }\n\n // convert attribute type to `this.type`.\n convert( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) : any { return next; }\n\n /**\n * Stage 2. Check if attr value is changed\n */\n isChanged( a : any, b : any ) : boolean {\n return notEqual( a, b );\n }\n\n /**\n * Stage 3. Handle attribute change\n */\n handleChange( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) {}\n\n /**\n * End update pipeline definitions.\n */\n\n // create empty object passing backbone options to constructor...\n create() { return void 0; }\n\n // generic clone function for typeless attributes\n // Must be overriden in sublass\n clone( value : any, record : AttributesContainer ) {\n return value;\n }\n\n dispose( record : AttributesContainer, value : any ) : void {\n this.handleChange( void 0, value, record, emptyOptions );\n }\n\n validate( record : AttributesContainer, value : any, key : string ) : any {}\n\n toJSON( value, key, options? : object ) {\n return value && value.toJSON ? value.toJSON( options ) : value;\n }\n\n createPropertyDescriptor() : PropertyDescriptor | void {\n const { name, getHook } = this;\n\n if( name !== 'id' ){\n return {\n // call to optimized set function for single argument.\n set( value ){\n setAttribute( this, name, value );\n },\n\n // attach get hook to the getter function, if it present\n get : (\n getHook ?\n function() {\n return getHook.call( this, this.attributes[ name ], name );\n } :\n function() { return this.attributes[ name ]; }\n ),\n\n configurable : true\n }\n }\n }\n\n value : any\n\n // Used as global default value for the given metatype\n static defaultValue : any;\n\n type : Function\n\n initialize( name : string, options : TransactionOptions ){}\n\n options : AttributeOptions\n\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\n const v = value === void 0 ? this.defaultValue() : value,\n x = this.transform( v, void 0, record, options );\n \n this.handleChange( x, void 0, record, options );\n return x;\n }\n\n doUpdate( value, record : AttributesContainer, options : TransactionOptions, nested? : RecordTransaction[] ){\n const { name } = this,\n { attributes } = record,\n prev = attributes[ name ];\n\n const next = this.transform( value, prev, record, options );\n attributes[ name ] = next;\n\n if( this.isChanged( next, prev ) ) {\n // Do the rest of the job after assignment\n this.handleChange( next, prev, record, options );\n return true;\n }\n\n return false;\n }\n\n propagateChanges : boolean\n\n protected _log( level : LogLevel, code : string, text : string, value, record : AttributesContainer, logger : Logger ){\n record._log( level, code, `${record.getClassName()}.${ this.name } ${ text }`, {\n 'New value' : value,\n 'Prev. value' : record.attributes[ this.name ]\n }, logger );\n }\n\n defaultValue(){\n return this.value;\n }\n\n constructor( public name : string, a_options : AttributeOptions ) { \n // Save original options...\n this.options = a_options;\n\n // Clone options.\n const options : AttributeOptions = { getHooks : [], transforms : [], changeHandlers : [], ...a_options };\n options.getHooks = options.getHooks.slice();\n options.transforms = options.transforms.slice();\n options.changeHandlers = options.changeHandlers.slice();\n\n const {\n value, type, parse, toJSON, changeEvents,\n validate, getHooks, transforms, changeHandlers\n } = options;\n\n // Initialize default value...\n this.value = value;\n this.type = type;\n\n // TODO: An opportunity to optimize for attribute subtype.\n if( !options.hasCustomDefault && type ){\n this.defaultValue = this.create;\n }\n else if( tools.isValidJSON( value ) ){ \n // JSON literals must be deep copied.\n this.defaultValue = new Function( `return ${ JSON.stringify( value ) };` ) as any;\n }\n else{\n this.defaultValue = this.defaultValue;\n }\n\n // Changes must be bubbled when they are not disabled for an attribute and transactional object.\n this.propagateChanges = changeEvents !== false;\n\n this.toJSON = toJSON === void 0 ? this.toJSON : toJSON;\n\n this.validate = validate || this.validate;\n \n if( options.isRequired ){\n this.validate = wrapIsRequired( this.validate );\n }\n\n /**\n * Assemble pipelines...\n */\n\n // `convert` is default transform, which is always present...\n transforms.unshift( this.convert );\n\n // Get hook from the attribute will be used first...\n if( this.get ) getHooks.unshift( this.get );\n\n // let subclasses configure the pipeline...\n this.initialize.call( this, options );\n\n // let attribute spec configure the pipeline...\n if( getHooks.length ){\n const getHook = this.getHook = getHooks.reduce( chainGetHooks );\n\n const { validate } = this;\n this.validate = function( record : AttributesContainer, value : any, key : string ){\n return validate.call( this, record, getHook.call( record, value, key ), key );\n }\n }\n \n this.transform = transforms.length ? transforms.reduce( chainTransforms ) : this.transform;\n \n this.handleChange = changeHandlers.length ? changeHandlers.reduce( chainChangeHandlers ) : this.handleChange;\n\n // Attribute-level parse transform are attached as update hooks modifiers...\n const { doInit, doUpdate } = this;\n this.doInit = parse ? function( value, record : AttributesContainer, options : TransactionOptions ){\n return doInit.call( this, options.parse && value !== void 0 ? parse.call( record, value, this.name ) : value, record, options );\n } : doInit;\n\n this.doUpdate = parse ? function( value, record : AttributesContainer, options : TransactionOptions, nested? : RecordTransaction[] ){\n return doUpdate.call( this, options.parse && value !== void 0 ? parse.call( record, value, this.name ) : value, record, options, nested );\n } : doUpdate;\n }\n\n getHook : ( value, key : string ) => any = null\n get : ( value, key : string ) => any\n}\n\n\nfunction chainGetHooks( prevHook : GetHook, nextHook : GetHook ) : GetHook {\n return function( value, name ) {\n return nextHook.call( this, prevHook.call( this, value, name ), name );\n }\n}\n\nfunction chainTransforms( prevTransform : Transform, nextTransform : Transform ) : Transform {\n return function( next, prev, record, options ) {\n return nextTransform.call( this, prevTransform.call( this, next, prev, record, options ), prev, record, options );\n }\n}\n\nfunction chainChangeHandlers( prevHandler : ChangeHandler, nextHandler : ChangeHandler ) : ChangeHandler {\n return function( next, prev, record, options ) {\n prevHandler.call( this, next, prev, record, options );\n nextHandler.call( this, next, prev, record, options );\n }\n}\n\nfunction wrapIsRequired( validate ){\n return function( record : AttributesContainer, value : any, key : string ){\n return value ? validate.call( this, record, value, key ) : 'Required';\n }\n}","/**\n * Built-in JSON types attributes: Object, Array, Number, String, Boolean, and immutable class.\n * \n * Adds type assertions, default validation, and optimized update pipeline.\n */\n\nimport { TransactionOptions } from '../../transactions';\nimport { AnyType } from './any';\nimport { AttributesContainer } from '../updates';\n\n/**\n * Custom class must be immutable class which implements toJSON() method\n * with a constructor taking json.\n */\nexport class ImmutableClassType extends AnyType {\n type : new ( value? : any ) => {}\n\n create(){\n return new this.type();\n }\n\n convert( next : any ) : any {\n return next == null || next instanceof this.type ? next : new this.type( next );\n }\n\n toJSON( value, key? : string, options? : object ){\n return value && value.toJSON ? value.toJSON( options ) : value;\n }\n\n clone( value ) {\n return new this.type( this.toJSON( value ) );\n }\n\n isChanged( a, b ){\n return a !== b;\n }\n}\n\n/**\n * Optimized attribute of primitive type.\n * \n * Primitives has specialized simplified pipeline.\n */\nexport class PrimitiveType extends AnyType {\n type : NumberConstructor | StringConstructor | BooleanConstructor\n\n dispose(){}\n create() { return this.type(); }\n\n toJSON( value ) { return value; }\n\n convert( next ) { return next == null ? next : this.type( next ); }\n\n isChanged( a, b ) { return a !== b; }\n\n clone( value ) { return value; }\n\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\n return this.transform( value === void 0 ? this.value : value, void 0, record, options );\n }\n\n doUpdate( value, record, options, nested ){\n const { name } = this,\n { attributes } = record,\n prev = attributes[ name ];\n \n return prev !== ( attributes[ name ] = this.transform( value, prev, record, options ) );\n }\n\n initialize(){\n if( !this.options.hasCustomDefault ){\n this.value = this.type();\n }\n }\n}\n\n// Number type with special validation algothim.\n/** @private */ \nexport class NumericType extends PrimitiveType {\n type : NumberConstructor\n\n create(){\n return 0;\n }\n\n convert( next, prev?, record?, options? ) {\n const num = next == null ? next : this.type( next );\n\n if( num !== num ){\n this._log( 'error', 'Type-R:InvalidNumber', 'Number attribute is assigned with an invalid number', next, record, options.logger );\n }\n \n return num;\n }\n\n validate( model, value, name ) {\n // Whatever is not symmetrically serializable to JSON, is not valid by default.\n if( value != null && !isFinite( value ) ) {\n return name + ' is not valid number';\n }\n }\n}\n\n/**\n * Compatibility wrapper for Array type.\n * @private\n */ \nexport class ArrayType extends AnyType {\n toJSON( value ) { return value; }\n dispose(){}\n create(){ return []; }\n\n convert( next, prev, record, options ) {\n // Fix incompatible constructor behaviour of Array...\n if( next == null || Array.isArray( next ) ) return next;\n\n this._log( 'error', 'Type-R:InvalidArray', 'Array attribute assigned with non-array value', next, record, options.logger );\n\n return [];\n }\n\n clone( value ){\n return value && value.slice();\n }\n}\n\nexport class ObjectType extends AnyType {\n create(){ return {}; }\n\n convert( next, prev, record, options ) {\n if( next == null || typeof next === 'object' ) return next;\n \n this._log( 'error', 'Type-R:InvalidObject', 'Object attribute is assigned with non-object value', next, record, options.logger );\n return {};\n }\n}\n\nexport function doNothing(){}\n\nexport class FunctionType extends AnyType {\n // Functions are not serialized.\n toJSON( value ) { return void 0; }\n create(){ return doNothing; }\n dispose(){}\n\n convert( next, prev, record, options ) {\n // Fix incompatible constructor behaviour of Function...\n if( next == null || typeof next === 'function' ) return next;\n\n this._log( 'error', 'Type-R:InvalidFunction', 'Function attribute assigned with non-function value', next, record, options.logger );\n\n return doNothing;\n }\n\n // Functions are not cloned.\n clone( value ){ return value; }\n}\n","/**\n * Date attribute type.\n * \n * Implements validation, cross-browser compatibility fixes, variety of Date serialization formats,\n * and optimized update pipeline.\n */\nimport { TransactionOptions } from '../../transactions';\nimport { AnyType } from './any';\nimport { AttributesContainer } from '../updates';\n\n// Date Attribute\n/** @private */\nexport class DateType extends AnyType {\n create(){\n return new Date();\n }\n \n convert( next : any, a, record, options ){\n if( next == null || next instanceof Date ) return next;\n\n const date = new Date( next ),\n timestamp = date.getTime();\n\n if( timestamp !== timestamp ){\n this._log( 'error', 'Type-R:InvalidDate', 'Date attribute assigned with invalid date', next, record, options.logger );\n }\n\n return date;\n }\n\n validate( model, value, name ) {\n if( value != null ){\n const timestamp = value.getTime(); \n if( timestamp !== timestamp ) return name + ' is Invalid Date';\n }\n }\n\n toJSON( value ) { return value && value.toISOString(); }\n\n isChanged( a, b ) { return ( a && a.getTime() ) !== ( b && b.getTime() ); }\n\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\n // Date don't have handleChanges step.\n return this.transform( value === void 0 ? this.defaultValue() : value, void 0, record, options );\n }\n\n doUpdate( value, record, options, nested ){\n const { name } = this,\n { attributes } = record,\n prev = attributes[ name ];\n \n // Date don't have handleChanges step.\n return this.isChanged( prev , attributes[ name ] = this.transform( value, prev, record, options ) );\n }\n\n clone( value ) { return value && new Date( value.getTime() ); }\n dispose(){}\n}\n\n// If ISO date is not supported by date constructor (such as in Safari), polyfill it.\nfunction supportsDate( date ){\n return !isNaN( ( new Date( date ) ).getTime() );\n}\n\nif( !supportsDate('2011-11-29T15:52:30.5') ||\n !supportsDate('2011-11-29T15:52:30.52') ||\n !supportsDate('2011-11-29T15:52:18.867') ||\n !supportsDate('2011-11-29T15:52:18.867Z') ||\n !supportsDate('2011-11-29T15:52:18.867-03:30') ){\n\n DateType.prototype.convert = function( value ){\n return value == null || value instanceof Date ? value : new Date( safeParseDate( value ) );\n }\n}\n\nconst numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ],\n isoDatePattern = /^(\\d{4}|[+\\-]\\d{6})(?:-(\\d{2})(?:-(\\d{2}))?)?(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:(Z)|([+\\-])(\\d{2})(?::(\\d{2}))?)?)?$/;\n\nfunction safeParseDate( date : string ) : number {\n var timestamp, struct : any[], minutesOffset = 0;\n\n if( ( struct = isoDatePattern.exec( date )) ) {\n // avoid NaN timestamps caused by undefined values being passed to Date.UTC\n for( var i = 0, k; ( k = numericKeys[ i ] ); ++i ) {\n struct[ k ] = +struct[ k ] || 0;\n }\n\n // allow undefined days and months\n struct[ 2 ] = (+struct[ 2 ] || 1) - 1;\n struct[ 3 ] = +struct[ 3 ] || 1;\n\n if( struct[ 8 ] !== 'Z' && struct[ 9 ] !== undefined ) {\n minutesOffset = struct[ 10 ] * 60 + struct[ 11 ];\n\n if( struct[ 9 ] === '+' ) {\n minutesOffset = 0 - minutesOffset;\n }\n }\n\n timestamp =\n Date.UTC( struct[ 1 ], struct[ 2 ], struct[ 3 ], struct[ 4 ], struct[ 5 ] + minutesOffset, struct[ 6 ],\n struct[ 7 ] );\n }\n else {\n timestamp = Date.parse( date );\n }\n\n return timestamp;\n}","import { ItemsBehavior, Transactional, transactionApi, TransactionOptions } from '../../transactions';\nimport { ValidationError } from '../../validation';\nimport { AnyType } from './any';\nimport { AttributesContainer, ConstructorOptions } from '../updates';\n\nconst { free, aquire } = transactionApi;\n\nexport class AggregatedType extends AnyType {\n type : typeof Transactional\n\n clone( value : Transactional ) : Transactional {\n return value ? value.clone() : value;\n }\n\n toJSON( x, key : string, options : object ){ return x && x.toJSON( options ); }\n\n doInit( value, record : AttributesContainer, options : ConstructorOptions ){\n const v = options.clone ? this.clone( value ) : (\n value === void 0 ? this.defaultValue() : value\n );\n\n const x = this.transform( v, void 0, record, options );\n this.handleChange( x, void 0, record, options );\n return x;\n }\n\n doUpdate( value, record, options, nested : any[] ){ // Last to things can be wrapped to an object, either transaction or ad-hoc\n const key = this.name, { attributes } = record; \n const prev = attributes[ key ];\n let update;\n\n // This can be moved to transactional attribute. And chained with the rest.\n if( update = this.canBeUpdated( prev, value, options ) ) { // todo - skip empty updates.\n const nestedTransaction = prev._createTransaction( update, options );\n if( nestedTransaction ){\n if( nested ){\n nested.push( nestedTransaction );\n }\n else{\n nestedTransaction.commit( record );\n }\n\n if( this.propagateChanges ) return true;\n }\n\n return false;\n }\n\n const next = this.transform( value, prev, record, options );\n attributes[ key ] = next;\n\n if( this.isChanged( next, prev ) ) { // Primitives and nested comparison can be inlined.\n // Do the rest of the job after assignment\n this.handleChange( next, prev, record, options );\n\n return true;\n }\n\n return false;\n }\n\n canBeUpdated( prev : Transactional, next : any, options : TransactionOptions ) : any {\n // If an object already exists, and new value is of incompatible type, let object handle the update.\n if( prev && next != null ){\n if( next instanceof this.type ){\n // In case if merge option explicitly specified, force merge.\n if( options.merge ) return next.__inner_state__;\n }\n else{\n return next;\n }\n }\n }\n\n convert( next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) : Transactional {\n // Invoke class factory to handle abstract classes\n if( next == null ) return next;\n \n if( next instanceof this.type ){\n if( next._shared && !( next._shared & ItemsBehavior.persistent ) ) { // TODO: think more about shared types assignment compatibility. \n this._log( 'error', 'Type-R:InvalidCollection', 'aggregated collection attribute is assigned with shared collection type', next, record, options.logger );\n }\n\n // With explicit 'merge' option we need to clone an object if its previous value was 'null'.\n // This is an only case we could be here when merge === true.\n if( options.merge ) return next.clone();\n\n if( next._owner ){\n this._log( 'warn', 'Type-R:InvalidOwner', 'object alreay has an owner and was cloned. Use explicit object.clone() to dismiss this warning.', next, record, options.logger );\n return next.clone();\n }\n\n return next;\n }\n\n return ( this.type as any).create( next, options );\n }\n\n dispose ( record : AttributesContainer, value : Transactional ){\n if( value ){\n this.handleChange( void 0, value, record, {} );\n }\n }\n\n validate( record : AttributesContainer, value : Transactional ) : ValidationError {\n var error = value && value.validationError;\n if( error ) return error;\n }\n\n create() : Transactional {\n return (this.type).create(); // this the subclass of Transactional here.\n }\n\n initialize( options ){\n options.changeHandlers.unshift( this._handleChange );\n }\n\n _handleChange( next : Transactional, prev : Transactional, record : AttributesContainer, options : TransactionOptions ){\n if( prev ){\n free( record, prev );\n options.unset || prev.dispose();\n } \n \n if( next ) aquire( record, next, this.name );\n }\n}","import { eventsApi } from '../../object-plus';\nimport { ItemsBehavior, Transactional, transactionApi, TransactionOptions } from '../../transactions';\nimport { AnyType } from './any';\nimport { AttributesContainer, ConstructorOptions } from '../updates';\nimport { ChainableAttributeSpec } from '../attrDef';\n\nconst { on, off } = eventsApi,\n { free, aquire } = transactionApi;\n\n/************************\n * Shared attribute definition.\n * - Not serialized.\n * - Listening to the changes.\n * - Doesn't take ownership when assigned with object of proper type.\n * - Takes ownership on objects which are converted.\n */\n\nconst shareAndListen = ItemsBehavior.listen | ItemsBehavior.share;\n\n/** @private */\nexport class SharedType extends AnyType {\n type : typeof Transactional\n\n doInit( value, record : AttributesContainer, options : ConstructorOptions ){\n const v = options.clone ? this.clone( value, record ) : (\n value === void 0 ? this.defaultValue() : value\n );\n\n const x = this.transform( v, void 0, record, options );\n this.handleChange( x, void 0, record, options );\n return x;\n }\n\n doUpdate( value, record, options, nested : any[] ){ // Last to things can be wrapped to an object, either transaction or ad-hoc\n const key = this.name, { attributes } = record; \n const prev = attributes[ key ];\n let update;\n\n // This can be moved to transactional attribute. And chained with the rest.\n if( update = this.canBeUpdated( prev, value, options ) ) { // todo - skip empty updates.\n const nestedTransaction = prev._createTransaction( update, options );\n if( nestedTransaction ){\n if( nested ){\n nested.push( nestedTransaction );\n }\n else{\n nestedTransaction.commit( record );\n }\n\n if( this.propagateChanges ) return true;\n }\n\n return false;\n }\n\n const next = this.transform( value, prev, record, options );\n attributes[ key ] = next;\n\n if( this.isChanged( next, prev ) ) { // Primitives and nested comparison can be inlined.\n // Do the rest of the job after assignment\n this.handleChange( next, prev, record, options );\n\n return true;\n }\n\n return false;\n }\n\n clone( value : Transactional, record : AttributesContainer ) : Transactional {\n // References are not cloned.\n if( !value || value._owner !== record ) return value;\n\n // Implicitly created objects are cloned.\n const clone = value.clone();\n aquire( record, clone, this.name );\n return clone;\n }\n\n // Do not serialize by default.\n toJSON(){}\n\n canBeUpdated( prev : Transactional, next : any, options : TransactionOptions ) : any {\n // If an object already exists, and new value is of incompatible type, let object handle the update.\n if( prev && next != null && !( next instanceof this.type ) ){\n return next;\n }\n }\n\n convert( next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) : Transactional {\n if( next == null || next instanceof this.type ) return next;\n\n // Convert type using implicitly created transactional object.\n const implicitObject = new ( this.type as any )( next, options, shareAndListen );\n\n // To prevent a leak, we need to take an ownership on it.\n aquire( record, implicitObject, this.name );\n\n return implicitObject;\n }\n\n // Refs are always valid.\n validate( model, value, name ){}\n\n // They are always created as null.\n create() : Transactional {\n return null;\n }\n\n // Listening to the change events\n _handleChange( next : Transactional, prev : Transactional, record : AttributesContainer, options ){\n if( prev ){\n // If there was an implicitly created object, remove an ownership.\n if( prev._owner === record ){\n free( record, prev );\n options.unset || prev.dispose();\n }\n else{\n off( prev, prev._changeEventName, this._onChange, record );\n }\n } \n \n if( next ){\n // No need to take an ownership for an implicit object - already done in convert or clone.\n if( next._owner !== record ){\n on( next, next._changeEventName, this._onChange, record );\n }\n } \n }\n\n dispose( record : AttributesContainer, value : Transactional ){\n if( value ){\n this.handleChange( void 0, value, record, {} );\n }\n }\n\n _onChange : ( child : Transactional, options : TransactionOptions, initiator : Transactional ) => void \n\n initialize( options ){\n // Create change event handler which knows current attribute name. \n const attribute = this;\n this._onChange = this.propagateChanges ? function( child, options, initiator ){\n this === initiator || this.forceAttributeChange( attribute.name, options );\n } : ignore;\n\n options.changeHandlers.unshift( this._handleChange );\n }\n}\n\nfunction ignore(){}","import { PrimitiveType, NumericType, ObjectType, ImmutableClassType, FunctionType, ArrayType } from './basic';\nimport { DateType } from './date';\nimport { AnyType, AttributeOptions } from './any';\n\nexport * from './any';\nexport * from './basic';\nexport * from './date';\nexport * from './owned';\nexport * from './shared';\n\n/**\n * Every record attribute type has the corresponding metatype controlling its behavior.\n * For built-in types, Type-R uses the predefined list to resolve metatype in order to avoid global objects modifications.\n * For user-defined types, static `_metatype` constructor member is used.\n */\n\nconst builtins : Function[] = [ String, Number, Boolean, Date, Object, Array, Function ],\n metatypes = [ PrimitiveType, NumericType, PrimitiveType, DateType, ObjectType, ArrayType, FunctionType ];\n\nexport function getMetatype( Ctor : Function ){\n return ( Ctor as any )._metatype || resolveBuiltins( Ctor );\n}\n\nAnyType.create = ( options : AttributeOptions, name : string ) => {\n const type = options.type,\n AttributeCtor = options._metatype || ( type ? getMetatype( type ): AnyType );\n\n return new AttributeCtor( name, options );\n}\n\nfunction resolveBuiltins( Ctor : Function ){\n const idx = builtins.indexOf( Ctor );\n return idx < 0 ? ImmutableClassType : metatypes[ idx ];\n}","/**\n * Type spec engine. Declare attributes using chainable syntax,\n * and returns object with spec.\n */\nimport { IOEndpoint } from '../io-tools';\nimport { definitionDecorator, EventMap, EventsDefinition, tools } from '../object-plus';\nimport { Transactional } from '../transactions';\nimport { AttributeOptions, Parse, AnyType, getMetatype, SharedType } from './metatypes';\nimport { AttributesContainer } from './updates';\n\nconst { assign } = tools;\n\nexport interface AttributeCheck {\n ( value : any, key : string ) : boolean\n error? : any\n}\n\n// Infer the proper TS type from a Type-R attribute spec.\nexport type Infer =\n A extends ChainableAttributeSpec ? TrueReturnType :\n A extends Function ? TrueReturnType :\n A;\n \n// Extract the proper TS return type for a function or constructor.\ntype TrueReturnType =\n F extends DateConstructor ? Date :\n F extends ( ...args : any[] ) => infer R ? R :\n F extends new ( ...args : any[] ) => infer R ? R :\n void;\n\nexport class ChainableAttributeSpec{\n options : AttributeOptions & { type? : F };\n\n constructor( options : AttributeOptions ) {\n // Shallow copy options, fill it with defaults.\n this.options = { getHooks : [], transforms : [], changeHandlers : []};\n if( options ) assign( this.options, options );\n }\n\n check( check : AttributeCheck, error? : any ) : this {\n function validate( model, value, name ){\n if( !check.call( model, value, name ) ){\n const msg = error || check.error || name + ' is not valid';\n return typeof msg === 'function' ? msg.call( model, name ) : msg;\n }\n }\n\n const prev = this.options.validate;\n\n return this.metadata({\n validate : prev ? (\n function( model, value, name ){\n return prev( model, value, name ) || validate( model, value, name );\n }\n ) : validate\n });\n }\n\n get as() : PropertyDecorator {\n return definitionDecorator( 'attributes', this );\n }\n\n get isRequired() : this {\n return this.required;\n }\n\n get required() : this {\n return this.metadata({ isRequired : true }); \n }\n\n endpoint( endpoint : IOEndpoint ) : this {\n return this.metadata({ endpoint });\n }\n\n watcher( ref : string | ( ( value : any, key : string ) => void ) ) : this {\n return this.metadata({ _onChange : ref });\n }\n\n // Attribute-specific parse transform\n parse( fun : Parse ) : this {\n return this.metadata({ parse : fun });\n }\n\n toJSON( fun ) : this {\n return this.metadata({\n toJSON : typeof fun === 'function' ? fun : ( fun ? ( x, k, o ) => x && x.toJSON( o ) : emptyFunction ) \n });\n }\n\n // Attribute get hook.\n get( fun ) : this {\n return this.metadata({\n getHooks : this.options.getHooks.concat( fun )\n });\n }\n\n // Attribute set hook.\n set( fun ) : this {\n function handleSetHook( next, prev, record : AttributesContainer, options ) {\n if( this.isChanged( next, prev ) ) {\n const changed = fun.call( record, next, this.name );\n return changed === void 0 ? prev : this.convert( changed, prev, record, options );\n }\n\n return prev;\n }\n\n return this.metadata({\n transforms : this.options.transforms.concat( handleSetHook )\n });\n }\n\n changeEvents( events : boolean ) : this {\n return this.metadata({ changeEvents : events });\n }\n\n // Subsribe to events from an attribute.\n events( map : EventsDefinition ) : this {\n const eventMap = new EventMap( map );\n\n function handleEventsSubscribtion( next, prev, record : AttributesContainer ){\n prev && prev.trigger && eventMap.unsubscribe( record, prev );\n\n next && next.trigger && eventMap.subscribe( record, next );\n }\n\n return this.metadata({\n changeHandlers : this.options.changeHandlers.concat( handleEventsSubscribtion )\n });\n }\n\n // Creates a copy of the spec.\n get has() : this {\n return this;\n }\n\n metadata( options : object ) : this {\n const cloned = new ChainableAttributeSpec( this.options );\n assign( cloned.options, options );\n return cloned as any;\n }\n\n value( x ) : this {\n return this.metadata({ value : x, hasCustomDefault : true });\n }\n\n static from( spec : any ) : ChainableAttributeSpec {\n // Pass metatype through untouched...\n if( spec && spec instanceof ChainableAttributeSpec ) {\n return spec;\n }\n\n return typeof spec === 'function' ? type( spec ) : value( spec );\n }\n}\n\nfunction emptyFunction(){}\n\nexport function type( this : void, Type : ChainableAttributeSpec | F, value? : any ) : ChainableAttributeSpec {\n if( Type instanceof ChainableAttributeSpec ) return Type;\n\n const attrDef = new ChainableAttributeSpec({ type : Type }),\n defaultValue = Type && value === void 0 ? getMetatype( Type ).defaultValue : value;\n\n return defaultValue === void 0 ? attrDef : attrDef.value( defaultValue );\n}\n\nexport function shared( this : void, Constructor : C ) : ChainableAttributeSpec {\n return new ChainableAttributeSpec({\n value : null,\n type : Constructor,\n _metatype : SharedType\n });\n}\n\n// Create attribute metatype inferring the type from the value.\nexport function value( this : void, x : any ) : ChainableAttributeSpec {\n const Type = inferType( x ),\n // Transactional types inferred from values must have shared type. \n AttrDef = Type && Type.prototype instanceof Transactional ? shared( Type ) :\n type( Type );\n\n return AttrDef.value( x );\n}\n\nfunction inferType( value : any ) : Function {\n switch( typeof value ) {\n case 'number' :\n return Number;\n case 'string' :\n return String;\n case 'boolean' :\n return Boolean;\n case 'function' :\n return Function;\n case 'undefined' :\n return void 0;\n case 'object' :\n return value ? value.constructor : void 0;\n }\n}","import { IOEndpoint } from '../io-tools';\nimport { eventsApi, tools as _ } from '../object-plus';\nimport { CompiledReference } from '../traversable';\nimport { ChainableAttributeSpec } from './attrDef';\nimport { AnyType } from './metatypes';\nimport { ConstructorsMixin, constructorsMixin } from './updates';\n\nexport interface RecordAttributesMixin extends ConstructorsMixin {\n // Attributes descriptors\n _attributes : AttributeDescriptors\n _attributesArray : AnyType[]\n \n // Attribute's property descriptors\n properties : PropertyDescriptorMap\n\n // Event map for record's local events.\n _localEvents? : eventsApi.EventMap,\n\n _endpoints : { [ name : string ] : IOEndpoint }\n}\n\nexport interface AttributeDescriptors {\n [ name : string ] : AnyType\n}\n\n// Create attribute from the type spec.\nexport function createAttribute( spec : any, name : string ) : AnyType {\n return AnyType.create( ChainableAttributeSpec.from( spec ).options, name );\n}\n\n// Create record mixin from the given record's attributes definition\nexport function createAttributesMixin( attributesDefinition : object, baseClassAttributes : AttributeDescriptors ) : RecordAttributesMixin {\n const myAttributes = _.transform( {} as AttributeDescriptors, attributesDefinition, createAttribute ),\n allAttributes = _.defaults( {} as AttributeDescriptors, myAttributes, baseClassAttributes );\n\n const ConstructorsMixin = constructorsMixin( allAttributes );\n\n return {\n ...ConstructorsMixin,\n _attributes : new ConstructorsMixin.AttributesCopy( allAttributes ),\n _attributesArray : Object.keys( allAttributes ).map( key => allAttributes[ key ] ),\n properties : _.transform( {}, myAttributes, x => x.createPropertyDescriptor() ),\n ...localEventsMixin( myAttributes ),\n _endpoints : _.transform( {}, allAttributes, attrDef => attrDef.options.endpoint )\n } \n}\n\ninterface LocalEventsMixin {\n _localEvents? : eventsApi.EventMap\n}\n\nfunction localEventsMixin( attrSpecs : AttributeDescriptors ) : LocalEventsMixin {\n let _localEvents : eventsApi.EventMap;\n\n for( var key in attrSpecs ){\n const attribute = attrSpecs[ key ],\n { _onChange } = attribute.options; \n\n if( _onChange ){\n _localEvents || ( _localEvents = new eventsApi.EventMap() );\n\n _localEvents.addEvent( 'change:' + key,\n typeof _onChange === 'string' ?\n createWatcherFromRef( _onChange, key ) : \n wrapWatcher( _onChange, key ) );\n }\n }\n\n return _localEvents ? { _localEvents } : {};\n}\n\nfunction wrapWatcher( watcher, key ){\n return function( record, value ){\n watcher.call( record, value, key );\n } \n}\n\nfunction createWatcherFromRef( ref : string, key : string ){\n const { local, resolve, tail } = new CompiledReference( ref, true );\n return local ?\n function( record, value ){\n record[ tail ]( value, key );\n } :\n function( record, value ){\n resolve( record )[ tail ]( value, key );\n }\n}","import { IOEndpoint, IONode, IOOptions, IOPromise, startIO } from '../io-tools';\nimport { TransactionOptions } from '../transactions';\n\nexport interface IORecord extends IONode {\n getEndpoint() : IOEndpoint\n save( options? : object ) : IOPromise\n fetch( options? : object ) : IOPromise\n destroy( options? : object ) : IOPromise\n toJSON( options? : object ) : any\n parse( data : any, options? : object ) : any\n isNew() : boolean\n id : string | number\n set( json : object, options : TransactionOptions ) : this\n}\n\nexport const IORecordMixin = {\n save( this : IORecord, options : IOOptions = {} ){\n const endpoint = this.getEndpoint(),\n json = this.toJSON({ ioMethod : 'save', ...options });\n\n return startIO(\n this,\n this.isNew() ?\n endpoint.create( json, options, this ) :\n endpoint.update( this.id, json, options, this ),\n options,\n\n update => {\n this.set( update, {\n parse : true,\n ioMethod : 'save',\n ...options\n } );\n }\n );\n },\n\n fetch( options : IOOptions = {} ){\n return startIO(\n this,\n this.getEndpoint().read( this.id, options, this ),\n options,\n\n json => this.set( json, { parse : true, ioMethod : 'fetch', ...options } )\n );\n },\n\n destroy( options : IOOptions = {} ){ \n return startIO(\n this,\n this.getEndpoint().destroy( this.id, options, this ),\n options,\n\n () => {\n const { collection } = this;\n if( collection ){\n collection.remove( this, options );\n }\n else{\n this.dispose();\n }\n\n return this;\n }\n )\n }\n}","/**\n * Record core implementing transactional updates.\n * The root of all definitions. \n */\n\nimport { CollectionConstructor } from '../collection';\nimport { IOEndpoint, IOPromise } from '../io-tools';\nimport { define, definitions, isProduction, Logger, logger, LogLevel, mixinRules, tools } from '../object-plus';\nimport { CloneOptions, Owner, Transaction, Transactional, TransactionalDefinition, TransactionOptions } from '../transactions';\nimport { ChildrenErrors } from '../validation';\nimport { AggregatedType, AnyType } from './metatypes';\nimport { IORecord, IORecordMixin } from './io-mixin';\nimport { AttributesConstructor, AttributesContainer, AttributesCopyConstructor, AttributesValues, setAttribute, shouldBeAnObject, unknownAttrsWarning, UpdateRecordMixin } from './updates';\nimport { type } from './attrDef';\n\n\nconst { assign, isEmpty } = tools;\n\n/*******************************************************\n * Record core implementation\n */\n\nexport interface ConstructorOptions extends TransactionOptions{\n clone? : boolean\n}\n\n// Client unique id counter\nlet _cidCounter : number = 0;\n\n/***************************************************************\n * Record Definition as accepted by Record.define( definition )\n */\nexport interface RecordDefinition extends TransactionalDefinition {\n idAttribute? : string\n attributes? : AttributesValues\n collection? : object\n Collection? : typeof Transactional\n}\n\n@define({\n // Default client id prefix \n cidPrefix : 'm',\n\n // Name of the change event\n _changeEventName : 'change',\n\n // Default id attribute name\n idAttribute : 'id'\n})\n@definitions({\n defaults : mixinRules.merge,\n attributes : mixinRules.merge,\n collection : mixinRules.merge,\n Collection : mixinRules.value,\n idAttribute : mixinRules.protoValue\n})\nexport class Record extends Transactional implements IORecord, AttributesContainer, Iterable {\n /** @internal */\n static _metatype = AggregatedType;\n\n // Hack\n static onDefine( definition, BaseClass ){}\n\n static Collection : CollectionConstructor;\n static DefaultCollection : CollectionConstructor;\n \n // Attribute type for the record id.\n static id = type( String ).value( null );\n \n // Lazy object reference, serializable as id.\n static get ref(){\n return type( this )\n .toJSON( x => x ? x.id : null )\n .parse( x => {\n return { [ this.prototype.idAttribute ] : x };\n });\n }\n\n static defaults( attrs : AttributesValues ) : typeof Record {\n return this.extend({ attributes : attrs });\n }\n \n static attributes : AttributesValues\n\n /********************\n * IO Methods\n */\n /** @internal */\n _endpoints : { [ name : string ] : IOEndpoint }\n\n /***********************************\n * Core Members\n */\n previousAttributes(){ return new this.AttributesCopy( this._previousAttributes ); } \n\n // Polymorphic accessor for aggregated attribute's canBeUpdated().\n /** @internal */\n get __inner_state__(){ return this.attributes; }\n\n get changed(){\n let changed = this._changedAttributes;\n\n if( !changed ){\n const prev = this._previousAttributes;\n changed = {};\n\n const { attributes } = this;\n\n for( let attr of this._attributesArray ){\n const key = attr.name,\n value = attributes[ key ];\n\n if( attr.isChanged( value, prev[ key ] ) ){\n changed[ key ] = value;\n }\n }\n\n this._changedAttributes = changed;\n }\n\n return changed; \n }\n\n changedAttributes( diff? : {} ) : boolean | {} {\n if( !diff ) return this.hasChanged() ? { ...this.changed } : false;\n\n var val, changed : {} | boolean = false,\n old = this._transaction ? this._previousAttributes : this.attributes,\n attrSpecs = this._attributes;\n\n for( var attr in diff ){\n if( !attrSpecs[ attr ].isChanged( old[ attr ], ( val = diff[ attr ] ) ) ) continue;\n (changed || (changed = {}))[ attr ] = val;\n }\n\n return changed; \n }\n\n hasChanged( key? : string ) : boolean {\n const { _previousAttributes } = this;\n if( !_previousAttributes ) return false;\n\n return key ?\n this._attributes[ key ].isChanged( this.attributes[ key ], _previousAttributes[ key ] ) :\n !isEmpty( this.changed );\n }\n\n previous( key : string ) : any {\n if( key ){\n const { _previousAttributes } = this;\n if( _previousAttributes ) return _previousAttributes[ key ];\n }\n \n return null;\n }\n\n isNew() : boolean {\n return this.id == null;\n }\n\n has( key : string ) : boolean {\n return this[ key ] != void 0;\n }\n\n // Return attribute value, setting an attribute to undefined.\n // TODO: If attribute was aggregated, don't dispose it.\n unset( key : string, options? ) : any {\n const value = this[ key ];\n this.set({ [ key ] : void 0 }, { unset : true, ...options });\n return value;\n }\n\n // Undocumented. Move to NestedTypes?\n clear( options? ) : this {\n const nullify = options && options.nullify;\n\n this.transaction( () =>{\n this.forEach( ( value, key ) => this[ key ] = nullify ? null : void 0 );\n }, options );\n\n return this;\n }\n\n // Returns Record owner skipping collections. TODO: Move out\n getOwner() : Owner {\n const owner : any = this._owner;\n\n // If there are no key, owner must be transactional object, and it's the collection.\n // We don't expect that collection can be the member of collection, so we're skipping just one level up. An optimization.\n return this._ownerKey ? owner : owner && owner._owner;\n }\n\n /***********************************\n * Identity managements\n */\n\n // Id attribute name ('id' by default)\n idAttribute : string;\n\n // Fixed 'id' property pointing to id attribute\n get id() : string { return this.attributes[ this.idAttribute ]; }\n set id( x : string ){ setAttribute( this, this.idAttribute, x ); }\n\n /***********************************\n * Dynamically compiled stuff\n */\n\n // Attributes specifications\n /** @internal */\n _attributes : { [ key : string ] : AnyType }\n\n /** @internal */\n _attributesArray : AnyType[]\n\n // Attributes object copy constructor\n Attributes : AttributesConstructor\n AttributesCopy : AttributesCopyConstructor\n\n // Create record default values, optionally augmenting given values.\n defaults( values = {} ){\n const defaults = {},\n { _attributesArray } = this;\n\n for( let attr of _attributesArray ){\n const key = attr.name,\n value = values[ key ];\n\n defaults[ key ] = value === void 0 ? attr.defaultValue() : value;\n }\n\n return defaults;\n }\n\n /***************************************************\n * Record construction\n */\n // Create record, optionally setting an owner\n constructor( a_values? : any, a_options? : ConstructorOptions ){\n super( _cidCounter++ );\n this.attributes = {};\n \n const options = a_options || {},\n values = ( options.parse ? this.parse( a_values, options ) : a_values ) || {};\n\n isProduction || typeCheck( this, values, options );\n\n this._previousAttributes = this.attributes = new this.Attributes( this, values, options );\n\n this.initialize( a_values, a_options );\n\n if( this._localEvents ) this._localEvents.subscribe( this, this );\n }\n\n // Initialization callback, to be overriden by the subclasses \n initialize( values? : Partial, options? ){}\n\n // Deeply clone record, optionally setting new owner.\n clone( options : CloneOptions = {} ) : this {\n const copy : this = new (this.constructor)( this.attributes, { clone : true } );\n \n if( options.pinStore ) copy._defaultStore = this.getStore();\n\n return copy;\n }\n\n /** @internal */\n _validateNested( errors : ChildrenErrors ) : number {\n var length = 0;\n\n const { attributes } = this;\n\n for( let attribute of this._attributesArray ){\n const { name } = attribute,\n error = attribute.validate( this, attributes[ name ], name );\n\n if( error ){\n errors[ name ] = error;\n length++;\n }\n }\n\n return length;\n }\n\n // Get attribute by key\n get( key : string ) : any {\n return this[ key ];\n }\n\n // Apply bulk in-place object update in scope of ad-hoc transaction \n set( values : any, options? : TransactionOptions ) : this {\n if( values ){ \n const transaction = this._createTransaction( values, options );\n transaction && transaction.commit();\n }\n\n return this;\n }\n\n /**\n * Serialization control\n */\n\n // Default record-level serializer, to be overriden by subclasses \n toJSON( options? : TransactionOptions ) : any {\n const json = {},\n { attributes } = this;\n\n for( let attribute of this._attributesArray ){\n const { name } = attribute,\n value = attributes[ name ];\n\n if( value !== void 0 ){\n // ...serialize it according to its spec.\n const asJson = attribute.toJSON.call( this, value, name, options );\n\n // ...skipping undefined values. Such an attributes are excluded.\n if( asJson !== void 0 ) json[ name ] = asJson; \n }\n }\n\n return json;\n }\n \n // Default record-level parser, to be overriden by the subclasses.\n parse( data, options? : TransactionOptions ){\n return data;\n }\n\n /**\n * Transactional control\n */\n deepSet( name : string, value : any, options? : any ){\n // Operation might involve series of nested object updates, thus it's wrapped in transaction.\n this.transaction( () => {\n const path = name.split( '.' ),\n l = path.length - 1,\n attr = path[ l ];\n\n let model = this;\n\n // Locate the model, traversing the path.\n for( let i = 0; i < l; i++ ){\n const key = path[ i ];\n\n // There might be collections in path, so use `get`.\n let next = model.get ? model.get( key ) : model[ key ];\n\n // Create models, if they are not exist.\n if( !next ){\n const attrSpecs = model._attributes;\n if( attrSpecs ){\n // If current object is model, create default attribute\n var newModel = attrSpecs[ key ].create();\n\n // If created object is model, nullify attributes when requested\n if( options && options.nullify && newModel._attributes ){\n newModel.clear( options );\n }\n\n model[ key ] = next = newModel;\n }\n // Silently fail in other case.\n else return;\n }\n \n model = next;\n }\n\n // Set model attribute.\n if( model.set ){\n model.set({ [ attr ] : value }, options );\n }\n else{\n model[ attr ] = value;\n }\n });\n\n return this;\n }\n \n // Returns owner without the key (usually it's collection)\n get collection() : any {\n return this._ownerKey ? null : this._owner;\n }\n\n // Dispose object and all childrens\n dispose(){\n if( this._disposed ) return;\n\n const { attributes } = this;\n\n for( let attr of this._attributesArray ){\n attr.dispose( this, attributes[ attr.name ] );\n }\n \n super.dispose();\n }\n\n /** @internal */\n _log( level : LogLevel, topic: string, text : string, props : object, a_logger? : Logger ) : void {\n ( a_logger || logger ).trigger( level, topic, this.getClassName() + ' ' + text, {\n ...props,\n 'Record' : this,\n 'Attributes definition' : this._attributes\n });\n }\n\n getClassName() : string {\n return super.getClassName() || 'Record';\n }\n\n /** @internal */\n _createTransaction( values : object, options : TransactionOptions ) : Transaction { return void 0; }\n // Simulate attribute change \n forceAttributeChange : ( key : string, options : TransactionOptions ) => void\n\n /** @internal */\n _onChildrenChange : ( child : Transactional, options : TransactionOptions ) => void\n\n\n /**\n * Map methods\n */\n\n forEach( iteratee : ( value? : any, key? : string ) => void, context? : any ){\n const fun = context !== void 0 ? ( v, k ) => iteratee.call( context, v, k ) : iteratee,\n { attributes } = this;\n\n for( const key in this.attributes ){\n const value = attributes[ key ];\n if( value !== void 0 ) fun( value, key );\n }\n }\n\n mapObject( a_fun : ( value, key ) => any, context? : any ) : object {\n const fun = context === void 0 ? a_fun : a_fun.bind( context );\n return tools.transform( {}, this.attributes, fun );\n }\n\n [ Symbol.iterator ](){\n return new RecordEntriesIterator( this );\n }\n\n entries(){\n return new RecordEntriesIterator( this );\n }\n\n // Get array of attribute keys (Record) or record ids (Collection) \n keys() : string[] {\n const keys : string[] = [];\n\n this.forEach( ( value, key ) => keys.push( key ) );\n\n return keys;\n }\n};\n\nexport interface Record extends IORecord {}\nexport interface Record extends AttributesContainer {}\n\n\nassign( Record.prototype, UpdateRecordMixin, IORecordMixin );\n\n/***********************************************\n * Helper functions\n */\n\nclass BaseRecordAttributes {\n id : string\n\n constructor( record : Record, x : AttributesValues, options : TransactionOptions ) {\n this.id = x.id;\n }\n}\n\nRecord.prototype.Attributes = BaseRecordAttributes;\n\nclass BaseRecordAttributesCopy {\n id : string\n\n constructor( x : AttributesValues ) {\n this.id = x.id;\n }\n}\n\nRecord.prototype.AttributesCopy = BaseRecordAttributesCopy;\n\nconst IdAttribute = AnyType.create({ value : void 0 }, 'id' );\nRecord.prototype._attributes = { id : IdAttribute };\nRecord.prototype._attributesArray = [ IdAttribute ];\n\nfunction typeCheck( record : Record, values : object, options ){\n if( shouldBeAnObject( record, values, options ) ){\n const { _attributes } = record;\n let unknown : string[];\n\n for( let name in values ){\n if( !_attributes[ name ] ){\n unknown || ( unknown = [] );\n unknown.push( `'${ name }'` );\n }\n }\n\n if( unknown ){\n unknownAttrsWarning( record, unknown, { values }, options );\n }\n }\n}\n\nexport class RecordEntriesIterator implements Iterator<[string, any]> {\n private idx = 0;\n \n constructor( private readonly record : Record){}\n\n next() : IteratorResult<[string, any]> {\n const { record } = this,\n metatype = record._attributesArray[ this.idx++ ];\n\n return {\n done : !metatype,\n value : metatype ? [ metatype.name, record[ metatype.name ] ] : void 0\n };\n }\n}","import { CollectionConstructor } from '../collection';\nimport { define, predefine, TheType, tools } from '../object-plus';\nimport { Transactional } from '../transactions';\nimport { Infer, type } from './attrDef';\nimport { createAttributesMixin } from './mixin';\nimport { Record, RecordDefinition } from './record';\n\nexport * from './attrDef';\nexport * from './metatypes';\nexport { Record };\n\nconst { assign, defaults } = tools;\n\nexport type InferAttrs = {\n [K in keyof A]: Infer\n};\n\nexport interface RecordConstructor extends TheType {\n new ( attrs? : Partial, options? : object ) : Record & A\n prototype : Record\n Collection : CollectionConstructor\n}\n\nexport function attributes( attrDefs : D ) : RecordConstructor> {\n @define class DefaultRecord extends Record {\n static attributes = attrDefs;\n }\n\n return DefaultRecord as any;\n}\n\nRecord.onExtend = function( this : typeof Record, BaseClass : typeof Record ){\n Transactional.onExtend.call( this, BaseClass );\n\n // Create the default collection\n const Class = this;\n\n @predefine class DefaultCollection extends BaseClass.Collection {\n static model = Class;\n }\n\n this.DefaultCollection = DefaultCollection;\n\n // If there are no collection defined in statics, use the default collection.\n // It will appear in onDefine's definition, overriding all other settings.\n if( Class.Collection === BaseClass.Collection ){\n this.Collection = DefaultCollection;\n }\n}\n\nRecord.onDefine = function( definition : RecordDefinition, BaseClass : typeof Record ){\n const baseProto : Record = BaseClass.prototype;\n\n // Compile attributes spec, creating definition mixin.\n const { properties, _localEvents, ...dynamicMixin } = createAttributesMixin( this.attributes = getAttributes( definition ), baseProto._attributes );\n assign( this.prototype, dynamicMixin );\n \n definition.properties = defaults( definition.properties || {}, properties );\n definition._localEvents = _localEvents;\n \n Transactional.onDefine.call( this, definition, BaseClass );\n\n // Finalize the definition of the default collection.\n this.DefaultCollection.define( definition.collection || {} );\n\n // assign collection from the definition.\n this.Collection = definition.Collection;\n this.Collection.prototype.model = this;\n\n if( definition.endpoint ) this.Collection.prototype._endpoint = definition.endpoint; \n}\n\nfunction getAttributes({ defaults, attributes, idAttribute } : RecordDefinition ) {\n const definition = attributes || defaults || {};\n \n // If there is an undeclared idAttribute, add its definition as untyped generic attribute.\n if( idAttribute && !( idAttribute in definition ) ){\n definition[ idAttribute ] = void 0;\n }\n\n return definition;\n}\n\ndeclare var Reflect;\n\nexport function auto( value : any ) : PropertyDecorator;\nexport function auto( proto : object, attrName : string ) : void;\nexport function auto( proto, attrName? : string ) : any {\n if( typeof Reflect !== 'undefined' && Reflect.getMetadata ){\n if( attrName ){\n type( Reflect.getMetadata( \"design:type\", proto, attrName ) ).as( proto, attrName );\n }\n else{\n const value = proto;\n return ( proto : object, attrName : string ) : void => {\n type( Reflect.getMetadata( \"design:type\", proto, attrName ) ).value( value ).as( proto, attrName );\n }\n } \n }\n else{\n proto._log( 'error', 'Type-R:MissingImport', 'Add import \"reflect-metadata\"; as the first line of your app.' );\n } \n}","import { eventsApi, Logger } from '../object-plus';\nimport { Record } from '../record';\nimport { ItemsBehavior, Owner, Transaction, Transactional, transactionApi, TransactionOptions } from '../transactions';\n\n\nconst { trigger2, trigger3, on, off } = eventsApi,\n { commit } = transactionApi,\n _aquire = transactionApi.aquire, _free = transactionApi.free;\n\n/** @private */\nexport interface CollectionCore extends Transactional, Owner {\n /** @internal */\n _byId : IdIndex\n\n models : Record[]\n model : typeof Record\n idAttribute : string // TODO: Refactor inconsistent idAttribute usage\n \n /** @internal */\n _comparator : Comparator\n \n get( objOrId : string | Record | Object ) : Record \n \n /** @internal */\n _itemEvents? : eventsApi.EventMap\n /** @internal */\n _shared : number\n /** @internal */\n _aggregationError : Record[]\n /** @internal */\n _log( level : string, topic : string, text : string, value : any, logger : Logger ) : void\n}\n\n// Collection's manipulation methods elements\nexport type Elements = ( Object | Record )[];\n\nexport interface CollectionOptions extends TransactionOptions {\n sort? : boolean\n}\n\nexport type Comparator = ( a : Record, b : Record ) => number; \n\n/** @private */\nexport function dispose( collection : CollectionCore ) : Record[]{\n const { models } = collection;\n\n collection.models = [];\n collection._byId = {};\n\n freeAll( collection, models );\n return models;\n}\n\n/** @private */\nexport function convertAndAquire( collection : CollectionCore, attrs : {} | Record, options : CollectionOptions ){\n const { model } = collection;\n \n let record : Record;\n\n if( collection._shared ){\n record = attrs instanceof model ? attrs : model.create( attrs, options );\n\n if( collection._shared & ItemsBehavior.listen ){\n on( record, record._changeEventName, collection._onChildrenChange, collection );\n }\n }\n else{\n record = attrs instanceof model ? ( options.merge ? attrs.clone() : attrs ) : model.create( attrs, options );\n\n if( record._owner ){\n if( record._owner !== collection ){\n _aquire( collection, record.clone() );\n const errors = collection._aggregationError || ( collection._aggregationError = [] );\n errors.push( record );\n }\n }\n else{\n _aquire( collection, record ); \n }\n } \n\n // Subscribe for events...\n const { _itemEvents } = collection;\n _itemEvents && _itemEvents.subscribe( collection, record );\n\n return record;\n}\n\n/** @private */\nexport function free( owner : CollectionCore, child : Record, unset? : boolean ) : void {\n if( owner._shared ){\n if( owner._shared & ItemsBehavior.listen ){\n off( child, child._changeEventName, owner._onChildrenChange, owner );\n }\n }\n else{\n _free( owner, child );\n unset || child.dispose();\n }\n\n const { _itemEvents } = owner;\n _itemEvents && _itemEvents.unsubscribe( owner, child );\n}\n\n/** @private */\nexport function freeAll( collection : CollectionCore, children : Record[] ) : Record[] {\n for( let child of children ){\n free( collection, child );\n }\n\n return children;\n}\n\n/**\n * Silently sort collection, if its required. Returns true if sort happened.\n * @private\n */ \nexport function sortElements( collection : CollectionCore, options : CollectionOptions ) : boolean {\n let { _comparator } = collection;\n if( _comparator && options.sort !== false ){\n collection.models.sort( _comparator );\n return true;\n }\n\n return false;\n}\n\n/**********************************\n * Collection Index\n * @private \n */\nexport interface IdIndex {\n [ id : string ] : Record\n}\n\n/** @private Add record */ \nexport function addIndex( index : IdIndex, model : Record ) : void {\n index[ model.cid ] = model;\n var id = model.id;\n \n if( id || ( id as any ) === 0 ){\n index[ id ] = model;\n }\n}\n\n/** @private Remove record */ \nexport function removeIndex( index : IdIndex, model : Record ) : void {\n delete index[ model.cid ];\n var id = model.id;\n if( id || ( id as any ) === 0 ){\n delete index[ id ];\n }\n}\n\nexport function updateIndex( index : IdIndex, model : Record ){\n delete index[ model.previous( model.idAttribute ) ];\n\n const { id } = model;\n id == null || ( index[ id ] = model );\n}\n\n/***\n * In Collections, transactions appears only when\n * add remove or change events might be emitted.\n * reset doesn't require transaction.\n * \n * Transaction holds information regarding events, and knows how to emit them.\n * \n * Two major optimization cases.\n * 1) Population of an empty collection\n * 2) Update of the collection (no or little changes) - it's crucial to reject empty transactions.\n */\n\n\n// Transaction class. Implements two-phase transactions on object's tree.\n/** @private */ \nexport class CollectionTransaction implements Transaction {\n // open transaction\n constructor( public object : CollectionCore,\n public isRoot : boolean,\n public added : Record[],\n public removed : Record[],\n public nested : Transaction[],\n public sorted : boolean ){}\n\n // commit transaction\n commit( initiator? : Transactional ){\n const { nested, object } = this,\n { _isDirty } = object;\n\n // Commit all nested transactions...\n for( let transaction of nested ){\n transaction.commit( object );\n }\n\n if( object._aggregationError ){\n logAggregationError( object, _isDirty );\n }\n\n // Just trigger 'change' on collection, it must be already triggered for models during nested commits.\n // ??? TODO: do it in nested transactions loop? This way appears to be more correct. \n for( let transaction of nested ){\n trigger2( object, 'change', transaction.object, _isDirty );\n }\n\n // Notify listeners on attribute changes...\n const { added, removed } = this;\n\n // Trigger `add` events for both model and collection.\n for( let record of added ){\n trigger3( record, 'add', record, object, _isDirty );\n trigger3( object, 'add', record, object, _isDirty );\n }\n\n // Trigger `remove` events for both model and collection.\n for( let record of removed ){\n trigger3( record, 'remove', record, object, _isDirty );\n trigger3( object, 'remove', record, object, _isDirty );\n }\n\n if( this.sorted ){\n trigger2( object, 'sort', object, _isDirty );\n }\n\n if( added.length || removed.length ){\n trigger2( object, 'update', object, _isDirty );\n }\n\n this.isRoot && commit( object, initiator );\n }\n}\n\nexport function logAggregationError( collection : CollectionCore, options : TransactionOptions ){\n collection._log( 'warn', 'Type-R:InvalidOwner', 'added records already have an owner and were cloned. Use explicit record.clone() to dismiss this warning.', collection._aggregationError, options.logger );\n collection._aggregationError = void 0;\n}","import { Record } from '../record';\nimport { Transaction, transactionApi } from '../transactions';\nimport { addIndex, CollectionCore, CollectionOptions, CollectionTransaction, convertAndAquire, logAggregationError, sortElements, updateIndex } from './commons';\n\nconst { begin, commit, markAsDirty } = transactionApi;\n\nexport interface AddOptions extends CollectionOptions {\n at? : number \n}\n\n/** @private */\nexport function addTransaction( collection : CollectionCore, items : any[], options : AddOptions, merge? : boolean ){\n const isRoot = begin( collection ),\n nested : Transaction[]= [];\n\n var added = appendElements( collection, items, nested, options, merge );\n\n if( added.length || nested.length ){\n let needSort = sortOrMoveElements( collection, added, options );\n if( markAsDirty( collection, options ) ){\n return new CollectionTransaction( collection, isRoot, added, [], nested, needSort );\n }\n\n if( collection._aggregationError ) logAggregationError( collection, options );\n }\n\n // No changes...\n isRoot && commit( collection );\n};\n\n// Handle sort or insert at options for add operation. Reurns true if sort happened.\n/** @private */ \nfunction sortOrMoveElements( collection : CollectionCore, added : Record[], options : AddOptions ) : boolean {\n let at = options.at;\n\n // if `at` option is given, it overrides sorting option...\n if( at != null ){\n // Take an original collection's length. \n const length = collection.models.length - added.length;\n\n // Crazy Backbone rules about `at` index. I don't know what that guys smoke.\n at = Number( at );\n if( at < 0 ) at += length + 1;\n if( at < 0 ) at = 0;\n if( at > length ) at = length;\n\n // Move added elements to desired position. In place.\n moveElements( collection.models, at, added );\n return false;\n }\n\n return sortElements( collection, options );\n}\n\n/** @private */\nfunction moveElements( source : any[], at : number, added : any[] ) : void {\n for( var j = source.length - 1, i = j - added.length; i >= at; i--, j-- ){\n source[ j ] = source[ i ];\n }\n\n for( i = 0, j = at; i < added.length; i++, j++ ){\n source[ j ] = added[ i ];\n }\n}\n\n// append data to model and index\n/** @private */\nfunction appendElements( collection : CollectionCore, a_items : any[], nested : Transaction[], a_options : AddOptions, forceMerge : boolean ){\n var { _byId, models } = collection,\n merge = ( forceMerge || a_options.merge ) && !collection._shared,\n parse = a_options.parse,\n idAttribute = collection.model.prototype.idAttribute,\n prevLength = models.length;\n\n for( const item of a_items ){\n let model = item ? _byId[ item[ idAttribute ] ] || _byId[ item.cid ] : null;\n\n if( model ){\n if( merge && item !== model ){\n var attrs = item.attributes || item;\n const transaction = model._createTransaction( attrs, a_options );\n transaction && nested.push( transaction );\n\n if( model.hasChanged( idAttribute ) ){\n updateIndex( _byId, model );\n }\n }\n }\n else{\n model = convertAndAquire( collection, item, a_options );\n models.push( model );\n addIndex( _byId, model );\n }\n }\n\n return models.slice( prevLength );\n}\n","/*************\n * Remove items from collections.\n * \n * Cannot be a part of two-phase transaction on object tree.\n * Can be executed in the scope of ad-hoc transaction or from the trigger, though.\n *\n * Implemented with low-level API. \n * Most frequent operation - single element remove. Thus, it have the fast-path.\n */\n\nimport { eventsApi } from '../object-plus';\nimport { Record } from '../record';\nimport { transactionApi, TransactionOptions } from '../transactions';\nimport { CollectionCore, CollectionTransaction, free, removeIndex } from './commons';\n\nconst { trigger2, trigger3 } = eventsApi,\n { markAsDirty, begin, commit } = transactionApi;\n\n/** @private */\nexport function removeOne( collection : CollectionCore, el : Record | {} | string, options : TransactionOptions ) : Record {\n var model : Record = collection.get( el );\n\n if( model ){\n const isRoot = begin( collection ),\n models = collection.models;\n\n // Remove model form the collection. \n models.splice( models.indexOf( model ), 1 );\n removeIndex( collection._byId, model );\n \n // Mark transaction as dirty. \n const notify = markAsDirty( collection, options );\n\n // Send out events.\n if( notify ){\n trigger3( model, 'remove', model, collection, options );\n trigger3( collection, 'remove', model, collection, options );\n } \n\n free( collection, model, options.unset );\n\n notify && trigger2( collection, 'update', collection, options );\n\n // Commit transaction.\n isRoot && commit( collection );\n\n return model;\n }\n};\n\n/** Optimized for removing many elements\n * 1. Remove elements from the index, checking for duplicates\n * 2. Create new models array matching index\n * 3. Send notifications and remove references\n */\n\n/** @private */\nexport function removeMany( collection : CollectionCore, toRemove : any[], options ){\n const removed = _removeFromIndex( collection, toRemove, options.unset );\n if( removed.length ){\n const isRoot = begin( collection );\n\n _reallocate( collection, removed.length );\n\n if( markAsDirty( collection, options ) ){\n const transaction = new CollectionTransaction( collection, isRoot, [], removed, [], false );\n transaction.commit();\n }\n else{\n // Commit transaction.\n isRoot && commit( collection );\n }\n }\n\n return removed;\n};\n\n// remove models from the index...\n/** @private */\nfunction _removeFromIndex( collection, toRemove, unset : boolean ){\n var removed = Array( toRemove.length ),\n _byId = collection._byId;\n\n for( var i = 0, j = 0; i < toRemove.length; i++ ){\n var model = collection.get( toRemove[ i ] );\n if( model ){\n removed[ j++ ] = model;\n removeIndex( _byId, model );\n free( collection, model, unset );\n }\n }\n\n removed.length = j;\n\n return removed;\n}\n\n// Allocate new models array removing models not present in the index.\n/** @private */\nfunction _reallocate( collection, removed ){\n var prev = collection.models,\n models = collection.models = Array( prev.length - removed ),\n _byId = collection._byId;\n\n for( var i = 0, j = 0; i < prev.length; i++ ){\n var model = prev[ i ];\n\n if( _byId[ model.cid ] ){\n models[ j++ ] = model;\n }\n }\n\n models.length = j;\n}","import { Record } from '../record';\nimport { Transaction, transactionApi } from '../transactions';\nimport { addIndex, CollectionCore, CollectionOptions, CollectionTransaction, convertAndAquire, Elements, free, freeAll, IdIndex, logAggregationError, sortElements } from './commons';\n\nconst { begin, commit, markAsDirty } = transactionApi;\n\n/** @private */\nconst silentOptions = { silent : true };\n\n/** @private */\nexport function emptySetTransaction( collection : CollectionCore, items : Elements, options : CollectionOptions, silent? : boolean ){\n const isRoot = begin( collection );\n\n const added = _reallocateEmpty( collection, items, options );\n\n if( added.length ){\n const needSort = sortElements( collection, options );\n\n if( markAsDirty( collection, silent ? silentOptions : options ) ){\n // 'added' is the reference to this.models. Need to copy it.\n return new CollectionTransaction( collection, isRoot, added.slice(), [], [], needSort );\n }\n\n if( collection._aggregationError ) logAggregationError( collection, options );\n }\n\n // No changes...\n isRoot && commit( collection );\n};\n\n/** @private */\nexport function setTransaction( collection, items, options ){\n const isRoot = begin( collection ),\n nested = [];\n\n var previous = collection.models,\n added = _reallocate( collection, items, nested, options );\n\n const reusedCount = collection.models.length - added.length,\n removed = reusedCount < previous.length ? (\n reusedCount ? _garbageCollect( collection, previous ) :\n freeAll( collection, previous )\n ) : []; \n \n const addedOrChanged = nested.length || added.length,\n // As we are reallocating models array, it needs to be sorted even if there are no changes.\n sorted = ( sortElements( collection, options ) && addedOrChanged ) || added.length || options.sorted;\n\n if( addedOrChanged || removed.length || sorted ){\n if( markAsDirty( collection, options ) ){ \n return new CollectionTransaction( collection, isRoot, added, removed, nested, sorted );\n }\n\n if( collection._aggregationError ) logAggregationError( collection, options );\n }\n\n isRoot && commit( collection );\n};\n\n// Remove references to all previous elements, which are not present in collection.\n// Returns an array with removed elements.\n/** @private */\nfunction _garbageCollect( collection : CollectionCore, previous : Record[] ) : Record[]{\n const { _byId } = collection,\n removed = [];\n\n // Filter out removed models and remove them from the index...\n for( let record of previous ){\n if( !_byId[ record.cid ] ){\n removed.push( record );\n free( collection, record );\n }\n }\n\n return removed;\n}\n\n// reallocate model and index\n/** @private */\nfunction _reallocate( collection : CollectionCore, source : any[], nested : Transaction[], options ){\n var models = Array( source.length ),\n _byId : IdIndex = {},\n merge = ( options.merge == null ? true : options.merge ) && !collection._shared,\n _prevById = collection._byId,\n prevModels = collection.models, \n idAttribute = collection.model.prototype.idAttribute,\n toAdd = [],\n orderKept = true;\n\n // for each item in source set...\n for( var i = 0, j = 0; i < source.length; i++ ){\n var item = source[ i ],\n model : Record = null;\n\n if( item ){\n var id = item[ idAttribute ],\n cid = item.cid;\n\n if( _byId[ id ] || _byId[ cid ] ) continue;\n\n model = _prevById[ id ] || _prevById[ cid ];\n }\n\n if( model ){\n if( merge && item !== model ){\n if( orderKept && prevModels[ j ] !== model ) orderKept = false;\n\n var attrs = item.attributes || item;\n const transaction = model._createTransaction( attrs, options );\n transaction && nested.push( transaction );\n }\n }\n else{\n model = convertAndAquire( collection, item, options );\n toAdd.push( model );\n }\n\n models[ j++ ] = model;\n addIndex( _byId, model );\n }\n\n models.length = j;\n collection.models = models;\n collection._byId = _byId;\n\n if( !orderKept ) options.sorted = true;\n\n return toAdd;\n}\n\n/** @private */\nfunction _reallocateEmpty( self, source, options ){\n var len = source ? source.length : 0,\n models = Array( len ),\n _byId : IdIndex = {},\n idAttribute = self.model.prototype.idAttribute;\n\n for( var i = 0, j = 0; i < len; i++ ){\n var src = source[ i ];\n\n if( src && ( _byId[ src[ idAttribute ] ] || _byId[ src.cid ] ) ){\n continue;\n }\n\n var model = convertAndAquire( self, src, options );\n models[ j++ ] = model;\n addIndex( _byId, model );\n }\n\n models.length = j;\n self._byId = _byId;\n\n return self.models = models;\n}","import { Record } from '../record'\n\nexport type Predicate = ( ( val : R, key? : number ) => boolean ) | Partial;\n\n/**\n * Optimized array methods.\n */\nexport abstract class ArrayMixin {\n models : R[]\n abstract get( modelOrId : string | Partial ) : R;\n\n /**\n * Map and optionally filter the collection.\n * @param mapFilter filter an element out if `undefined` is returned \n * @param context optional `this` for `mapFilter`\n */\n map( mapFilter : ( val : R, key? : number ) => T, context? : any ) : T[]{\n const { models } = this,\n { length } = models,\n res = Array( length ),\n fun = context ? mapFilter.bind( context ) : mapFilter;\n\n for( var i = 0, j = 0; i < length; i++ ){\n const val = fun( models[ i ], i );\n val === void 0 || ( res[ j++ ] = val );\n }\n\n if( i !== j ){\n res.length = j;\n }\n\n return res;\n }\n\n /**\n * Iterate through the collection.\n * @param context optional `this` for `iteratee`.\n */\n each( fun : ( val : R, key? : number ) => any, context? : any ) : void {\n const { models } = this,\n { length } = models,\n iteratee = context ? fun.bind( context ) : fun;\n\n for( let i = 0; i < length; i++ ){\n iteratee( models[ i ], i );\n }\n }\n\n /**\n * Iterate through collection optionally returning the value.\n * @param doWhile break the loop if anything but `undefined` is returned, and return this value.\n * @param context optional `this` for `doWhile`.\n */\n firstMatch( doWhile : ( val : R, key? : number ) => T ) : T\n firstMatch( doWhile : ( this : C, val : R, key? : number ) => T, context : C ) : T\n firstMatch( doWhile : ( val : R, key? : number ) => T, context? : any ) : T {\n const { models } = this,\n { length } = models,\n iteratee = context ? doWhile.bind( context ) : doWhile;\n\n for( let i = 0; i < length; i++ ){\n const res = iteratee( models[ i ], i );\n if( res !== void 0 ) return res;\n }\n }\n\n /**\n * Proxy for the `array.reduce()`\n * @param iteratee \n */\n reduce( iteratee : (previousValue: R, currentValue: R, currentIndex?: number ) => R ) : R\n reduce( iteratee : (previousValue: T, currentValue: R, currentIndex?: number ) => T, init? : any ) : T\n reduce( iteratee : (previousValue: any, currentValue: any, currentIndex?: number ) => any, init? : any ) : T | R {\n return init === void 0 ? this.models.reduce( iteratee ) : this.models.reduce( iteratee, init );\n }\n\n // Slice out a sub-array of models from the collection.\n slice( begin? : number, end? : number ) : R[] {\n return this.models.slice( begin, end );\n }\n \n indexOf( modelOrId : string | Partial ) : number {\n return this.models.indexOf( this.get( modelOrId ) );\n }\n\n includes( idOrObj : string | Partial ) : boolean {\n return Boolean( this.get( idOrObj ) );\n }\n\n filter( iteratee : Predicate, context? : any ) : R[] {\n const fun = toPredicateFunction( iteratee );\n return this.map( m => fun( m ) ? m : void 0, context );\n }\n\n find( iteratee : Predicate, context? : any ) : R {\n const fun = toPredicateFunction( iteratee );\n return this.firstMatch( m => fun( m ) ? m : void 0, context );\n }\n\n some( iteratee : Predicate, context? : any ) : boolean {\n return Boolean( this.find( iteratee, context ) );\n }\n\n forEach( iteratee : ( val : R, key? : number ) => void, context? : any ) : void {\n this.each( iteratee, context );\n }\n\n values() : IterableIterator {\n return this.models.values();\n }\n\n entries() : IterableIterator<[ number, R ]>{\n return this.models.entries();\n }\n\n every( iteratee : Predicate, context? : any ) : boolean {\n const fun = toPredicateFunction( iteratee );\n return this.firstMatch( m => fun( m ) ? void 0 : false, context ) === void 0;\n }\n\n pluck( key : K ) : R[K][] {\n return this.map( model => model[ key ] );\n }\n\n first() : R { return this.models[ 0 ]; }\n\n last() : R { return this.models[ this.models.length - 1 ]; }\n\n at( a_index : number ) : R {\n const index = a_index < 0 ? a_index + this.models.length : a_index; \n return this.models[ index ];\n }\n}\n\nconst noOp = x => x;\n\nfunction toPredicateFunction( iteratee : Predicate ){\n if( iteratee == null ) return noOp;\n\n switch( typeof iteratee ){\n case 'function' : return iteratee;\n case 'object' :\n const keys = Object.keys( iteratee );\n \n return x => {\n for( let key of keys ){\n if( iteratee[ key ] !== x[ key ] )\n return false;\n }\n\n return true;\n }\n default : throw new Error( 'Invalid iteratee' );\n }\n}","import { IOPromise, startIO } from '../io-tools';\nimport { define, definitions, EventMap, eventsApi, EventsDefinition, Logger, logger, LogLevel, Mixable, mixinRules, TheType, tools, mixins } from '../object-plus';\nimport { AggregatedType, Record, SharedType } from '../record';\nimport { CloneOptions, ItemsBehavior, Transactional, TransactionalDefinition, transactionApi, TransactionOptions } from '../transactions';\nimport { AddOptions, addTransaction } from './add';\nimport { CollectionCore, CollectionTransaction, Elements, free, sortElements, updateIndex } from './commons';\nimport { removeMany, removeOne } from './remove';\nimport { emptySetTransaction, setTransaction } from './set';\n\n\nconst { trigger2 } = eventsApi,\n { begin, commit, markAsDirty } = transactionApi;\n\nlet _count = 0;\n\nexport type GenericComparator = string | ( ( x : Record ) => number ) | ( ( a : Record, b : Record ) => number ); \n\nexport interface CollectionOptions extends TransactionOptions {\n comparator? : GenericComparator\n model? : typeof Record\n}\n\nexport interface CollectionDefinition extends TransactionalDefinition {\n model? : typeof Record,\n itemEvents? : EventsDefinition\n _itemEvents? : EventMap\n}\n\nclass CollectionRefsType extends SharedType {\n static defaultValue = [];\n}\n\nexport interface CollectionConstructor extends TheType {\n new ( records? : ElementsArg, options?: CollectionOptions ) : Collection\n prototype : Collection\n Refs : CollectionConstructor\n};\n\n@define({\n // Default client id prefix \n cidPrefix : 'c',\n model : Record,\n _changeEventName : 'changes',\n _aggregationError : null\n})\n@mixins( ArrayMixin )\n@definitions({\n comparator : mixinRules.value,\n model : mixinRules.protoValue,\n itemEvents : mixinRules.merge\n})\nexport class Collection< R extends Record = Record> extends Transactional implements CollectionCore, Iterable {\n /** @internal */\n _shared : number\n /** @internal */\n _aggregationError : R[]\n\n static Subset : typeof Collection\n static Refs : CollectionConstructor\n\n /** @internal */\n static _SubsetOf : typeof Collection\n \n createSubset( models : ElementsArg, options? : CollectionOptions) : Collection{\n throw new ReferenceError( 'Failed dependency injection' )\n }\n\n static onExtend( BaseClass : typeof Transactional ){\n // Cached subset collection must not be inherited.\n const Ctor = this;\n this._SubsetOf = null;\n\n function RefsCollection( a, b, listen? ){\n Ctor.call( this, a, b, ItemsBehavior.share | ( listen ? ItemsBehavior.listen : 0 ) );\n }\n\n Mixable.mixins.populate( RefsCollection );\n \n RefsCollection.prototype = this.prototype;\n RefsCollection._metatype = CollectionRefsType;\n\n this.Refs = this.Subset = RefsCollection;\n\n Transactional.onExtend.call( this, BaseClass );\n }\n \n static onDefine( definition : CollectionDefinition, BaseClass : any ){\n if( definition.itemEvents ){\n const eventsMap = new EventMap( BaseClass.prototype._itemEvents );\n eventsMap.addEventsMap( definition.itemEvents );\n this.prototype._itemEvents = eventsMap;\n }\n\n if( definition.comparator !== void 0 ) this.prototype.comparator = definition.comparator;\n\n Transactional.onDefine.call( this, definition );\n }\n \n /** @internal */\n _itemEvents : EventMap\n\n /***********************************\n * Core Members\n */\n // Array of the records\n models : R[]\n\n // Polymorphic accessor for aggregated attribute's canBeUpdated().\n /** @internal */\n get __inner_state__(){ return this.models; }\n\n // Index by id and cid\n /** @internal */\n _byId : { [ id : string ] : R }\n\n set comparator( x : GenericComparator ){\n\n switch( typeof x ){\n case 'string' :\n this._comparator = ( a, b ) => {\n const aa = a[ x ], bb = b[ x ];\n if( aa === bb ) return 0;\n return aa < bb ? -1 : + 1;\n } \n break;\n case 'function' :\n if( x.length === 1 ){\n this._comparator = ( a, b ) => {\n const aa = (x).call( this, a ), bb = (x).call( this, b );\n if( aa === bb ) return 0;\n return aa < bb ? -1 : + 1;\n }\n }\n else{\n this._comparator = ( a, b ) => (x).call( this, a, b );\n }\n break;\n \n default :\n this._comparator = null;\n }\n }\n \n // TODO: Improve typing\n getStore() : Transactional {\n return this._store || ( this._store = this._owner ? this._owner.getStore() : this._defaultStore );\n }\n\n /** @internal */\n _store : Transactional\n\n get comparator(){ return this._comparator; }\n\n /** @internal */\n _comparator : ( a : R, b : R ) => number\n\n /** @internal */\n _onChildrenChange( record : R, options : TransactionOptions = {}, initiator? : Transactional ){\n // Ignore updates from nested transactions.\n if( initiator === this ) return;\n\n const { idAttribute } = this;\n\n if( record.hasChanged( idAttribute ) ){\n updateIndex( this._byId, record );\n }\n\n const isRoot = begin( this );\n\n if( markAsDirty( this, options ) ){\n // Forward change event from the record.\n trigger2( this, 'change', record, options )\n }\n\n isRoot && commit( this );\n }\n\n get( objOrId : string | { id? : string, cid? : string } ) : R {\n if( objOrId == null ) return;\n\n if( typeof objOrId === 'object' ){\n const id = objOrId[ this.idAttribute ];\n return ( id !== void 0 && this._byId[ id ] ) || this._byId[ objOrId.cid ];\n }\n else{\n return this._byId[ objOrId ];\n } \n }\n\n [ Symbol.iterator ]() : IterableIterator {\n return this.models[ Symbol.iterator ]();\n }\n\n // Loop through the members in the scope of transaction.\n // Transactional version of each()\n updateEach( iteratee : ( val : R, key? : number ) => void ){\n const isRoot = transactionApi.begin( this );\n this.each( iteratee );\n isRoot && transactionApi.commit( this );\n }\n\n /** @internal */\n _validateNested( errors : {} ) : number {\n // Don't validate if not aggregated.\n if( this._shared ) return 0;\n\n let count = 0;\n\n this.each( record => {\n const error = record.validationError;\n if( error ){\n errors[ record.cid ] = error;\n count++;\n }\n });\n\n return count;\n }\n\n model : typeof Record\n\n // idAttribute extracted from the model type.\n idAttribute : string\n\n constructor( records? : ElementsArg, options : CollectionOptions = {}, shared? : number ){\n super( _count++ );\n this.models = [];\n this._byId = {};\n \n this.comparator = this.comparator;\n\n if( options.comparator !== void 0 ){\n this.comparator = options.comparator;\n options.comparator = void 0;\n }\n \n this.model = this.model;\n \n if( options.model ){\n this.model = options.model;\n options.model = void 0;\n }\n\n this.idAttribute = this.model.prototype.idAttribute; //TODO: Remove?\n\n this._shared = shared || 0;\n\n if( records ){\n const elements = toElements( this, records, options );\n emptySetTransaction( this, elements, options, true );\n }\n\n this.initialize.apply( this, arguments );\n\n if( this._localEvents ) this._localEvents.subscribe( this, this );\n }\n\n initialize(){}\n\n // Deeply clone collection, optionally setting new owner.\n clone( options : CloneOptions = {} ) : this {\n const models = this._shared & ItemsBehavior.share ? this.models : this.map( model => model.clone() ),\n copy : this = new (this.constructor)( models, { model : this.model, comparator : this.comparator }, this._shared );\n \n if( options.pinStore ) copy._defaultStore = this.getStore();\n \n return copy;\n }\n\n toJSON( options? : object ) : any {\n return this.map( model => model.toJSON( options ) );\n }\n\n // Apply bulk in-place object update in scope of ad-hoc transaction \n set( elements : ElementsArg = [], options : TransactionOptions = {} ) : this {\n if( (options).add !== void 0 ){\n this._log( 'warn', \"Type-R:InvalidOption\", \"Collection.set doesn't support 'add' option, behaving as if options.add === true.\", options );\n }\n\n // Handle reset option here - no way it will be populated from the top as nested transaction.\n if( options.reset ){\n this.reset( elements, options )\n }\n else{\n const transaction = this._createTransaction( elements, options );\n transaction && transaction.commit();\n } \n\n return this; \n }\n\n /**\n * Enable or disable live updates.\n * \n * `true` enables full collection synchronization.\n * `false` cancel live updates.\n * `json => true | false` - filter updates\n */\n liveUpdates( enabled : LiveUpdatesOption ) : IOPromise {\n if( enabled ){\n this.liveUpdates( false );\n\n const filter = typeof enabled === 'function' ? enabled : () => true;\n\n this._liveUpdates = {\n updated : json => {\n filter( json ) && this.add( json, { parse : true, merge : true } );\n },\n\n removed : id => this.remove( id )\n };\n\n return this.getEndpoint().subscribe( this._liveUpdates, this ).then( () => this );\n }\n else{\n if( this._liveUpdates ){\n this.getEndpoint().unsubscribe( this._liveUpdates, this );\n this._liveUpdates = null;\n }\n\n // TODO: Return the resolved promise.\n }\n }\n\n /** @internal */\n _liveUpdates : object\n\n fetch( a_options : { liveUpdates? : LiveUpdatesOption } & TransactionOptions = {} ) : IOPromise {\n const options = { parse : true, ...a_options },\n endpoint = this.getEndpoint();\n\n return startIO(\n this,\n endpoint.list( options, this ),\n options,\n\n json => {\n let result : any = this.set( json, { parse : true, ioMethod : 'fetch', ...options } as TransactionOptions );\n \n if( options.liveUpdates ){\n result = this.liveUpdates( options.liveUpdates );\n }\n\n return result;\n }\n );\n }\n\n dispose() : void {\n if( this._disposed ) return;\n\n const aggregated = !this._shared;\n\n for( let record of this.models ){\n free( this, record );\n\n if( aggregated ) record.dispose();\n }\n\n this.liveUpdates( false );\n\n super.dispose();\n }\n\n reset( a_elements? : ElementsArg, options : TransactionOptions = {} ) : R[] {\n const isRoot = begin( this ),\n previousModels = this.models;\n\n // Make all changes required, but be silent.\n if( a_elements ){ \n emptySetTransaction( this, toElements( this, a_elements, options ), options, true );\n }\n else{\n this._byId = {};\n this.models = [];\n }\n\n markAsDirty( this, options );\n\n options.silent || trigger2( this, 'reset', this, { previousModels, ...options } );\n\n // Dispose models which are not in the updated collection.\n const { _byId } = this;\n \n for( let toDispose of previousModels ){\n _byId[ toDispose.cid ] || free( this, toDispose );\n }\n\n isRoot && commit( this );\n return this.models;\n }\n\n // Add elements to collection.\n add( a_elements : ElementsArg , options : AddOptions = {} ){\n const elements = toElements( this, a_elements, options ),\n transaction = this.models.length ?\n addTransaction( this, elements, options ) :\n emptySetTransaction( this, elements, options );\n\n if( transaction ){\n transaction.commit();\n return transaction.added;\n }\n }\n\n // Remove elements. \n remove( recordsOrIds : any, options : CollectionOptions = {} ) : R[] | R {\n if( recordsOrIds ){\n return Array.isArray( recordsOrIds ) ?\n removeMany( this, recordsOrIds, options ) as R[]:\n removeOne( this, recordsOrIds, options ) as R;\n }\n\n return [];\n }\n\n // Apply bulk object update without any notifications, and return open transaction.\n // Used internally to implement two-phase commit. \n /** @internal */\n _createTransaction( a_elements : ElementsArg, options : TransactionOptions = {} ) : CollectionTransaction | void {\n const elements = toElements( this, a_elements, options );\n\n if( this.models.length ){\n return options.remove === false ?\n addTransaction( this, elements, options, true ) :\n setTransaction( this, elements, options );\n }\n else{\n return emptySetTransaction( this, elements, options );\n }\n }\n\n /** @internal */\n static _metatype = AggregatedType;\n\n /***********************************\n * Collection manipulation methods\n */\n\n sort( options : TransactionOptions = {} ) : this {\n if( sortElements( this, options ) ){\n const isRoot = begin( this );\n \n if( markAsDirty( this, options ) ){\n trigger2( this, 'sort', this, options );\n }\n\n isRoot && commit( this );\n }\n\n return this;\n }\n\n // Remove and return given model.\n unset( modelOrId : R | string, options? ) : R {\n const value = this.get( modelOrId );\n this.remove( modelOrId, { unset : true, ...options } );\n return value;\n }\n\n modelId( attrs : {} ) : any {\n return attrs[ this.model.prototype.idAttribute ];\n }\n\n // Toggle model in collection.\n toggle( model : R, a_next? : boolean ) : boolean {\n var prev = Boolean( this.get( model ) ),\n next = a_next === void 0 ? !prev : Boolean( a_next );\n\n if( prev !== next ){\n if( prev ){\n this.remove( model );\n }\n else{\n this.add( model );\n }\n }\n\n return next;\n }\n\n /** @internal */\n _log( level : LogLevel, topic : string, text : string, value : object, a_logger? : Logger ) : void {\n ( a_logger || logger ).trigger( level, topic, `${ this.model.prototype.getClassName() }.${ this.getClassName() }: ` + text, {\n Argument : value,\n 'Attributes spec' : this.model.prototype._attributes\n });\n }\n\n getClassName() : string {\n return super.getClassName() || 'Collection';\n }\n\n /***********************************\n * Proxied Array methods\n */\n\n get length() : number { return this.models.length; }\n\n // Add a model to the end of the collection.\n push(model : ElementsArg, options? : CollectionOptions ) {\n return this.add(model, { at: this.length, ...options });\n }\n\n // Remove a model from the end of the collection.\n pop( options? : CollectionOptions ) : R {\n var model = this.at(this.length - 1);\n this.remove(model, { unset : true, ...options });\n return model;\n }\n\n // Add a model to the beginning of the collection.\n unshift(model : ElementsArg, options? : CollectionOptions ) {\n return this.add(model, { at: 0, ...options });\n }\n \n // Remove a model from the beginning of the collection.\n shift( options? : CollectionOptions ) : R {\n const model = this.at(0);\n this.remove( model, { unset : true, ...options } );\n return model;\n }\n}\n\nimport { ArrayMixin } from './arrayMethods'\n\nexport interface Collection extends ArrayMixin{\n\n}\n\nexport type LiveUpdatesOption = boolean | ( ( x : any ) => boolean );\n\nexport type ElementsArg = Partial | Partial[]\n\n// TODO: make is safe for parse to return null (?)\nfunction toElements( collection : Collection, elements : ElementsArg, options : CollectionOptions ) : Elements {\n const parsed = options.parse ? collection.parse( elements, options ) : elements; \n return Array.isArray( parsed ) ? parsed : [ parsed ];\n}\n\nRecord.Collection = Collection;","import { Collection } from '../collection';\nimport { Record } from '../record';\nimport { CompiledReference } from '../traversable';\n\nexport type CollectionReference = ( () => Collection ) | Collection | string; \n\n/** @private */\nexport function parseReference( collectionRef : CollectionReference ) : ( root : Record ) => Collection {\n switch( typeof collectionRef ){\n case 'function' :\n return root => (collectionRef).call( root );\n case 'object' :\n return () => collectionRef;\n case 'string' :\n const { resolve } = new CompiledReference( collectionRef );\n return resolve;\n }\n}","import { AnyType, ChainableAttributeSpec, Record } from '../record';\nimport { CollectionReference, parseReference } from './commons';\n\n\n/********\n * Reference to model by id.\n * \n * Untyped attribute. Holds model id, when unresolved. When resolved, is substituted\n * with a real model.\n * \n * No model changes are detected and counted as owner's change. That's intentional.\n */\n\n/** @private */\ntype RecordRefValue = Record | string;\n\n/** @private */\nclass RecordRefType extends AnyType {\n // It is always serialized as an id, whenever it's resolved or not. \n toJSON( value : RecordRefValue ){\n return value && typeof value === 'object' ? value.id : value;\n }\n\n // Wne \n clone( value : RecordRefValue ){\n return value && typeof value === 'object' ? value.id : value;\n }\n\n // Model refs by id are equal when their ids are equal.\n isChanged( a : RecordRefValue, b : RecordRefValue){\n var aId = a && ( (a).id == null ? a : (a).id ),\n bId = b && ( (b).id == null ? b : (b).id );\n\n return aId !== bId;\n }\n\n // Refs are always valid.\n validate( model, value, name ){}\n}\n\nexport function memberOf( this : void, masterCollection : CollectionReference, T? : R ) : ChainableAttributeSpec {\n const getMasterCollection = parseReference( masterCollection );\n\n const typeSpec = new ChainableAttributeSpec({\n value : null,\n _metatype : RecordRefType\n });\n \n return typeSpec\n .get( function( objOrId : RecordRefValue, name : string ) : Record {\n if( typeof objOrId === 'object' ) return objOrId;\n\n // So, we're dealing with an id reference. Resolve it.\n const collection = getMasterCollection( this );\n let record : Record = null;\n\n // If master collection exists and is not empty...\n if( collection && collection.length ){\n // Silently update attribute with record from this collection.\n record = collection.get( objOrId ) || null;\n this.attributes[ name ] = record;\n\n // Subscribe for events manually. delegateEvents won't be invoked.\n record && this._attributes[ name ].handleChange( record, null, this, {} );\n }\n\n return record;\n });\n}","import { Collection, CollectionConstructor } from '../collection';\nimport { define, tools } from '../object-plus';\nimport { AggregatedType, ChainableAttributeSpec, Record, type } from '../record';\nimport { ItemsBehavior, transactionApi } from '../transactions';\nimport { CollectionReference, parseReference } from './commons';\n\n\ntype RecordsIds = ( string | number )[];\n\nexport function subsetOf, R extends Record>( this : void, masterCollection : CollectionReference, T? : X ) : ChainableAttributeSpec{\n const CollectionClass = T || Collection,\n // Lazily define class for subset collection, if it's not defined already...\n SubsetOf = CollectionClass._SubsetOf || ( CollectionClass._SubsetOf = defineSubsetCollection( CollectionClass as any ) as any ),\n getMasterCollection = parseReference( masterCollection );\n\n return type( SubsetOf ).get(\n function( refs ){\n !refs || refs.resolvedWith || refs.resolve( getMasterCollection( this ) );\n return refs;\n }\n );\n}\n\nCollection.prototype.createSubset = function( models : any, options ) : Collection {\n const SubsetOf = subsetOf( this, this.constructor ).options.type,\n subset = new SubsetOf( models, options );\n \n subset.resolve( this );\n return subset;\n}\n\nconst subsetOfBehavior = ItemsBehavior.share | ItemsBehavior.persistent;\n\nfunction defineSubsetCollection( CollectionClass : typeof Collection ) {\n @define class SubsetOfCollection extends CollectionClass {\n refs : any[];\n resolvedWith : Collection = null;\n\n _metatype : AggregatedType\n\n get __inner_state__(){ return this.refs || this.models; }\n\n constructor( recordsOrIds?, options? ){\n super( [], options, subsetOfBehavior );\n this.refs = toArray( recordsOrIds );\n }\n\n // Remove should work fine as it already accepts ids. Add won't...\n add( a_elements, options = {} ){\n const { resolvedWith } = this,\n toAdd = toArray( a_elements );\n \n if( resolvedWith ){\n // If the collection is resolved already, everything is simple.\n return super.add( resolveRefs( resolvedWith, toAdd ), options );\n }\n else{\n // Collection is not resolved yet. So, we prepare the delayed computation.\n if( toAdd.length ){\n const isRoot = transactionApi.begin( this );\n\n // Save elements to resolve in future...\n this.refs = this.refs ? this.refs.concat( toAdd ) : toAdd.slice();\n\n transactionApi.markAsDirty( this, options );\n\n // And throw the 'changes' event.\n isRoot && transactionApi.commit( this );\n }\n }\n }\n\n reset( a_elements?, options = {} ){\n const { resolvedWith } = this,\n elements = toArray( a_elements );\n \n return resolvedWith ?\n // Collection is resolved, so parse ids and forward the call to set.\n super.reset( resolveRefs( resolvedWith, elements ), options ) :\n // Collection is not resolved yet. So, we prepare the delayed computation.\n delaySet( this, elements, options ) as any || [];\n }\n\n _createTransaction( a_elements, options? ){\n const { resolvedWith } = this,\n elements = toArray( a_elements );\n \n return resolvedWith ?\n // Collection is resolved, so parse ids and forward the call to set.\n super._createTransaction( resolveRefs( resolvedWith, elements ), options ) :\n // Collection is not resolved yet. So, we prepare the delayed computation.\n delaySet( this, elements, options );\n }\n\n // Serialized as an array of model ids.\n toJSON() : RecordsIds {\n return this.refs ?\n this.refs.map( objOrId => objOrId.id || objOrId ) :\n this.models.map( model => model.id );\n }\n\n // Subset is always valid.\n _validateNested(){ return 0; }\n\n get length() : number {\n return this.models.length || ( this.refs ? this.refs.length : 0 );\n }\n\n // Must be shallow copied on clone.\n clone( owner? ){\n var Ctor = (this).constructor,\n copy = new Ctor( [], {\n model : this.model,\n comparator : this.comparator\n });\n\n if( this.resolvedWith ){\n // TODO: bug here. \n copy.resolvedWith = this.resolvedWith;\n copy.refs = null;\n copy.reset( this.models, { silent : true } );\n }\n else{\n copy.refs = this.refs.slice();\n }\n\n return copy;\n }\n\n // Clean up the custom parse method possibly defined in the base class.\n parse( raw : any ) : Record[] {\n return raw;\n }\n\n resolve( collection : Collection ) : this {\n if( collection && collection.length ){\n this.resolvedWith = collection;\n\n if( this.refs ){\n this.reset( this.refs, { silent : true } );\n this.refs = null;\n }\n }\n\n return this;\n }\n\n getModelIds() : RecordsIds { return this.toJSON(); }\n\n toggle( modelOrId : any, val : boolean ) : boolean {\n return super.toggle( this.resolvedWith.get( modelOrId ), val );\n }\n\n addAll() : Record[] {\n if( this.resolvedWith ){\n this.set( this.resolvedWith.models );\n return this.models;\n }\n\n throw new Error( \"Cannot add elemens because the subset collection is not resolved yet.\" );\n }\n\n toggleAll() : Record[] {\n return this.length ? this.reset() : this.addAll();\n }\n }\n\n // Clean up all custom item events to prevent memory leaks.\n SubsetOfCollection.prototype._itemEvents = void 0;\n\n return SubsetOfCollection;\n}\n\nfunction resolveRefs( master, elements ){\n const records = [];\n \n for( let el of elements ){\n const record = master.get( el );\n if( record ) records.push( record );\n }\n\n return records;\n}\n\nfunction delaySet( collection, elements, options ) : void {\n if( tools.notEqual( collection.refs, elements ) ){\n const isRoot = transactionApi.begin( collection );\n\n // Save elements to resolve in future...\n collection.refs = elements.slice();\n\n transactionApi.markAsDirty( collection, options );\n \n // And throw the 'changes' event.\n isRoot && transactionApi.commit( collection );\n }\n}\n\nfunction toArray( elements ){\n return elements ? ( \n Array.isArray( elements ) ? elements : [ elements ]\n ) : [];\n}","import { Record } from '../record';\nimport { Transactional } from '../transactions';\n\nlet _store : Store = null;\n\nexport class Store extends Record {\n getStore() : Store { return this; }\n \n // delegate item lookup to owner, and to the global store if undefined\n get( name : string ) : any {\n // Lookup for resource in the current store. \n let local = this[ name ];\n\n // If something is found or it's the global store, return result.\n if( local || this === this._defaultStore ) return local;\n\n // Forward failed lookup to owner or global store.\n return this._owner ? this._owner.get( name ) : this._defaultStore.get( name ); \n }\n\n static get global(){ return _store; }\n static set global( store : Store ){\n if( _store ){\n _store.dispose();\n }\n\n Transactional.prototype._defaultStore = _store = store;\n }\n}\n\nStore.global = new Store();","// Dummy polyfill to prevent exception in IE.\nif( typeof Symbol === 'undefined' ){\n Object.defineProperty( window, 'Symbol', { value : { iterator : 'Symbol.iterator' }, configurable : true });\n}\n\nimport { Events, Mixable as Class } from './object-plus/';\n// Define synonims for NestedTypes backward compatibility.\nimport { Record as Model } from './record';\n\n/**\n * Export everything \n */\nexport * from './collection';\nexport * from './io-tools';\nexport * from './object-plus';\nexport * from './record';\nexport * from './relations';\nexport * from './transactions';\nexport { Model, Class };\n\n\nexport const { on, off, trigger, once, listenTo, stopListening, listenToOnce } = Events;\n\n/** Wrap model or collection method in transaction. */\nexport function transaction< F extends Function >( method : F ) : F {\n return function( ...args ){\n let result;\n \n this.transaction( () => {\n result = method.apply( this, args );\n });\n \n return result;\n }\n}"],"names":["defaults","dest","source","name","hasOwnProperty","arguments","length","i","other","isValidJSON","value","proto","Object","getPrototypeOf","prototype","Array","every","getBaseClass","Class","constructor","isEmpty","obj","key","some","fun","ArrayProto","arr","result","someArray","someObject","predicate","x","omit","discard","transform","assign","once","func","memo","first","apply","this","DateProto","Date","ObjectProto","notEqual","a","b","protoA","arraysNotEqual","keysA","keys","objectsNotEqual","HashProto","create","hashMap","hash","definition","_i","names","names_1","_a","name_1","prop","desc","getOwnPropertyDescriptor","o","map","EventMap","handlers","slice","addEventsMap","concat","addEvent","split","eventSplitter","getBubblingHandler","callback","name_2","push","EventDescriptor","target","event_1","on","event_2","off","handler","_bubblingHandlers","event","c","d","e","trigger5","trigger3","trigger2","context","next","listOff","_events","filteredHead","prev","head","ev","_callback","listSend3","call","EventHandler","once_1","_once","name_3","strings","api","events","test","self","queue","all","listSend2","listSend4","listSend5","f","listSend6","extendStatics","setPrototypeOf","__proto__","p","__extends","__","__assign","t","s","n","__rest","indexOf","getOwnPropertySymbols","__decorate","decorators","r","Reflect","decorate","defineProperty","Mixable","protoProps","staticProps","BaseClass","mixins","defineMixin","merge","mergeObject","getStaticDefinitions","onDefine","definitions","mergeInheritedMembers","spec","statics","TheSubclass","tslib_1.__extends","predefine","define","Constructor","__super__","MixinsState","get","populate","onExtend","ClassOrDefinition","Ctor","rules","definitionRules","definitionDecorator","definitionKey","mergeRules","appliedMixins","rule","mixins_1","mixin","isArray","sourceMixins","ctors","ctors_1","unshift","object","ignore","dontMix","getOwnPropertyNames","forEachOwnProp","sourceProp","_this","assignProperty","mixinRules","protoValue","baseProto","resolveRule","function","caller","list","destProp","configurable","pipe","classFirst","classLast","_idCount","uniqueId","cid","initialize","Messenger","localEvents","_localEvents","properties","eventsMap","defineProperties","toPropertyDescriptor","addReference","a_source","_listeningTo","removeAll","second","_disposed","stopListening","Events","listener","isProduction","process","env","NODE_ENV","logEvents","Logger","level","filter","topic","msg","props","args","toString","console","Error","counter","_super","window","something","body","join","JSON","stringify","logger","logEvents_1","logToConsole","throwingLogger","throwOn","log","trigger","bind","startIO","promise","options","thenDo","abortIO","_ioPromise","then","resp","triggerAndBubble","catch","err","abort","eventSource","collection","referenceMask","reference","splitTail","path","match","substr","tail","pop","local","resolve","Function","shift","resolveReference","root","action","skip","getStore","getOwner","ItemsBehavior","_validateNested","nested","error","validate","ValidationError","iteratee","each","eachError","cidPrefix","Transactional","endpoint","_endpoint","Transactional_1","_owner","_ownerKey","_changeEventName","listenTo","isRoot","transactionApi","begin","update","set","commit","transaction","__inner_state__","_changeToken","json","strict","validationError","eachValidationError","getClassName","data","_defaultStore","getOwnerEndpoint","_endpoints","_validationError","getValidationError","_transaction","markAsDirty","dirty","silent","_isDirty","initiator","originalOptions","_onChildrenChange","aquire","owner","child","ReferenceError","free","_begin","_markAsDirty","setAttribute","record","_attributes","doUpdate","attributes","_previousAttributes","AttributesCopy","_changedAttributes","UpdateRecordMixin","attribute","propagateChanges","forceAttributeChange","_createTransaction","a_values","unknown","changes","values","parse","shouldBeAnObject","unknownAttrsWarning","RecordTransaction","nested_1","_log","nested_2","changes_1","_b","emptyOptions","a_options","getHooks","transforms","changeHandlers","type","toJSON","changeEvents","hasCustomDefault","defaultValue","tools.isValidJSON","isRequired","convert","getHook_1","getHook","reduce","chainGetHooks","validate_1","chainTransforms","handleChange","chainChangeHandlers","doInit","AnyType","model","v","isChanged","code","text","New value","Prev. value","prevHook","nextHook","prevTransform","nextTransform","prevHandler","nextHandler","ImmutableClassType","PrimitiveType","NumericType","num","isFinite","ArrayType","ObjectType","doNothing","FunctionType","DateType","date","timestamp","getTime","toISOString","supportsDate","isNaN","struct","minutesOffset","isoDatePattern","exec","k","numericKeys","undefined","UTC","safeParseDate","AggregatedType","clone","canBeUpdated","nestedTransaction","_shared","persistent","_handleChange","unset","dispose","shareAndListen","listen","share","SharedType","implicitObject","_onChange","builtins","String","Number","Boolean","metatypes","getMetatype","_metatype","idx","ChainableAttributeSpec","check","metadata","required","ref","emptyFunction","changed","eventMap","unsubscribe","subscribe","cloned","Type","attrDef","shared","inferType","createAttribute","from","createAttributesMixin","attributesDefinition","baseClassAttributes","myAttributes","_.transform","allAttributes","_.defaults","ConstructorsMixin","attrDefs","attrs","attr","Attributes","constructorsMixin","_attributesArray","createPropertyDescriptor","attrSpecs","eventsApi.EventMap","createWatcherFromRef","wrapWatcher","localEventsMixin","watcher","IORecordMixin","save","getEndpoint","ioMethod","isNew","id","fetch","read","destroy","remove","_cidCounter","typeCheck","Record","idAttribute","extend","diff","hasChanged","val","old","nullify","forEach","_attributesArray_1","copy","pinStore","errors","asJson","l","newModel","clear","a_logger","Attributes definition","a_fun","tools.transform","Symbol","iterator","RecordEntriesIterator","Collection","BaseRecordAttributes","BaseRecordAttributesCopy","IdAttribute","metatype","done","DefaultCollection","dynamicMixin","_aquire","_free","convertAndAquire","_aggregationError","_itemEvents","sortElements","_comparator","sort","models","addIndex","index","removeIndex","updateIndex","previous","added","removed","sorted","CollectionTransaction","logAggregationError","added_1","_d","removed_1","_e","addTransaction","items","a_items","forceMerge","_byId","prevLength","a_items_1","item","appendElements","needSort","at","length_1","j","moveElements","sortOrMoveElements","removeMany","toRemove","_removeFromIndex","_reallocate","silentOptions","emptySetTransaction","len","src","_reallocateEmpty","setTransaction","_prevById","prevModels","toAdd","orderKept","reusedCount","previous_1","_garbageCollect","children","children_1","freeAll","addedOrChanged","ArrayMixin","mapFilter","res","doWhile","init","end","modelOrId","idOrObj","toPredicateFunction","m","firstMatch","find","entries","a_index","noOp","keys_1","keys_2","_count","CollectionRefsType","records","comparator","toElements","RefsCollection","_SubsetOf","Refs","Subset","itemEvents","aa","bb","_store","objOrId","count","elements","add","reset","enabled","liveUpdates","filter_1","_liveUpdates","updated","tslib_1.__assign","aggregated","a_elements","previousModels","previousModels_1","toDispose","recordsOrIds","el","splice","notify","removeOne","a_next","Argument","Attributes spec","parsed","parseReference","collectionRef","RecordRefType","subsetOf","masterCollection","T","CollectionClass","SubsetOf","subsetOfBehavior","refs","toArray","SubsetOfCollection","resolvedWith","resolveRefs","delaySet","raw","toggle","addAll","getMasterCollection","createSubset","subset","master","elements_1","tools.notEqual","Store","store","global","listenToOnce","method","reject","onAbort","fn","Promise","a_resolve","a_reject","listName","DefaultRecord","attrName","getMetadata","value_1","as"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../src/object-plus/tools.ts","../src/object-plus/eventsource.ts","../node_modules/tslib/tslib.es6.js","../src/object-plus/mixins.ts","../src/object-plus/events.ts","../src/object-plus/logging.ts","../src/io-tools.ts","../src/traversable.ts","../src/validation.ts","../src/transactions.ts","../src/record/updates.ts","../src/record/metatypes/any.ts","../src/record/metatypes/basic.ts","../src/record/metatypes/date.ts","../src/record/metatypes/owned.ts","../src/record/metatypes/shared.ts","../src/record/metatypes/index.ts","../src/record/attrDef.ts","../src/record/mixin.ts","../src/record/io-mixin.ts","../src/record/record.ts","../src/record/index.ts","../src/collection/commons.ts","../src/collection/add.ts","../src/collection/remove.ts","../src/collection/set.ts","../src/collection/arrayMethods.ts","../src/collection/index.ts","../src/relations/commons.ts","../src/relations/from.ts","../src/relations/subsetOf.ts","../src/relations/store.ts","../src/index.ts"],"sourcesContent":[" /** Similar to underscore `_.defaults` */\nexport function defaults< T >( dest : T, ...sources : Object[] ) : T\nexport function defaults< T >( dest : T, source : Object ) : T {\n for( var name in source ) {\n if( source.hasOwnProperty( name ) && !dest.hasOwnProperty( name ) ) {\n dest[ name ] = source[ name ];\n }\n }\n\n if( arguments.length > 2 ){\n for( let i = 2; i < arguments.length; i++ ){\n const other = arguments[ i ];\n other && defaults( dest, other );\n }\n }\n\n return dest;\n}\n\n/** Check if value is raw JSON */\nexport function isValidJSON( value : any ) : boolean {\n if( value === null ){\n return true;\n }\n\n switch( typeof value ){\n case 'number' :\n case 'string' :\n case 'boolean' :\n return true;\n\n case 'object':\n var proto = Object.getPrototypeOf( value );\n\n if( proto === Object.prototype || proto === Array.prototype ){\n return every( value, isValidJSON );\n }\n }\n\n return false;\n}\n\n/** Get the base class constructor function.\n * @param Class Subclass constructor function.\n * @returns Base class constructor function.\n */\nexport function getBaseClass( Class : Function ) {\n return Object.getPrototypeOf( Class.prototype ).constructor\n}\n\nexport function assignToClassProto( Class, definition : T, ...names : K[] ) : void {\n for( let name of names ){\n const value = definition[ name ];\n value === void 0 || ( Class.prototype[ name ] = value );\n }\n}\n\n/** Checks whenever given object is an empty hash `{}` */\nexport function isEmpty( obj : {} ) : boolean {\n if( obj ){\n for( let key in obj ){\n if( obj.hasOwnProperty( key ) ){\n return false;\n }\n }\n }\n\n return true;\n}\n\nexport type Iteratee = ( value : any, key? : string | number ) => any;\n\nfunction someArray( arr : any[], fun : Iteratee ) : any {\n let result;\n\n for( let i = 0; i < arr.length; i++ ){\n if( result = fun( arr[ i ], i ) ){\n return result;\n }\n }\n}\n\nfunction someObject( obj : {}, fun : Iteratee ) : any {\n let result;\n\n for( let key in obj ){\n if( obj.hasOwnProperty( key ) ){\n if( result = fun( obj[ key ], key ) ){\n return result;\n }\n }\n }\n}\n\n/** Similar to underscore `_.some` */\nexport function some( obj, fun : Iteratee ) : any {\n if( Object.getPrototypeOf( obj ) === ArrayProto ){\n return someArray( obj, fun );\n }\n else{\n return someObject( obj, fun );\n }\n}\n\n/** Similar to underscore `_.every` */\nexport function every( obj : { }, predicate : Iteratee ) : boolean {\n return !some( obj, x => !predicate( x ) );\n}\n\n/** Similar to `getOwnPropertyDescriptor`, but traverse the whole prototype chain. */\nexport function getPropertyDescriptor( obj : {}, prop : string ) : PropertyDescriptor {\n let desc : PropertyDescriptor;\n\n for( let proto = obj; !desc && proto; proto = Object.getPrototypeOf( proto ) ) {\n desc = Object.getOwnPropertyDescriptor( proto, prop );\n }\n\n return desc;\n}\n\n/** Similar to underscore `_.omit` */\nexport function omit( source : {}, ...rest : string[] ) : {}\nexport function omit( source ) : {} {\n const dest = {}, discard = {};\n\n for( let i = 1; i < arguments.length; i ++ ){\n discard[ arguments[ i ] ] = true;\n }\n\n for( var name in source ) {\n if( !discard.hasOwnProperty( name ) && source.hasOwnProperty( name ) ) {\n dest[ name ] = source[ name ];\n }\n }\n\n return dest;\n}\n\n/** map `source` object properties with a given function, and assign the result to the `dest` object.\n * When `fun` returns `undefined`, skip this value. \n */\nexport function transform< A, B >( dest : { [ key : string ] : A }, source : { [ key : string ] : B }, fun : ( value : B, key : string ) => A | void ) : { [ key : string ] : A } {\n for( var name in source ) {\n if( source.hasOwnProperty( name ) ) {\n var value = fun( source[ name ], name );\n value === void 0 || ( dest[ name ] = < A >value );\n }\n }\n\n return dest;\n}\n\nexport function fastAssign< A >( dest : A, source : {} ) : A {\n for( var name in source ) {\n dest[ name ] = source[ name ];\n }\n\n return dest;\n}\n\nexport function fastDefaults< A >( dest : A, source : {} ) : A {\n for( var name in source ) {\n if( dest[ name ] === void 0 ){\n dest[ name ] = source[ name ];\n }\n }\n\n return dest;\n}\n\n/** Similar to underscore `_.extend` and `Object.assign` */\nexport function assign< T >( dest : T, ...sources : Object[] ) : T\nexport function assign< T >( dest : T, source : Object ) : T {\n for( var name in source ) {\n if( source.hasOwnProperty( name ) ) {\n dest[ name ] = source[ name ];\n }\n }\n\n if( arguments.length > 2 ){\n for( let i = 2; i < arguments.length; i++ ){\n const other = arguments[ i ];\n other && assign( dest, other );\n }\n }\n\n return dest;\n}\n\n/** Similar to underscore `_.keys` */\nexport function keys( o : any ) : string[]{\n return o ? Object.keys( o ) : [];\n}\n\n/** Similar to underscore `_.once` */\nexport function once( func : Function ) : Function {\n var memo, first = true;\n return function() {\n if ( first ) {\n first = false;\n memo = func.apply(this, arguments);\n func = null;\n }\n return memo;\n };\n}\n\nconst ArrayProto = Array.prototype,\n DateProto = Date.prototype,\n ObjectProto = Object.prototype;\n\n/**\n * Determine whenever two values are not equal, deeply traversing \n * arrays and plain JS objects (hashes). Dates are compared by enclosed timestamps, all other\n * values are compared with strict comparison.\n */\nexport function notEqual( a : any, b : any) : boolean {\n if( a === b ) return false;\n\n if( a && b && typeof a == 'object' && typeof b == 'object' ) {\n const protoA = Object.getPrototypeOf( a );\n\n if( protoA !== Object.getPrototypeOf( b ) ) return true;\n\n switch( protoA ){\n case DateProto : return +a !== +b;\n case ArrayProto : return arraysNotEqual( a, b );\n case ObjectProto :\n case null:\n return objectsNotEqual( a, b );\n }\n }\n\n return true;\n}\n\nfunction objectsNotEqual( a, b ) {\n const keysA = Object.keys( a );\n\n if( keysA.length !== Object.keys( b ).length ) return true;\n\n for( let i = 0; i < keysA.length; i++ ) {\n const key = keysA[ i ];\n\n if( !b.hasOwnProperty( key ) || notEqual( a[ key ], b[ key ] ) ) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction arraysNotEqual( a, b ) {\n if( a.length !== b.length ) return true;\n\n for( let i = 0; i < a.length; i++ ) {\n if( notEqual( a[ i ], b[ i ] ) ) return true;\n }\n\n return false;\n}\n\n/**\n * Create an object without Object prototype members except hasOwnProperty.\n * @param obj - optional parameter to populate the hash map from.\n */\nconst HashProto = Object.create( null );\nHashProto.hasOwnProperty = ObjectProto.hasOwnProperty;\n\nexport function hashMap( obj? ){\n const hash = Object.create( HashProto );\n return obj ? assign( hash, obj ) : hash;\n}","import { once as _once } from './tools'\n\n/*******************\n * Prebuilt events map, used for optimized bulk event subscriptions.\n *\n * const events = new EventMap({\n * 'change' : true, // Resend this event from self as it is.\n * 'change:attr' : 'localTargetFunction',\n * 'executedInTargetContext' : function(){ ... }\n * 'executedInNativeContext' : '^props.handler'\n * })\n */\nexport interface EventsDefinition {\n [ events : string ] : Function | string | boolean\n}\n\n\nexport class EventMap {\n handlers : EventDescriptor[] = [];\n\n constructor( map? : EventsDefinition | EventMap ){\n if( map ){\n if( map instanceof EventMap ){\n this.handlers = map.handlers.slice();\n }\n else{\n map && this.addEventsMap( map );\n }\n }\n }\n\n merge( map : EventMap ){\n this.handlers = this.handlers.concat( map.handlers );\n }\n\n addEventsMap( map : EventsDefinition ){\n for( let names in map ){\n this.addEvent( names, map[ names ] )\n }\n }\n\n bubbleEvents( names : string ){\n for( let name of names.split( eventSplitter ) ){\n this.addEvent( name, getBubblingHandler( name ) );\n }\n }\n\n addEvent( names : string, callback : Function | string | boolean ){\n const { handlers } = this;\n\n for( let name of names.split( eventSplitter ) ){\n handlers.push( new EventDescriptor( name, callback ) );\n }\n }\n\n subscribe( target : {}, source : EventSource ){\n for( let event of this.handlers ){\n on( source, event.name, event.callback, target );\n }\n }\n\n unsubscribe( target : {}, source : EventSource ){\n for( let event of this.handlers ){\n off( source, event.name, event.callback, target );\n }\n }\n}\n\nexport class EventDescriptor {\n callback : Function\n\n constructor(\n public name : string,\n callback : Function | string | boolean\n ){\n if( callback === true ){\n this.callback = getBubblingHandler( name );\n }\n else if( typeof callback === 'string' ){\n this.callback =\n function localCallback(){\n const handler = this[ callback ];\n handler && handler.apply( this, arguments );\n };\n }\n else{\n this.callback = callback;\n }\n }\n}\n\nconst _bubblingHandlers = {};\n\nfunction getBubblingHandler( event : string ){\n return _bubblingHandlers[ event ] || (\n _bubblingHandlers[ event ] = function( a?, b?, c?, d?, e? ){\n if( d !== void 0 || e !== void 0 ) trigger5( this, event, a, b, c, d, e );\n if( c !== void 0 ) trigger3( this, event, a, b, c );\n else trigger2( this, event, a, b );\n }\n );\n}\n\nexport interface HandlersByEvent {\n [ name : string ] : EventHandler\n}\n\nexport class EventHandler {\n constructor( public callback : Callback, public context : any, public next = null ){}\n}\n\nfunction listOff( _events : HandlersByEvent, name : string, callback : Callback, context : any ){\n const head = _events[ name ];\n\n let filteredHead, prev;\n\n for( let ev = head; ev; ev = ev.next ){\n // Element must be kept\n if( ( callback && callback !== ev.callback && callback !== ev.callback._callback ) ||\n ( context && context !== ev.context ) ){\n \n prev = ev;\n filteredHead || ( filteredHead = ev );\n }\n // Element must be skipped\n else{\n if( prev ) prev.next = ev.next;\n }\n }\n\n if( head !== filteredHead ) _events[ name ] = filteredHead;\n}\n\nfunction listSend2( head : EventHandler, a, b ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b );\n}\n\nfunction listSend3( head : EventHandler, a, b, c ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c );\n}\n\nfunction listSend4( head : EventHandler, a, b, c, d ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d );\n}\n\nfunction listSend5( head : EventHandler, a, b, c, d, e ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d, e );\n}\n\nfunction listSend6( head : EventHandler, a, b, c, d, e, f ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d, e, f );\n}\n\nexport interface Callback extends Function {\n _callback? : Function\n}\n\n/** @internal */\nexport function on( source : EventSource, name : string, callback : Callback, context? : any ) : void {\n if( callback ){\n const _events = source._events || ( source._events = Object.create( null ) );\n _events[ name ] = new EventHandler( callback, context, _events[ name ] );\n }\n}\n\n/** @internal */\nexport function once( source : EventSource, name : string, callback : Callback, context? : any ) : void {\n if( callback ){\n const once : Callback = _once( function(){\n off( source, name, once );\n callback.apply(this, arguments);\n });\n\n once._callback = callback;\n on( source, name, once, context );\n }\n}\n\n/** @internal */\nexport function off( source : EventSource, name? : string, callback? : Callback, context? : any ) : void {\n const { _events } = source;\n if( _events ){\n if( callback || context ) {\n if( name ){\n listOff( _events, name, callback, context );\n }\n else{\n for( let name in _events ){\n listOff( _events, name, callback, context );\n }\n }\n }\n else if( name ){\n _events[ name ] = void 0;\n }\n else{\n source._events = void 0;\n }\n }\n}\n\nexport interface EventSource {\n /** @internal */\n _events : HandlersByEvent\n}\n\nconst eventSplitter = /\\s+/;\n\n/** @internal */\nexport function strings( api : ApiEntry, source : EventSource, events : string, callback : Callback, context ){\n if( eventSplitter.test( events ) ){\n const names = events.split( eventSplitter );\n for( let name of names ) api( source, name, callback, context );\n }\n else api( source, events, callback, context );\n}\n\n/** @internal */\nexport type ApiEntry = ( source : EventSource, event : string, callback : Callback, context? : any ) => void\n\n/*********************************\n * Event-triggering API\n */\n\n/** @internal */\nexport function trigger2( self : EventSource, name : string, a, b ) : void {\n const { _events } = self;\n if( _events ){\n const queue = _events[ name ],\n { all } = _events;\n\n listSend2( queue, a, b );\n listSend3( all, name, a, b );\n }\n};\n\n/** @internal */\nexport function trigger3( self : EventSource, name : string, a, b, c ) : void{\n const { _events } = self;\n if( _events ){\n const queue = _events[ name ],\n { all } = _events;\n\n listSend3( queue, a, b, c );\n listSend4( all, name, a, b, c );\n }\n};\n\n/** @internal */\nexport function trigger5( self : EventSource, name : string, a, b, c, d, e ) : void{\n const { _events } = self;\n if( _events ){\n const queue = _events[ name ],\n { all } = _events;\n\n listSend5( queue, a, b, c, d, e );\n listSend6( all, name, a, b, c, d, e );\n }\n};","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","/*****************************************************************\n * Mixins engine and @define metaprogramming class extensions\n *\n * Vlad Balin & Volicon, (c) 2016-2017\n */\nimport { __extends } from 'tslib';\nimport { assign, defaults, getBaseClass, hashMap, transform } from './tools';\n\nexport interface Subclass< T > extends MixableConstructor {\n new ( ...args ) : T\n prototype : T\n}\n\nexport interface MixableConstructor extends Function{\n __super__? : object;\n mixins? : MixinsState;\n onExtend? : ( BaseClass : Function ) => void;\n onDefine? : ( definition : object, BaseClass : Function ) => void;\n define? : ( definition? : object, statics? : object ) => MixableConstructor;\n extend? : ( definition? : T, statics? : object ) => Subclass;\n}\n\nexport interface MixableDefinition {\n mixins? : Mixin[]\n}\n\n/**\n * Base class, holding metaprogramming class extensions.\n * Supports mixins and Class.define metaprogramming method.\n */\nexport class Mixable {\n static onExtend : ( BaseClass : Function ) => void;\n static onDefine : ( definition : object, BaseClass : Function ) => object; \n static __super__ : object\n static mixins : MixinsState;\n\n /** \n * Must be called after inheritance and before 'define'.\n */\n static define( protoProps : MixableDefinition = {}, staticProps? : object ) : MixableConstructor {\n const BaseClass : MixableConstructor = getBaseClass( this );\n\n // Assign statics.\n staticProps && assign( this, staticProps );\n\n // Extract and apply mixins from the definition.\n const { mixins, ...defineMixin } = protoProps;\n mixins && this.mixins.merge( mixins );\n\n // Unshift definition to the the prototype.\n this.mixins.mergeObject( this.prototype, defineMixin, true );\n\n // Unshift definition from statics to the prototype.\n this.mixins.mergeObject( this.prototype, this.mixins.getStaticDefinitions( BaseClass ), true );\n\n // Call onDefine hook, if it's present.\n this.onDefine && this.onDefine( this.mixins.definitions, BaseClass );\n \n // Apply merge rules to inherited members. No mixins can be added after this point.\n this.mixins.mergeInheritedMembers( BaseClass );\n\n return this;\n }\n\n /** Backbone-compatible extend method to be used in ES5 and for backward compatibility */\n static extend< T extends object>(spec? : T, statics? : {} ) : Subclass< T > {\n let TheSubclass : Subclass< T >;\n\n // 1. Create the subclass (ES5 compatibility shim).\n // If constructor function is given...\n if( spec && spec.hasOwnProperty( 'constructor' ) ){\n // ...we need to manually call internal TypeScript __extend function. Hack! Hack!\n TheSubclass = spec.constructor as any;\n __extends( TheSubclass, this );\n }\n // Otherwise, create the subclall in usual way.\n else{\n TheSubclass = class Subclass extends this {} as any;\n }\n\n predefine( TheSubclass );\n spec && TheSubclass.define( spec, statics );\n\n return TheSubclass;\n }\n}\n\n/** @decorator `@predefine` for forward definitions. Can be used with [[Mixable]] classes only.\n * Forwards the call to the [[Mixable.predefine]];\n */\nexport function predefine( Constructor : MixableConstructor ) : void {\n const BaseClass : MixableConstructor = getBaseClass( Constructor );\n\n // Legacy systems support\n Constructor.__super__ = BaseClass.prototype;\n \n // Initialize mixins structures...\n Constructor.define || MixinsState.get( Mixable ).populate( Constructor );\n\n // Make sure Ctor.mixins are ready before the callback...\n MixinsState.get( Constructor );\n\n // Call extend hook.\n Constructor.onExtend && Constructor.onExtend( BaseClass );\n}\n\n/** @decorator `@define` for metaprogramming magic. Can be used with [[Mixable]] classes only.\n * Forwards the call to [[Mixable.define]].\n */\nexport function define( ClassOrDefinition : Function ) : void;\nexport function define( ClassOrDefinition : object ) : ClassDecorator;\nexport function define( ClassOrDefinition : object | MixableConstructor ){\n // @define class\n if( typeof ClassOrDefinition === 'function' ){\n predefine( ClassOrDefinition );\n ( ClassOrDefinition as MixableConstructor ).define();\n }\n // @define({ prop : val, ... }) class\n else{\n return function( Ctor : MixableConstructor ){\n predefine( Ctor );\n Ctor.define( ClassOrDefinition );\n } as any;\n }\n}\n\nexport function definitions( rules : MixinMergeRules ) : ClassDecorator {\n return ( Class : Function ) => {\n const mixins = MixinsState.get( Class );\n mixins.definitionRules = defaults( hashMap(), rules, mixins.definitionRules );\n }\n}\n\n// Create simple property list decorator\nexport function propertyListDecorator( listName: string ) : PropertyDecorator {\n return function propList(proto, name : string) {\n const list = proto.hasOwnProperty( listName ) ?\n proto[ listName ] : (proto[ listName ] = (proto[ listName ] || []).slice()); \n\n list.push(name);\n }\n}\n\nexport function definitionDecorator( definitionKey, value ){\n return ( proto : object, name : string ) => {\n MixinsState\n .get( proto.constructor )\n .mergeObject( proto, {\n [ definitionKey ] : {\n [ name ] : value\n }\n });\n }\n}\n\nexport class MixinsState {\n mergeRules : MixinMergeRules;\n definitionRules : MixinMergeRules;\n definitions : object = {};\n appliedMixins : Mixin[];\n\n // Return mixins state for the class. Initialize if it's not exist.\n static get( Class ) : MixinsState {\n const { mixins } = Class;\n \n return mixins && Class === mixins.Class ? mixins :\n Class.mixins = new MixinsState( Class );\n }\n\n constructor( public Class : MixableConstructor ){\n const { mixins } = getBaseClass( Class );\n\n this.mergeRules = ( mixins && mixins.mergeRules ) || hashMap();\n this.definitionRules = ( mixins && mixins.definitionRules ) || hashMap();\n this.appliedMixins = ( mixins && mixins.appliedMixins ) || [];\n }\n\n getStaticDefinitions( BaseClass : Function ){\n const definitions = hashMap(),\n { Class } = this;\n\n return transform( definitions, this.definitionRules, ( rule, name ) =>{\n if( BaseClass[ name ] !== Class[ name ]){\n return Class[ name ];\n }\n });\n }\n\n merge( mixins : Mixin[] ){\n const proto = this.Class.prototype,\n { mergeRules } = this;\n\n // Copy applied mixins array as it's going to be updated.\n const appliedMixins = this.appliedMixins = this.appliedMixins.slice();\n\n // Apply mixins in sequence...\n for( let mixin of mixins ) {\n // Mixins array should be flattened.\n if( Array.isArray( mixin ) ) {\n this.merge( mixin );\n }\n // Don't apply mixins twice.\n else if( appliedMixins.indexOf( mixin ) < 0 ){\n appliedMixins.push( mixin );\n\n // For constructors, merge _both_ static and prototype members.\n if( typeof mixin === 'function' ){\n // Merge static members\n this.mergeObject( this.Class, mixin );\n\n // merge definitionRules and mergeRules\n const sourceMixins = ( mixin as any ).mixins;\n if( sourceMixins ){\n this.mergeRules = defaults( hashMap(), this.mergeRules, sourceMixins.mergeRules );\n this.definitionRules = defaults( hashMap(), this.definitionRules, sourceMixins.definitionRules );\n this.appliedMixins = this.appliedMixins.concat( sourceMixins.appliedMixins );\n }\n\n // Prototypes are merged according with rules.\n this.mergeObject( proto, mixin.prototype );\n }\n // Handle plain object mixins.\n else {\n this.mergeObject( proto, mixin );\n }\n }\n }\n }\n\n populate( ...ctors : Function[] ){\n for( let Ctor of ctors ) {\n MixinsState.get( Ctor ).merge([ this.Class ]);\n }\n }\n\n mergeObject( dest : object, source : object, unshift? : boolean ) {\n forEachOwnProp( source, name => {\n const sourceProp = Object.getOwnPropertyDescriptor( source, name );\n let rule : MixinMergeRule;\n\n if( rule = this.definitionRules[ name ] ){\n assignProperty( this.definitions, name, sourceProp, rule, unshift );\n }\n\n if( !rule || rule === mixinRules.protoValue ){\n assignProperty( dest, name, sourceProp, this.mergeRules[ name ], unshift );\n }\n });\n }\n\n mergeInheritedMembers( BaseClass : Function ){\n const { mergeRules, Class } = this;\n\n if( mergeRules ){\n const proto = Class.prototype,\n baseProto = BaseClass.prototype;\n\n for( let name in mergeRules ) {\n const rule = mergeRules[ name ];\n\n if( proto.hasOwnProperty( name ) && name in baseProto ){\n proto[ name ] = resolveRule( proto[ name ], baseProto[ name ], rule );\n }\n }\n }\n }\n}\n\nconst dontMix = {\n function : hashMap({\n length : true,\n prototype : true,\n caller : true,\n arguments : true,\n name : true,\n __super__ : true\n }),\n \n object : hashMap({\n constructor : true\n }) \n}\n\nfunction forEachOwnProp( object : object, fun : ( name : string ) => void ){\n const ignore = dontMix[ typeof object ];\n\n for( let name of Object.getOwnPropertyNames( object ) ) {\n ignore[ name ] || fun( name );\n }\n}\n\nexport interface MixinMergeRules {\n [ name : string ] : MixinMergeRule\n}\n\nexport type MixinMergeRule = ( a : any, b : any ) => any\nexport type Mixin = { [ key : string ] : any } | Function\n\n// @mixins( A, B, ... ) decorator.\nexport interface MixinRulesDecorator {\n ( rules : MixinMergeRules ) : ClassDecorator\n value( a : object, b : object) : object;\n protoValue( a : object, b : object) : object;\n merge( a : object, b : object ) : object;\n pipe( a: Function, b : Function ) : Function;\n defaults( a: Function, b : Function ) : Function;\n classFirst( a: Function, b : Function ) : Function;\n classLast( a: Function, b : Function ) : Function;\n every( a: Function, b : Function ) : Function;\n some( a: Function, b : Function ) : Function;\n}\n\nexport const mixins = ( ...list : Mixin[] ) => (\n ( Class : Function ) => MixinsState.get( Class ).merge( list )\n);\n\n// @mixinRules({ name : rule, ... }) decorator.\nexport const mixinRules = ( ( rules : MixinMergeRules ) => (\n ( Class : Function ) => {\n const mixins = MixinsState.get( Class );\n mixins.mergeRules = defaults( rules, mixins.mergeRules );\n }\n) ) as MixinRulesDecorator;\n\n// Pre-defined mixin merge rules\n\nmixinRules.value = ( a, b ) => a;\n\nmixinRules.protoValue = ( a, b ) => a;\n\n// Recursively merge members\nmixinRules.merge = ( a, b ) => defaults( {}, a, b );\n\n // Execute methods in pipe, with the class method executed last.\nmixinRules.pipe = ( a, b ) => (\n function( x : any ) : any {\n return a.call( this, b.call( this, x ) );\n }\n);\n\n // Assume methods return an object, and merge results with defaults (class method executed first)\nmixinRules.defaults = ( a : Function, b : Function ) => (\n function() : object {\n return defaults( a.apply( this, arguments ), b.apply( this, arguments ) );\n }\n);\n\n// Execute methods in sequence staring with the class method.\nmixinRules.classFirst = ( a : Function, b : Function ) => (\n function() : void {\n a.apply( this, arguments );\n b.apply( this, arguments );\n }\n);\n\n // Execute methods in sequence ending with the class method.\nmixinRules.classLast = ( a : Function, b : Function ) => (\n function() : void {\n b.apply( this, arguments );\n a.apply( this, arguments );\n }\n)\n\n // Execute methods in sequence returning the first falsy result.\nmixinRules.every = ( a : Function, b : Function ) =>(\n function() : any {\n return a.apply( this, arguments ) && b.apply( this, arguments );\n }\n);\n // Execute methods in sequence returning the first truthy result.\nmixinRules.some = ( a : Function, b : Function ) =>(\n function() : any {\n return a.apply( this, arguments ) || b.apply( this, arguments );\n }\n);\n\n/**\n * Helpers\n */\n\nfunction assignProperty( dest : object, name : string, sourceProp : PropertyDescriptor, rule : MixinMergeRule, unshift? : boolean ){\n// Destination prop is defined, thus the merge rules must be applied.\n if( dest.hasOwnProperty( name ) ){\n const destProp = Object.getOwnPropertyDescriptor( dest, name );\n\n if( destProp.configurable && 'value' in destProp ){\n dest[ name ] = unshift ?\n resolveRule( sourceProp.value, destProp.value, rule ) :\n resolveRule( destProp.value, sourceProp.value, rule ) ;\n }\n }\n // If destination is empty, just copy the prop over.\n else{\n Object.defineProperty( dest, name, sourceProp );\n }\n}\n\nfunction resolveRule( dest, source, rule : MixinMergeRule ){\n // When destination is empty, take the source.\n if( dest === void 0 ) return source;\n\n // In these cases we take non-empty destination:\n if( !rule || source === void 0 ) return dest;\n\n // In other cases we must merge values.\n return rule( dest, source );\n}","import * as _eventsApi from './eventsource';\nimport { EventMap, EventsDefinition, EventSource, HandlersByEvent } from './eventsource';\nimport { define, definitions, Mixable, MixableConstructor, mixinRules, MixinsState } from './mixins';\nimport { omit, transform } from './tools';\n\nconst { strings, on, off, once, trigger5, trigger2, trigger3 } = _eventsApi;\n\nlet _idCount = 0;\n\nfunction uniqueId() : string {\n return 'l' + _idCount++;\n}\n\nexport { EventMap, EventsDefinition };\n\nexport interface MessengerDefinition {\n _localEvents? : EventMap\n localEvents? : EventsDefinition\n properties? : PropertyMap\n [ name : string ] : any\n}\n\nexport interface PropertyMap {\n [ name : string ] : Property\n}\n\nexport type Property = PropertyDescriptor | ( () => any )\n\nexport interface MessengersByCid {\n [ cid : string ] : Messenger\n}\n\nexport type EventCallbacks = { [ events : string ] : EventCallback }\nexport type EventCallback = ( this : Context, ...args : any[] ) => void\n\n/*************************\n * Messenger is mixable class with capabilities of sending and receiving synchronous events.\n * This class itself can serve as both mixin and base class.\n */\n\n@define\n@definitions({\n properties : mixinRules.merge,\n localEvents : mixinRules.merge\n})\nexport class Messenger implements Mixable, EventSource {\n // Define extendable mixin static properties.\n /** @internal */\n static __super__ : object;\n static mixins : MixinsState;\n static onExtend : ( BaseClass : Function ) => void;\n static define : ( definition? : MessengerDefinition, statics? : object ) => MixableConstructor;\n static extend : ( definition? : MessengerDefinition, statics? : object ) => MixableConstructor;\n static onDefine({ localEvents, _localEvents, properties } : MessengerDefinition, BaseClass? : typeof Mixable ){\n // Handle localEvents definition\n if( localEvents || _localEvents ){\n const eventsMap = new EventMap( this.prototype._localEvents );\n\n localEvents && eventsMap.addEventsMap( localEvents );\n _localEvents && eventsMap.merge( _localEvents );\n \n this.prototype._localEvents = eventsMap;\n }\n\n // Handle properties definitions...\n if( properties ){\n Object.defineProperties( this.prototype, transform( {}, properties, toPropertyDescriptor ) );\n }\n }\n\n /** @internal */ \n _events : HandlersByEvent = void 0;\n\n /** @internal */ \n _listeningTo : MessengersByCid = void 0\n\n /** Unique client-only id. */\n cid : string\n\n /** @internal Prototype-only property to manage automatic local events subscription */ \n _localEvents : EventMap\n\n constructor(){\n this.cid = uniqueId();\n this.initialize.apply( this, arguments );\n\n // TODO: local events subscribe?\n }\n\n /** Method is called at the end of the constructor */\n initialize() : void {}\n \n on( events : string | EventCallbacks, callback?, context? ) : this {\n if( typeof events === 'string' ) strings( on, this, events, callback, context );\n else for( let name in events ) strings( on, this, name, events[ name ], context || callback );\n\n return this;\n }\n\n once( events : string | EventCallbacks, callback?, context? ) : this {\n if( typeof events === 'string' ) strings( once, this, events, callback, context );\n else for( let name in events ) strings( once, this, name, events[ name ], context || callback );\n\n return this;\n }\n\n off( events? : string | EventCallbacks, callback?, context? ) : this {\n if( !events ) off( this, void 0, callback, context );\n else if( typeof events === 'string' ) strings( off, this, events, callback, context );\n else for( let name in events ) strings( off, this, name, events[ name ], context || callback );\n\n return this;\n }\n\n // Trigger one or many events, firing all bound callbacks. Callbacks are\n // passed the same arguments as `trigger` is, apart from the event name\n // (unless you're listening on `\"all\"`, which will cause your callback to\n // receive the true name of the event as the first argument).\n trigger(name : string, a?, b?, c?, d?, e? ) : this {\n if( d !== void 0 || e !== void 0 ) trigger5( this, name, a, b, c, d, e );\n else if( c !== void 0 ) trigger3( this, name, a, b, c );\n else trigger2( this, name, a, b );\n return this;\n }\n\n listenTo( source : Messenger, a : string | EventCallbacks, b? : Function ) : this {\n if( source ){\n addReference( this, source );\n source.on( a, !b && typeof a === 'object' ? this : b, this );\n }\n\n return this;\n }\n\n listenToOnce( source : Messenger, a : string | EventCallbacks, b? : Function ) : this {\n if( source ){\n addReference( this, source );\n source.once( a, !b && typeof a === 'object' ? this : b, this );\n }\n\n return this;\n }\n\n stopListening( a_source? : Messenger, a? : string | EventCallbacks, b? : Function ) : this {\n const { _listeningTo } = this;\n if( _listeningTo ){\n const removeAll = !( a || b ),\n second = !b && typeof a === 'object' ? this : b;\n\n if( a_source ){\n const source = _listeningTo[ a_source.cid ];\n if( source ){\n if( removeAll ) delete _listeningTo[ a_source.cid ];\n source.off( a, second, this );\n }\n }\n else if( a_source == null ){\n for( let cid in _listeningTo ) _listeningTo[ cid ].off( a, second, this );\n\n if( removeAll ) ( this._listeningTo = void 0 );\n }\n }\n\n return this;\n }\n\n /**\n * Destructor. Stops messenger from listening to all objects,\n * and stop others from listening to the messenger. \n */\n _disposed : boolean\n\n dispose() : void {\n if( this._disposed ) return;\n\n this.stopListening();\n this.off();\n\n this._disposed = true;\n }\n}\n\n/**\n * Backbone 1.2 API conformant Events mixin.\n */\nexport const Events : Messenger = omit( Messenger.prototype, 'constructor', 'initialize' );\n\n/**\n * Messenger Private Helpers \n */\n\nfunction toPropertyDescriptor( x : Property ) : PropertyDescriptor {\n if( x ){\n return typeof x === 'function' ? { get : < () => any >x, configurable : true } : x;\n }\n}\n\nfunction addReference( listener : Messenger, source : Messenger ){\n const listeningTo = listener._listeningTo || (listener._listeningTo = Object.create( null ) ),\n cid = source.cid || ( source.cid = uniqueId() );\n\n listeningTo[ cid ] = source;\n}","import { Messenger } from './events'\nimport { define } from './mixins';\n\nexport type LogLevel = 'error' | 'warn' | 'debug' | 'info' | 'log';\nexport type LoggerEventHandler = ( topic : string, msg : string, props : object ) => void;\n\nexport const isProduction = typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'production',\n logEvents : LogLevel[] = isProduction ?\n [ 'error', 'info' ] :\n [ 'error', 'warn', 'debug', 'info', 'log' ];\n\n@define\nexport class Logger extends Messenger {\n counter : { [ level in LogLevel ]? : number } = {}\n\n // Log events of the given log level to the console, optionally filtered by topic\n logToConsole( level : LogLevel, filter? : RegExp ) : this {\n return this.on( level, ( topic, msg, props ) => {\n if( !filter || filter.test( topic ) ){\n const args = [ `[${topic}] ${msg}` ];\n \n for( let name in props ){\n args.push( `\\n\\t${name}:`, toString( props[ name ] ) );\n }\n \n console[ level ].apply( console, args );\n }\n });\n }\n\n // Fire exception on the events of the given log level, optionally filtered by topic\n throwOn( level : LogLevel, filter? : RegExp ) : this {\n return this.on( level, ( topic, msg, props ) => {\n if( !filter || filter.test( topic ) ){\n throw new Error( `[${topic}] ${msg}` );\n }\n });\n }\n\n // Count log events of the given level, optionally filtered by topic\n count( level : LogLevel, filter? : RegExp ) : this {\n return this.on( level, ( topic, msg, props ) => {\n if( !filter || filter.test( topic ) ){\n this.counter[ level ] = ( this.counter[ level ] || 0 ) + 1;\n }\n });\n }\n\n trigger : ( level : LogLevel, topic : string, message : string, props? : object ) => this;\n \n off : ( event? : LogLevel ) => this;\n\n\n on( handlers : { [ name in LogLevel ] : LoggerEventHandler } ) : this;\n on( handlers : LogLevel, handler : LoggerEventHandler ) : this;\n on( handlers : 'all', handler : ( level : LogLevel, topic : string, msg : string, props : object ) => void ) : this;\n on( a : any, b? : any ){\n return super.on( a, b );\n }\n}\n\n/**\n * Convert objects to the plain text friendly format.\n * primitives as in JSON.\n */\nlet toString = typeof window === 'undefined' ? \n something => {\n if( something && typeof something === 'object' ){\n const { __inner_state__ } = something,\n value = __inner_state__ || something,\n isArray = Array.isArray( value );\n\n const body = isArray ? `[ length = ${ value.length } ]` : `{ ${ Object.keys( value ).join( ', ' )} }`;\n\n return something.constructor.name + ' ' + body;\n }\n\n return JSON.stringify( something );\n }\n : x => x;\n\nexport const logger = new Logger();\n\nif( typeof console !== 'undefined' ) {\n for( let event of logEvents ){\n logger.logToConsole( event );\n }\n}\n\nexport const throwingLogger = new Logger();\nthrowingLogger.throwOn( 'error' ).throwOn( 'warn' );\n\nexport const log : typeof logger.trigger = logger.trigger.bind( logger );","export interface IONode {\n /** @internal */\n _endpoint : IOEndpoint\n\n /** @internal */\n _ioPromise : IOPromise< this >\n}\n\nexport interface IOPromise extends Promise {\n abort? : () => void\n}\n\nexport interface IOEndpoint {\n list( options : IOOptions, collection? ) : IOPromise\n create( json : any, options : IOOptions, record? ) : IOPromise\n update( id : string | number, json :any, options : IOOptions, record? ) : IOPromise\n read( id : string | number, options : IOOptions, record? ) : IOPromise\n destroy( id : string | number, options : IOOptions, record? ) : IOPromise\n subscribe( events : IOEvents, collection? ) : IOPromise\n unsubscribe( events : IOEvents, collection? ) : void\n}\n\nexport interface IOOptions {\n ioMethod? : 'save' | 'fetch'\n}\n\nexport interface IOEvents {\n updated? : ( json : any ) => void\n removed? : ( json : any ) => void\n}\n\nexport function getOwnerEndpoint( self ) : IOEndpoint {\n // Check if we are the member of the collection...\n const { collection } = self;\n if( collection ){\n return getOwnerEndpoint( collection );\n }\n\n // Now, if we're the member of the model...\n if( self._owner ){\n const { _endpoints } = self._owner;\n return _endpoints && _endpoints[ self._ownerKey ];\n }\n}\n\n/**\n * Create abortable promise.\n * Adds `promise.abort()` function which rejects the promise by default\n * initialize() function takes third optional argument `abort : ( resolve, reject ) => void`,\n * which can be used to add custom abort handling.\n */\ndeclare var Promise: PromiseConstructorLike;\n\nexport function createIOPromise( initialize : InitIOPromise ) : IOPromise{\n let resolve, reject, onAbort;\n\n function abort( fn ){\n onAbort = fn;\n }\n\n const promise : IOPromise = new Promise( ( a_resolve, a_reject ) =>{\n reject = a_reject;\n resolve = a_resolve;\n initialize( resolve, reject, abort );\n }) as IOPromise;\n\n promise.abort = () => {\n onAbort ? onAbort( resolve, reject ) : reject( new Error( \"I/O Aborted\" ) );\n }\n\n return promise;\n}\n\nexport type InitIOPromise = ( resolve : ( x? : any ) => void, reject : ( x? : any ) => void, abort? : ( fn : Function ) => void ) => void;\n\nexport function startIO( self : IONode, promise : IOPromise, options : IOOptions, thenDo : ( json : any ) => any ) : IOPromise {\n // Stop pending I/O first...\n abortIO( self );\n\n self._ioPromise = promise\n .then( resp => {\n self._ioPromise = null;\n \n const result = thenDo ? thenDo( resp ) : resp;\n \n triggerAndBubble( self, 'sync', self, resp, options );\n \n return result;\n } ) \n .catch( err => {\n self._ioPromise = null;\n \n // Overlaps with a new `error` event.\n triggerAndBubble( self, 'error', self, err, options );\n \n throw err;\n } ) as IOPromise;\n\n self._ioPromise.abort = promise.abort;\n\n return self._ioPromise;\n}\n\nexport function abortIO( self : IONode ){\n if( self._ioPromise && self._ioPromise.abort ){\n self._ioPromise.abort();\n self._ioPromise = null;\n }\n}\n\nexport function triggerAndBubble( eventSource, ...args ){\n eventSource.trigger.apply( eventSource, args );\n const { collection } = eventSource;\n collection && collection.trigger.apply( collection, args ); \n}","/**\n * Traversable objects and symbolic references\n */\nexport interface Traversable {\n getStore() : Traversable\n getOwner() : Traversable\n get( key : string ) : any \n}\n\nconst referenceMask = /\\^|(store\\.[^.]+)|([^.]+)/g;\n\n// Compile reference to function\nexport type ResolveReference = ( root : Traversable ) => any; \n\nexport class CompiledReference {\n resolve : ResolveReference\n tail : string\n local : boolean\n\n constructor( reference : string, splitTail : boolean = false ){\n const path = reference\n .match( referenceMask )\n .map( key => {\n if( key === '^' || key === 'owner' ) return 'getOwner()';\n\n if( key[ 0 ] === '~' ) return `getStore().get(\"${ key.substr( 1 ) }\")`;\n\n if( key.indexOf( 'store.' ) === 0 ) return `getStore().get(\"${ key.substr( 6 ) }\")`;\n \n return key;\n } );\n \n this.tail = splitTail && path.pop();\n this.local = !path.length;\n \n this.resolve = new Function( 'self', `\n var v = self.${ path.shift() };\n \n ${ path.map( x => `\n v = v && v.${ x };\n `).join('')}\n\n return v;\n ` );\n }\n}\n\nexport function resolveReference( root : Traversable, reference : string, action : ( object, key : string ) => any ) : any {\n const path = reference.match( referenceMask ),\n skip = path.length - 1;\n \n let self = root;\n\n for( var i = 0; i < skip; i++ ){\n const key = path[ i ];\n switch( key ){\n case '~' : self = self.getStore(); break;\n case '^' : self = self.getOwner(); break;\n default : self = self.get( key );\n }\n\n // Do nothing if object on the path doesn't exist.\n if( !self ) return;\n }\n\n return action( self, path[ skip ] );\n}","export interface ChildrenErrors {\n [ key : string ] : ValidationError | any\n} \n\nexport interface Validatable {\n /** @internal */\n _validateNested( errors : ChildrenErrors ) : number;\n \n validate( self : any ) : any\n get( key : string ) : any\n}\n\n// Validation error object.\nexport class ValidationError {\n // Invalid nested object keys \n nested : ChildrenErrors \n length : number\n\n // Local error\n error : any\n\n constructor( obj : Validatable ){\n this.length = obj._validateNested( this.nested = {} );\n\n if( this.error = obj.validate( obj ) ){\n this.length++;\n }\n }\n\n each( iteratee : ( value : any, key : string ) => void ) : void {\n const { error, nested } = this;\n\n if( error ) iteratee( error, null );\n\n for( const key in nested ){\n iteratee( nested[ key ], key );\n }\n }\n\n eachError( iteratee : ( error : any, key : string, object : Validatable ) => void, object : Validatable ) : void {\n this.each( ( value : any, key : string ) => {\n if( value instanceof ValidationError ){\n (value).eachError( iteratee, object.get( key ) );\n }\n else{\n iteratee( value, key, object );\n }\n });\n }\n}","import { abortIO, IOEndpoint, IONode, IOPromise } from './io-tools';\nimport { EventCallbacks, define, definitions, eventsApi, Logger, LogLevel, Messenger, MessengerDefinition, MessengersByCid, mixinRules, mixins, MixinsState, throwingLogger } from './object-plus';\nimport { resolveReference, Traversable } from './traversable';\nimport { ChildrenErrors, Validatable, ValidationError } from './validation';\n\nconst { trigger3, on, off } = eventsApi;\n/***\n * Abstract class implementing ownership tree, tho-phase transactions, and validation. \n * 1. createTransaction() - apply changes to an object tree, and if there are some events to send, transaction object is created.\n * 2. transaction.commit() - send and process all change events, and close transaction.\n */\n\n/** @private */\nexport interface TransactionalDefinition extends MessengerDefinition {\n endpoint? : IOEndpoint\n}\n\nexport enum ItemsBehavior {\n share = 0b0001,\n listen = 0b0010,\n persistent = 0b0100\n}\n\n// Transactional object interface\n\nexport interface Transactional extends Messenger {}\n\n@define\n@definitions({\n endpoint : mixinRules.value\n})\n@mixins( Messenger )\nexport abstract class Transactional implements Messenger, IONode, Validatable, Traversable {\n // Mixins are hard in TypeScript. We need to copy type signatures over...\n // Here goes 'Mixable' mixin.\n static endpoint : IOEndpoint;\n \n /** @internal */\n static __super__ : object;\n \n static mixins : MixinsState;\n static define : ( definition? : TransactionalDefinition, statics? : object ) => typeof Transactional;\n static extend : ( definition? : T, statics? : object ) => any;\n\n static onDefine( definitions : TransactionalDefinition, BaseClass : typeof Transactional ){\n if( definitions.endpoint ) this.prototype._endpoint = definitions.endpoint;\n Messenger.onDefine.call( this, definitions, BaseClass );\n };\n\n static onExtend( BaseClass : typeof Transactional ) : void {\n // Make sure we don't inherit class factories.\n if( BaseClass.create === this.create ) {\n this.create = Transactional.create;\n }\n }\n\n // Define extendable mixin static properties.\n static create( a : any, b? : any ) : Transactional {\n return new (this as any)( a, b );\n }\n\n // State accessor.\n /** @internal */\n readonly __inner_state__ : any;\n\n // Shared modifier (used by collections of shared models)\n /** @internal */\n _shared? : number; \n \n dispose() : void {\n if( this._disposed ) return;\n \n abortIO( this );\n this._owner = void 0;\n this._ownerKey = void 0;\n this.off();\n this.stopListening();\n this._disposed = true;\n }\n \n cidPrefix : string\n\n // Unique version token replaced on change\n /** @internal */\n _changeToken : {} = {}\n\n // true while inside of the transaction\n /** @internal */\n _transaction : boolean = false;\n\n // Holds current transaction's options, when in the middle of transaction and there're changes but is an unsent change event\n /** @internal */\n _isDirty : TransactionOptions = null;\n\n // Backreference set by owner (Record, Collection, or other object)\n /** @internal */\n _owner : Owner = void 0;\n\n // Key supplied by owner. Used by record to identify attribute key.\n // Only collections doesn't set the key, which is used to distinguish collections.\n /** @internal */ \n _ownerKey : string = void 0;\n\n // Name of the change event\n /** @internal */\n _changeEventName : string\n\n /**\n * Subsribe for the changes.\n */\n onChanges( handler : Function, target? : Messenger ){\n on( this, this._changeEventName, handler, target );\n }\n\n /**\n * Unsubscribe from changes.\n */\n offChanges( handler? : Function, target? : Messenger ){\n off( this, this._changeEventName, handler, target );\n }\n\n /**\n * Listen to changes event. \n */\n listenToChanges( target : Transactional, handler ){\n this.listenTo( target, target._changeEventName, handler );\n }\n\n constructor( cid : string | number ){\n this.cid = this.cidPrefix + cid;\n }\n\n // Deeply clone ownership subtree\n abstract clone( options? : CloneOptions ) : this\n \n // Execute given function in the scope of ad-hoc transaction.\n transaction( fun : ( self : this ) => void, options : TransactionOptions = {} ) : void{\n const isRoot = transactionApi.begin( this );\n const update = fun.call( this, this );\n update && this.set( update );\n isRoot && transactionApi.commit( this );\n }\n\n // Assign transactional object \"by value\", copying aggregated items.\n assignFrom( source : Transactional | Object ) : this {\n // Need to delay change events until change token willl by synced.\n this.transaction( () =>{\n this.set( ( source ).__inner_state__ || source, { merge : true } );\n\n // Synchronize change tokens\n const { _changeToken } = source as any;\n \n if( _changeToken ){\n this._changeToken = _changeToken;\n } \n });\n\n return this;\n }\n\n // Create object from JSON. Throw if validation fail.\n static from Transactional >( this : T, json : any, { strict, ...options } : { strict? : boolean } & TransactionOptions = {} ) : InstanceType{\n const obj : Transactional = ( this as any ).create( json, { ...options, logger : strict ? throwingLogger : void 0 } );\n\n if( strict && obj.validationError ){\n obj.eachValidationError( ( error, key, obj ) => {\n throw new Error( `${ obj.getClassName() }.${ key }: ${ error }` );\n });\n }\n\n return obj as any;\n }\n\n // Apply bulk object update without any notifications, and return open transaction.\n // Used internally to implement two-phase commit.\n // Returns null if there are no any changes.\n /** @internal */\n abstract _createTransaction( values : any, options? : TransactionOptions ) : Transaction | void\n\n // Apply bulk in-place object update in scope of ad-hoc transaction \n abstract set( values : any, options? : TransactionOptions ) : this;\n\n \n // Parse function applied when 'parse' option is set for transaction.\n parse( data : any, options? : TransactionOptions ) : any { return data }\n\n // Convert object to the serializable JSON structure\n abstract toJSON( options? : object ) : {}\n\n /*******************\n * Traversals and member access\n */\n \n // Get object member by its key.\n abstract get( key : string ) : any\n\n // Get object member by symbolic reference.\n deepGet( reference : string ) : any {\n return resolveReference( this, reference, ( object, key ) => object.get ? object.get( key ) : object[ key ] );\n }\n\n //_isCollection : boolean\n\n // Return owner skipping collections.\n getOwner() : Owner {\n return this._owner;\n }\n\n // Store used when owner chain store lookup failed. Static value in the prototype. \n /** @internal */\n _defaultStore : Transactional\n\n // Locate the closest store. Store object stops traversal by overriding this method. \n getStore() : Transactional {\n const { _owner } = this;\n return _owner ? _owner.getStore() : this._defaultStore;\n }\n\n\n /***************************************************\n * Iteration API\n */\n\n // Loop through the members. Must be efficiently implemented in container class.\n\n /** @internal */\n _endpoint : IOEndpoint\n \n /** @internal */\n _ioPromise : IOPromise\n\n hasPendingIO() : IOPromise { return this._ioPromise; }\n\n //fetch( options? : object ) : IOPromise { throw new Error( \"Not implemented\" ); }\n\n getEndpoint() : IOEndpoint {\n return getOwnerEndpoint( this ) || this._endpoint;\n }\n \n /*********************************\n * Validation API\n */\n\n // Lazily evaluated validation error\n /** @internal */\n _validationError : ValidationError = void 0\n\n // Validate ownership tree and return valudation error \n get validationError() : ValidationError {\n const error = this._validationError || ( this._validationError = new ValidationError( this ) );\n return error.length ? error : null; \n }\n\n // Validate nested members. Returns errors count.\n /** @internal */\n abstract _validateNested( errors : ChildrenErrors ) : number\n\n // Object-level validator. Returns validation error.\n validate( obj? : Transactional ) : any {}\n\n // Return validation error (or undefined) for nested object with the given key. \n getValidationError( key? : string ) : any {\n var error = this.validationError;\n return ( key ? error && error.nested[ key ] : error ) || null;\n }\n\n // Get validation error for the given symbolic reference.\n deepValidationError( reference : string ) : any {\n return resolveReference( this, reference, ( object, key ) => object.getValidationError( key ) );\n }\n\n // Iterate through all validation errors across the ownership tree.\n eachValidationError( iteratee : ( error : any, key : string, object : Transactional ) => void ) : void {\n const { validationError } = this;\n validationError && validationError.eachError( iteratee, this );\n }\n\n // Check whenever member with a given key is valid. \n isValid( key? : string ) : boolean {\n return !this.getValidationError( key );\n }\n\n valueOf() : Object { return this.cid; }\n toString(){ return this.cid; }\n\n // Get class name for an object instance. Works fine with ES6 classes definitions (not in IE).\n getClassName() : string {\n const { name } = this.constructor;\n if( name !== 'Subclass' ) return name;\n }\n\n // Logging interface for run time errors and warnings.\n /** @internal */\n abstract _log( level : LogLevel, topic : string, text : string, value : any, logger? : Logger ) : void\n}\n\nexport interface CloneOptions {\n // 'Pin store' shall assign this._defaultStore = this.getStore();\n pinStore? : boolean\n}\n\n// Owner must accept children update events. It's an only way children communicates with an owner.\n/** @private */\nexport interface Owner extends Traversable, Messenger {\n /** @internal */\n _onChildrenChange( child : Transactional, options : TransactionOptions ) : void;\n \n getOwner() : Owner\n getStore() : Transactional\n}\n\n// Transaction object used for two-phase commit protocol.\n// Must be implemented by subclasses.\n// Transaction must be created if there are actual changes and when markIsDirty returns true.\n/** @private */ \nexport interface Transaction {\n // Object transaction is being made on.\n object : Transactional\n\n // Send out change events, process update triggers, and close transaction.\n // Nested transactions must be marked with isNested flag (it suppress owner notification).\n commit( initiator? : Transactional )\n}\n\n// Options for distributed transaction \nexport interface TransactionOptions {\n // Invoke parsing \n parse? : boolean\n\n // Optional logger\n logger? : Logger\n\n // Suppress change notifications and update triggers\n silent? : boolean\n\n // Update existing transactional members in place, or skip the update (ignored by models)\n merge? : boolean // =true\n\n // Should collections remove elements in set (ignored by models) \n remove? : boolean // =true\n\n // Always replace enclosed objects with new instances\n reset? : boolean // = false\n\n // Do not dispose aggregated members\n unset? : boolean\n\n validate? : boolean\n\n // IO method name if the transaction is initiated as a result of IO operation\n ioMethod? : 'save' | 'fetch'\n\n // The hint for IOEndpoint\n // If `true`, `record.save()` will behave as \"upsert\" operation for the records having id.\n upsert? : boolean\n\n lazyRelations? : boolean\n}\n\n/**\n * Low-level transactions API. Must be used like this:\n * const isRoot = begin( record );\n * ...\n * isRoot && commit( record, options );\n * \n * When committing nested transaction, the flag must be set to true. \n * commit( object, options, isNested ) \n */\n\nexport const transactionApi = {\n // Start transaction. Return true if it's the root one.\n /** @private */\n begin( object : Transactional ) : boolean {\n return object._transaction ? false : ( object._transaction = true ); \n },\n\n // Mark object having changes inside of the current transaction.\n // Returns true whenever there notifications are required.\n /** @private */\n markAsDirty( object : Transactional, options : TransactionOptions ) : boolean {\n // If silent option is in effect, don't set isDirty flag.\n const dirty = !options.silent;\n if( dirty ) object._isDirty = options;\n \n // Reset version token.\n object._changeToken = {};\n\n // Object is changed, so validation must happen again. Clear the cache.\n object._validationError = void 0;\n\n return dirty;\n },\n\n // Commit transaction. Send out change event and notify owner. Returns true if there were changes.\n // Must be executed for the root transaction only.\n /** @private */\n commit( object : Transactional, initiator? : Transactional ){\n let originalOptions = object._isDirty;\n\n if( originalOptions ){\n // Send the sequence of change events, handling chained handlers.\n while( object._isDirty ){\n const options = object._isDirty;\n object._isDirty = null; \n trigger3( object, object._changeEventName, object, options, initiator );\n }\n \n // Mark transaction as closed.\n object._transaction = false;\n\n // Notify owner on changes out of transaction scope. \n const { _owner } = object; \n if( _owner && _owner !== initiator ){ // If it's the nested transaction, owner is already aware there are some changes.\n _owner._onChildrenChange( object, originalOptions );\n }\n }\n else{\n // No changes. Silently close transaction.\n object._isDirty = null;\n object._transaction = false;\n }\n },\n\n /************************************\n * Ownership management\n */\n\n // Add reference to the record.\n /** @private */\n aquire( owner : Owner, child : Transactional, key? : string ) : void {\n if( child._owner ) throw new ReferenceError( 'Trying to aquire ownership for an object already having an owner' );\n\n child._owner = owner;\n child._ownerKey = key;\n },\n\n // Remove reference to the record.\n /** @private */\n free( owner : Owner, child : Transactional ) : void {\n if( owner === child._owner ){\n child._owner = void 0;\n child._ownerKey = void 0;\n }\n }\n}\n\nfunction getOwnerEndpoint( self : Transactional ) : IOEndpoint {\n // Check if we are the member of the collection...\n const { collection } = self as any;\n if( collection ){\n return getOwnerEndpoint( collection );\n }\n\n // Now, if we're the member of the model...\n if( self._owner ){\n const { _endpoints } = self._owner as any;\n return _endpoints && _endpoints[ self._ownerKey ];\n }\n}\n","import { eventsApi } from '../object-plus';\nimport { Owner, Transaction, Transactional, transactionApi, TransactionOptions } from \"../transactions\";\nconst { begin : _begin, markAsDirty : _markAsDirty, commit } = transactionApi;\n\nconst { trigger3 } = eventsApi;\n\nexport interface ConstructorsMixin {\n Attributes : AttributesConstructor\n AttributesCopy : AttributesCopyConstructor\n}\n\nexport interface ConstructorOptions extends TransactionOptions{\n clone? : boolean\n}\n\nexport type AttributesConstructor = new ( record : AttributesContainer, values : object, options : TransactionOptions ) => AttributesValues;\nexport type AttributesCopyConstructor = new ( values : object ) => AttributesValues;\n\nexport interface AttributesContainer extends Transactional, Owner, ConstructorsMixin {\n // Attribute descriptors.\n /** @internal */\n _attributes : AttributesDescriptors\n\n // Attribute values.\n attributes : AttributesValues\n\n // Previous attribute values.\n /** @internal */\n _previousAttributes : AttributesValues\n\n // Changed attributes cache. \n /** @internal */\n _changedAttributes : AttributesValues\n}\n\nexport interface AttributesValues {\n [ name : string ] : any\n}\n\nexport interface AttributesDescriptors {\n [ name : string ] : AttributeUpdatePipeline\n}\n\nexport interface AttributeUpdatePipeline{\n doUpdate( value, record : AttributesContainer, options : TransactionOptions, nested? : Transaction[] ) : boolean\n}\n\n // Optimized single attribute transactional update. To be called from attributes setters\n // options.silent === false, parse === false. \nexport function setAttribute( record : AttributesContainer, name : string, value : any ) : void {\n // Open the transaction.\n const isRoot = begin( record ),\n options = {};\n\n // Update attribute. \n if( record._attributes[ name ].doUpdate( value, record, options ) ){\n // Notify listeners on changes.\n markAsDirty( record, options );\n trigger3( record, 'change:' + name, record, record.attributes[ name ], options );\n }\n\n // Close the transaction.\n isRoot && commit( record );\n}\n\nfunction begin( record : AttributesContainer ){\n if( _begin( record ) ){\n record._previousAttributes = new record.AttributesCopy( record.attributes );\n record._changedAttributes = null;\n return true;\n }\n \n return false;\n}\n\nfunction markAsDirty( record : AttributesContainer, options : TransactionOptions ){\n // Need to recalculate changed attributes, when we have nested set in change:attr handler\n if( record._changedAttributes ){\n record._changedAttributes = null;\n }\n\n return _markAsDirty( record, options );\n}\n\n/**\n * TODO: There's an opportunity to create an optimized pipeline for primitive types and Date, which makes the majority\n * of attributes. It might create the major speedup.\n * \n * Create the dedicated pipeline for owned and shared attributes as well.\n * \n * Three elements of the pipeline:\n * - from constructor\n * - from assignment\n * - from `set`\n */\n\nexport const UpdateRecordMixin = {\n// Need to override it here, since begin/end transaction brackets are overriden. \n transaction( this : AttributesContainer, fun : ( self : AttributesContainer ) => void, options : TransactionOptions = {} ) : void{\n const isRoot = begin( this );\n fun.call( this, this );\n isRoot && commit( this );\n },\n \n // Handle nested changes. TODO: propagateChanges == false, same in transaction.\n _onChildrenChange( child : Transactional, options : TransactionOptions ) : void {\n const { _ownerKey } = child,\n attribute = this._attributes[ _ownerKey ];\n\n if( !attribute /* TODO: Must be an opposite, likely the bug */ || attribute.propagateChanges ) this.forceAttributeChange( _ownerKey, options );\n },\n\n // Simulate attribute change \n forceAttributeChange( key : string, options : TransactionOptions = {} ){\n // Touch an attribute in bounds of transaction\n const isRoot = begin( this );\n\n if( markAsDirty( this, options ) ){\n trigger3( this, 'change:' + key, this, this.attributes[ key ], options );\n }\n \n isRoot && commit( this );\n },\n\n _createTransaction( this : AttributesContainer, a_values : {}, options : TransactionOptions = {} ) : Transaction {\n const isRoot = begin( this ),\n changes : string[] = [],\n nested : RecordTransaction[]= [],\n { _attributes } = this,\n values = options.parse ? this.parse( a_values, options ) : a_values;\n\n let unknown;\n\n if( shouldBeAnObject( this, values, options ) ){\n for( let name in values ){\n const spec = _attributes[ name ];\n\n if( spec ){\n if( spec.doUpdate( values[ name ], this, options, nested ) ){\n changes.push( name );\n }\n }\n else{\n unknown || ( unknown = [] );\n unknown.push( `'${ name }'` );\n }\n }\n\n if( unknown ){\n unknownAttrsWarning( this, unknown, { values }, options );\n }\n }\n \n if( changes.length && markAsDirty( this, options ) ){\n return new RecordTransaction( this, isRoot, nested, changes );\n }\n \n // No changes, but there might be silent attributes with open transactions.\n for( let pendingTransaction of nested ){\n pendingTransaction.commit( this );\n }\n\n isRoot && commit( this );\n }\n};\n\nexport function unknownAttrsWarning( record : AttributesContainer, unknown : string[], props, options ){\n record._log( 'warn', 'Type-R:UnknownAttrs', `undefined attributes ${ unknown.join(', ')} are ignored.`, props, options.logger );\n}\n\n// One of the main performance tricks of Type-R.\n// Create loop unrolled constructors for internal attribute hash,\n// so the hidden class JIT optimization will be engaged and they will become static structs.\n// It dramatically improves record performance.\nexport function constructorsMixin( attrDefs : AttributesDescriptors ) : ConstructorsMixin {\n const attrs = Object.keys( attrDefs );\n\n const AttributesCopy : AttributesCopyConstructor = new Function( 'values', `\n ${ attrs.map( attr =>`\n this.${ attr } = values.${ attr };\n `).join( '' ) }\n `) as any;\n\n AttributesCopy.prototype = Object.prototype;\n\n const Attributes : AttributesConstructor = new Function( 'record', 'values', 'options', `\n var _attrs = record._attributes;\n\n ${ attrs.map( attr =>`\n this.${ attr } = _attrs.${ attr }.doInit( values.${ attr }, record, options );\n `).join( '' ) }\n `) as any;\n\n Attributes.prototype = Object.prototype;\n\n return { Attributes, AttributesCopy };\n}\n\nexport function shouldBeAnObject( record : AttributesContainer, values : object, options ){\n if( values && values.constructor === Object ) return true;\n\n record._log( 'error', 'Type-R:InvalidObject', 'update with non-object is ignored!', { values }, options.logger );\n return false;\n}\n\n// Transaction class. Implements two-phase transactions on object's tree. \n// Transaction must be created if there are actual changes and when markIsDirty returns true. \nexport class RecordTransaction implements Transaction {\n // open transaction\n constructor( public object : AttributesContainer,\n public isRoot : boolean,\n public nested : Transaction[],\n public changes : string[] ){}\n\n // commit transaction\n commit( initiator? : AttributesContainer ) : void {\n const { nested, object, changes } = this;\n\n // Commit all pending nested transactions...\n for( let transaction of nested ){ \n transaction.commit( object );\n }\n\n // Notify listeners on attribute changes...\n // Transaction is never created when silent option is set, so just send events out.\n const { attributes, _isDirty } = object;\n for( let key of changes ){\n trigger3( object, 'change:' + key, object, attributes[ key ], _isDirty );\n }\n\n this.isRoot && commit( object, initiator );\n }\n}","import { IOEndpoint } from '../../io-tools';\nimport { LogLevel, tools, Logger } from '../../object-plus';\nimport { TransactionOptions } from '../../transactions';\nimport { AttributesContainer, AttributeUpdatePipeline, RecordTransaction, setAttribute } from '../updates';\n\nconst { notEqual, assign} = tools;\n\nexport type Transform = ( this : AnyType, next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) => any;\nexport type ChangeHandler = ( this : AnyType, next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) => void;\n\nexport interface AttributeOptions {\n _metatype? : typeof AnyType\n validate? : ( record : AttributesContainer, value : any, key : string ) => any\n isRequired? : boolean\n changeEvents? : boolean\n\n endpoint? : IOEndpoint\n\n type? : Function\n value? : any\n hasCustomDefault? : boolean\n\n parse? : Parse\n toJSON? : AttributeToJSON\n properties? : Object\n \n getHooks? : GetHook[]\n transforms? : Transform[]\n changeHandlers? : ChangeHandler[]\n\n _onChange? : ChangeAttrHandler\n}\n\nexport type Parse = ( value : any, key : string ) => any;\nexport type GetHook = ( value : any, key : string ) => any;\nexport type AttributeToJSON = ( value : any, key : string ) => any\nexport type AttributeParse = ( value : any, key : string ) => any\nexport type ChangeAttrHandler = ( ( value : any, attr : string ) => void ) | string;\n\n// TODO: interface differs from options, do something obout it\nconst emptyOptions : TransactionOptions = {};\n\n/**\n * Typeless attribute. Is the base class for all other attributes.\n */\nexport class AnyType implements AttributeUpdatePipeline {\n // Factory method to create attribute from options \n static create : ( options : AttributeOptions, name : string ) => AnyType;\n \n /**\n * Update pipeline functions\n * =========================\n *\n * Stage 0. canBeUpdated( value )\n * - presence of this function implies attribute's ability to update in place.\n */\n canBeUpdated( prev, next, options : TransactionOptions ) : any {}\n\n /**\n * Stage 1. Transform stage\n */\n transform( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) : any { return next; }\n\n // convert attribute type to `this.type`.\n convert( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) : any { return next; }\n\n /**\n * Stage 2. Check if attr value is changed\n */\n isChanged( a : any, b : any ) : boolean {\n return notEqual( a, b );\n }\n\n /**\n * Stage 3. Handle attribute change\n */\n handleChange( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) {}\n\n /**\n * End update pipeline definitions.\n */\n\n // create empty object passing backbone options to constructor...\n create() { return void 0; }\n\n // generic clone function for typeless attributes\n // Must be overriden in sublass\n clone( value : any, record : AttributesContainer ) {\n return value;\n }\n\n dispose( record : AttributesContainer, value : any ) : void {\n this.handleChange( void 0, value, record, emptyOptions );\n }\n\n validate( record : AttributesContainer, value : any, key : string ) : any {}\n\n toJSON( value, key, options? : object ) {\n return value && value.toJSON ? value.toJSON( options ) : value;\n }\n\n properties: Object\n\n createPropertyDescriptor() : PropertyDescriptor | void {\n const { name, getHook } = this;\n\n if( name !== 'id' ){\n return {\n // call to optimized set function for single argument.\n set( value ){\n setAttribute( this, name, value );\n },\n\n // attach get hook to the getter function, if it present\n get : (\n getHook ?\n function() {\n return getHook.call( this, this.attributes[ name ], name );\n } :\n function() { return this.attributes[ name ]; }\n ),\n\n configurable : true\n }\n }\n }\n\n value : any\n\n // Used as global default value for the given metatype\n static defaultValue : any;\n\n type : any\n\n initialize( name : string, options : TransactionOptions ){}\n\n options : AttributeOptions\n\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\n const v = value === void 0 ? this.defaultValue() : value,\n x = this.transform( v, void 0, record, options );\n \n this.handleChange( x, void 0, record, options );\n return x;\n }\n\n doUpdate( value, record : AttributesContainer, options : TransactionOptions, nested? : RecordTransaction[] ){\n const { name } = this,\n { attributes } = record,\n prev = attributes[ name ];\n\n const next = this.transform( value, prev, record, options );\n attributes[ name ] = next;\n\n if( this.isChanged( next, prev ) ) {\n // Do the rest of the job after assignment\n this.handleChange( next, prev, record, options );\n return true;\n }\n\n return false;\n }\n\n propagateChanges : boolean\n\n protected _log( level : LogLevel, code : string, text : string, value, record : AttributesContainer, logger : Logger ){\n record._log( level, code, `${record.getClassName()}.${ this.name } ${ text }`, {\n 'New value' : value,\n 'Prev. value' : record.attributes[ this.name ]\n }, logger );\n }\n\n defaultValue(){\n return this.value;\n }\n\n constructor( public name : string, a_options : AttributeOptions ) { \n // Save original options...\n this.options = a_options;\n\n // Clone options.\n const options : AttributeOptions = { getHooks : [], transforms : [], changeHandlers : [], ...a_options };\n options.getHooks = options.getHooks.slice();\n options.transforms = options.transforms.slice();\n options.changeHandlers = options.changeHandlers.slice();\n\n const {\n value, type, parse, toJSON, changeEvents, properties,\n validate, getHooks, transforms, changeHandlers\n } = options;\n\n // Initialize default value...\n this.value = value;\n this.type = type;\n\n // TODO: An opportunity to optimize for attribute subtype.\n if( !options.hasCustomDefault && type ){\n this.defaultValue = this.create;\n }\n else if( tools.isValidJSON( value ) ){ \n // JSON literals must be deep copied.\n this.defaultValue = new Function( `return ${ JSON.stringify( value ) };` ) as any;\n }\n else{\n this.defaultValue = this.defaultValue;\n }\n\n // Changes must be bubbled when they are not disabled for an attribute and transactional object.\n this.propagateChanges = changeEvents !== false;\n\n this.toJSON = toJSON === void 0 ? this.toJSON : toJSON;\n\n this.properties = properties == void 0 ? {} : properties;\n\n this.validate = validate || this.validate;\n \n if( options.isRequired ){\n this.validate = wrapIsRequired( this.validate );\n }\n\n /**\n * Assemble pipelines...\n */\n\n // `convert` is default transform, which is always present...\n transforms.unshift( this.convert );\n\n // Get hook from the attribute will be used first...\n if( this.get ) getHooks.unshift( this.get );\n\n // let subclasses configure the pipeline...\n this.initialize.call( this, options );\n\n // let attribute spec configure the pipeline...\n if( getHooks.length ){\n const getHook = this.getHook = getHooks.reduce( chainGetHooks );\n\n const { validate } = this;\n this.validate = function( record : AttributesContainer, value : any, key : string ){\n return validate.call( this, record, getHook.call( record, value, key ), key );\n }\n }\n \n this.transform = transforms.length ? transforms.reduce( chainTransforms ) : this.transform;\n \n this.handleChange = changeHandlers.length ? changeHandlers.reduce( chainChangeHandlers ) : this.handleChange;\n\n // Attribute-level parse transform are attached as update hooks modifiers...\n const { doInit, doUpdate } = this;\n this.doInit = parse ? function( value, record : AttributesContainer, options : TransactionOptions ){\n return doInit.call( this, options.parse && value !== void 0 ? parse.call( record, value, this.name ) : value, record, options );\n } : doInit;\n\n this.doUpdate = parse ? function( value, record : AttributesContainer, options : TransactionOptions, nested? : RecordTransaction[] ){\n return doUpdate.call( this, options.parse && value !== void 0 ? parse.call( record, value, this.name ) : value, record, options, nested );\n } : doUpdate;\n }\n\n getHook : ( value, key : string ) => any = null\n get : ( value, key : string ) => any\n}\n\n\nfunction chainGetHooks( prevHook : GetHook, nextHook : GetHook ) : GetHook {\n return function( value, name ) {\n return nextHook.call( this, prevHook.call( this, value, name ), name );\n }\n}\n\nfunction chainTransforms( prevTransform : Transform, nextTransform : Transform ) : Transform {\n return function( next, prev, record, options ) {\n return nextTransform.call( this, prevTransform.call( this, next, prev, record, options ), prev, record, options );\n }\n}\n\nfunction chainChangeHandlers( prevHandler : ChangeHandler, nextHandler : ChangeHandler ) : ChangeHandler {\n return function( next, prev, record, options ) {\n prevHandler.call( this, next, prev, record, options );\n nextHandler.call( this, next, prev, record, options );\n }\n}\n\nfunction wrapIsRequired( validate ){\n return function( record : AttributesContainer, value : any, key : string ){\n return value ? validate.call( this, record, value, key ) : 'Required';\n }\n}","/**\n * Built-in JSON types attributes: Object, Array, Number, String, Boolean, and immutable class.\n * \n * Adds type assertions, default validation, and optimized update pipeline.\n */\n\nimport { TransactionOptions } from '../../transactions';\nimport { AnyType } from './any';\nimport { AttributesContainer } from '../updates';\n\n/**\n * Custom class must be immutable class which implements toJSON() method\n * with a constructor taking json.\n */\nexport class ImmutableClassType extends AnyType {\n type : new ( value? : any ) => {}\n\n create(){\n return new this.type();\n }\n\n convert( next : any ) : any {\n return next == null || next instanceof this.type ? next : new this.type( next );\n }\n\n toJSON( value, key? : string, options? : object ){\n return value && value.toJSON ? value.toJSON( options ) : value;\n }\n\n clone( value ) {\n return new this.type( this.toJSON( value ) );\n }\n\n isChanged( a, b ){\n return a !== b;\n }\n}\n\n/**\n * Optimized attribute of primitive type.\n * \n * Primitives has specialized simplified pipeline.\n */\nexport class PrimitiveType extends AnyType {\n type : NumberConstructor | StringConstructor | BooleanConstructor\n\n dispose(){}\n create() { return this.type(); }\n\n toJSON( value ) { return value; }\n\n convert( next ) { return next == null ? next : this.type( next ); }\n\n isChanged( a, b ) { return a !== b; }\n\n clone( value ) { return value; }\n\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\n return this.transform( value === void 0 ? this.value : value, void 0, record, options );\n }\n\n doUpdate( value, record, options, nested ){\n const { name } = this,\n { attributes } = record,\n prev = attributes[ name ];\n \n return prev !== ( attributes[ name ] = this.transform( value, prev, record, options ) );\n }\n\n initialize(){\n if( !this.options.hasCustomDefault ){\n this.value = this.type();\n }\n }\n}\n\n// Number type with special validation algothim.\n/** @private */ \nexport class NumericType extends PrimitiveType {\n type : NumberConstructor\n\n create(){\n return 0;\n }\n\n convert( next, prev?, record?, options? ) {\n const num = next == null ? next : this.type( next );\n\n if( num !== num ){\n this._log( 'error', 'Type-R:InvalidNumber', 'Number attribute is assigned with an invalid number', next, record, options.logger );\n }\n \n return num;\n }\n\n validate( model, value, name ) {\n // Whatever is not symmetrically serializable to JSON, is not valid by default.\n if( value != null && !isFinite( value ) ) {\n return name + ' is not valid number';\n }\n }\n}\n\n/**\n * Compatibility wrapper for Array type.\n * @private\n */ \nexport class ArrayType extends AnyType {\n toJSON( value ) { return value; }\n dispose(){}\n create(){ return []; }\n\n convert( next, prev, record, options ) {\n // Fix incompatible constructor behaviour of Array...\n if( next == null || Array.isArray( next ) ) return next;\n\n this._log( 'error', 'Type-R:InvalidArray', 'Array attribute assigned with non-array value', next, record, options.logger );\n\n return [];\n }\n\n clone( value ){\n return value && value.slice();\n }\n}\n\nexport class ObjectType extends AnyType {\n create(){ return {}; }\n\n convert( next, prev, record, options ) {\n if( next == null || typeof next === 'object' ) return next;\n \n this._log( 'error', 'Type-R:InvalidObject', 'Object attribute is assigned with non-object value', next, record, options.logger );\n return {};\n }\n}\n\nexport function doNothing(){}\n\nexport class FunctionType extends AnyType {\n // Functions are not serialized.\n toJSON( value ) { return void 0; }\n create(){ return doNothing; }\n dispose(){}\n\n convert( next, prev, record, options ) {\n // Fix incompatible constructor behaviour of Function...\n if( next == null || typeof next === 'function' ) return next;\n\n this._log( 'error', 'Type-R:InvalidFunction', 'Function attribute assigned with non-function value', next, record, options.logger );\n\n return doNothing;\n }\n\n // Functions are not cloned.\n clone( value ){ return value; }\n}\n","/**\n * Date attribute type.\n * \n * Implements validation, cross-browser compatibility fixes, variety of Date serialization formats,\n * and optimized update pipeline.\n */\nimport { TransactionOptions } from '../../transactions';\nimport { AnyType } from './any';\nimport { AttributesContainer } from '../updates';\n\n// Date Attribute\n/** @private */\nexport class DateType extends AnyType {\n create(){\n return new Date();\n }\n \n convert( next : any, a, record, options ){\n if( next == null || next instanceof Date ) return next;\n\n const date = new Date( next ),\n timestamp = date.getTime();\n\n if( timestamp !== timestamp ){\n this._log( 'error', 'Type-R:InvalidDate', 'Date attribute assigned with invalid date', next, record, options.logger );\n }\n\n return date;\n }\n\n validate( model, value, name ) {\n if( value != null ){\n const timestamp = value.getTime(); \n if( timestamp !== timestamp ) return name + ' is Invalid Date';\n }\n }\n\n toJSON( value ) { return value && value.toISOString(); }\n\n isChanged( a, b ) { return ( a && a.getTime() ) !== ( b && b.getTime() ); }\n\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\n // Date don't have handleChanges step.\n return this.transform( value === void 0 ? this.defaultValue() : value, void 0, record, options );\n }\n\n doUpdate( value, record, options, nested ){\n const { name } = this,\n { attributes } = record,\n prev = attributes[ name ];\n \n // Date don't have handleChanges step.\n return this.isChanged( prev , attributes[ name ] = this.transform( value, prev, record, options ) );\n }\n\n clone( value ) { return value && new Date( value.getTime() ); }\n dispose(){}\n}\n\n// If ISO date is not supported by date constructor (such as in Safari), polyfill it.\nfunction supportsDate( date ){\n return !isNaN( ( new Date( date ) ).getTime() );\n}\n\nif( !supportsDate('2011-11-29T15:52:30.5') ||\n !supportsDate('2011-11-29T15:52:30.52') ||\n !supportsDate('2011-11-29T15:52:18.867') ||\n !supportsDate('2011-11-29T15:52:18.867Z') ||\n !supportsDate('2011-11-29T15:52:18.867-03:30') ){\n\n DateType.prototype.convert = function( value ){\n return value == null || value instanceof Date ? value : new Date( safeParseDate( value ) );\n }\n}\n\nconst numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ],\n isoDatePattern = /^(\\d{4}|[+\\-]\\d{6})(?:-(\\d{2})(?:-(\\d{2}))?)?(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:(Z)|([+\\-])(\\d{2})(?::(\\d{2}))?)?)?$/;\n\nfunction safeParseDate( date : string ) : number {\n var timestamp, struct : any[], minutesOffset = 0;\n\n if( ( struct = isoDatePattern.exec( date )) ) {\n // avoid NaN timestamps caused by undefined values being passed to Date.UTC\n for( var i = 0, k; ( k = numericKeys[ i ] ); ++i ) {\n struct[ k ] = +struct[ k ] || 0;\n }\n\n // allow undefined days and months\n struct[ 2 ] = (+struct[ 2 ] || 1) - 1;\n struct[ 3 ] = +struct[ 3 ] || 1;\n\n if( struct[ 8 ] !== 'Z' && struct[ 9 ] !== undefined ) {\n minutesOffset = struct[ 10 ] * 60 + struct[ 11 ];\n\n if( struct[ 9 ] === '+' ) {\n minutesOffset = 0 - minutesOffset;\n }\n }\n\n timestamp =\n Date.UTC( struct[ 1 ], struct[ 2 ], struct[ 3 ], struct[ 4 ], struct[ 5 ] + minutesOffset, struct[ 6 ],\n struct[ 7 ] );\n }\n else {\n timestamp = Date.parse( date );\n }\n\n return timestamp;\n}","import { ItemsBehavior, Transactional, transactionApi, TransactionOptions } from '../../transactions';\nimport { ValidationError } from '../../validation';\nimport { AnyType } from './any';\nimport { AttributesContainer, ConstructorOptions } from '../updates';\n\nconst { free, aquire } = transactionApi;\n\nexport class AggregatedType extends AnyType {\n type : typeof Transactional\n\n clone( value : Transactional ) : Transactional {\n return value ? value.clone() : value;\n }\n\n toJSON( x, key : string, options : object ){ return x && x.toJSON( options ); }\n\n doInit( value, record : AttributesContainer, options : ConstructorOptions ){\n const v = options.clone ? this.clone( value ) : (\n value === void 0 ? this.defaultValue() : value\n );\n\n const x = this.transform( v, void 0, record, options );\n this.handleChange( x, void 0, record, options );\n return x;\n }\n\n doUpdate( value, record, options, nested : any[] ){ // Last to things can be wrapped to an object, either transaction or ad-hoc\n const key = this.name, { attributes } = record; \n const prev = attributes[ key ];\n let update;\n\n // This can be moved to transactional attribute. And chained with the rest.\n if( update = this.canBeUpdated( prev, value, options ) ) { // todo - skip empty updates.\n const nestedTransaction = prev._createTransaction( update, options );\n if( nestedTransaction ){\n if( nested ){\n nested.push( nestedTransaction );\n }\n else{\n nestedTransaction.commit( record );\n }\n\n if( this.propagateChanges ) return true;\n }\n\n return false;\n }\n\n const next = this.transform( value, prev, record, options );\n attributes[ key ] = next;\n\n if( this.isChanged( next, prev ) ) { // Primitives and nested comparison can be inlined.\n // Do the rest of the job after assignment\n this.handleChange( next, prev, record, options );\n\n return true;\n }\n\n return false;\n }\n\n canBeUpdated( prev : Transactional, next : any, options : TransactionOptions ) : any {\n // If an object already exists, and new value is of incompatible type, let object handle the update.\n if( prev && next != null ){\n if( next instanceof this.type ){\n // In case if merge option explicitly specified, force merge.\n if( options.merge ) return next.__inner_state__;\n }\n else{\n return next;\n }\n }\n }\n\n convert( next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) : Transactional {\n // Invoke class factory to handle abstract classes\n if( next == null ) return next;\n \n if( next instanceof this.type ){\n if( next._shared && !( next._shared & ItemsBehavior.persistent ) ) { // TODO: think more about shared types assignment compatibility. \n this._log( 'error', 'Type-R:InvalidCollection', 'aggregated collection attribute is assigned with shared collection type', next, record, options.logger );\n }\n\n // With explicit 'merge' option we need to clone an object if its previous value was 'null'.\n // This is an only case we could be here when merge === true.\n if( options.merge ) return next.clone();\n\n if( next._owner ){\n this._log( 'warn', 'Type-R:InvalidOwner', 'object alreay has an owner and was cloned. Use explicit object.clone() to dismiss this warning.', next, record, options.logger );\n return next.clone();\n }\n\n return next;\n }\n\n return ( this.type as any).create( next, options );\n }\n\n dispose ( record : AttributesContainer, value : Transactional ){\n if( value ){\n this.handleChange( void 0, value, record, {} );\n }\n }\n\n validate( record : AttributesContainer, value : Transactional ) : ValidationError {\n var error = value && value.validationError;\n if( error ) return error;\n }\n\n create() : Transactional {\n return (this.type).create(); // this the subclass of Transactional here.\n }\n\n initialize( options ){\n options.changeHandlers.unshift( this._handleChange );\n }\n\n _handleChange( next : Transactional, prev : Transactional, record : AttributesContainer, options : TransactionOptions ){\n if( prev ){\n free( record, prev );\n options.unset || prev.dispose();\n } \n \n if( next ) aquire( record, next, this.name );\n }\n}","import { eventsApi } from '../../object-plus';\nimport { ItemsBehavior, Transactional, transactionApi, TransactionOptions } from '../../transactions';\nimport { AnyType } from './any';\nimport { type } from '../attrDef'\nimport { AttributesContainer, ConstructorOptions } from '../updates';\nimport { ChainableAttributeSpec } from '../attrDef';\n\nconst { on, off } = eventsApi,\n { free, aquire } = transactionApi;\n\n/************************\n * Shared attribute definition.\n * - Not serialized.\n * - Listening to the changes.\n * - Doesn't take ownership when assigned with object of proper type.\n * - Takes ownership on objects which are converted.\n */\n\nconst shareAndListen = ItemsBehavior.listen | ItemsBehavior.share;\n\nfunction getType(attr: any) {\n while (attr && attr.options && attr.options.type) {\n attr = attr.options.type;\n }\n return attr;\n}\n\n/** @private */\nexport class SharedType extends AnyType {\n //type : ChainableAttributeSpec\n type : typeof Transactional | ChainableAttributeSpec\n\n doInit( value, record : AttributesContainer, options : ConstructorOptions ){\n const v = options.clone ? this.clone( value, record ) : (\n value === void 0 ? this.defaultValue() : value\n );\n\n const x = this.transform( v, void 0, record, options );\n this.handleChange( x, void 0, record, options );\n return x;\n }\n\n doUpdate( value, record, options, nested : any[] ){ // Last to things can be wrapped to an object, either transaction or ad-hoc\n const key = this.name, { attributes } = record; \n const prev = attributes[ key ];\n let update;\n\n // This can be moved to transactional attribute. And chained with the rest.\n if( update = this.canBeUpdated( prev, value, options ) ) { // todo - skip empty updates.\n const nestedTransaction = prev._createTransaction( update, options );\n if( nestedTransaction ){\n if( nested ){\n nested.push( nestedTransaction );\n }\n else{\n nestedTransaction.commit( record );\n }\n\n if( this.propagateChanges ) return true;\n }\n\n return false;\n }\n\n const next = this.transform( value, prev, record, options );\n attributes[ key ] = next;\n\n if( this.isChanged( next, prev ) ) { // Primitives and nested comparison can be inlined.\n // Do the rest of the job after assignment\n this.handleChange( next, prev, record, options );\n\n return true;\n }\n\n return false;\n }\n\n clone( value : Transactional, record : AttributesContainer ) : Transactional {\n // References are not cloned.\n if( !value || value._owner !== record ) return value;\n\n // Implicitly created objects are cloned.\n const clone = value.clone();\n aquire( record, clone, this.name );\n return clone;\n }\n\n // Do not serialize by default.\n toJSON(){}\n\n canBeUpdated( prev : Transactional, next : any, options : TransactionOptions ) : any {\n // If an object already exists, and new value is of incompatible type, let object handle the update.\n let type = getType(this);\n if( prev && next != null && !( next instanceof type ) ){\n return next;\n }\n }\n\n convert( next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) : Transactional {\n let type = getType(this);\n if (next == null || next instanceof type || options.lazyRelations) return next;\n\n next = type.create(next, options, shareAndListen);\n \n /*\n if (!next) {\n // Convert type using implicitly created transactional object.\n next = new (type as any)(next, options, shareAndListen);\n\n // To prevent a leak, we need to take an ownership on it.\n aquire(record, next, this.name);\n }\n */\n\n return next;\n }\n\n // Refs are always valid.\n validate( model, value, name ){}\n\n // They are always created as null.\n create() : Transactional {\n return null;\n }\n\n // Listening to the change events\n _handleChange( next : Transactional, prev : Transactional, record : AttributesContainer, options ){\n if( prev ){\n // If there was an implicitly created object, remove an ownership.\n if( prev._owner === record ){\n free( record, prev );\n options.unset || prev.dispose();\n }\n else{\n off( prev, prev._changeEventName, this._onChange, record );\n }\n } \n \n if( next ){\n // No need to take an ownership for an implicit object - already done in convert or clone.\n if( next._owner !== record ){\n on( next, next._changeEventName, this._onChange, record );\n }\n } \n }\n\n dispose( record : AttributesContainer, value : Transactional ){\n if( value ){\n this.handleChange( void 0, value, record, {} );\n }\n }\n\n _onChange : ( child : Transactional, options : TransactionOptions, initiator : Transactional ) => void \n\n initialize( options ){\n // Create change event handler which knows current attribute name. \n const attribute = this;\n this._onChange = this.propagateChanges ? function( child, options, initiator ){\n this === initiator || this.forceAttributeChange( attribute.name, options );\n } : ignore;\n\n options.changeHandlers.unshift( this._handleChange );\n }\n}\n\nfunction ignore(){}","import { PrimitiveType, NumericType, ObjectType, ImmutableClassType, FunctionType, ArrayType } from './basic';\nimport { DateType } from './date';\nimport { AnyType, AttributeOptions } from './any';\n\nexport * from './any';\nexport * from './basic';\nexport * from './date';\nexport * from './owned';\nexport * from './shared';\n\n/**\n * Every record attribute type has the corresponding metatype controlling its behavior.\n * For built-in types, Type-R uses the predefined list to resolve metatype in order to avoid global objects modifications.\n * For user-defined types, static `_metatype` constructor member is used.\n */\n\nconst builtins : Function[] = [ String, Number, Boolean, Date, Object, Array, Function ],\n metatypes = [ PrimitiveType, NumericType, PrimitiveType, DateType, ObjectType, ArrayType, FunctionType ];\n\nexport function getMetatype( Ctor : Function ){\n return ( Ctor as any )._metatype || resolveBuiltins( Ctor );\n}\n\nAnyType.create = ( options : AttributeOptions, name : string ) => {\n const type = options.type,\n AttributeCtor = options._metatype || ( type ? getMetatype( type ): AnyType );\n\n return new AttributeCtor( name, options );\n}\n\nfunction resolveBuiltins( Ctor : Function ){\n const idx = builtins.indexOf( Ctor );\n return idx < 0 ? ImmutableClassType : metatypes[ idx ];\n}","/**\n * Type spec engine. Declare attributes using chainable syntax,\n * and returns object with spec.\n */\nimport { IOEndpoint } from '../io-tools';\nimport { definitionDecorator, EventMap, EventsDefinition, tools } from '../object-plus';\nimport { Transactional } from '../transactions';\nimport { AttributeOptions, Parse, AnyType, getMetatype, SharedType } from './metatypes';\nimport { AttributesContainer } from './updates';\n\nconst { assign } = tools;\n\nexport interface AttributeCheck {\n ( value : any, key : string ) : boolean\n error? : any\n}\n\n// Infer the proper TS type from a Type-R attribute spec.\nexport type Infer =\n A extends ChainableAttributeSpec ? TrueReturnType :\n A extends Function ? TrueReturnType :\n A;\n \n// Extract the proper TS return type for a function or constructor.\ntype TrueReturnType =\n F extends DateConstructor ? Date :\n F extends ( ...args : any[] ) => infer R ? R :\n F extends new ( ...args : any[] ) => infer R ? R :\n void;\n\nexport class ChainableAttributeSpec{\n options : AttributeOptions & { type? : F };\n\n constructor( options : AttributeOptions ) {\n // Shallow copy options, fill it with defaults.\n this.options = { getHooks : [], transforms : [], changeHandlers : []};\n if( options ) assign( this.options, options );\n }\n\n check( check : AttributeCheck, error? : any ) : this {\n function validate( model, value, name ){\n if( !check.call( model, value, name ) ){\n const msg = error || check.error || name + ' is not valid';\n return typeof msg === 'function' ? msg.call( model, name ) : msg;\n }\n }\n\n const prev = this.options.validate;\n\n return this.metadata({\n validate : prev ? (\n function( model, value, name ){\n return prev( model, value, name ) || validate( model, value, name );\n }\n ) : validate\n });\n }\n\n get as() : PropertyDecorator {\n return definitionDecorator( 'attributes', this );\n }\n\n get isRequired() : this {\n return this.required;\n }\n\n get required() : this {\n return this.metadata({ isRequired : true }); \n }\n\n endpoint( endpoint : IOEndpoint ) : this {\n return this.metadata({ endpoint });\n }\n\n watcher( ref : string | ( ( value : any, key : string ) => void ) ) : this {\n return this.metadata({ _onChange : ref });\n }\n\n // Attribute-specific parse transform\n parse( fun : Parse ) : this {\n return this.metadata({ parse : fun });\n }\n\n toJSON( fun ) : this {\n return this.metadata({\n toJSON : typeof fun === 'function' ? fun : ( fun ? ( x, k, o ) => x && x.toJSON( o ) : emptyFunction ) \n });\n }\n\n // Attribute get hook.\n get( fun ) : this {\n return this.metadata({\n getHooks : this.options.getHooks.concat( fun )\n });\n }\n\n // Attribute set hook.\n set( fun ) : this {\n function handleSetHook( next, prev, record : AttributesContainer, options ) {\n if( this.isChanged( next, prev ) ) {\n const changed = fun.call( record, next, this.name );\n return changed === void 0 ? prev : this.convert( changed, prev, record, options );\n }\n\n return prev;\n }\n\n return this.metadata({\n transforms : this.options.transforms.concat( handleSetHook )\n });\n }\n\n changeEvents( events : boolean ) : this {\n return this.metadata({ changeEvents : events });\n }\n\n // Subsribe to events from an attribute.\n events( map : EventsDefinition ) : this {\n const eventMap = new EventMap( map );\n\n function handleEventsSubscribtion( next, prev, record : AttributesContainer ){\n prev && prev.trigger && eventMap.unsubscribe( record, prev );\n\n next && next.trigger && eventMap.subscribe( record, next );\n }\n\n return this.metadata({\n changeHandlers : this.options.changeHandlers.concat( handleEventsSubscribtion )\n });\n }\n\n properties( props : object ) : this {\n return this.metadata({properties: props});\n }\n\n // Creates a copy of the spec.\n get has() : this {\n return this;\n }\n\n metadata( options : object ) : this {\n const cloned = new ChainableAttributeSpec( this.options );\n assign( cloned.options, options );\n return cloned as any;\n }\n\n value( x ) : this {\n return this.metadata({ value : x, hasCustomDefault : true });\n }\n\n static from( spec : any ) : ChainableAttributeSpec {\n // Pass metatype through untouched...\n if( spec && spec instanceof ChainableAttributeSpec ) {\n return spec;\n }\n\n return typeof spec === 'function' ? type( spec ) : value( spec );\n }\n}\n\nfunction emptyFunction(){}\n\nexport function type( this : void, Type : ChainableAttributeSpec | F, value? : any ) : ChainableAttributeSpec {\n if( Type instanceof ChainableAttributeSpec ) return Type;\n\n const attrDef = new ChainableAttributeSpec({ type : Type }),\n defaultValue = Type && value === void 0 ? getMetatype( Type ).defaultValue : value;\n\n return defaultValue === void 0 ? attrDef : attrDef.value( defaultValue );\n}\n\nexport function shared( this : void, Constructor : C ) : ChainableAttributeSpec {\n return new ChainableAttributeSpec({\n value : null,\n type : Constructor,\n _metatype : SharedType\n });\n}\n\n// Create attribute metatype inferring the type from the value.\nexport function value( this : void, x : any ) : ChainableAttributeSpec {\n const Type = inferType( x ),\n // Transactional types inferred from values must have shared type. \n AttrDef = Type && Type.prototype instanceof Transactional ? shared( Type ) :\n type( Type );\n\n return AttrDef.value( x );\n}\n\nfunction inferType( value : any ) : Function {\n switch( typeof value ) {\n case 'number' :\n return Number;\n case 'string' :\n return String;\n case 'boolean' :\n return Boolean;\n case 'function' :\n return Function;\n case 'undefined' :\n return void 0;\n case 'object' :\n return value ? value.constructor : void 0;\n }\n}","import { IOEndpoint } from '../io-tools';\nimport { eventsApi, tools as _ } from '../object-plus';\nimport { CompiledReference } from '../traversable';\nimport { ChainableAttributeSpec } from './attrDef';\nimport { AnyType } from './metatypes';\nimport { ConstructorsMixin, constructorsMixin } from './updates';\n\nexport interface RecordAttributesMixin extends ConstructorsMixin {\n // Attributes descriptors\n _attributes : AttributeDescriptors\n _attributesArray : AnyType[]\n \n // Attribute's property descriptors\n properties : PropertyDescriptorMap\n\n // Event map for record's local events.\n _localEvents? : eventsApi.EventMap,\n\n _endpoints : { [ name : string ] : IOEndpoint }\n}\n\nexport interface AttributeDescriptors {\n [ name : string ] : AnyType\n}\n\n// Create attribute from the type spec.\nexport function createAttribute( spec : any, name : string ) : AnyType {\n return AnyType.create( ChainableAttributeSpec.from( spec ).options, name );\n}\n\n// Create record mixin from the given record's attributes definition\nexport function createAttributesMixin( attributesDefinition : object, baseClassAttributes : AttributeDescriptors ) : RecordAttributesMixin {\n const myAttributes = _.transform( {} as AttributeDescriptors, attributesDefinition, createAttribute ),\n allAttributes = _.defaults( {} as AttributeDescriptors, myAttributes, baseClassAttributes );\n\n const ConstructorsMixin = constructorsMixin( allAttributes );\n\n return {\n ...ConstructorsMixin,\n _attributes : new ConstructorsMixin.AttributesCopy( allAttributes ),\n _attributesArray : Object.keys( allAttributes ).map( key => allAttributes[ key ] ),\n properties : _.transform( {}, myAttributes, x => x.createPropertyDescriptor() ),\n ...localEventsMixin( myAttributes ),\n _endpoints : _.transform( {}, allAttributes, attrDef => attrDef.options.endpoint )\n } \n}\n\ninterface LocalEventsMixin {\n _localEvents? : eventsApi.EventMap\n}\n\nfunction localEventsMixin( attrSpecs : AttributeDescriptors ) : LocalEventsMixin {\n let _localEvents : eventsApi.EventMap;\n\n for( var key in attrSpecs ){\n const attribute = attrSpecs[ key ],\n { _onChange } = attribute.options; \n\n if( _onChange ){\n _localEvents || ( _localEvents = new eventsApi.EventMap() );\n\n _localEvents.addEvent( 'change:' + key,\n typeof _onChange === 'string' ?\n createWatcherFromRef( _onChange, key ) : \n wrapWatcher( _onChange, key ) );\n }\n }\n\n return _localEvents ? { _localEvents } : {};\n}\n\nfunction wrapWatcher( watcher, key ){\n return function( record, value ){\n watcher.call( record, value, key );\n } \n}\n\nfunction createWatcherFromRef( ref : string, key : string ){\n const { local, resolve, tail } = new CompiledReference( ref, true );\n return local ?\n function( record, value ){\n record[ tail ]( value, key );\n } :\n function( record, value ){\n resolve( record )[ tail ]( value, key );\n }\n}","import { IOEndpoint, IONode, IOOptions, IOPromise, startIO } from '../io-tools';\nimport { TransactionOptions } from '../transactions';\n\nexport interface IORecord extends IONode {\n getEndpoint() : IOEndpoint\n save( options? : object ) : IOPromise\n fetch( options? : object ) : IOPromise\n destroy( options? : object ) : IOPromise\n toJSON( options? : object ) : any\n parse( data : any, options? : object ) : any\n isNew() : boolean\n id : string | number\n set( json : object, options : TransactionOptions ) : this\n}\n\nexport const IORecordMixin = {\n save( this : IORecord, options : IOOptions = {} ){\n const endpoint = this.getEndpoint(),\n json = this.toJSON({ ioMethod : 'save', ...options });\n\n return startIO(\n this,\n this.isNew() ?\n endpoint.create( json, options, this ) :\n endpoint.update( this.id, json, options, this ),\n options,\n\n update => {\n this.set( update, {\n parse : true,\n ioMethod : 'save',\n ...options\n } );\n }\n );\n },\n\n fetch( options : IOOptions = {} ){\n return startIO(\n this,\n this.getEndpoint().read( this.id, options, this ),\n options,\n\n json => this.set( json, { parse : true, ioMethod : 'fetch', ...options } )\n );\n },\n\n destroy( options : IOOptions = {} ){ \n return startIO(\n this,\n this.getEndpoint().destroy( this.id, options, this ),\n options,\n\n () => {\n const { collection } = this;\n if( collection ){\n collection.remove( this, options );\n }\n else{\n this.dispose();\n }\n\n return this;\n }\n )\n }\n}","/**\n * Record core implementing transactional updates.\n * The root of all definitions. \n */\n\nimport { CollectionConstructor } from '../collection';\nimport { IOEndpoint, IOPromise } from '../io-tools';\nimport { define, definitions, isProduction, Logger, logger, LogLevel, mixinRules, tools } from '../object-plus';\nimport { CloneOptions, Owner, Transaction, Transactional, TransactionalDefinition, TransactionOptions } from '../transactions';\nimport { ChildrenErrors } from '../validation';\nimport { AggregatedType, AnyType } from './metatypes';\nimport { IORecord, IORecordMixin } from './io-mixin';\nimport { AttributesConstructor, AttributesContainer, AttributesCopyConstructor, AttributesValues, setAttribute, shouldBeAnObject, unknownAttrsWarning, UpdateRecordMixin } from './updates';\nimport { type } from './attrDef';\n\n\nconst { assign, isEmpty } = tools;\n\n/*******************************************************\n * Record core implementation\n */\n\nexport interface ConstructorOptions extends TransactionOptions{\n clone? : boolean\n}\n\n// Client unique id counter\nlet _cidCounter : number = 0;\n\n/***************************************************************\n * Record Definition as accepted by Record.define( definition )\n */\nexport interface RecordDefinition extends TransactionalDefinition {\n idAttribute? : string\n attributes? : AttributesValues\n collection? : object\n Collection? : typeof Transactional\n}\n\n@define({\n // Default client id prefix \n cidPrefix : 'm',\n\n // Name of the change event\n _changeEventName : 'change',\n\n // Default id attribute name\n idAttribute : 'id'\n})\n@definitions({\n defaults : mixinRules.merge,\n attributes : mixinRules.merge,\n collection : mixinRules.merge,\n Collection : mixinRules.value,\n idAttribute : mixinRules.protoValue\n})\nexport class Record extends Transactional implements IORecord, AttributesContainer, Iterable {\n /** @internal */\n static _metatype = AggregatedType;\n\n // Hack\n static onDefine( definition, BaseClass ){}\n\n static Collection : CollectionConstructor;\n static DefaultCollection : CollectionConstructor;\n \n // Attribute type for the record id.\n static id = type( String ).value( null );\n \n // Lazy object reference, serializable as id.\n static get ref(){\n return type( this )\n .toJSON( x => x ? x.id : null )\n .parse( x => {\n return { [ this.prototype.idAttribute ] : x };\n });\n }\n\n static defaults( attrs : AttributesValues ) : typeof Record {\n return this.extend({ attributes : attrs });\n }\n \n static attributes : AttributesValues\n\n /********************\n * IO Methods\n */\n /** @internal */\n _endpoints : { [ name : string ] : IOEndpoint }\n\n /***********************************\n * Core Members\n */\n previousAttributes(){ return new this.AttributesCopy( this._previousAttributes ); } \n\n // Polymorphic accessor for aggregated attribute's canBeUpdated().\n /** @internal */\n get __inner_state__(){ return this.attributes; }\n\n get changed(){\n let changed = this._changedAttributes;\n\n if( !changed ){\n const prev = this._previousAttributes;\n changed = {};\n\n const { attributes } = this;\n\n for( let attr of this._attributesArray ){\n const key = attr.name,\n value = attributes[ key ];\n\n if( attr.isChanged( value, prev[ key ] ) ){\n changed[ key ] = value;\n }\n }\n\n this._changedAttributes = changed;\n }\n\n return changed; \n }\n\n changedAttributes( diff? : {} ) : boolean | {} {\n if( !diff ) return this.hasChanged() ? { ...this.changed } : false;\n\n var val, changed : {} | boolean = false,\n old = this._transaction ? this._previousAttributes : this.attributes,\n attrSpecs = this._attributes;\n\n for( var attr in diff ){\n if( !attrSpecs[ attr ].isChanged( old[ attr ], ( val = diff[ attr ] ) ) ) continue;\n (changed || (changed = {}))[ attr ] = val;\n }\n\n return changed; \n }\n\n hasChanged( key? : string ) : boolean {\n const { _previousAttributes } = this;\n if( !_previousAttributes ) return false;\n\n return key ?\n this._attributes[ key ].isChanged( this.attributes[ key ], _previousAttributes[ key ] ) :\n !isEmpty( this.changed );\n }\n\n previous( key : string ) : any {\n if( key ){\n const { _previousAttributes } = this;\n if( _previousAttributes ) return _previousAttributes[ key ];\n }\n \n return null;\n }\n\n isNew() : boolean {\n return this.id == null;\n }\n\n has( key : string ) : boolean {\n return this[ key ] != void 0;\n }\n\n // Return attribute value, setting an attribute to undefined.\n // TODO: If attribute was aggregated, don't dispose it.\n unset( key : string, options? ) : any {\n const value = this[ key ];\n this.set({ [ key ] : void 0 }, { unset : true, ...options });\n return value;\n }\n\n // Undocumented. Move to NestedTypes?\n clear( options? ) : this {\n const nullify = options && options.nullify;\n\n this.transaction( () =>{\n this.forEach( ( value, key ) => this[ key ] = nullify ? null : void 0 );\n }, options );\n\n return this;\n }\n\n // Returns Record owner skipping collections. TODO: Move out\n getOwner() : Owner {\n const owner : any = this._owner;\n\n // If there are no key, owner must be transactional object, and it's the collection.\n // We don't expect that collection can be the member of collection, so we're skipping just one level up. An optimization.\n return this._ownerKey ? owner : owner && owner._owner;\n }\n\n /***********************************\n * Identity managements\n */\n\n // Id attribute name ('id' by default)\n idAttribute : string;\n\n // Fixed 'id' property pointing to id attribute\n get id() : string { return this.attributes[ this.idAttribute ]; }\n set id( x : string ){ setAttribute( this, this.idAttribute, x ); }\n\n /***********************************\n * Dynamically compiled stuff\n */\n\n // Attributes specifications\n /** @internal */\n _attributes : { [ key : string ] : AnyType }\n\n /** @internal */\n _attributesArray : AnyType[]\n\n // Attributes object copy constructor\n Attributes : AttributesConstructor\n AttributesCopy : AttributesCopyConstructor\n\n // Create record default values, optionally augmenting given values.\n defaults( values = {} ){\n const defaults = {},\n { _attributesArray } = this;\n\n for( let attr of _attributesArray ){\n const key = attr.name,\n value = values[ key ];\n\n defaults[ key ] = value === void 0 ? attr.defaultValue() : value;\n }\n\n return defaults;\n }\n\n /***************************************************\n * Record construction\n */\n // Create record, optionally setting an owner\n constructor( a_values? : any, a_options? : ConstructorOptions ){\n super( _cidCounter++ );\n this.attributes = {};\n \n const options = a_options || {},\n values = ( options.parse ? this.parse( a_values, options ) : a_values ) || {};\n\n isProduction || typeCheck( this, values, options );\n\n this._previousAttributes = this.attributes = new this.Attributes( this, values, options );\n\n this.initialize( a_values, a_options );\n\n if( this._localEvents ) this._localEvents.subscribe( this, this );\n }\n\n // Initialization callback, to be overriden by the subclasses \n initialize( values? : Partial, options? ){}\n\n // Deeply clone record, optionally setting new owner.\n clone( options : CloneOptions = {} ) : this {\n const copy : this = new (this.constructor)( this.attributes, { clone : true } );\n \n if( options.pinStore ) copy._defaultStore = this.getStore();\n\n return copy;\n }\n\n /** @internal */\n _validateNested( errors : ChildrenErrors ) : number {\n var length = 0;\n\n const { attributes } = this;\n\n for( let attribute of this._attributesArray ){\n const { name } = attribute,\n error = attribute.validate( this, attributes[ name ], name );\n\n if( error ){\n errors[ name ] = error;\n length++;\n }\n }\n\n return length;\n }\n\n // Get attribute by key\n get( key : string ) : any {\n return this[ key ];\n }\n\n // Apply bulk in-place object update in scope of ad-hoc transaction \n set( values : any, options? : TransactionOptions ) : this {\n if( values ){ \n const transaction = this._createTransaction( values, options );\n transaction && transaction.commit();\n }\n\n return this;\n }\n\n /**\n * Serialization control\n */\n\n // Default record-level serializer, to be overriden by subclasses \n toJSON( options? : TransactionOptions ) : any {\n const json = {},\n { attributes } = this;\n\n for( let attribute of this._attributesArray ){\n const { name } = attribute,\n value = attributes[ name ];\n\n if( value !== void 0 ){\n // ...serialize it according to its spec.\n const asJson = attribute.toJSON.call( this, value, name, options );\n\n // ...skipping undefined values. Such an attributes are excluded.\n if( asJson !== void 0 ) json[ name ] = asJson; \n }\n }\n\n return json;\n }\n \n // Default record-level parser, to be overriden by the subclasses.\n parse( data, options? : TransactionOptions ){\n return data;\n }\n\n /**\n * Transactional control\n */\n deepSet( name : string, value : any, options? : any ){\n // Operation might involve series of nested object updates, thus it's wrapped in transaction.\n this.transaction( () => {\n const path = name.split( '.' ),\n l = path.length - 1,\n attr = path[ l ];\n\n let model = this;\n\n // Locate the model, traversing the path.\n for( let i = 0; i < l; i++ ){\n const key = path[ i ];\n\n // There might be collections in path, so use `get`.\n let next = model.get ? model.get( key ) : model[ key ];\n\n // Create models, if they are not exist.\n if( !next ){\n const attrSpecs = model._attributes;\n if( attrSpecs ){\n // If current object is model, create default attribute\n var newModel = attrSpecs[ key ].create();\n\n // If created object is model, nullify attributes when requested\n if( options && options.nullify && newModel._attributes ){\n newModel.clear( options );\n }\n\n model[ key ] = next = newModel;\n }\n // Silently fail in other case.\n else return;\n }\n \n model = next;\n }\n\n // Set model attribute.\n if( model.set ){\n model.set({ [ attr ] : value }, options );\n }\n else{\n model[ attr ] = value;\n }\n });\n\n return this;\n }\n \n // Returns owner without the key (usually it's collection)\n get collection() : any {\n return this._ownerKey ? null : this._owner;\n }\n\n // Dispose object and all childrens\n dispose(){\n if( this._disposed ) return;\n\n const { attributes } = this;\n\n for( let attr of this._attributesArray ){\n attr.dispose( this, attributes[ attr.name ] );\n }\n \n super.dispose();\n }\n\n /** @internal */\n _log( level : LogLevel, topic: string, text : string, props : object, a_logger? : Logger ) : void {\n ( a_logger || logger ).trigger( level, topic, this.getClassName() + ' ' + text, {\n ...props,\n 'Record' : this,\n 'Attributes definition' : this._attributes\n });\n }\n\n getClassName() : string {\n return super.getClassName() || 'Record';\n }\n\n /** @internal */\n _createTransaction( values : object, options : TransactionOptions ) : Transaction { return void 0; }\n // Simulate attribute change \n forceAttributeChange : ( key : string, options : TransactionOptions ) => void\n\n /** @internal */\n _onChildrenChange : ( child : Transactional, options : TransactionOptions ) => void\n\n\n /**\n * Map methods\n */\n\n forEach( iteratee : ( value? : any, key? : string ) => void, context? : any ){\n const fun = context !== void 0 ? ( v, k ) => iteratee.call( context, v, k ) : iteratee,\n { attributes } = this;\n\n for( const key in this.attributes ){\n const value = attributes[ key ];\n if( value !== void 0 ) fun( value, key );\n }\n }\n\n mapObject( a_fun : ( value, key ) => any, context? : any ) : object {\n const fun = context === void 0 ? a_fun : a_fun.bind( context );\n return tools.transform( {}, this.attributes, fun );\n }\n\n [ Symbol.iterator ](){\n return new RecordEntriesIterator( this );\n }\n\n entries(){\n return new RecordEntriesIterator( this );\n }\n\n // Get array of attribute keys (Record) or record ids (Collection) \n keys() : string[] {\n const keys : string[] = [];\n\n this.forEach( ( value, key ) => keys.push( key ) );\n\n return keys;\n }\n};\n\nexport interface Record extends IORecord {}\nexport interface Record extends AttributesContainer {}\n\n\nassign( Record.prototype, UpdateRecordMixin, IORecordMixin );\n\n/***********************************************\n * Helper functions\n */\n\nclass BaseRecordAttributes {\n id : string\n\n constructor( record : Record, x : AttributesValues, options : TransactionOptions ) {\n this.id = x.id;\n }\n}\n\nRecord.prototype.Attributes = BaseRecordAttributes;\n\nclass BaseRecordAttributesCopy {\n id : string\n\n constructor( x : AttributesValues ) {\n this.id = x.id;\n }\n}\n\nRecord.prototype.AttributesCopy = BaseRecordAttributesCopy;\n\nconst IdAttribute = AnyType.create({ value : void 0 }, 'id' );\nRecord.prototype._attributes = { id : IdAttribute };\nRecord.prototype._attributesArray = [ IdAttribute ];\n\nfunction typeCheck( record : Record, values : object, options ){\n if( shouldBeAnObject( record, values, options ) ){\n const { _attributes } = record;\n let unknown : string[];\n\n for( let name in values ){\n if( !_attributes[ name ] ){\n unknown || ( unknown = [] );\n unknown.push( `'${ name }'` );\n }\n }\n\n if( unknown ){\n unknownAttrsWarning( record, unknown, { values }, options );\n }\n }\n}\n\nexport class RecordEntriesIterator implements Iterator<[string, any]> {\n private idx = 0;\n \n constructor( private readonly record : Record){}\n\n next() : IteratorResult<[string, any]> {\n const { record } = this,\n metatype = record._attributesArray[ this.idx++ ];\n\n return {\n done : !metatype,\n value : metatype ? [ metatype.name, record[ metatype.name ] ] : void 0\n };\n }\n}","import { CollectionConstructor } from '../collection';\nimport { define, predefine, TheType, tools } from '../object-plus';\nimport { Transactional } from '../transactions';\nimport { Infer, type } from './attrDef';\nimport { createAttributesMixin } from './mixin';\nimport { Record, RecordDefinition } from './record';\n\nexport * from './attrDef';\nexport * from './metatypes';\nexport { Record };\n\nconst { assign, defaults } = tools;\n\nexport type InferAttrs = {\n [K in keyof A]: Infer\n};\n\nexport interface RecordConstructor extends TheType {\n new ( attrs? : Partial, options? : object ) : Record & A\n prototype : Record\n Collection : CollectionConstructor\n}\n\nexport function attributes( attrDefs : D ) : RecordConstructor> {\n @define class DefaultRecord extends Record {\n static attributes = attrDefs;\n }\n\n return DefaultRecord as any;\n}\n\nRecord.onExtend = function( this : typeof Record, BaseClass : typeof Record ){\n Transactional.onExtend.call( this, BaseClass );\n\n // Create the default collection\n const Class = this;\n\n @predefine class DefaultCollection extends BaseClass.Collection {\n static model = Class;\n }\n\n this.DefaultCollection = DefaultCollection;\n\n // If there are no collection defined in statics, use the default collection.\n // It will appear in onDefine's definition, overriding all other settings.\n if( Class.Collection === BaseClass.Collection ){\n this.Collection = DefaultCollection;\n }\n}\n\nRecord.onDefine = function( definition : RecordDefinition, BaseClass : typeof Record ){\n const baseProto : Record = BaseClass.prototype;\n\n // Compile attributes spec, creating definition mixin.\n const { properties, _localEvents, ...dynamicMixin } = createAttributesMixin( this.attributes = getAttributes( definition ), baseProto._attributes );\n assign( this.prototype, dynamicMixin );\n \n definition.properties = defaults( definition.properties || {}, properties );\n definition._localEvents = _localEvents;\n \n Transactional.onDefine.call( this, definition, BaseClass );\n\n // Finalize the definition of the default collection.\n this.DefaultCollection.define( definition.collection || {} );\n\n // assign collection from the definition.\n this.Collection = definition.Collection;\n this.Collection.prototype.model = this;\n\n if( definition.endpoint ) this.Collection.prototype._endpoint = definition.endpoint; \n}\n\nfunction getAttributes({ defaults, attributes, idAttribute } : RecordDefinition ) {\n const definition = attributes || defaults || {};\n \n // If there is an undeclared idAttribute, add its definition as untyped generic attribute.\n if( idAttribute && !( idAttribute in definition ) ){\n definition[ idAttribute ] = void 0;\n }\n\n return definition;\n}\n\ndeclare var Reflect;\n\nexport function auto( value : any ) : PropertyDecorator;\nexport function auto( proto : object, attrName : string ) : void;\nexport function auto( proto, attrName? : string ) : any {\n if( typeof Reflect !== 'undefined' && Reflect.getMetadata ){\n if( attrName ){\n type( Reflect.getMetadata( \"design:type\", proto, attrName ) ).as( proto, attrName );\n }\n else{\n const value = proto;\n return ( proto : object, attrName : string ) : void => {\n type( Reflect.getMetadata( \"design:type\", proto, attrName ) ).value( value ).as( proto, attrName );\n }\n } \n }\n else{\n proto._log( 'error', 'Type-R:MissingImport', 'Add import \"reflect-metadata\"; as the first line of your app.' );\n } \n}","import { eventsApi, Logger } from '../object-plus';\nimport { Record } from '../record';\nimport { ItemsBehavior, Owner, Transaction, Transactional, transactionApi, TransactionOptions } from '../transactions';\n\n\nconst { trigger2, trigger3, on, off } = eventsApi,\n { commit } = transactionApi,\n _aquire = transactionApi.aquire, _free = transactionApi.free;\n\n/** @private */\nexport interface CollectionCore extends Transactional, Owner {\n /** @internal */\n _byId : IdIndex\n\n models : Record[]\n model : typeof Record\n idAttribute : string // TODO: Refactor inconsistent idAttribute usage\n \n /** @internal */\n _comparator : Comparator\n \n get( objOrId : string | Record | Object ) : Record \n \n /** @internal */\n _itemEvents? : eventsApi.EventMap\n /** @internal */\n _shared : number\n /** @internal */\n _aggregationError : Record[]\n /** @internal */\n _log( level : string, topic : string, text : string, value : any, logger : Logger ) : void\n}\n\n// Collection's manipulation methods elements\nexport type Elements = ( Object | Record )[];\n\nexport interface CollectionOptions extends TransactionOptions {\n sort? : boolean\n}\n\nexport type Comparator = ( a : Record, b : Record ) => number; \n\n/** @private */\nexport function dispose( collection : CollectionCore ) : Record[]{\n const { models } = collection;\n\n collection.models = [];\n collection._byId = {};\n\n freeAll( collection, models );\n return models;\n}\n\n/** @private */\nexport function convertAndAquire( collection : CollectionCore, attrs : {} | Record, options : CollectionOptions ){\n const { model } = collection;\n \n let record : Record;\n\n if( collection._shared ){\n record = attrs instanceof model ? attrs : model.create( attrs, options );\n\n if( collection._shared & ItemsBehavior.listen ){\n on( record, record._changeEventName, collection._onChildrenChange, collection );\n }\n }\n else{\n record = attrs instanceof model ? ( options.merge ? attrs.clone() : attrs ) : model.create( attrs, options );\n\n if( record._owner ){\n if( record._owner !== collection ){\n _aquire( collection, record.clone() );\n const errors = collection._aggregationError || ( collection._aggregationError = [] );\n errors.push( record );\n }\n }\n else{\n _aquire( collection, record ); \n }\n } \n\n // Subscribe for events...\n const { _itemEvents } = collection;\n _itemEvents && _itemEvents.subscribe( collection, record );\n\n return record;\n}\n\n/** @private */\nexport function free( owner : CollectionCore, child : Record, unset? : boolean ) : void {\n if( owner._shared ){\n if( owner._shared & ItemsBehavior.listen ){\n off( child, child._changeEventName, owner._onChildrenChange, owner );\n }\n }\n else{\n _free( owner, child );\n unset || child.dispose();\n }\n\n const { _itemEvents } = owner;\n _itemEvents && _itemEvents.unsubscribe( owner, child );\n}\n\n/** @private */\nexport function freeAll( collection : CollectionCore, children : Record[] ) : Record[] {\n for( let child of children ){\n free( collection, child );\n }\n\n return children;\n}\n\n/**\n * Silently sort collection, if its required. Returns true if sort happened.\n * @private\n */ \nexport function sortElements( collection : CollectionCore, options : CollectionOptions ) : boolean {\n let { _comparator } = collection;\n if( _comparator && options.sort !== false ){\n collection.models.sort( _comparator );\n return true;\n }\n\n return false;\n}\n\n/**********************************\n * Collection Index\n * @private \n */\nexport interface IdIndex {\n [ id : string ] : Record\n}\n\n/** @private Add record */ \nexport function addIndex( index : IdIndex, model : Record ) : void {\n index[ model.cid ] = model;\n var id = model.id;\n \n if( id || ( id as any ) === 0 ){\n index[ id ] = model;\n }\n}\n\n/** @private Remove record */ \nexport function removeIndex( index : IdIndex, model : Record ) : void {\n delete index[ model.cid ];\n var id = model.id;\n if( id || ( id as any ) === 0 ){\n delete index[ id ];\n }\n}\n\nexport function updateIndex( index : IdIndex, model : Record ){\n delete index[ model.previous( model.idAttribute ) ];\n\n const { id } = model;\n id == null || ( index[ id ] = model );\n}\n\n/***\n * In Collections, transactions appears only when\n * add remove or change events might be emitted.\n * reset doesn't require transaction.\n * \n * Transaction holds information regarding events, and knows how to emit them.\n * \n * Two major optimization cases.\n * 1) Population of an empty collection\n * 2) Update of the collection (no or little changes) - it's crucial to reject empty transactions.\n */\n\n\n// Transaction class. Implements two-phase transactions on object's tree.\n/** @private */ \nexport class CollectionTransaction implements Transaction {\n // open transaction\n constructor( public object : CollectionCore,\n public isRoot : boolean,\n public added : Record[],\n public removed : Record[],\n public nested : Transaction[],\n public sorted : boolean ){}\n\n // commit transaction\n commit( initiator? : Transactional ){\n const { nested, object } = this,\n { _isDirty } = object;\n\n // Commit all nested transactions...\n for( let transaction of nested ){\n transaction.commit( object );\n }\n\n if( object._aggregationError ){\n logAggregationError( object, _isDirty );\n }\n\n // Just trigger 'change' on collection, it must be already triggered for models during nested commits.\n // ??? TODO: do it in nested transactions loop? This way appears to be more correct. \n for( let transaction of nested ){\n trigger2( object, 'change', transaction.object, _isDirty );\n }\n\n // Notify listeners on attribute changes...\n const { added, removed } = this;\n\n // Trigger `add` events for both model and collection.\n for( let record of added ){\n trigger3( record, 'add', record, object, _isDirty );\n trigger3( object, 'add', record, object, _isDirty );\n }\n\n // Trigger `remove` events for both model and collection.\n for( let record of removed ){\n trigger3( record, 'remove', record, object, _isDirty );\n trigger3( object, 'remove', record, object, _isDirty );\n }\n\n if( this.sorted ){\n trigger2( object, 'sort', object, _isDirty );\n }\n\n if( added.length || removed.length ){\n trigger2( object, 'update', object, _isDirty );\n }\n\n this.isRoot && commit( object, initiator );\n }\n}\n\nexport function logAggregationError( collection : CollectionCore, options : TransactionOptions ){\n collection._log( 'warn', 'Type-R:InvalidOwner', 'added records already have an owner and were cloned. Use explicit record.clone() to dismiss this warning.', collection._aggregationError, options.logger );\n collection._aggregationError = void 0;\n}","import { Record } from '../record';\nimport { Transaction, transactionApi } from '../transactions';\nimport { addIndex, CollectionCore, CollectionOptions, CollectionTransaction, convertAndAquire, logAggregationError, sortElements, updateIndex } from './commons';\n\nconst { begin, commit, markAsDirty } = transactionApi;\n\nexport interface AddOptions extends CollectionOptions {\n at? : number \n}\n\n/** @private */\nexport function addTransaction( collection : CollectionCore, items : any[], options : AddOptions, merge? : boolean ){\n const isRoot = begin( collection ),\n nested : Transaction[]= [];\n\n var added = appendElements( collection, items, nested, options, merge );\n\n if( added.length || nested.length ){\n let needSort = sortOrMoveElements( collection, added, options );\n if( markAsDirty( collection, options ) ){\n return new CollectionTransaction( collection, isRoot, added, [], nested, needSort );\n }\n\n if( collection._aggregationError ) logAggregationError( collection, options );\n }\n\n // No changes...\n isRoot && commit( collection );\n};\n\n// Handle sort or insert at options for add operation. Reurns true if sort happened.\n/** @private */ \nfunction sortOrMoveElements( collection : CollectionCore, added : Record[], options : AddOptions ) : boolean {\n let at = options.at;\n\n // if `at` option is given, it overrides sorting option...\n if( at != null ){\n // Take an original collection's length. \n const length = collection.models.length - added.length;\n\n // Crazy Backbone rules about `at` index. I don't know what that guys smoke.\n at = Number( at );\n if( at < 0 ) at += length + 1;\n if( at < 0 ) at = 0;\n if( at > length ) at = length;\n\n // Move added elements to desired position. In place.\n moveElements( collection.models, at, added );\n return false;\n }\n\n return sortElements( collection, options );\n}\n\n/** @private */\nfunction moveElements( source : any[], at : number, added : any[] ) : void {\n for( var j = source.length - 1, i = j - added.length; i >= at; i--, j-- ){\n source[ j ] = source[ i ];\n }\n\n for( i = 0, j = at; i < added.length; i++, j++ ){\n source[ j ] = added[ i ];\n }\n}\n\n// append data to model and index\n/** @private */\nfunction appendElements( collection : CollectionCore, a_items : any[], nested : Transaction[], a_options : AddOptions, forceMerge : boolean ){\n var { _byId, models } = collection,\n merge = ( forceMerge || a_options.merge ) && !collection._shared,\n parse = a_options.parse,\n idAttribute = collection.model.prototype.idAttribute,\n prevLength = models.length;\n\n for( const item of a_items ){\n let model = item ? _byId[ item[ idAttribute ] ] || _byId[ item.cid ] : null;\n\n if( model ){\n if( merge && item !== model ){\n var attrs = item.attributes || item;\n const transaction = model._createTransaction( attrs, a_options );\n transaction && nested.push( transaction );\n\n if( model.hasChanged( idAttribute ) ){\n updateIndex( _byId, model );\n }\n }\n }\n else{\n model = convertAndAquire( collection, item, a_options );\n models.push( model );\n addIndex( _byId, model );\n }\n }\n\n return models.slice( prevLength );\n}\n","/*************\n * Remove items from collections.\n * \n * Cannot be a part of two-phase transaction on object tree.\n * Can be executed in the scope of ad-hoc transaction or from the trigger, though.\n *\n * Implemented with low-level API. \n * Most frequent operation - single element remove. Thus, it have the fast-path.\n */\n\nimport { eventsApi } from '../object-plus';\nimport { Record } from '../record';\nimport { transactionApi, TransactionOptions } from '../transactions';\nimport { CollectionCore, CollectionTransaction, free, removeIndex } from './commons';\n\nconst { trigger2, trigger3 } = eventsApi,\n { markAsDirty, begin, commit } = transactionApi;\n\n/** @private */\nexport function removeOne( collection : CollectionCore, el : Record | {} | string, options : TransactionOptions ) : Record {\n var model : Record = collection.get( el );\n\n if( model ){\n const isRoot = begin( collection ),\n models = collection.models;\n\n // Remove model form the collection. \n models.splice( models.indexOf( model ), 1 );\n removeIndex( collection._byId, model );\n \n // Mark transaction as dirty. \n const notify = markAsDirty( collection, options );\n\n // Send out events.\n if( notify ){\n trigger3( model, 'remove', model, collection, options );\n trigger3( collection, 'remove', model, collection, options );\n } \n\n free( collection, model, options.unset );\n\n notify && trigger2( collection, 'update', collection, options );\n\n // Commit transaction.\n isRoot && commit( collection );\n\n return model;\n }\n};\n\n/** Optimized for removing many elements\n * 1. Remove elements from the index, checking for duplicates\n * 2. Create new models array matching index\n * 3. Send notifications and remove references\n */\n\n/** @private */\nexport function removeMany( collection : CollectionCore, toRemove : any[], options ){\n const removed = _removeFromIndex( collection, toRemove, options.unset );\n if( removed.length ){\n const isRoot = begin( collection );\n\n _reallocate( collection, removed.length );\n\n if( markAsDirty( collection, options ) ){\n const transaction = new CollectionTransaction( collection, isRoot, [], removed, [], false );\n transaction.commit();\n }\n else{\n // Commit transaction.\n isRoot && commit( collection );\n }\n }\n\n return removed;\n};\n\n// remove models from the index...\n/** @private */\nfunction _removeFromIndex( collection, toRemove, unset : boolean ){\n var removed = Array( toRemove.length ),\n _byId = collection._byId;\n\n for( var i = 0, j = 0; i < toRemove.length; i++ ){\n var model = collection.get( toRemove[ i ] );\n if( model ){\n removed[ j++ ] = model;\n removeIndex( _byId, model );\n free( collection, model, unset );\n }\n }\n\n removed.length = j;\n\n return removed;\n}\n\n// Allocate new models array removing models not present in the index.\n/** @private */\nfunction _reallocate( collection, removed ){\n var prev = collection.models,\n models = collection.models = Array( prev.length - removed ),\n _byId = collection._byId;\n\n for( var i = 0, j = 0; i < prev.length; i++ ){\n var model = prev[ i ];\n\n if( _byId[ model.cid ] ){\n models[ j++ ] = model;\n }\n }\n\n models.length = j;\n}","import { Record } from '../record';\nimport { Transaction, transactionApi } from '../transactions';\nimport { addIndex, CollectionCore, CollectionOptions, CollectionTransaction, convertAndAquire, Elements, free, freeAll, IdIndex, logAggregationError, sortElements } from './commons';\n\nconst { begin, commit, markAsDirty } = transactionApi;\n\n/** @private */\nconst silentOptions = { silent : true };\n\n/** @private */\nexport function emptySetTransaction( collection : CollectionCore, items : Elements, options : CollectionOptions, silent? : boolean ){\n const isRoot = begin( collection );\n\n const added = _reallocateEmpty( collection, items, options );\n\n if( added.length ){\n const needSort = sortElements( collection, options );\n\n if( markAsDirty( collection, silent ? silentOptions : options ) ){\n // 'added' is the reference to this.models. Need to copy it.\n return new CollectionTransaction( collection, isRoot, added.slice(), [], [], needSort );\n }\n\n if( collection._aggregationError ) logAggregationError( collection, options );\n }\n\n // No changes...\n isRoot && commit( collection );\n};\n\n/** @private */\nexport function setTransaction( collection, items, options ){\n const isRoot = begin( collection ),\n nested = [];\n\n var previous = collection.models,\n added = _reallocate( collection, items, nested, options );\n\n const reusedCount = collection.models.length - added.length,\n removed = reusedCount < previous.length ? (\n reusedCount ? _garbageCollect( collection, previous ) :\n freeAll( collection, previous )\n ) : []; \n \n const addedOrChanged = nested.length || added.length,\n // As we are reallocating models array, it needs to be sorted even if there are no changes.\n sorted = ( sortElements( collection, options ) && addedOrChanged ) || added.length || options.sorted;\n\n if( addedOrChanged || removed.length || sorted ){\n if( markAsDirty( collection, options ) ){ \n return new CollectionTransaction( collection, isRoot, added, removed, nested, sorted );\n }\n\n if( collection._aggregationError ) logAggregationError( collection, options );\n }\n\n isRoot && commit( collection );\n};\n\n// Remove references to all previous elements, which are not present in collection.\n// Returns an array with removed elements.\n/** @private */\nfunction _garbageCollect( collection : CollectionCore, previous : Record[] ) : Record[]{\n const { _byId } = collection,\n removed = [];\n\n // Filter out removed models and remove them from the index...\n for( let record of previous ){\n if( !_byId[ record.cid ] ){\n removed.push( record );\n free( collection, record );\n }\n }\n\n return removed;\n}\n\n// reallocate model and index\n/** @private */\nfunction _reallocate( collection : CollectionCore, source : any[], nested : Transaction[], options ){\n var models = Array( source.length ),\n _byId : IdIndex = {},\n merge = ( options.merge == null ? true : options.merge ) && !collection._shared,\n _prevById = collection._byId,\n prevModels = collection.models, \n idAttribute = collection.model.prototype.idAttribute,\n toAdd = [],\n orderKept = true;\n\n // for each item in source set...\n for( var i = 0, j = 0; i < source.length; i++ ){\n var item = source[ i ],\n model : Record = null;\n\n if( item ){\n var id = item[ idAttribute ],\n cid = item.cid;\n\n if( _byId[ id ] || _byId[ cid ] ) continue;\n\n model = _prevById[ id ] || _prevById[ cid ];\n }\n\n if( model ){\n if( merge && item !== model ){\n if( orderKept && prevModels[ j ] !== model ) orderKept = false;\n\n var attrs = item.attributes || item;\n const transaction = model._createTransaction( attrs, options );\n transaction && nested.push( transaction );\n }\n }\n else{\n model = convertAndAquire( collection, item, options );\n toAdd.push( model );\n }\n\n models[ j++ ] = model;\n addIndex( _byId, model );\n }\n\n models.length = j;\n collection.models = models;\n collection._byId = _byId;\n\n if( !orderKept ) options.sorted = true;\n\n return toAdd;\n}\n\n/** @private */\nfunction _reallocateEmpty( self, source, options ){\n var len = source ? source.length : 0,\n models = Array( len ),\n _byId : IdIndex = {},\n idAttribute = self.model.prototype.idAttribute;\n\n for( var i = 0, j = 0; i < len; i++ ){\n var src = source[ i ];\n\n if( src && ( _byId[ src[ idAttribute ] ] || _byId[ src.cid ] ) ){\n continue;\n }\n\n var model = convertAndAquire( self, src, options );\n models[ j++ ] = model;\n addIndex( _byId, model );\n }\n\n models.length = j;\n self._byId = _byId;\n\n return self.models = models;\n}","import { Record } from '../record'\n\nexport type Predicate = ( ( val : R, key? : number ) => boolean ) | Partial;\n\n/**\n * Optimized array methods.\n */\nexport abstract class ArrayMixin {\n models : R[]\n abstract get( modelOrId : string | Partial ) : R;\n\n /**\n * Map and optionally filter the collection.\n * @param mapFilter filter an element out if `undefined` is returned \n * @param context optional `this` for `mapFilter`\n */\n map( mapFilter : ( val : R, key? : number ) => T, context? : any ) : T[]{\n const { models } = this,\n { length } = models,\n res = Array( length ),\n fun = context ? mapFilter.bind( context ) : mapFilter;\n\n for( var i = 0, j = 0; i < length; i++ ){\n const val = fun( models[ i ], i );\n val === void 0 || ( res[ j++ ] = val );\n }\n\n if( i !== j ){\n res.length = j;\n }\n\n return res;\n }\n\n /**\n * Iterate through the collection.\n * @param context optional `this` for `iteratee`.\n */\n each( fun : ( val : R, key? : number ) => any, context? : any ) : void {\n const { models } = this,\n { length } = models,\n iteratee = context ? fun.bind( context ) : fun;\n\n for( let i = 0; i < length; i++ ){\n iteratee( models[ i ], i );\n }\n }\n\n /**\n * Iterate through collection optionally returning the value.\n * @param doWhile break the loop if anything but `undefined` is returned, and return this value.\n * @param context optional `this` for `doWhile`.\n */\n firstMatch( doWhile : ( val : R, key? : number ) => T ) : T\n firstMatch( doWhile : ( this : C, val : R, key? : number ) => T, context : C ) : T\n firstMatch( doWhile : ( val : R, key? : number ) => T, context? : any ) : T {\n const { models } = this,\n { length } = models,\n iteratee = context ? doWhile.bind( context ) : doWhile;\n\n for( let i = 0; i < length; i++ ){\n const res = iteratee( models[ i ], i );\n if( res !== void 0 ) return res;\n }\n }\n\n /**\n * Proxy for the `array.reduce()`\n * @param iteratee \n */\n reduce( iteratee : (previousValue: R, currentValue: R, currentIndex?: number ) => R ) : R\n reduce( iteratee : (previousValue: T, currentValue: R, currentIndex?: number ) => T, init? : any ) : T\n reduce( iteratee : (previousValue: any, currentValue: any, currentIndex?: number ) => any, init? : any ) : T | R {\n return init === void 0 ? this.models.reduce( iteratee ) : this.models.reduce( iteratee, init );\n }\n\n // Slice out a sub-array of models from the collection.\n slice( begin? : number, end? : number ) : R[] {\n return this.models.slice( begin, end );\n }\n \n indexOf( modelOrId : string | Partial ) : number {\n return this.models.indexOf( this.get( modelOrId ) );\n }\n\n includes( idOrObj : string | Partial ) : boolean {\n return Boolean( this.get( idOrObj ) );\n }\n\n filter( iteratee : Predicate, context? : any ) : R[] {\n const fun = toPredicateFunction( iteratee );\n return this.map( m => fun( m ) ? m : void 0, context );\n }\n\n find( iteratee : Predicate, context? : any ) : R {\n const fun = toPredicateFunction( iteratee );\n return this.firstMatch( m => fun( m ) ? m : void 0, context );\n }\n\n some( iteratee : Predicate, context? : any ) : boolean {\n return Boolean( this.find( iteratee, context ) );\n }\n\n forEach( iteratee : ( val : R, key? : number ) => void, context? : any ) : void {\n this.each( iteratee, context );\n }\n\n values() : IterableIterator {\n return this.models.values();\n }\n\n entries() : IterableIterator<[ number, R ]>{\n return this.models.entries();\n }\n\n every( iteratee : Predicate, context? : any ) : boolean {\n const fun = toPredicateFunction( iteratee );\n return this.firstMatch( m => fun( m ) ? void 0 : false, context ) === void 0;\n }\n\n pluck( key : K ) : R[K][] {\n return this.map( model => model[ key ] );\n }\n\n first() : R { return this.models[ 0 ]; }\n\n last() : R { return this.models[ this.models.length - 1 ]; }\n\n at( a_index : number ) : R {\n const index = a_index < 0 ? a_index + this.models.length : a_index; \n return this.models[ index ];\n }\n}\n\nconst noOp = x => x;\n\nfunction toPredicateFunction( iteratee : Predicate ){\n if( iteratee == null ) return noOp;\n\n switch( typeof iteratee ){\n case 'function' : return iteratee;\n case 'object' :\n const keys = Object.keys( iteratee );\n \n return x => {\n for( let key of keys ){\n if( iteratee[ key ] !== x[ key ] )\n return false;\n }\n\n return true;\n }\n default : throw new Error( 'Invalid iteratee' );\n }\n}","import { IOPromise, startIO } from '../io-tools';\nimport { define, definitions, EventMap, eventsApi, EventsDefinition, Logger, logger, LogLevel, Mixable, mixinRules, TheType, tools, mixins } from '../object-plus';\nimport { AggregatedType, Record, SharedType } from '../record';\nimport { CloneOptions, ItemsBehavior, Transactional, TransactionalDefinition, transactionApi, TransactionOptions } from '../transactions';\nimport { AddOptions, addTransaction } from './add';\nimport { CollectionCore, CollectionTransaction, Elements, free, sortElements, updateIndex } from './commons';\nimport { removeMany, removeOne } from './remove';\nimport { emptySetTransaction, setTransaction } from './set';\n\n\nconst { trigger2 } = eventsApi,\n { begin, commit, markAsDirty } = transactionApi;\n\nlet _count = 0;\n\nexport type GenericComparator = string | ( ( x : Record ) => number ) | ( ( a : Record, b : Record ) => number ); \n\nexport interface CollectionOptions extends TransactionOptions {\n comparator? : GenericComparator\n model? : typeof Record\n}\n\nexport interface CollectionDefinition extends TransactionalDefinition {\n model? : typeof Record,\n itemEvents? : EventsDefinition\n _itemEvents? : EventMap\n}\n\nclass CollectionRefsType extends SharedType {\n static defaultValue = [];\n}\n\nexport interface CollectionConstructor extends TheType {\n new ( records? : ElementsArg, options?: CollectionOptions ) : Collection\n prototype : Collection\n Refs : CollectionConstructor\n};\n\n@define({\n // Default client id prefix \n cidPrefix : 'c',\n model : Record,\n _changeEventName : 'changes',\n _aggregationError : null\n})\n@mixins( ArrayMixin )\n@definitions({\n comparator : mixinRules.value,\n model : mixinRules.protoValue,\n itemEvents : mixinRules.merge\n})\nexport class Collection< R extends Record = Record> extends Transactional implements CollectionCore, Iterable {\n /** @internal */\n _shared : number\n /** @internal */\n _aggregationError : R[]\n\n static Subset : typeof Collection\n static Refs : CollectionConstructor\n\n /** @internal */\n static _SubsetOf : typeof Collection\n \n createSubset( models : ElementsArg, options? : CollectionOptions) : Collection{\n throw new ReferenceError( 'Failed dependency injection' )\n }\n\n static onExtend( BaseClass : typeof Transactional ){\n // Cached subset collection must not be inherited.\n const Ctor = this;\n this._SubsetOf = null;\n\n function RefsCollection( a, b, listen? ){\n Ctor.call( this, a, b, ItemsBehavior.share | ( listen ? ItemsBehavior.listen : 0 ) );\n }\n\n Mixable.mixins.populate( RefsCollection );\n \n RefsCollection.prototype = this.prototype;\n RefsCollection._metatype = CollectionRefsType;\n\n this.Refs = this.Subset = RefsCollection;\n\n Transactional.onExtend.call( this, BaseClass );\n }\n \n static onDefine( definition : CollectionDefinition, BaseClass : any ){\n if( definition.itemEvents ){\n const eventsMap = new EventMap( BaseClass.prototype._itemEvents );\n eventsMap.addEventsMap( definition.itemEvents );\n this.prototype._itemEvents = eventsMap;\n }\n\n if( definition.comparator !== void 0 ) this.prototype.comparator = definition.comparator;\n\n Transactional.onDefine.call( this, definition );\n }\n \n /** @internal */\n _itemEvents : EventMap\n\n /***********************************\n * Core Members\n */\n // Array of the records\n models : R[]\n\n // Polymorphic accessor for aggregated attribute's canBeUpdated().\n /** @internal */\n get __inner_state__(){ return this.models; }\n\n // Index by id and cid\n /** @internal */\n _byId : { [ id : string ] : R }\n\n set comparator( x : GenericComparator ){\n\n switch( typeof x ){\n case 'string' :\n this._comparator = ( a, b ) => {\n const aa = a[ x ], bb = b[ x ];\n if( aa === bb ) return 0;\n return aa < bb ? -1 : + 1;\n } \n break;\n case 'function' :\n if( x.length === 1 ){\n this._comparator = ( a, b ) => {\n const aa = (x).call( this, a ), bb = (x).call( this, b );\n if( aa === bb ) return 0;\n return aa < bb ? -1 : + 1;\n }\n }\n else{\n this._comparator = ( a, b ) => (x).call( this, a, b );\n }\n break;\n \n default :\n this._comparator = null;\n }\n }\n \n // TODO: Improve typing\n getStore() : Transactional {\n return this._store || ( this._store = this._owner ? this._owner.getStore() : this._defaultStore );\n }\n\n /** @internal */\n _store : Transactional\n\n get comparator(){ return this._comparator; }\n\n /** @internal */\n _comparator : ( a : R, b : R ) => number\n\n /** @internal */\n _onChildrenChange( record : R, options : TransactionOptions = {}, initiator? : Transactional ){\n // Ignore updates from nested transactions.\n if( initiator === this ) return;\n\n const { idAttribute } = this;\n\n if( record.hasChanged( idAttribute ) ){\n updateIndex( this._byId, record );\n }\n\n const isRoot = begin( this );\n\n if( markAsDirty( this, options ) ){\n // Forward change event from the record.\n trigger2( this, 'change', record, options )\n }\n\n isRoot && commit( this );\n }\n\n get( objOrId : string | { id? : string, cid? : string } ) : R {\n if( objOrId == null ) return;\n\n if( typeof objOrId === 'object' ){\n const id = objOrId[ this.idAttribute ];\n return ( id !== void 0 && this._byId[ id ] ) || this._byId[ objOrId.cid ];\n }\n else{\n return this._byId[ objOrId ];\n } \n }\n\n [ Symbol.iterator ]() : IterableIterator {\n return this.models[ Symbol.iterator ]();\n }\n\n // Loop through the members in the scope of transaction.\n // Transactional version of each()\n updateEach( iteratee : ( val : R, key? : number ) => void ){\n const isRoot = transactionApi.begin( this );\n this.each( iteratee );\n isRoot && transactionApi.commit( this );\n }\n\n /** @internal */\n _validateNested( errors : {} ) : number {\n // Don't validate if not aggregated.\n if( this._shared ) return 0;\n\n let count = 0;\n\n this.each( record => {\n const error = record.validationError;\n if( error ){\n errors[ record.cid ] = error;\n count++;\n }\n });\n\n return count;\n }\n\n model : typeof Record\n\n // idAttribute extracted from the model type.\n idAttribute : string\n\n constructor( records? : ElementsArg, options : CollectionOptions = {}, shared? : number ){\n super( _count++ );\n this.models = [];\n this._byId = {};\n \n this.comparator = this.comparator;\n\n if( options.comparator !== void 0 ){\n this.comparator = options.comparator;\n options.comparator = void 0;\n }\n \n this.model = this.model;\n \n if( options.model ){\n this.model = options.model;\n options.model = void 0;\n }\n\n this.idAttribute = this.model.prototype.idAttribute; //TODO: Remove?\n\n this._shared = shared || 0;\n\n if( records ){\n const elements = toElements( this, records, options );\n emptySetTransaction( this, elements, options, true );\n }\n\n this.initialize.apply( this, arguments );\n\n if( this._localEvents ) this._localEvents.subscribe( this, this );\n }\n\n initialize(){}\n\n // Deeply clone collection, optionally setting new owner.\n clone( options : CloneOptions = {} ) : this {\n const models = this._shared & ItemsBehavior.share ? this.models : this.map( model => model.clone() ),\n copy : this = new (this.constructor)( models, { model : this.model, comparator : this.comparator }, this._shared );\n \n if( options.pinStore ) copy._defaultStore = this.getStore();\n \n return copy;\n }\n\n toJSON( options? : object ) : any {\n return this.map( model => model.toJSON( options ) );\n }\n\n // Apply bulk in-place object update in scope of ad-hoc transaction \n set( elements : ElementsArg = [], options : TransactionOptions = {} ) : this {\n if( (options).add !== void 0 ){\n this._log( 'warn', \"Type-R:InvalidOption\", \"Collection.set doesn't support 'add' option, behaving as if options.add === true.\", options );\n }\n\n // Handle reset option here - no way it will be populated from the top as nested transaction.\n if( options.reset ){\n this.reset( elements, options )\n }\n else{\n const transaction = this._createTransaction( elements, options );\n transaction && transaction.commit();\n } \n\n return this; \n }\n\n /**\n * Enable or disable live updates.\n * \n * `true` enables full collection synchronization.\n * `false` cancel live updates.\n * `json => true | false` - filter updates\n */\n liveUpdates( enabled : LiveUpdatesOption ) : IOPromise {\n if( enabled ){\n this.liveUpdates( false );\n\n const filter = typeof enabled === 'function' ? enabled : () => true;\n\n this._liveUpdates = {\n updated : json => {\n filter( json ) && this.add( json, { parse : true, merge : true } );\n },\n\n removed : id => this.remove( id )\n };\n\n return this.getEndpoint().subscribe( this._liveUpdates, this ).then( () => this );\n }\n else{\n if( this._liveUpdates ){\n this.getEndpoint().unsubscribe( this._liveUpdates, this );\n this._liveUpdates = null;\n }\n\n // TODO: Return the resolved promise.\n }\n }\n\n /** @internal */\n _liveUpdates : object\n\n fetch( a_options : { liveUpdates? : LiveUpdatesOption } & TransactionOptions = {} ) : IOPromise {\n const options = { parse : true, ...a_options },\n endpoint = this.getEndpoint();\n\n return startIO(\n this,\n endpoint.list( options, this ),\n options,\n\n json => {\n let result : any = this.set( json, { parse : true, ioMethod : 'fetch', ...options } as TransactionOptions );\n \n if( options.liveUpdates ){\n result = this.liveUpdates( options.liveUpdates );\n }\n\n return result;\n }\n );\n }\n\n dispose() : void {\n if( this._disposed ) return;\n\n const aggregated = !this._shared;\n\n for( let record of this.models ){\n free( this, record );\n\n if( aggregated ) record.dispose();\n }\n\n this.liveUpdates( false );\n\n super.dispose();\n }\n\n reset( a_elements? : ElementsArg, options : TransactionOptions = {} ) : R[] {\n const isRoot = begin( this ),\n previousModels = this.models;\n\n // Make all changes required, but be silent.\n if( a_elements ){ \n emptySetTransaction( this, toElements( this, a_elements, options ), options, true );\n }\n else{\n this._byId = {};\n this.models = [];\n }\n\n markAsDirty( this, options );\n\n options.silent || trigger2( this, 'reset', this, { previousModels, ...options } );\n\n // Dispose models which are not in the updated collection.\n const { _byId } = this;\n \n for( let toDispose of previousModels ){\n _byId[ toDispose.cid ] || free( this, toDispose );\n }\n\n isRoot && commit( this );\n return this.models;\n }\n\n // Add elements to collection.\n add( a_elements : ElementsArg , options : AddOptions = {} ){\n const elements = toElements( this, a_elements, options ),\n transaction = this.models.length ?\n addTransaction( this, elements, options ) :\n emptySetTransaction( this, elements, options );\n\n if( transaction ){\n transaction.commit();\n return transaction.added;\n }\n }\n\n // Remove elements. \n remove( recordsOrIds : any, options : CollectionOptions = {} ) : R[] | R {\n if( recordsOrIds ){\n return Array.isArray( recordsOrIds ) ?\n removeMany( this, recordsOrIds, options ) as R[]:\n removeOne( this, recordsOrIds, options ) as R;\n }\n\n return [];\n }\n\n // Apply bulk object update without any notifications, and return open transaction.\n // Used internally to implement two-phase commit. \n /** @internal */\n _createTransaction( a_elements : ElementsArg, options : TransactionOptions = {} ) : CollectionTransaction | void {\n const elements = toElements( this, a_elements, options );\n\n if( this.models.length ){\n return options.remove === false ?\n addTransaction( this, elements, options, true ) :\n setTransaction( this, elements, options );\n }\n else{\n return emptySetTransaction( this, elements, options );\n }\n }\n\n /** @internal */\n static _metatype = AggregatedType;\n\n /***********************************\n * Collection manipulation methods\n */\n\n sort( options : TransactionOptions = {} ) : this {\n if( sortElements( this, options ) ){\n const isRoot = begin( this );\n \n if( markAsDirty( this, options ) ){\n trigger2( this, 'sort', this, options );\n }\n\n isRoot && commit( this );\n }\n\n return this;\n }\n\n // Remove and return given model.\n unset( modelOrId : R | string, options? ) : R {\n const value = this.get( modelOrId );\n this.remove( modelOrId, { unset : true, ...options } );\n return value;\n }\n\n modelId( attrs : {} ) : any {\n return attrs[ this.model.prototype.idAttribute ];\n }\n\n // Toggle model in collection.\n toggle( model : R, a_next? : boolean ) : boolean {\n var prev = Boolean( this.get( model ) ),\n next = a_next === void 0 ? !prev : Boolean( a_next );\n\n if( prev !== next ){\n if( prev ){\n this.remove( model );\n }\n else{\n this.add( model );\n }\n }\n\n return next;\n }\n\n /** @internal */\n _log( level : LogLevel, topic : string, text : string, value : object, a_logger? : Logger ) : void {\n ( a_logger || logger ).trigger( level, topic, `${ this.model.prototype.getClassName() }.${ this.getClassName() }: ` + text, {\n Argument : value,\n 'Attributes spec' : this.model.prototype._attributes\n });\n }\n\n getClassName() : string {\n return super.getClassName() || 'Collection';\n }\n\n /***********************************\n * Proxied Array methods\n */\n\n get length() : number { return this.models.length; }\n\n // Add a model to the end of the collection.\n push(model : ElementsArg, options? : CollectionOptions ) {\n return this.add(model, { at: this.length, ...options });\n }\n\n // Remove a model from the end of the collection.\n pop( options? : CollectionOptions ) : R {\n var model = this.at(this.length - 1);\n this.remove(model, { unset : true, ...options });\n return model;\n }\n\n // Add a model to the beginning of the collection.\n unshift(model : ElementsArg, options? : CollectionOptions ) {\n return this.add(model, { at: 0, ...options });\n }\n \n // Remove a model from the beginning of the collection.\n shift( options? : CollectionOptions ) : R {\n const model = this.at(0);\n this.remove( model, { unset : true, ...options } );\n return model;\n }\n}\n\nimport { ArrayMixin } from './arrayMethods'\n\nexport interface Collection extends ArrayMixin{\n\n}\n\nexport type LiveUpdatesOption = boolean | ( ( x : any ) => boolean );\n\nexport type ElementsArg = Partial | Partial[]\n\n// TODO: make is safe for parse to return null (?)\nfunction toElements( collection : Collection, elements : ElementsArg, options : CollectionOptions ) : Elements {\n const parsed = options.parse ? collection.parse( elements, options ) : elements; \n return Array.isArray( parsed ) ? parsed : [ parsed ];\n}\n\nRecord.Collection = Collection;","import { Collection } from '../collection';\nimport { Record } from '../record';\nimport { CompiledReference } from '../traversable';\n\nexport type CollectionReference = ( () => Collection ) | Collection | string; \n\n/** @private */\nexport function parseReference( collectionRef : CollectionReference ) : ( root : Record ) => Collection {\n switch( typeof collectionRef ){\n case 'function' :\n return root => (collectionRef).call( root );\n case 'object' :\n return () => collectionRef;\n case 'string' :\n const { resolve } = new CompiledReference( collectionRef );\n return resolve;\n }\n}","import { AnyType, ChainableAttributeSpec, Record } from '../record';\nimport { CollectionReference, parseReference } from './commons';\n\n\n/********\n * Reference to model by id.\n * \n * Untyped attribute. Holds model id, when unresolved. When resolved, is substituted\n * with a real model.\n * \n * No model changes are detected and counted as owner's change. That's intentional.\n */\n\n/** @private */\ntype RecordRefValue = Record | string;\n\n/** @private */\nclass RecordRefType extends AnyType {\n // It is always serialized as an id, whenever it's resolved or not. \n toJSON( value : RecordRefValue ){\n return value && typeof value === 'object' ? value.id : value;\n }\n\n // Wne \n clone( value : RecordRefValue ){\n return value && typeof value === 'object' ? value.id : value;\n }\n\n // Model refs by id are equal when their ids are equal.\n isChanged( a : RecordRefValue, b : RecordRefValue){\n var aId = a && ( (a).id == null ? a : (a).id ),\n bId = b && ( (b).id == null ? b : (b).id );\n\n return aId !== bId;\n }\n\n // Refs are always valid.\n validate( model, value, name ){}\n}\n\nexport function memberOf( this : void, masterCollection : CollectionReference, T? : R ) : ChainableAttributeSpec {\n const getMasterCollection = parseReference( masterCollection );\n\n const typeSpec = new ChainableAttributeSpec({\n value : null,\n _metatype : RecordRefType\n });\n \n return typeSpec\n .get( function( objOrId : RecordRefValue, name : string ) : Record {\n if( typeof objOrId === 'object' ) return objOrId;\n\n // So, we're dealing with an id reference. Resolve it.\n const collection = getMasterCollection( this );\n let record : Record = null;\n\n // If master collection exists and is not empty...\n if( collection && collection.length ){\n // Silently update attribute with record from this collection.\n record = collection.get( objOrId ) || null;\n this.attributes[ name ] = record;\n\n // Subscribe for events manually. delegateEvents won't be invoked.\n record && this._attributes[ name ].handleChange( record, null, this, {} );\n }\n\n return record;\n });\n}","import { Collection, CollectionConstructor } from '../collection';\nimport { define, tools } from '../object-plus';\nimport { AggregatedType, ChainableAttributeSpec, Record, type } from '../record';\nimport { ItemsBehavior, transactionApi } from '../transactions';\nimport { CollectionReference, parseReference } from './commons';\n\n\ntype RecordsIds = ( string | number )[];\n\nexport function subsetOf, R extends Record>( this : void, masterCollection : CollectionReference, T? : X ) : ChainableAttributeSpec{\n const CollectionClass = T || Collection,\n // Lazily define class for subset collection, if it's not defined already...\n SubsetOf = CollectionClass._SubsetOf || ( CollectionClass._SubsetOf = defineSubsetCollection( CollectionClass as any ) as any ),\n getMasterCollection = parseReference( masterCollection );\n\n return type( SubsetOf ).get(\n function( refs ){\n !refs || refs.resolvedWith || refs.resolve( getMasterCollection( this ) );\n return refs;\n }\n );\n}\n\nCollection.prototype.createSubset = function( models : any, options ) : Collection {\n const SubsetOf = subsetOf( this, this.constructor ).options.type,\n subset = new SubsetOf( models, options );\n \n subset.resolve( this );\n return subset;\n}\n\nconst subsetOfBehavior = ItemsBehavior.share | ItemsBehavior.persistent;\n\nfunction defineSubsetCollection( CollectionClass : typeof Collection ) {\n @define class SubsetOfCollection extends CollectionClass {\n refs : any[];\n resolvedWith : Collection = null;\n\n _metatype : AggregatedType\n\n get __inner_state__(){ return this.refs || this.models; }\n\n constructor( recordsOrIds?, options? ){\n super( [], options, subsetOfBehavior );\n this.refs = toArray( recordsOrIds );\n }\n\n // Remove should work fine as it already accepts ids. Add won't...\n add( a_elements, options = {} ){\n const { resolvedWith } = this,\n toAdd = toArray( a_elements );\n \n if( resolvedWith ){\n // If the collection is resolved already, everything is simple.\n return super.add( resolveRefs( resolvedWith, toAdd ), options );\n }\n else{\n // Collection is not resolved yet. So, we prepare the delayed computation.\n if( toAdd.length ){\n const isRoot = transactionApi.begin( this );\n\n // Save elements to resolve in future...\n this.refs = this.refs ? this.refs.concat( toAdd ) : toAdd.slice();\n\n transactionApi.markAsDirty( this, options );\n\n // And throw the 'changes' event.\n isRoot && transactionApi.commit( this );\n }\n }\n }\n\n reset( a_elements?, options = {} ){\n const { resolvedWith } = this,\n elements = toArray( a_elements );\n \n return resolvedWith ?\n // Collection is resolved, so parse ids and forward the call to set.\n super.reset( resolveRefs( resolvedWith, elements ), options ) :\n // Collection is not resolved yet. So, we prepare the delayed computation.\n delaySet( this, elements, options ) as any || [];\n }\n\n _createTransaction( a_elements, options? ){\n const { resolvedWith } = this,\n elements = toArray( a_elements );\n \n return resolvedWith ?\n // Collection is resolved, so parse ids and forward the call to set.\n super._createTransaction( resolveRefs( resolvedWith, elements ), options ) :\n // Collection is not resolved yet. So, we prepare the delayed computation.\n delaySet( this, elements, options );\n }\n\n // Serialized as an array of model ids.\n toJSON() : RecordsIds {\n return this.refs ?\n this.refs.map( objOrId => objOrId.id || objOrId ) :\n this.models.map( model => model.id );\n }\n\n // Subset is always valid.\n _validateNested(){ return 0; }\n\n get length() : number {\n return this.models.length || ( this.refs ? this.refs.length : 0 );\n }\n\n // Must be shallow copied on clone.\n clone( owner? ){\n var Ctor = (this).constructor,\n copy = new Ctor( [], {\n model : this.model,\n comparator : this.comparator\n });\n\n if( this.resolvedWith ){\n // TODO: bug here. \n copy.resolvedWith = this.resolvedWith;\n copy.refs = null;\n copy.reset( this.models, { silent : true } );\n }\n else{\n copy.refs = this.refs.slice();\n }\n\n return copy;\n }\n\n // Clean up the custom parse method possibly defined in the base class.\n parse( raw : any ) : Record[] {\n return raw;\n }\n\n resolve( collection : Collection ) : this {\n if( collection && collection.length ){\n this.resolvedWith = collection;\n\n if( this.refs ){\n this.reset( this.refs, { silent : true } );\n this.refs = null;\n }\n }\n\n return this;\n }\n\n getModelIds() : RecordsIds { return this.toJSON(); }\n\n toggle( modelOrId : any, val : boolean ) : boolean {\n return super.toggle( this.resolvedWith.get( modelOrId ), val );\n }\n\n addAll() : Record[] {\n if( this.resolvedWith ){\n this.set( this.resolvedWith.models );\n return this.models;\n }\n\n throw new Error( \"Cannot add elemens because the subset collection is not resolved yet.\" );\n }\n\n toggleAll() : Record[] {\n return this.length ? this.reset() : this.addAll();\n }\n }\n\n // Clean up all custom item events to prevent memory leaks.\n SubsetOfCollection.prototype._itemEvents = void 0;\n\n return SubsetOfCollection;\n}\n\nfunction resolveRefs( master, elements ){\n const records = [];\n \n for( let el of elements ){\n const record = master.get( el );\n if( record ) records.push( record );\n }\n\n return records;\n}\n\nfunction delaySet( collection, elements, options ) : void {\n if( tools.notEqual( collection.refs, elements ) ){\n const isRoot = transactionApi.begin( collection );\n\n // Save elements to resolve in future...\n collection.refs = elements.slice();\n\n transactionApi.markAsDirty( collection, options );\n \n // And throw the 'changes' event.\n isRoot && transactionApi.commit( collection );\n }\n}\n\nfunction toArray( elements ){\n return elements ? ( \n Array.isArray( elements ) ? elements : [ elements ]\n ) : [];\n}","import { Record } from '../record';\nimport { Transactional } from '../transactions';\n\nlet _store : Store = null;\n\nexport class Store extends Record {\n getStore() : Store { return this; }\n \n // delegate item lookup to owner, and to the global store if undefined\n get( name : string ) : any {\n // Lookup for resource in the current store. \n let local = this[ name ];\n\n // If something is found or it's the global store, return result.\n if( local || this === this._defaultStore ) return local;\n\n // Forward failed lookup to owner or global store.\n return this._owner ? this._owner.get( name ) : this._defaultStore.get( name ); \n }\n\n static get global(){ return _store; }\n static set global( store : Store ){\n if( _store ){\n _store.dispose();\n }\n\n Transactional.prototype._defaultStore = _store = store;\n }\n}\n\nStore.global = new Store();","// Dummy polyfill to prevent exception in IE.\nif( typeof Symbol === 'undefined' ){\n Object.defineProperty( window, 'Symbol', { value : { iterator : 'Symbol.iterator' }, configurable : true });\n}\n\nimport { Events, Mixable as Class } from './object-plus/';\n// Define synonims for NestedTypes backward compatibility.\nimport { Record as Model } from './record';\n\n/**\n * Export everything \n */\nexport * from './collection';\nexport * from './io-tools';\nexport * from './object-plus';\nexport * from './record';\nexport * from './relations';\nexport * from './transactions';\nexport { Model, Class };\n\n\nexport const { on, off, trigger, once, listenTo, stopListening, listenToOnce } = Events;\n\n/** Wrap model or collection method in transaction. */\nexport function transaction< F extends Function >( method : F ) : F {\n return function( ...args ){\n let result;\n \n this.transaction( () => {\n result = method.apply( this, args );\n });\n \n return result;\n }\n}"],"names":["defaults","dest","source","name","hasOwnProperty","arguments","length","i","other","isValidJSON","value","proto","Object","getPrototypeOf","prototype","Array","every","getBaseClass","Class","constructor","isEmpty","obj","key","some","fun","ArrayProto","arr","result","someArray","someObject","predicate","x","omit","discard","transform","assign","once","func","memo","first","apply","this","DateProto","Date","ObjectProto","notEqual","a","b","protoA","arraysNotEqual","keysA","keys","objectsNotEqual","HashProto","create","hashMap","hash","definition","_i","names","names_1","_a","name_1","prop","desc","getOwnPropertyDescriptor","o","map","EventMap","handlers","slice","addEventsMap","concat","addEvent","split","eventSplitter","getBubblingHandler","callback","name_2","push","EventDescriptor","target","event_1","on","event_2","off","handler","_bubblingHandlers","event","c","d","e","trigger5","trigger3","trigger2","context","next","listOff","_events","filteredHead","prev","head","ev","_callback","listSend3","call","EventHandler","once_1","_once","name_3","strings","api","events","test","self","queue","all","listSend2","listSend4","listSend5","f","listSend6","extendStatics","setPrototypeOf","__proto__","p","__extends","__","__assign","t","s","n","__rest","indexOf","getOwnPropertySymbols","__decorate","decorators","r","Reflect","decorate","defineProperty","Mixable","protoProps","staticProps","BaseClass","mixins","defineMixin","merge","mergeObject","getStaticDefinitions","onDefine","definitions","mergeInheritedMembers","spec","statics","TheSubclass","tslib_1.__extends","predefine","define","Constructor","__super__","MixinsState","get","populate","onExtend","ClassOrDefinition","Ctor","rules","definitionRules","definitionDecorator","definitionKey","mergeRules","appliedMixins","rule","mixins_1","mixin","isArray","sourceMixins","ctors","ctors_1","unshift","object","ignore","dontMix","getOwnPropertyNames","forEachOwnProp","sourceProp","_this","assignProperty","mixinRules","protoValue","baseProto","resolveRule","function","caller","list","destProp","configurable","pipe","classFirst","classLast","_idCount","uniqueId","cid","initialize","Messenger","localEvents","_localEvents","properties","eventsMap","defineProperties","toPropertyDescriptor","addReference","a_source","_listeningTo","removeAll","second","_disposed","stopListening","Events","listener","isProduction","process","env","NODE_ENV","logEvents","Logger","level","filter","topic","msg","props","args","toString","console","Error","counter","_super","window","something","body","join","JSON","stringify","logger","logEvents_1","logToConsole","throwingLogger","throwOn","log","trigger","bind","startIO","promise","options","thenDo","abortIO","_ioPromise","then","resp","triggerAndBubble","catch","err","abort","eventSource","collection","referenceMask","reference","splitTail","path","match","substr","tail","pop","local","resolve","Function","shift","resolveReference","root","action","skip","getStore","getOwner","ItemsBehavior","_validateNested","nested","error","validate","ValidationError","iteratee","each","eachError","cidPrefix","Transactional","endpoint","_endpoint","Transactional_1","_owner","_ownerKey","_changeEventName","listenTo","isRoot","transactionApi","begin","update","set","commit","transaction","__inner_state__","_changeToken","json","strict","validationError","eachValidationError","getClassName","data","_defaultStore","getOwnerEndpoint","_endpoints","_validationError","getValidationError","_transaction","markAsDirty","dirty","silent","_isDirty","initiator","originalOptions","_onChildrenChange","aquire","owner","child","ReferenceError","free","_begin","_markAsDirty","setAttribute","record","_attributes","doUpdate","attributes","_previousAttributes","AttributesCopy","_changedAttributes","UpdateRecordMixin","attribute","propagateChanges","forceAttributeChange","_createTransaction","a_values","unknown","changes","values","parse","shouldBeAnObject","unknownAttrsWarning","RecordTransaction","nested_1","_log","nested_2","changes_1","_b","emptyOptions","a_options","getHooks","transforms","changeHandlers","type","toJSON","changeEvents","hasCustomDefault","defaultValue","tools.isValidJSON","isRequired","convert","getHook_1","getHook","reduce","chainGetHooks","validate_1","chainTransforms","handleChange","chainChangeHandlers","doInit","AnyType","model","v","isChanged","code","text","New value","Prev. value","prevHook","nextHook","prevTransform","nextTransform","prevHandler","nextHandler","ImmutableClassType","PrimitiveType","NumericType","num","isFinite","ArrayType","ObjectType","doNothing","FunctionType","DateType","date","timestamp","getTime","toISOString","supportsDate","isNaN","struct","minutesOffset","isoDatePattern","exec","k","numericKeys","undefined","UTC","safeParseDate","AggregatedType","clone","canBeUpdated","nestedTransaction","_shared","persistent","_handleChange","unset","dispose","shareAndListen","listen","share","getType","attr","SharedType","lazyRelations","_onChange","builtins","String","Number","Boolean","metatypes","getMetatype","_metatype","idx","ChainableAttributeSpec","check","metadata","required","ref","emptyFunction","changed","eventMap","unsubscribe","subscribe","cloned","Type","attrDef","shared","inferType","createAttribute","from","createAttributesMixin","attributesDefinition","baseClassAttributes","myAttributes","_.transform","allAttributes","_.defaults","ConstructorsMixin","attrDefs","attrs","Attributes","constructorsMixin","_attributesArray","createPropertyDescriptor","attrSpecs","eventsApi.EventMap","createWatcherFromRef","wrapWatcher","localEventsMixin","watcher","IORecordMixin","save","getEndpoint","ioMethod","isNew","id","fetch","read","destroy","remove","_cidCounter","typeCheck","Record","idAttribute","extend","diff","hasChanged","val","old","nullify","forEach","_attributesArray_1","copy","pinStore","errors","asJson","l","newModel","clear","a_logger","Attributes definition","a_fun","tools.transform","Symbol","iterator","RecordEntriesIterator","Collection","BaseRecordAttributes","BaseRecordAttributesCopy","IdAttribute","metatype","done","DefaultCollection","dynamicMixin","_aquire","_free","convertAndAquire","_aggregationError","_itemEvents","sortElements","_comparator","sort","models","addIndex","index","removeIndex","updateIndex","previous","added","removed","sorted","CollectionTransaction","logAggregationError","added_1","_d","removed_1","_e","addTransaction","items","a_items","forceMerge","_byId","prevLength","a_items_1","item","appendElements","needSort","at","length_1","j","moveElements","sortOrMoveElements","removeMany","toRemove","_removeFromIndex","_reallocate","silentOptions","emptySetTransaction","len","src","_reallocateEmpty","setTransaction","_prevById","prevModels","toAdd","orderKept","reusedCount","previous_1","_garbageCollect","children","children_1","freeAll","addedOrChanged","ArrayMixin","mapFilter","res","doWhile","init","end","modelOrId","idOrObj","toPredicateFunction","m","firstMatch","find","entries","a_index","noOp","keys_1","keys_2","_count","CollectionRefsType","records","comparator","toElements","RefsCollection","_SubsetOf","Refs","Subset","itemEvents","aa","bb","_store","objOrId","count","elements","add","reset","enabled","liveUpdates","filter_1","_liveUpdates","updated","tslib_1.__assign","aggregated","a_elements","previousModels","previousModels_1","toDispose","recordsOrIds","el","splice","notify","removeOne","a_next","Argument","Attributes spec","parsed","parseReference","collectionRef","RecordRefType","subsetOf","masterCollection","T","CollectionClass","SubsetOf","subsetOfBehavior","refs","toArray","SubsetOfCollection","resolvedWith","resolveRefs","delaySet","raw","toggle","addAll","getMasterCollection","createSubset","subset","master","elements_1","tools.notEqual","Store","store","global","listenToOnce","method","reject","onAbort","fn","Promise","a_resolve","a_reject","listName","DefaultRecord","attrName","getMetadata","value_1","as"],"mappings":"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"} \ No newline at end of file diff --git a/lib/record/attrDef.d.ts b/lib/record/attrDef.d.ts index 1f9367b7..cd3306dc 100644 --- a/lib/record/attrDef.d.ts +++ b/lib/record/attrDef.d.ts @@ -24,6 +24,7 @@ export declare class ChainableAttributeSpec { set(fun: any): this; changeEvents(events: boolean): this; events(map: EventsDefinition): this; + properties(props: object): this; readonly has: this; metadata(options: object): this; value(x: any): this; diff --git a/lib/record/attrDef.js b/lib/record/attrDef.js index b0a0fe64..46b0ed56 100644 --- a/lib/record/attrDef.js +++ b/lib/record/attrDef.js @@ -87,6 +87,9 @@ var ChainableAttributeSpec = (function () { changeHandlers: this.options.changeHandlers.concat(handleEventsSubscribtion) }); }; + ChainableAttributeSpec.prototype.properties = function (props) { + return this.metadata({ properties: props }); + }; Object.defineProperty(ChainableAttributeSpec.prototype, "has", { get: function () { return this; diff --git a/lib/record/attrDef.js.map b/lib/record/attrDef.js.map index 3d6ab2e8..65046655 100644 --- a/lib/record/attrDef.js.map +++ b/lib/record/attrDef.js.map @@ -1 +1 @@ -{"version":3,"file":"attrDef.js","sourceRoot":"","sources":["../../src/record/attrDef.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"attrDef.js","sourceRoot":"","sources":["../../src/record/attrDef.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/record/metatypes/any.d.ts b/lib/record/metatypes/any.d.ts index 8aeb655f..2bf8fff8 100644 --- a/lib/record/metatypes/any.d.ts +++ b/lib/record/metatypes/any.d.ts @@ -15,6 +15,7 @@ export interface AttributeOptions { hasCustomDefault?: boolean; parse?: Parse; toJSON?: AttributeToJSON; + properties?: Object; getHooks?: GetHook[]; transforms?: Transform[]; changeHandlers?: ChangeHandler[]; @@ -38,10 +39,11 @@ export declare class AnyType implements AttributeUpdatePipeline { dispose(record: AttributesContainer, value: any): void; validate(record: AttributesContainer, value: any, key: string): any; toJSON(value: any, key: any, options?: object): any; + properties: Object; createPropertyDescriptor(): PropertyDescriptor | void; value: any; static defaultValue: any; - type: Function; + type: any; initialize(name: string, options: TransactionOptions): void; options: AttributeOptions; doInit(value: any, record: AttributesContainer, options: TransactionOptions): any; diff --git a/lib/record/metatypes/any.js b/lib/record/metatypes/any.js index ca6ebd4c..15558bd9 100644 --- a/lib/record/metatypes/any.js +++ b/lib/record/metatypes/any.js @@ -12,7 +12,7 @@ var AnyType = (function () { options.getHooks = options.getHooks.slice(); options.transforms = options.transforms.slice(); options.changeHandlers = options.changeHandlers.slice(); - var value = options.value, type = options.type, parse = options.parse, toJSON = options.toJSON, changeEvents = options.changeEvents, validate = options.validate, getHooks = options.getHooks, transforms = options.transforms, changeHandlers = options.changeHandlers; + var value = options.value, type = options.type, parse = options.parse, toJSON = options.toJSON, changeEvents = options.changeEvents, properties = options.properties, validate = options.validate, getHooks = options.getHooks, transforms = options.transforms, changeHandlers = options.changeHandlers; this.value = value; this.type = type; if (!options.hasCustomDefault && type) { @@ -26,6 +26,7 @@ var AnyType = (function () { } this.propagateChanges = changeEvents !== false; this.toJSON = toJSON === void 0 ? this.toJSON : toJSON; + this.properties = properties == void 0 ? {} : properties; this.validate = validate || this.validate; if (options.isRequired) { this.validate = wrapIsRequired(this.validate); diff --git a/lib/record/metatypes/any.js.map b/lib/record/metatypes/any.js.map index fb574e01..5afa3b03 100644 --- a/lib/record/metatypes/any.js.map +++ b/lib/record/metatypes/any.js.map @@ -1 +1 @@ -{"version":3,"file":"any.js","sourceRoot":"","sources":["../../../src/record/metatypes/any.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"any.js","sourceRoot":"","sources":["../../../src/record/metatypes/any.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/record/metatypes/shared.d.ts b/lib/record/metatypes/shared.d.ts index 5f183202..f61ba457 100644 --- a/lib/record/metatypes/shared.d.ts +++ b/lib/record/metatypes/shared.d.ts @@ -1,8 +1,9 @@ import { Transactional, TransactionOptions } from '../../transactions'; import { AnyType } from './any'; import { AttributesContainer, ConstructorOptions } from '../updates'; +import { ChainableAttributeSpec } from '../attrDef'; export declare class SharedType extends AnyType { - type: typeof Transactional; + type: typeof Transactional | ChainableAttributeSpec; doInit(value: any, record: AttributesContainer, options: ConstructorOptions): any; doUpdate(value: any, record: any, options: any, nested: any[]): boolean; clone(value: Transactional, record: AttributesContainer): Transactional; diff --git a/lib/record/metatypes/shared.js b/lib/record/metatypes/shared.js index 49c8e965..8f66c0f4 100644 --- a/lib/record/metatypes/shared.js +++ b/lib/record/metatypes/shared.js @@ -4,6 +4,12 @@ import { ItemsBehavior, transactionApi } from '../../transactions'; import { AnyType } from './any'; var on = eventsApi.on, off = eventsApi.off, free = transactionApi.free, aquire = transactionApi.aquire; var shareAndListen = ItemsBehavior.listen | ItemsBehavior.share; +function getType(attr) { + while (attr && attr.options && attr.options.type) { + attr = attr.options.type; + } + return attr; +} var SharedType = (function (_super) { tslib_1.__extends(SharedType, _super); function SharedType() { @@ -50,16 +56,17 @@ var SharedType = (function (_super) { }; SharedType.prototype.toJSON = function () { }; SharedType.prototype.canBeUpdated = function (prev, next, options) { - if (prev && next != null && !(next instanceof this.type)) { + var type = getType(this); + if (prev && next != null && !(next instanceof type)) { return next; } }; SharedType.prototype.convert = function (next, prev, record, options) { - if (next == null || next instanceof this.type) + var type = getType(this); + if (next == null || next instanceof type || options.lazyRelations) return next; - var implicitObject = new this.type(next, options, shareAndListen); - aquire(record, implicitObject, this.name); - return implicitObject; + next = type.create(next, options, shareAndListen); + return next; }; SharedType.prototype.validate = function (model, value, name) { }; SharedType.prototype.create = function () { diff --git a/lib/record/metatypes/shared.js.map b/lib/record/metatypes/shared.js.map index 52cf6ad1..7d640472 100644 --- a/lib/record/metatypes/shared.js.map +++ b/lib/record/metatypes/shared.js.map @@ -1 +1 @@ -{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/record/metatypes/shared.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/record/metatypes/shared.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/transactions.d.ts b/lib/transactions.d.ts index 0bf2e013..585bb192 100644 --- a/lib/transactions.d.ts +++ b/lib/transactions.d.ts @@ -73,6 +73,7 @@ export interface TransactionOptions { validate?: boolean; ioMethod?: 'save' | 'fetch'; upsert?: boolean; + lazyRelations?: boolean; } export declare const transactionApi: { begin(object: Transactional): boolean; diff --git a/lib/transactions.js.map b/lib/transactions.js.map index 466fe0fa..45bcddac 100644 --- a/lib/transactions.js.map +++ b/lib/transactions.js.map @@ -1 +1 @@ -{"version":3,"file":"transactions.js","sourceRoot":"","sources":["../src/transactions.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"transactions.js","sourceRoot":"","sources":["../src/transactions.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 00000000..ac1e8e4f Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/record/attrDef.ts b/src/record/attrDef.ts index 92ee9487..84075282 100644 --- a/src/record/attrDef.ts +++ b/src/record/attrDef.ts @@ -129,6 +129,10 @@ export class ChainableAttributeSpec{ }); } + properties( props : object ) : this { + return this.metadata({properties: props}); + } + // Creates a copy of the spec. get has() : this { return this; diff --git a/src/record/metatypes/any.ts b/src/record/metatypes/any.ts index ce179a63..c7a225a6 100644 --- a/src/record/metatypes/any.ts +++ b/src/record/metatypes/any.ts @@ -22,6 +22,7 @@ export interface AttributeOptions { parse? : Parse toJSON? : AttributeToJSON + properties? : Object getHooks? : GetHook[] transforms? : Transform[] @@ -98,6 +99,8 @@ export class AnyType implements AttributeUpdatePipeline { return value && value.toJSON ? value.toJSON( options ) : value; } + properties: Object + createPropertyDescriptor() : PropertyDescriptor | void { const { name, getHook } = this; @@ -127,7 +130,7 @@ export class AnyType implements AttributeUpdatePipeline { // Used as global default value for the given metatype static defaultValue : any; - type : Function + type : any initialize( name : string, options : TransactionOptions ){} @@ -182,7 +185,7 @@ export class AnyType implements AttributeUpdatePipeline { options.changeHandlers = options.changeHandlers.slice(); const { - value, type, parse, toJSON, changeEvents, + value, type, parse, toJSON, changeEvents, properties, validate, getHooks, transforms, changeHandlers } = options; @@ -207,6 +210,8 @@ export class AnyType implements AttributeUpdatePipeline { this.toJSON = toJSON === void 0 ? this.toJSON : toJSON; + this.properties = properties == void 0 ? {} : properties; + this.validate = validate || this.validate; if( options.isRequired ){ diff --git a/src/record/metatypes/shared.ts b/src/record/metatypes/shared.ts index b99937a2..aff2eb11 100644 --- a/src/record/metatypes/shared.ts +++ b/src/record/metatypes/shared.ts @@ -1,6 +1,7 @@ import { eventsApi } from '../../object-plus'; import { ItemsBehavior, Transactional, transactionApi, TransactionOptions } from '../../transactions'; import { AnyType } from './any'; +import { type } from '../attrDef' import { AttributesContainer, ConstructorOptions } from '../updates'; import { ChainableAttributeSpec } from '../attrDef'; @@ -17,9 +18,17 @@ const { on, off } = eventsApi, const shareAndListen = ItemsBehavior.listen | ItemsBehavior.share; +function getType(attr: any) { + while (attr && attr.options && attr.options.type) { + attr = attr.options.type; + } + return attr; +} + /** @private */ export class SharedType extends AnyType { - type : typeof Transactional + //type : ChainableAttributeSpec + type : typeof Transactional | ChainableAttributeSpec doInit( value, record : AttributesContainer, options : ConstructorOptions ){ const v = options.clone ? this.clone( value, record ) : ( @@ -81,21 +90,29 @@ export class SharedType extends AnyType { canBeUpdated( prev : Transactional, next : any, options : TransactionOptions ) : any { // If an object already exists, and new value is of incompatible type, let object handle the update. - if( prev && next != null && !( next instanceof this.type ) ){ + let type = getType(this); + if( prev && next != null && !( next instanceof type ) ){ return next; } } convert( next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) : Transactional { - if( next == null || next instanceof this.type ) return next; - - // Convert type using implicitly created transactional object. - const implicitObject = new ( this.type as any )( next, options, shareAndListen ); - - // To prevent a leak, we need to take an ownership on it. - aquire( record, implicitObject, this.name ); + let type = getType(this); + if (next == null || next instanceof type || options.lazyRelations) return next; + + next = type.create(next, options, shareAndListen); + + /* + if (!next) { + // Convert type using implicitly created transactional object. + next = new (type as any)(next, options, shareAndListen); + + // To prevent a leak, we need to take an ownership on it. + aquire(record, next, this.name); + } + */ - return implicitObject; + return next; } // Refs are always valid. diff --git a/src/transactions.ts b/src/transactions.ts index 55eeaf6a..8fe4faff 100644 --- a/src/transactions.ts +++ b/src/transactions.ts @@ -353,6 +353,8 @@ export interface TransactionOptions { // The hint for IOEndpoint // If `true`, `record.save()` will behave as "upsert" operation for the records having id. upsert? : boolean + + lazyRelations? : boolean } /**