/
Instance.js.map
1 lines (1 loc) · 25.4 KB
/
Instance.js.map
1
{"version":3,"sources":["lib/Instance.ts"],"names":[],"mappings":"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","file":"lib/Instance.js","sourcesContent":["import {Core} from './Core';\r\nimport {Model} from './Model';\r\nimport {Plugin} from './Plugins';\r\nimport {CacheDirector} from './CacheDirector';\r\nimport * as General from './General';\r\nimport * as ModelInterfaces from './ModelInterfaces';\r\nimport * as Index from './Index';\r\nimport {Schema} from './Schema';\r\nimport {Transforms} from './Transforms';\r\nimport {DefaultValidators} from './Validators';\r\n\r\nimport _ = require('lodash');\r\nimport MongoDB = require('mongodb');\r\nimport Bluebird = require('bluebird');\r\nimport Skmatc = require('skmatc');\r\n\r\n/**\r\n * The default Iridium Instance implementation which provides methods for saving, refreshing and\r\n * removing the wrapped document from the collection, as well as integrating with Omnom, our\r\n * built in document diff processor which allows clean, atomic, document updates to be performed\r\n * without needing to write the update queries yourself.\r\n *\r\n * @param TDocument The interface representing the structure of the documents in the collection.\r\n * @param TInstance The type of instance which wraps the documents, generally the subclass of this class.\r\n *\r\n * This class will be subclassed automatically by Iridium to create a model specific instance\r\n * which takes advantage of some of v8's optimizations to boost performance significantly.\r\n * The instance returned by the model, and all of this instance's methods, will be of type\r\n * TInstance - which should represent the merger of TSchema and IInstance for best results.\r\n */\r\nexport class Instance<TDocument extends { _id?: any }, TInstance> {\r\n /**\r\n * Creates a new instance which represents the given document as a type of model\r\n * @param model The model that dictates the collection the document originated from as well as how validations are performed.\r\n * @param document The document which should be wrapped by this instance\r\n * @param isNew Whether the document is new (doesn't exist in the database) or not\r\n * @param isPartial Whether the document has only a subset of its fields populated\r\n *\r\n */\r\n constructor(model: Model<TDocument, TInstance>, document: TDocument, isNew: boolean = true, isPartial: boolean = false) {\r\n this._model = model;\r\n\r\n this._isNew = !!isNew;\r\n this._isPartial = isPartial;\r\n this._original = document;\r\n this._modified = model.helpers.cloneDocument(document);\r\n\r\n _.each(model.core.plugins,(plugin: Plugin) => {\r\n if (plugin.newInstance) plugin.newInstance(this, model);\r\n });\r\n }\r\n\r\n private _isNew: boolean;\r\n private _isPartial: boolean;\r\n private _model: Model<TDocument, TInstance>;\r\n private _original: TDocument;\r\n private _modified: TDocument;\r\n\r\n /**\r\n * Gets the underlying document representation of this instance\r\n */\r\n get document(): TDocument {\r\n return this._modified;\r\n }\r\n\r\n [name: string]: any;\r\n\r\n /**\r\n * A function which is called whenever a new document is in the process of being inserted into the database.\r\n * @param document The document which will be inserted into the database.\r\n */\r\n static onCreating: (document: { _id?: any }) => Promise.Thenable<any> | void;\r\n\r\n /**\r\n * A function which is called whenever a document of this type is received from the database, prior to it being\r\n * wrapped by an Instance object.\r\n * @param document The document that was retrieved from the database.\r\n */\r\n static onRetrieved: (document: { _id?: any }) => Promise.Thenable<any> | void;\r\n\r\n /**\r\n * A function which is called whenever a new instance has been created to wrap a document.\r\n * @param instance The instance which has been created.\r\n */\r\n static onReady: (instance: Instance<{ _id?: any }, Instance<{ _id?: any }, any>>) => Promise.Thenable<any> | void;\r\n\r\n /**\r\n * A function which is called whenever an instance's save() method is called to allow you to interrogate and/or manipulate\r\n * the changes which are being made.\r\n *\r\n * @param instance The instance to which the changes are being made\r\n * @param changes The MongoDB change object describing the changes being made to the document.\r\n */\r\n static onSaving: (instance: Instance<{ _id?: any }, Instance<{ _id?: any }, any>>, changes: any) => Promise.Thenable<any> | void;\r\n\r\n /**\r\n * The name of the collection into which documents of this type are stored.\r\n */\r\n static collection: string;\r\n\r\n /**\r\n * The schema used to validate documents of this type before being stored in the database.\r\n */\r\n static schema: Schema = {\r\n _id: false\r\n };\r\n\r\n /**\r\n * Additional which should be made available for use in the schema definition for this instance.\r\n */\r\n static validators: Skmatc.Validator[] = DefaultValidators();\r\n\r\n /**\r\n * The transformations which should be applied to properties of documents of this type.\r\n */\r\n static transforms: Transforms = {\r\n\r\n };\r\n\r\n /**\r\n * The cache director used to derive unique cache keys for documents of this type.\r\n */\r\n static cache: CacheDirector;\r\n\r\n /**\r\n * The indexes which should be managed by Iridium for the collection used by this type.\r\n */\r\n static indexes: (Index.Index | Index.IndexSpecification)[] = [];\r\n\r\n /**\r\n * Saves any changes to this instance, using the built in diff algorithm to write the update query.\r\n * @param {function(Error, IInstance)} callback A callback which is triggered when the save operation completes\r\n * @returns {Promise<TInstance>}\r\n */\r\n save(callback?: General.Callback<TInstance>): Bluebird<TInstance>;\r\n /**\r\n * Saves the given changes to this instance and updates the instance to match the latest database document.\r\n * @param {Object} changes The MongoDB changes object to be used when updating this instance\r\n * @param {function(Error, IInstance)} callback A callback which is triggered when the save operation completes\r\n * @returns {Promise<TInstance>}\r\n */\r\n save(changes: Object, callback?: General.Callback<TInstance>): Bluebird<TInstance>;\r\n /**\r\n * Saves the given changes to this instance and updates the instance to match the latest database document.\r\n * @param {Object} conditions The conditions under which the update will take place - these will be merged with an _id query\r\n * @param {Object} changes The MongoDB changes object to be used when updating this instance\r\n * @param {function(Error, IInstance)} callback A callback which is triggered when the save operation completes\r\n * @returns {Promise<TInstance>}\r\n */\r\n save(conditions: Object, changes: Object, callback?: General.Callback<TInstance>): Bluebird<TInstance>;\r\n save(...args: any[]): Bluebird<TInstance> {\r\n var callback: General.Callback<any> = null;\r\n var changes: any = null;\r\n var conditions: any = {};\r\n\r\n Array.prototype.slice.call(args, 0).reverse().forEach((arg) => {\r\n if (typeof arg == 'function') callback = arg;\r\n else if (typeof arg == 'object') {\r\n if (!changes) changes = arg;\r\n else conditions = arg;\r\n }\r\n });\r\n\r\n return Bluebird.resolve().then(() => {\r\n conditions = this._model.helpers.cloneConditions(conditions);\r\n _.merge(conditions, { _id: this._modified._id });\r\n\r\n if (!changes) {\r\n var validation = this._model.helpers.validate(this._modified);\r\n if (validation.failed) return Bluebird.reject(validation.error).bind(this).nodeify(callback);\r\n\r\n var original = this._model.helpers.cloneDocument(this._original);\r\n var modified = this._model.helpers.cloneDocument(this._modified);\r\n \r\n modified = this._model.helpers.transformToDB(modified, { document: true }); \r\n\r\n changes = this._model.helpers.diff(original, modified);\r\n }\r\n\r\n if (!_.keys(changes).length) return null;\r\n\r\n return changes;\r\n }).then((changes) => {\r\n if (!changes && !this._isNew) return changes;\r\n return this._model.handlers.savingDocument(<TInstance><any>this, changes).then(() => changes);\r\n }).then((changes) => {\r\n if (!changes && !this._isNew) return false;\r\n\r\n if (this._isNew) {\r\n return new Bluebird<boolean>((resolve, reject) => {\r\n this._model.collection.insertOne(this._modified, { w: 'majority' }, (err, doc) => {\r\n if (err) return reject(err);\r\n return resolve(<any>!!doc);\r\n });\r\n });\r\n } else {\r\n return new Bluebird<boolean>((resolve: (changed: boolean) => void, reject) => {\r\n this._model.collection.updateOne(conditions, changes, { w: 'majority' }, (err: Error, changed: boolean) => {\r\n if(err) {\r\n err['conditions'] = conditions;\r\n err['changes'] = changes;\r\n return reject(err);\r\n }\r\n\r\n return resolve(changed);\r\n });\r\n });\r\n }\r\n }).catch(err => {\r\n err['original'] = this._original;\r\n err['modified'] = this._modified;\r\n return Bluebird.reject(err);\r\n }).then((changed: boolean) => {\r\n conditions = { _id: this._modified._id };\r\n if (!changed) return this._modified;\r\n\r\n return new Bluebird<TDocument>((resolve, reject) => {\r\n this._model.collection.findOne(conditions, (err: Error, latest) => {\r\n if (err) return reject(err);\r\n return resolve(latest);\r\n });\r\n });\r\n }).then((latest: TDocument) => {\r\n if(!latest) {\r\n this._isNew = true;\r\n this._original = this._model.helpers.cloneDocument(this._modified);\r\n return Bluebird.resolve(<TInstance><any>this);\r\n }\r\n\r\n return this._model.handlers.documentReceived(conditions, latest, (value) => {\r\n this._isPartial = false;\r\n this._isNew = false;\r\n this._modified = value;\r\n this._original = this._model.helpers.cloneDocument(value);\r\n return <TInstance><any>this;\r\n });\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Updates this instance to match the latest document available in the backing collection\r\n * @param {function(Error, IInstance)} callback A callback which is triggered when the update completes\r\n * @returns {Promise<TInstance>}\r\n */\r\n update(callback?: General.Callback<TInstance>): Bluebird<TInstance> {\r\n return this.refresh(callback);\r\n }\r\n\r\n /**\r\n * Updates this instance to match the latest document available in the backing collection\r\n * @param {function(Error, IInstance)} callback A callback which is triggered when the update completes\r\n * @returns {Promise<TInstance>}\r\n */\r\n refresh(callback?: General.Callback<TInstance>): Bluebird<TInstance> {\r\n var conditions = { _id: this._original._id };\r\n\r\n return Bluebird.resolve().then(() => {\r\n return new Bluebird<TDocument>((resolve, reject) => {\r\n this._model.collection.findOne(conditions,(err: Error, doc: any) => {\r\n if (err) return reject(err);\r\n return resolve(doc);\r\n });\r\n });\r\n }).then((newDocument) => {\r\n if (!newDocument) {\r\n this._isPartial = true;\r\n this._isNew = true;\r\n this._original = this._model.helpers.cloneDocument(this._modified);\r\n return <Bluebird<TInstance>><any>this;\r\n }\r\n\r\n return this._model.handlers.documentReceived(conditions, newDocument, (doc) => {\r\n this._isNew = false;\r\n this._isPartial = false;\r\n this._original = doc;\r\n this._modified = this._model.helpers.cloneDocument(doc);\r\n\r\n return <TInstance><any>this;\r\n });\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Removes this instance's document from the backing collection\r\n * @param {function(Error, IInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise<TInstance>}\r\n */\r\n delete(callback?: General.Callback<TInstance>): Bluebird<TInstance> {\r\n return this.remove(callback);\r\n }\r\n\r\n /**\r\n * Removes this instance's document from the backing collection\r\n * @param {function(Error, IInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise<TInstance>}\r\n */\r\n remove(callback?: General.Callback<TInstance>): Bluebird<TInstance> {\r\n var conditions = { _id: this._original._id };\r\n\r\n return Bluebird.resolve().then(() => {\r\n if (this._isNew) return 0;\r\n return new Bluebird<number>((resolve, reject) => {\r\n this._model.collection.remove(conditions, { w: 'majority' },(err: Error, removed?: any) => {\r\n if (err) return reject(err);\r\n return resolve(removed);\r\n });\r\n });\r\n }).then((removed) => {\r\n if (removed) return this._model.cache.clear(conditions);\r\n return false;\r\n }).then(() => {\r\n this._isNew = true;\r\n return <TInstance><any>this;\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Retrieves the first element in an enumerable collection which matches the predicate\r\n * @param collection The collection from which to retrieve the element\r\n * @param predicate The function which determines whether to select an element\r\n * @returns The first element in the array which matched the predicate.\r\n */\r\n first<T>(collection: T[], predicate: General.Predicate<T>): T;\r\n /**\r\n * Retrieves the first element in an enumerable collection which matches the predicate\r\n * @param collection The collection from which to retrieve the element\r\n * @param predicate The function which determines whether to select an element\r\n * @returns The first element in the object which matched the predicate.\r\n */\r\n first<T>(collection: { [key: string]: T }, predicate: General.Predicate<T>): T;\r\n first<T>(collection: T[]| { [key: string]: T }, predicate: General.Predicate<T>): T {\r\n var result = null;\r\n\r\n _.each(collection,(value: T, key) => {\r\n if (predicate.call(this, value, key)) {\r\n result = value;\r\n return false;\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Retrieves a number of elements from an enumerable collection which match the predicate\r\n * @param collection The collection from which elements will be plucked\r\n * @param predicate The function which determines the elements to be plucked\r\n * @returns A new array containing the elements in the array which matched the predicate.\r\n */\r\n select<T>(collection: T[], predicate: General.Predicate<T>): T[];\r\n /**\r\n * Retrieves a number of elements from an enumerable collection which match the predicate\r\n * @param collection The collection from which elements will be plucked\r\n * @param predicate The function which determines the elements to be plucked\r\n * @returns An object with the properties from the collection which matched the predicate.\r\n */\r\n select<T>(collection: { [key: string]: T }, predicate: General.Predicate<T>): { [key: string]: T };\r\n select<T>(collection: T[]| { [key: string]: T }, predicate: General.Predicate<T>): any {\r\n var isArray = Array.isArray(collection);\r\n var results: any = isArray ? [] : {};\r\n\r\n _.each(collection,(value: T, key) => {\r\n if (predicate.call(this, value, key)) {\r\n if (isArray) results.push(value);\r\n else results[key] = value;\r\n }\r\n });\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Gets the JSON representation of this instance\r\n * @returns {TDocument}\r\n */\r\n toJSON(): any {\r\n return this.document;\r\n }\r\n\r\n /**\r\n * Gets a string representation of this instance\r\n * @returns {String}\r\n */\r\n toString(): string {\r\n return JSON.stringify(this.document, null, 2);\r\n }\r\n}"],"sourceRoot":"/source/"}