UNPKG

orbit-state-tree

Version:
1 lines 47.3 kB
{"version":3,"file":"orbit-state-tree.mjs","sources":["../node_modules/rollup-plugin-node-builtins/src/es6/events.js","../lib/Serializer.js","../lib/StateTree.js","../lib/requestSelector.js","../lib/recordSelector.js"],"sourcesContent":["'use strict';\n\nvar domain;\n\n// This constructor is used to store event handlers. Instantiating this is\n// faster than explicitly calling `Object.create(null)` to get a \"clean\" empty\n// object (tested with v8 v4.9).\nfunction EventHandlers() {}\nEventHandlers.prototype = Object.create(null);\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nexport default EventEmitter;\nexport {EventEmitter};\n\n// nodejs oddity\n// require('events') === require('events').EventEmitter\nEventEmitter.EventEmitter = EventEmitter\n\nEventEmitter.usingDomains = false;\n\nEventEmitter.prototype.domain = undefined;\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\nEventEmitter.init = function() {\n this.domain = null;\n if (EventEmitter.usingDomains) {\n // if there is an active domain, then attach to it.\n if (domain.active && !(this instanceof domain.Domain)) {\n this.domain = domain.active;\n }\n }\n\n if (!this._events || this._events === Object.getPrototypeOf(this)._events) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || isNaN(n))\n throw new TypeError('\"n\" argument must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\n// These standalone emit* functions are used to optimize calling of event\n// handlers for fast cases because emit() itself often has a variable number of\n// arguments and can be deoptimized because of that. These functions always have\n// the same number of arguments and thus do not get deoptimized, so the code\n// inside them can execute faster.\nfunction emitNone(handler, isFn, self) {\n if (isFn)\n handler.call(self);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self);\n }\n}\nfunction emitOne(handler, isFn, self, arg1) {\n if (isFn)\n handler.call(self, arg1);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1);\n }\n}\nfunction emitTwo(handler, isFn, self, arg1, arg2) {\n if (isFn)\n handler.call(self, arg1, arg2);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2);\n }\n}\nfunction emitThree(handler, isFn, self, arg1, arg2, arg3) {\n if (isFn)\n handler.call(self, arg1, arg2, arg3);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2, arg3);\n }\n}\n\nfunction emitMany(handler, isFn, self, args) {\n if (isFn)\n handler.apply(self, args);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].apply(self, args);\n }\n}\n\nEventEmitter.prototype.emit = function emit(type) {\n var er, handler, len, args, i, events, domain;\n var needDomainExit = false;\n var doError = (type === 'error');\n\n events = this._events;\n if (events)\n doError = (doError && events.error == null);\n else if (!doError)\n return false;\n\n domain = this.domain;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n er = arguments[1];\n if (domain) {\n if (!er)\n er = new Error('Uncaught, unspecified \"error\" event');\n er.domainEmitter = this;\n er.domain = domain;\n er.domainThrown = false;\n domain.emit('error', er);\n } else if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n return false;\n }\n\n handler = events[type];\n\n if (!handler)\n return false;\n\n var isFn = typeof handler === 'function';\n len = arguments.length;\n switch (len) {\n // fast cases\n case 1:\n emitNone(handler, isFn, this);\n break;\n case 2:\n emitOne(handler, isFn, this, arguments[1]);\n break;\n case 3:\n emitTwo(handler, isFn, this, arguments[1], arguments[2]);\n break;\n case 4:\n emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);\n break;\n // slower\n default:\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n emitMany(handler, isFn, this, args);\n }\n\n if (needDomainExit)\n domain.exit();\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = target._events;\n if (!events) {\n events = target._events = new EventHandlers();\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (!existing) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] :\n [existing, listener];\n } else {\n // If we've already got an array, just append.\n if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n }\n\n // Check for listener leak\n if (!existing.warned) {\n m = $getMaxListeners(target);\n if (m && m > 0 && existing.length > m) {\n existing.warned = true;\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + type + ' listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n emitWarning(w);\n }\n }\n }\n\n return target;\n}\nfunction emitWarning(e) {\n typeof console.warn === 'function' ? console.warn(e) : console.log(e);\n}\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction _onceWrap(target, type, listener) {\n var fired = false;\n function g() {\n target.removeListener(type, g);\n if (!fired) {\n fired = true;\n listener.apply(target, arguments);\n }\n }\n g.listener = listener;\n return g;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = this._events;\n if (!events)\n return this;\n\n list = events[type];\n if (!list)\n return this;\n\n if (list === listener || (list.listener && list.listener === listener)) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list[0] = undefined;\n if (--this._eventsCount === 0) {\n this._events = new EventHandlers();\n return this;\n } else {\n delete events[type];\n }\n } else {\n spliceOne(list, position);\n }\n\n if (events.removeListener)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events;\n\n events = this._events;\n if (!events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!events.removeListener) {\n if (arguments.length === 0) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n } else if (events[type]) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n for (var i = 0, key; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = new EventHandlers();\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n do {\n this.removeListener(type, listeners[listeners.length - 1]);\n } while (listeners[0]);\n }\n\n return this;\n };\n\nEventEmitter.prototype.listeners = function listeners(type) {\n var evlistener;\n var ret;\n var events = this._events;\n\n if (!events)\n ret = [];\n else {\n evlistener = events[type];\n if (!evlistener)\n ret = [];\n else if (typeof evlistener === 'function')\n ret = [evlistener.listener || evlistener];\n else\n ret = unwrapListeners(evlistener);\n }\n\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];\n};\n\n// About 1.5x faster than the two-arg version of Array#splice().\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)\n list[i] = list[k];\n list.pop();\n}\n\nfunction arrayClone(arr, i) {\n var copy = new Array(i);\n while (i--)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n","import Jsona from 'jsona'\nimport invariant from 'invariant'\n\n/**\n * Serialize plain objects into json api format\n */\nexport default class Serializer {\n constructor (schema) {\n this._formatter = new Jsona()\n this._schema = schema\n }\n\n /**\n * Augment object with attributes needed by formatter\n *\n * @param {String} type Object type\n * @param {Object} object\n */\n _augmentObject (type, object) {\n const relationships = this._schema.models[type].relationships\n const relationshipNames = relationships ? Object.keys(relationships) : []\n\n for (let relationshipName of relationshipNames) {\n if (!object[relationshipName]) {\n continue\n }\n if (Array.isArray(object[relationshipName])) {\n object[relationshipName] = object[relationshipName].map(\n relationshipObject => this._augmentObject(relationships[relationshipName].model, relationshipObject)\n )\n continue\n }\n object[relationshipName] = this._augmentObject(relationships[relationshipName].model, object[relationshipName])\n }\n\n return Object.assign(\n {\n type: type,\n relationshipNames: relationshipNames\n },\n object\n )\n }\n\n /**\n * Serialize an object into json api format\n *\n * @param {String} type Object type\n * @param {Object} object Object\n * @returns {Object}\n */\n serialize (type, object) {\n invariant(type in this._schema.models, 'serialized type must exist in schema')\n return this._formatter.serialize({stuff: this._augmentObject(type, object)})\n }\n}\n","import EventEmitter from 'events'\nimport invariant from 'invariant'\nimport normalize from 'json-api-normalizer'\nimport Serializer from './Serializer'\nimport { Exception as OrbitException } from '@orbit/core'\n\nexport default class StateTree {\n /**\n * Initialize the state tree with your store and schema instances\n *\n * @param {Object} {store, schema}\n * @memberof StateTree\n */\n constructor ({store, schema}) {\n invariant(store, 'Store instance required')\n invariant(schema, 'Schema instance required')\n this._store = store\n this._schema = schema\n this._serializer = new Serializer(this._schema)\n this._events = new EventEmitter()\n this._lastRequestId = 0\n this._state = {\n entities: {},\n requests: {}\n }\n }\n\n /**\n * Listen for tree changes, receving a new tree every time a change is comitted\n *\n * @param {Function} callback\n */\n onChange (callback) {\n return this._events.addListener('change', callback)\n }\n\n /**\n * Listen for unhandled errors, errors coming from orbitjs are described on request object\n *\n * @param {Function} callback\n */\n onUnhandledError (callback) {\n return this._events.addListener('unhandledError', callback)\n }\n\n /**\n * Adds an record\n *\n * @param {String} type\n * @param {Object} object\n */\n addRecord (type, object) {\n return this._storeUpdate('addRecord', [this._serialize(type, object)])\n }\n\n /**\n * Replaces an entire record\n *\n * @param {String} type\n * @param {Object} object\n */\n replaceRecord (type, object) {\n return this._storeUpdate('replaceRecord', [this._serialize(type, object)])\n }\n\n /**\n * Removes an record\n *\n * @param {String} type\n * @param {String} id\n */\n removeRecord (type, id) {\n return this._storeUpdate('removeRecord', [{type, id}])\n }\n\n /**\n * Replaces a key\n *\n * @param {String} type\n * @param {String} id\n * @param {String} keyName\n * @param {String} keyValue\n */\n replaceKey (type, id, keyName, keyValue) {\n return this._storeUpdate('replaceKey', [{type, id}, keyName, keyValue])\n }\n\n /**\n * Replaces an attribute\n *\n * @param {String} type\n * @param {String} id\n * @param {String} attributeName\n * @param {String} attributeValue\n */\n replaceAttribute (type, id, attributeName, attributeValue) {\n return this._storeUpdate('replaceAttribute', [{type, id}, attributeName, attributeValue])\n }\n\n /**\n * Adds a member to a to-many relationship\n *\n * @param {String} type\n * @param {String} id\n * @param {String} relationshipName\n * @param {String} relationshipId\n */\n addToRelatedRecords (type, id, relationshipName, relationshipId) {\n this._validateRelationship(type, relationshipName, 'hasMany')\n const relationshipType = this._schema.models[type].relationships[relationshipName].model\n return this._storeUpdate('addToRelatedRecords', [{type, id}, relationshipName, {type: relationshipType, id: relationshipId}])\n }\n\n /**\n * Removes a member from a to-many relationship\n *\n * @param {String} type\n * @param {String} id\n * @param {String} relationshipName\n * @param {String} relationshipId\n */\n removeFromRelatedRecords (type, id, relationshipName, relationshipId) {\n this._validateRelationship(type, relationshipName, 'hasMany')\n const relationshipType = this._schema.models[type].relationships[relationshipName].model\n return this._storeUpdate('removeFromRelatedRecords', [{type, id}, relationshipName, {type: relationshipType, id: relationshipId}])\n }\n\n /**\n * Replaces every member of a to-many relationship\n *\n * @param {String} type\n * @param {String} id\n * @param {String} relationshipName\n * @param {String[]} relationshipIds\n */\n replaceRelatedRecords (type, id, relationshipName, relationshipIds) {\n this._validateRelationship(type, relationshipName, 'hasMany')\n const relationshipType = this._schema.models[type].relationships[relationshipName].model\n const data = relationshipIds.map(id => ({type: relationshipType, id}))\n return this._storeUpdate('replaceRelatedRecords', [{type, id}, relationshipName, data])\n }\n\n /**\n * Replaces a to-one relationship\n *\n * @param {String} type\n * @param {String} id\n * @param {String} relationshipName\n * @param {String} relationshipId\n */\n replaceRelatedRecord (type, id, relationshipName, relationshipId) {\n this._validateRelationship(type, relationshipName, 'hasOne')\n const relationshipType = this._schema.models[type].relationships[relationshipName].model\n return this._storeUpdate('replaceRelatedRecord', [{type, id}, relationshipName, {type: relationshipType, id: relationshipId}])\n }\n\n /**\n * Find a record by its identity.\n *\n * @param {String} type\n * @param {String} id\n */\n findRecord (type, id) {\n return this._storeQuery('findRecord', [{type, id}])\n }\n\n /**\n * Find all records of a specific type.\n *\n * @param {String} type\n * @param {Object} query\n */\n findRecords (type, query) {\n const hook = (builder) => {\n if (query.filter) {\n for (let filter of query.filter) {\n builder.filter(filter)\n }\n }\n if (query.sort) {\n for (let sort of query.sort) {\n builder.sort(sort)\n }\n }\n if (query.page) {\n builder.page(query.page)\n }\n return builder\n }\n return this._storeQuery('findRecords', [type], hook)\n }\n\n /**\n * Find a related record in a to-one relationship\n *\n * @param {String} type\n * @param {String} id\n * @param {String} relationship\n */\n findRelatedRecord (type, id, relationship) {\n this._validateRelationship(type, relationship, 'hasOne')\n return this._storeQuery('findRelatedRecord', [{type, id}, relationship])\n }\n\n /**\n * Find a related record in a to-one relationship\n *\n * @param {String} type\n * @param {String} id\n * @param {String} relationship\n */\n findRelatedRecords (type, id, relationship) {\n this._validateRelationship(type, relationship, 'hasMany')\n return this._storeQuery('findRelatedRecords', [{type, id}, relationship])\n }\n\n _validateRelationship (type, name, relationshipType) {\n const isValid = this._schema.models[type] &&\n this._schema.models[type].relationships[name] &&\n (!relationshipType || this._schema.models[type].relationships[name].type === relationshipType)\n if (!isValid) {\n throw new Error('Invalid relationship ' + name + ' on model ' + type + ' with type ' + relationshipType)\n }\n }\n\n _serialize (type, object) {\n return this._serializer.serialize(type, object).data\n }\n\n _storeUpdate (method, args) {\n const requestId = this._createRequest()\n const promise = this._store.update(t => t[method].apply(t, args)).then(\n jsonApiObject => this._handeRequestSuccess(requestId, jsonApiObject)\n ).catch(\n error => this._handleRequestError(requestId, error)\n )\n return {requestId, promise}\n }\n\n _storeQuery (method, args, hook) {\n const requestId = this._createRequest()\n const promise = this._store.query(queryBuilder => {\n let query = queryBuilder[method].apply(queryBuilder, args)\n if (hook) {\n query = hook(query)\n }\n return query\n }).then(\n jsonApiObject => this._handeRequestSuccess(requestId, jsonApiObject)\n ).catch(\n error => this._handleRequestError(requestId, error)\n )\n return {requestId, promise}\n }\n\n _createRequest () {\n const requestId = ++this._lastRequestId\n this._mergeState({\n requests: {\n [requestId]: {\n id: requestId,\n completed: false,\n timestamp: (new Date()).getTime()\n }\n }\n })\n return requestId\n }\n\n _handeRequestSuccess (requestId, response) {\n const idsByType = {}\n if (Array.isArray(response)) {\n for (let item of response) {\n if (!idsByType[item.type]) {\n idsByType[item.type] = []\n }\n idsByType[item.type].push(item.id)\n }\n } else if (response && response.type) {\n idsByType[response.type] = [response.id]\n }\n this._insertEntities(requestId, normalize({data: response}), idsByType)\n }\n\n _handleRequestError (requestId, error) {\n if (!(error instanceof OrbitException)) {\n this._events.emit('unhandledError', error, requestId)\n return error\n }\n const request = {\n id: requestId,\n completed: true,\n result: {},\n error: {\n message: error.message,\n description: error.description,\n type: error.type,\n id: error.id,\n relationship: error.relationship\n }\n }\n this._mergeState({\n entities: {},\n requests: {\n [requestId]: request\n }\n })\n }\n\n _insertEntities (requestId, entities, idsByType) {\n const request = {\n id: requestId,\n completed: true,\n result: idsByType,\n error: null\n }\n this._mergeState({\n entities: entities,\n requests: {\n [requestId]: request\n }\n })\n }\n\n _mergeState (mergedState) {\n const newState = Object.assign({}, this._state)\n for (let key in mergedState.entities) {\n newState.entities[key] = Object.assign({}, this._state.entities[key], mergedState.entities[key])\n }\n for (let key in mergedState.requests) {\n newState.requests[key] = Object.assign({}, this._state.requests[key], mergedState.requests[key])\n }\n this._state = newState\n this._events.emit('change', this._state)\n }\n}\n","/**\n * Returns an request object from current state tree\n */\nexport default function requestSelector (state, requestId) {\n return state.requests[requestId]\n}\n","import build from 'redux-object'\n\n/**\n * Return a record from current state tree\n */\nexport default function recordSelector (state, type, id) {\n return build(state.entities, type, id)\n}\n"],"names":["Serializer","schema","_formatter","Jsona","_schema","type","object","relationships","models","relationshipNames","Object","keys","relationshipName","Array","isArray","map","_augmentObject","model","relationshipObject","assign","serialize","stuff","StateTree","store","_store","_serializer","_events","EventEmitter","_lastRequestId","_state","callback","addListener","_storeUpdate","_serialize","id","keyName","keyValue","attributeName","attributeValue","relationshipId","_validateRelationship","relationshipType","relationshipIds","data","_storeQuery","query","hook","builder","filter","sort","page","relationship","name","isValid","Error","method","args","requestId","_createRequest","promise","update","t","apply","then","_handeRequestSuccess","jsonApiObject","catch","_handleRequestError","error","queryBuilder","_mergeState","Date","getTime","response","idsByType","item","push","_insertEntities","normalize","OrbitException","emit","request","message","description","entities","mergedState","newState","key","requests","requestSelector","state","recordSelector","build"],"mappings":"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"}