diff --git a/Iridium.njsproj b/Iridium.njsproj index 414c122..ab88aa7 100644 --- a/Iridium.njsproj +++ b/Iridium.njsproj @@ -52,8 +52,17 @@ Code Mocha + + Code + Mocha + + + Code + Mocha + + diff --git a/lib/Model.js b/lib/Model.js index a7884ea..9d75711 100644 --- a/lib/Model.js +++ b/lib/Model.js @@ -431,7 +431,7 @@ var Model = (function () { if (typeof (specification) === 'string') index = specification; else { - index = _(specification).map(function (direction, key) { return key + '_' + direction; }).reduce(function (x, y) { return x + '_' + y; }, '').value(); + index = _(specification).map(function (direction, key) { return key + '_' + direction; }).reduce(function (x, y) { return x + '_' + y; }, ''); } return new Promise(function (resolve, reject) { _this.collection.dropIndex(index, function (err, count) { diff --git a/lib/Model.js.map b/lib/Model.js.map index 91ffc7d..e49352b 100644 --- a/lib/Model.js.map +++ b/lib/Model.js.map @@ -1 +1 @@ -{"version":3,"file":"Model.js","sourceRoot":"","sources":["Model.ts"],"names":["Model","Model.constructor","Model.options","Model.helpers","Model.handlers","Model.schema","Model.core","Model.collection","Model.collectionName","Model.cacheDirector","Model.cache","Model.wrap","Model.find","Model.get","Model.findOne","Model.create","Model.insert","Model.update","Model.count","Model.remove","Model.ensureIndex","Model.ensureIndices","Model.dropIndex","Model.dropIndexes","ModelSpecificInstance","ModelSpecificInstance.constructor","ModelSpecificInstance.build","ModelHelpers","ModelHelpers.constructor","ModelHelpers.transform","ModelHelpers.validate","ModelHelpers.selectOne","ModelHelpers.identifierField","ModelHelpers.selectOneDownstream","ModelHelpers.wrapDocument","ModelHelpers.diff","ModelHandlers","ModelHandlers.constructor","ModelHandlers.model","ModelHandlers.documentsReceived","ModelHandlers.creatingDocuments","ModelHandlers.savingDocument","ModelCache","ModelCache.constructor","ModelCache.model","ModelCache.set","ModelCache.get","ModelCache.clear"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Model.js","sourceRoot":"","sources":["Model.ts"],"names":["Model","Model.constructor","Model.options","Model.helpers","Model.handlers","Model.schema","Model.core","Model.collection","Model.collectionName","Model.cacheDirector","Model.cache","Model.wrap","Model.find","Model.get","Model.findOne","Model.create","Model.insert","Model.update","Model.count","Model.remove","Model.ensureIndex","Model.ensureIndices","Model.dropIndex","Model.dropIndexes","ModelSpecificInstance","ModelSpecificInstance.constructor","ModelSpecificInstance.build","ModelHelpers","ModelHelpers.constructor","ModelHelpers.transform","ModelHelpers.validate","ModelHelpers.selectOne","ModelHelpers.identifierField","ModelHelpers.selectOneDownstream","ModelHelpers.wrapDocument","ModelHelpers.diff","ModelHandlers","ModelHandlers.constructor","ModelHandlers.model","ModelHandlers.documentsReceived","ModelHandlers.creatingDocuments","ModelHandlers.savingDocument","ModelCache","ModelCache.constructor","ModelCache.model","ModelCache.set","ModelCache.get","ModelCache.clear"],"mappings":"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"} \ No newline at end of file diff --git a/lib/Model.ts b/lib/Model.ts index 66d62af..3eb5697 100644 --- a/lib/Model.ts +++ b/lib/Model.ts @@ -1 +1 @@ -/// import MongoDB = require('mongodb'); import Skmatc = require('skmatc'); import Concoction = require('concoction'); import Promise = require('bluebird'); import util = require('util'); import _ = require('lodash'); import Iridium = require('./Core'); import instance = require('./Instance'); import ISchema = require('./Schema'); import hooks = require('./Hooks'); import IPlugin = require('./Plugins'); import cache = require('./Cache'); import CacheDirector = require('./CacheDirector'); import general = require('./General'); import noOpCache = require('./caches/NoOpCache'); import memoryCache = require('./caches/MemoryCache'); import idCacheController = require('./cacheControllers/IDDirector'); import Omnom = require('./utils/Omnom'); /** * An Iridium Model which represents a structured MongoDB collection * @class */ export class Model implements IModel { /** * Creates a new Iridium model representing a given ISchema and backed by a collection whose name is specified * @param {Iridium} core The Iridium core that this model should use for database access * @param {String} collection The name of the collection within the database which should be used by this model * @param {schema} schema The schema defining the data validations to be performed on the model * @param {IModelOptions} options The options dictating the behaviour of the model * @returns {Model} * @constructor */ constructor(core: Iridium, instanceType, collection: string, schema: ISchema, options: IModelOptions = {}) { // Allow instantiation doing `require('iridium').Model(db, 'collection', {})` if (!(this instanceof Model)) return new Model(core, instanceType, collection, schema, options); if (!(core instanceof Iridium)) throw new Error("You failed to provide a valid Iridium core for this model"); if (typeof instanceType != 'function') throw new Error("You failed to provide a valid instance constructor for this model"); if (typeof collection != 'string' || !collection) throw new Error("You failed to provide a valid collection name for this model"); if (!_.isPlainObject(schema) || !_.keys(schema).length) throw new Error("You failed to provide a valid schema for this model"); options = options || {}; _.defaults(options, >{ hooks: {}, transforms: [ new Concoction.Rename({ _id: 'id' }), new Concoction.Convert({ id: { apply: function (value) { return (value && value.id) ? new MongoDB.ObjectID(value.id).toHexString() : value; }, reverse: function (value) { if (value === null || value === undefined) return undefined; if (value && /^[a-f0-9]{24}$/.test(value)) return MongoDB.ObjectID.createFromHexString(value); return value; } } }) ], cache: new idCacheController() }); this._core = core; this._collection = collection; this._schema = schema; this._options = options; core.plugins.forEach(function (plugin: IPlugin) { if (plugin.newModel) plugin.newModel(this); }); this._cache = new ModelCache(this); this._Instance = new ModelSpecificInstance(this, instanceType); this._helpers = new ModelHelpers(this); this._handlers = new ModelHandlers(this); } private _options: IModelOptions; /** * Gets the options provided when instantiating this model * @public * @returns {IModelOptions} * @description * This is intended to be consumed by plugins which require any configuration * options. Changes made to this object after the {plugin.newModel} hook are * called will not have any effect on this model. */ get options(): IModelOptions { return this._options; } private _helpers: ModelHelpers; /** * Provides helper methods used by Iridium for common tasks * @returns {ModelHelpers} */ get helpers(): ModelHelpers { return this._helpers; } private _handlers: ModelHandlers; /** * Provides helper methods used by Iridium for hook delegation and common processes * @returns {ModelHandlers} */ get handlers(): ModelHandlers { return this._handlers; } private _schema: ISchema; /** * Gets the ISchema dictating the data structure represented by this model * @public * @returns {schema} */ get schema(): ISchema { return this._schema; } private _core: Iridium; /** * Gets the Iridium core that this model is associated with * @public * @returns {Iridium} */ get core(): Iridium { return this._core; } private _collection: string; /** * Gets the underlying MongoDB collection from which this model's documents are retrieved * @public * @returns {Collection} */ get collection(): MongoDB.Collection { return this.core.connection.collection(this._collection); } /** * Gets the name of the underlying MongoDB collection from which this model's documents are retrieved * @public */ get collectionName(): string { return this._collection; } /** * Sets the name of the underlying MongoDB collection from which this model's documents are retrieved * @public */ set collectionName(value: string) { this._collection = value; } private _cacheDirector: CacheDirector; /** * Gets the cache controller which dictates which queries will be cached, and under which key * @public * @returns {CacheDirector} */ get cacheDirector(): CacheDirector { return this._cacheDirector; } private _cache: ModelCache; /** * Gets the cache responsible for storing objects for quick retrieval under certain conditions * @public * @returns {ModelCache} */ get cache(): ModelCache { return this._cache; } private _Instance: ModelSpecificInstance; /** * Wraps the given document using the instance constructor provided for this model * @public * @param {TDocument} document The document to wrap in an instance object * @param {Boolean} isNew Whether the document is present in the database or not * @param {Boolean} isPartial Whether the document contains all properties defined in the database * @returns {function(Object): Instance} * @constructor */ wrap(document: TDocument, isNew: boolean = true, isPartial: boolean = false): TInstance { return this._Instance.build(document, isNew, isPartial); } /** * Retrieves all documents in the collection and wraps them as instances * @param {function(Error, TInstance[])} callback An optional callback which will be triggered when results are available * @returns {Promise} */ find(callback?: general.Callback): Promise; /** * Returns all documents in the collection which match the conditions and wraps them as instances * @param {Object} conditions The MongoDB query dictating which documents to return * @param {function(Error, TInstance[])} callback An optional callback which will be triggered when results are available * @returns {Promise} */ find(conditions: any, callback?: general.Callback): Promise; /** * Returns all documents in the collection which match the conditions * @param {Object} conditions The MongoDB query dictating which documents to return * @param {QueryOptions} options The options dictating how this function behaves * @param {function(Error, TInstance[])} callback An optional callback which will be triggered when results are available * @returns {Promise} */ find(conditions: any, options: QueryOptions, callback?: general.Callback): Promise; find(conditions?: any, options?: QueryOptions, callback?: general.Callback): Promise { if (typeof options == 'function') { callback = >options; options = {}; } if (typeof conditions == 'function') { callback = >conditions; conditions = {}; options = {}; } conditions = conditions || {}; options = options || {}; _.defaults(options, { }); return Promise.resolve().then(() => { if (options.fields) this.helpers.transform.reverse(options.fields); if (!_.isPlainObject(conditions)) conditions = this.helpers.selectOneDownstream(conditions); this.helpers.transform.reverse(conditions); var cursor = this.collection.find(conditions, { limit: options.limit, sort: options.sort, skip: options.skip, fields: options.fields }); return Promise.promisify((callback) => { cursor.toArray(callback); })(); }).then((results: TDocument[]) => { if (!results || !results.length) return Promise.resolve([]); return this.handlers.documentsReceived(conditions, results,(document, isNew?, isPartial?) => this.helpers.wrapDocument(document, isNew, isPartial), options); }).nodeify(callback); } /** * Retrieves a single document from the collection and wraps it as an instance * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ get(callback?: general.Callback): Promise; /** * Retrieves a single document from the collection with the given ID and wraps it as an instance * @param {any} id The document's unique _id field value in downstream format * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ get(id: any, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection which matches the conditions * @param {Object} conditions The MongoDB query dictating which document to return * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ get(conditions: { [key: string]: any }, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection with the given ID and wraps it as an instance * @param {any} id The document's unique _id field value in downstream format * @param {QueryOptions} options The options dictating how this function behaves * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ get(id: any, options: QueryOptions, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection which matches the conditions * @param {Object} conditions The MongoDB query dictating which document to return * @param {QueryOptions} options The options dictating how this function behaves * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ get(conditions: { [key: string]: any }, options: QueryOptions, callback?: general.Callback): Promise; get(...args: any[]): Promise { return this.get.apply(this, args); } /** * Retrieves a single document from the collection and wraps it as an instance * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ findOne(callback?: general.Callback): Promise; /** * Retrieves a single document from the collection with the given ID and wraps it as an instance * @param {any} id The document's unique _id field value in downstream format * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ findOne(id: any, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection which matches the conditions * @param {Object} conditions The MongoDB query dictating which document to return * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ findOne(conditions: { [key: string]: any }, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection with the given ID and wraps it as an instance * @param {any} id The document's unique _id field value in downstream format * @param {QueryOptions} options The options dictating how this function behaves * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ findOne(id: any, options: QueryOptions, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection which matches the conditions * @param {Object} conditions The MongoDB query dictating which document to return * @param {QueryOptions} options The options dictating how this function behaves * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ findOne(conditions: { [key: string]: any }, options: QueryOptions, callback?: general.Callback): Promise; findOne(...args: any[]): Promise { var conditions: { [key: string]: any } = null; var options: QueryOptions = null; var callback: general.Callback = null; for (var argI = 0; argI < args.length; argI++) { if (typeof args[argI] == 'function') callback = callback || args[argI]; else if (_.isPlainObject(args[argI])) { if (conditions) options = args[argI]; else conditions = args[argI]; } else conditions = this.helpers.selectOneDownstream(args[argI]); } conditions = conditions || {}; options = options || {}; _.defaults(options, { wrap: true, cache: true }); return Promise.resolve().bind(this).then(() => { this.helpers.transform.reverse(conditions); if (options.fields) this.helpers.transform.reverse(options.fields); return this.cache.get(conditions); }).then((cachedDocument: TDocument) => { if (cachedDocument) return cachedDocument; return new Promise((resolve, reject) => { this.collection.findOne(conditions, { fields: options.fields, skip: options.skip, sort: options.sort, limit: options.limit },(err, result) => { if (err) return reject(err); return resolve(result); }); }); }).then((document: TDocument) => { if (!document) return null; return this.handlers.documentsReceived(conditions, [document],(document, isNew?, isPartial?) => this.helpers.wrapDocument(document, isNew, isPartial), options).then((documents) => documents[0]); }).nodeify(callback); } create(objects: TDocument, callback?: general.Callback): Promise; create(objects: TDocument, options: CreateOptions, callback?: general.Callback): Promise; create(objects: TDocument[], callback?: general.Callback): Promise; create(objects: TDocument[], options: CreateOptions, callback?: general.Callback): Promise; create(...args: any[]): Promise { return this.insert.apply(this, args); } insert(objects: TDocument, callback?: general.Callback): Promise; insert(objects: TDocument, options: CreateOptions, callback?: general.Callback): Promise; insert(objects: TDocument[], callback?: general.Callback): Promise; insert(objects: TDocument[], options: CreateOptions, callback?: general.Callback): Promise; insert(objs: TDocument | TDocument[], ...args: any[]): Promise { var objects: TDocument[]; var options: CreateOptions = {}; var callback: general.Callback = null; if (typeof args[0] == 'function') callback = args[0]; else { options = args[0]; callback = args[1]; } var returnArray: boolean = false; if (Array.isArray(objs)) objects = objs; else objects = [objs]; options = options || {}; _.defaults(options, { w: 1 }); return Promise.resolve().then(() => { var queryOptions = { w: options.w, upsert: options.upsert, new: true }; if (options.upsert) return this.handlers.creatingDocuments(objects).map((object: { _id: any; }) => { return new Promise((resolve, reject) => { this.collection.findAndModify({ _id: object._id }, ["_id"], object, queryOptions,(err, result) => { if (err) return reject(err); return resolve(result); }); }); }); else return this.handlers.creatingDocuments(objects).then((objects) => { return new Promise((resolve, reject) => { this.collection.insert(objects, queryOptions,(err, results) => { if (err) return reject(err); return resolve(results); }); }); }); }).then((inserted: any[]) => { return this.handlers.documentsReceived(null, inserted,(document, isNew?, isPartial?) => this.helpers.wrapDocument(document, isNew, isPartial), { cache: options.cache }); }).then((results: TInstance[]) => { if (Array.isArray(objs)) return results; return results[0]; }).nodeify(callback); } update(conditions: any, changes: any, callback?: general.Callback): Promise; update(conditions: any, changes: any, options: UpdateOptions, callback?: general.Callback): Promise; update(conditions: any, changes: any, options?: UpdateOptions, callback?: general.Callback): Promise { if (typeof options == 'function') { callback = >options; options = {}; } _.defaults(options, { w: 1, multi: true }); this.helpers.transform.reverse(conditions); return new Promise((resolve, reject) => { this.collection.update(conditions, changes, options,(err, changes) => { if (err) return reject(err); return resolve(changes); }); }).nodeify(callback); } count(callback?: general.Callback): Promise; count(conditions: any, callback?: general.Callback): Promise; count(conditions?: any, callback?: general.Callback): Promise { if (typeof conditions == 'function') { callback = >conditions; conditions = {}; } var $this = this; return new Promise((resolve, reject) => { $this.collection.count(conditions,(err, results) => { if (err) return reject(err); return resolve(results); }); }).nodeify(callback); } remove(callback?: general.Callback): Promise; remove(conditions: any, callback?: general.Callback): Promise; remove(conditions?: any, callback?: general.Callback): Promise { if (typeof conditions == 'function') { callback = >conditions; conditions = {}; } return new Promise((resolve, reject) => { this.collection.remove(conditions,(err, results) => { if (err) return reject(err); return resolve(results); }); }).then((count) => { return this.cache.clear(conditions).then(() => count); }).nodeify(callback); } ensureIndex(specification: IndexSpecification, callback?: general.Callback): Promise; ensureIndex(specification: IndexSpecification, options: MongoDB.IndexOptions, callback?: general.Callback): Promise; ensureIndex(specification: IndexSpecification, options?: MongoDB.IndexOptions, callback?: general.Callback): Promise { if (typeof options == 'function') { callback = >options; options = {}; } return new Promise((resolve, reject) => { this.collection.ensureIndex(specification, options,(err, name: any) => { if (err) return reject(err); return resolve(name); }); }).nodeify(callback); } ensureIndices(callback?: general.Callback): Promise { return Promise.resolve(this.options.indices).map((index: Index | IndexSpecification) => { return this.ensureIndex((index).spec || index,(index).options || {}); }).nodeify(callback); } dropIndex(name: string, callback?: general.Callback): Promise; dropIndex(index: IndexSpecification, callback?: general.Callback): Promise; dropIndex(specification: string | IndexSpecification, callback?: general.Callback): Promise { var index: string; if (typeof (specification) === 'string') index = specification; else { index = _(specification).map((direction, key) => key + '_' + direction).reduce((x, y) => x + '_' + y, '').value(); } return new Promise((resolve, reject) => { this.collection.dropIndex(index,(err, count) => { if (err) return reject(err); return resolve(count); }); }).nodeify(callback); } dropIndexes(callback?: general.Callback): Promise { return new Promise((resolve, reject) => { this.collection.dropAllIndexes((err, count) => { if (err) return reject(err); return resolve(count); }); }).nodeify(callback); } } export interface IModelBase { collection: MongoDB.Collection; collectionName: string; core: Iridium; schema: ISchema; cache: ModelCache; cacheDirector: CacheDirector; } export interface IModelFactory { (core: Iridium): IModel; } export interface IModelOptions { hooks?: hooks.IHooks; validators?: SkmatcCore.IValidator[]; transforms?: Concoction.Ingredient[]; cache?: CacheDirector; indices?: (Index | IndexSpecification)[]; properties?: { [key: string]: (general.PropertyGetter | general.Property) }; } export interface IModel extends IModelBase { wrap(doc: TDocument, isNew?: boolean, isPartial?: boolean): TInstance; } export class ModelSpecificInstance { constructor(model: Model, instanceConstructor) { this.Constructor = function (document: TDocument, isNew?: boolean, isPartial?: boolean) { instanceConstructor.call(this, model, document, isNew, isPartial); }; util.inherits(this.Constructor, instanceConstructor); _.each(model.schema,(property, key) => { Object.defineProperty(this.Constructor.prototype, key, { get: function () { return this._modified[key]; }, set: function (value) { this._modified[key] = value; }, enumerable: true }); }); } private Constructor: (document: TDocument, isNew?: boolean, isPartial?: boolean) => void; build(document: TDocument, isNew?: boolean, isPartial?: boolean): TInstance { return new this.Constructor(document, isNew, isPartial); } } export class ModelHelpers { constructor(model: Model) { this._model = model; this._validator = new Skmatc(model.schema); this._transform = new Concoction(model.options.transforms); } private _model: Model; private _transform: concoction; /** * Gets the Concoction transforms defined for this model * @returns {Concoction} */ get transform(): Concoction { return this._transform; } private _validator: Skmatc; /** * Validates a document to ensure that it matches the model's ISchema requirements * @param {any} document The document to validate against the ISchema * @returns {SkmatcCore.IResult} The result of the validation */ validate(document: TDocument): SkmatcCore.IResult { return this._validator.validate(document); } /** * Creates a selector based on the document's unique _id field * @param {object} document The document to render the unique selector for * @returns {{_id: any}} A database selector which can be used to return only this document */ selectOne(document: TDocument): { _id: any } { var testDoc: any = _.cloneDeep(document); this.transform.reverse(testDoc); return { _id: testDoc._id }; } /** * Gets the field used in the ISchema to represent the document _id */ get identifierField(): string { var id = new String(""); var testDoc = { _id: id }; this.transform.apply(testDoc); var idField = null; for (var k in testDoc) if (testDoc[k] === id) { idField = k; break; } return idField; } /** * Creates a selector based on the document's unique _id field in downstream format * @param {any} id The downstream identifier to use when creating the selector * @returns {object} A database selector which can be used to return only this document in downstream form */ selectOneDownstream(id: TDocument): any { var conditions = {}; conditions[this.identifierField] = id; return conditions; } /** * Wraps the given document in an instance wrapper for use throughout the application * @param {any} document The document to be wrapped as an instance * @param {Boolean} isNew Whether the instance originated from the database or was created by the application * @param {Boolean} isPartial Whether the document supplied contains all information present in the database * @returns {any} An instance which wraps this document */ wrapDocument(document: TDocument, isNew?: boolean, isPartial?: boolean): TInstance { return this._model.wrap(document, isNew, isPartial); } /** * Performs a diff operation between two documents and creates a MongoDB changes object to represent the differences * @param {any} original The original document prior to changes being made * @param {any} modified The document after changes were made */ diff(original: TDocument, modified: TDocument): any { var omnom = new Omnom(); omnom.diff(original, modified); return omnom.changes; } } export class ModelHandlers { constructor(model: Model) { this._model = model; } private _model: Model; get model(): Model { return this._model; } documentsReceived(conditions: any, results: TDocument[], wrapper: (document: TDocument, isNew?: boolean, isPartial?: boolean) => TInstance, options: QueryOptions = {}): Promise { _.defaults(options, { cache: true, partial: false }); return Promise.resolve(results).map((target: any) => { return >Promise.resolve().then(() => { // Trigger the received hook if (this.model.options.hooks.retrieved) return this.model.options.hooks.retrieved(target); }).then(() => { // Cache the document if caching is enabled if (this.model.core.cache && options.cache && !options.fields) { var cacheDoc = _.cloneDeep(target); return this.model.cache.set(conditions, cacheDoc); } }).then(() => { // Transform the document this.model.helpers.transform.apply(target); // Wrap the document and trigger the ready hook var wrapped: TInstance = wrapper(target, false, !!options.fields); if (this.model.options.hooks.ready) return Promise.resolve(this.model.options.hooks.ready(wrapped)).then(() => wrapped); return wrapped; }); }); } creatingDocuments(documents: TDocument[]): Promise { return Promise.all(documents.map((document: any) => { return Promise.resolve().then(() => { if (this.model.options.hooks.retrieved) return this.model.options.hooks.creating(document); }).then(() => { var validation: SkmatcCore.IResult = this.model.helpers.validate(document); if (validation.failed) return Promise.reject(validation.error); this.model.helpers.transform.reverse(document); return document; }); })); } savingDocument(instance: TInstance, changes: any): Promise { return Promise.resolve().then(() => { if (this.model.options.hooks.saving) return this.model.options.hooks.saving(instance, changes); }).then(() => instance); } } export interface QueryOptions { cache?: boolean; fields?: { [name: string]: number }; limit?: number; skip?: number; sort?: IndexSpecification; } export interface CreateOptions { w?: any; upsert?: boolean; cache?: boolean; } export interface UpdateOptions { w?: any; multi?: boolean; } export interface IndexSpecification { [key: string]: number; } export interface Index { spec: IndexSpecification; options?: MongoDB.IndexOptions; } class ModelCache { constructor(model: IModelBase) { this._model = model; } private _model: IModelBase; get model(): IModelBase { return this._model; } set(conditions: any, value: T): Promise { if (!this.model.cacheDirector || !this.model.cacheDirector.valid(conditions)) return Promise.resolve(value); return this.model.core.cache.set(this.model.cacheDirector.buildKey(conditions), value); } get(conditions: any): Promise { if (!this.model.cacheDirector || !this.model.cacheDirector.valid(conditions)) return Promise.resolve(null); return this.model.core.cache.get(this.model.cacheDirector.buildKey(conditions)); } clear(conditions: any): Promise { if (!this.model.cacheDirector || !this.model.cacheDirector.valid(conditions)) return Promise.resolve(false); return this.model.core.cache.clear(this.model.cacheDirector.buildKey(conditions)); } } +/// import MongoDB = require('mongodb'); import Skmatc = require('skmatc'); import Concoction = require('concoction'); import Promise = require('bluebird'); import util = require('util'); import _ = require('lodash'); import Iridium = require('./Core'); import instance = require('./Instance'); import ISchema = require('./Schema'); import hooks = require('./Hooks'); import IPlugin = require('./Plugins'); import cache = require('./Cache'); import CacheDirector = require('./CacheDirector'); import general = require('./General'); import noOpCache = require('./caches/NoOpCache'); import memoryCache = require('./caches/MemoryCache'); import idCacheController = require('./cacheControllers/IDDirector'); import Omnom = require('./utils/Omnom'); /** * An Iridium Model which represents a structured MongoDB collection * @class */ export class Model implements IModel { /** * Creates a new Iridium model representing a given ISchema and backed by a collection whose name is specified * @param {Iridium} core The Iridium core that this model should use for database access * @param {String} collection The name of the collection within the database which should be used by this model * @param {schema} schema The schema defining the data validations to be performed on the model * @param {IModelOptions} options The options dictating the behaviour of the model * @returns {Model} * @constructor */ constructor(core: Iridium, instanceType, collection: string, schema: ISchema, options: IModelOptions = {}) { // Allow instantiation doing `require('iridium').Model(db, 'collection', {})` if (!(this instanceof Model)) return new Model(core, instanceType, collection, schema, options); if (!(core instanceof Iridium)) throw new Error("You failed to provide a valid Iridium core for this model"); if (typeof instanceType != 'function') throw new Error("You failed to provide a valid instance constructor for this model"); if (typeof collection != 'string' || !collection) throw new Error("You failed to provide a valid collection name for this model"); if (!_.isPlainObject(schema) || !_.keys(schema).length) throw new Error("You failed to provide a valid schema for this model"); options = options || {}; _.defaults(options, >{ hooks: {}, transforms: [ new Concoction.Rename({ _id: 'id' }), new Concoction.Convert({ id: { apply: function (value) { return (value && value.id) ? new MongoDB.ObjectID(value.id).toHexString() : value; }, reverse: function (value) { if (value === null || value === undefined) return undefined; if (value && /^[a-f0-9]{24}$/.test(value)) return MongoDB.ObjectID.createFromHexString(value); return value; } } }) ], cache: new idCacheController() }); this._core = core; this._collection = collection; this._schema = schema; this._options = options; core.plugins.forEach(function (plugin: IPlugin) { if (plugin.newModel) plugin.newModel(this); }); this._cache = new ModelCache(this); this._Instance = new ModelSpecificInstance(this, instanceType); this._helpers = new ModelHelpers(this); this._handlers = new ModelHandlers(this); } private _options: IModelOptions; /** * Gets the options provided when instantiating this model * @public * @returns {IModelOptions} * @description * This is intended to be consumed by plugins which require any configuration * options. Changes made to this object after the {plugin.newModel} hook are * called will not have any effect on this model. */ get options(): IModelOptions { return this._options; } private _helpers: ModelHelpers; /** * Provides helper methods used by Iridium for common tasks * @returns {ModelHelpers} */ get helpers(): ModelHelpers { return this._helpers; } private _handlers: ModelHandlers; /** * Provides helper methods used by Iridium for hook delegation and common processes * @returns {ModelHandlers} */ get handlers(): ModelHandlers { return this._handlers; } private _schema: ISchema; /** * Gets the ISchema dictating the data structure represented by this model * @public * @returns {schema} */ get schema(): ISchema { return this._schema; } private _core: Iridium; /** * Gets the Iridium core that this model is associated with * @public * @returns {Iridium} */ get core(): Iridium { return this._core; } private _collection: string; /** * Gets the underlying MongoDB collection from which this model's documents are retrieved * @public * @returns {Collection} */ get collection(): MongoDB.Collection { return this.core.connection.collection(this._collection); } /** * Gets the name of the underlying MongoDB collection from which this model's documents are retrieved * @public */ get collectionName(): string { return this._collection; } /** * Sets the name of the underlying MongoDB collection from which this model's documents are retrieved * @public */ set collectionName(value: string) { this._collection = value; } private _cacheDirector: CacheDirector; /** * Gets the cache controller which dictates which queries will be cached, and under which key * @public * @returns {CacheDirector} */ get cacheDirector(): CacheDirector { return this._cacheDirector; } private _cache: ModelCache; /** * Gets the cache responsible for storing objects for quick retrieval under certain conditions * @public * @returns {ModelCache} */ get cache(): ModelCache { return this._cache; } private _Instance: ModelSpecificInstance; /** * Wraps the given document using the instance constructor provided for this model * @public * @param {TDocument} document The document to wrap in an instance object * @param {Boolean} isNew Whether the document is present in the database or not * @param {Boolean} isPartial Whether the document contains all properties defined in the database * @returns {function(Object): Instance} * @constructor */ wrap(document: TDocument, isNew: boolean = true, isPartial: boolean = false): TInstance { return this._Instance.build(document, isNew, isPartial); } /** * Retrieves all documents in the collection and wraps them as instances * @param {function(Error, TInstance[])} callback An optional callback which will be triggered when results are available * @returns {Promise} */ find(callback?: general.Callback): Promise; /** * Returns all documents in the collection which match the conditions and wraps them as instances * @param {Object} conditions The MongoDB query dictating which documents to return * @param {function(Error, TInstance[])} callback An optional callback which will be triggered when results are available * @returns {Promise} */ find(conditions: any, callback?: general.Callback): Promise; /** * Returns all documents in the collection which match the conditions * @param {Object} conditions The MongoDB query dictating which documents to return * @param {QueryOptions} options The options dictating how this function behaves * @param {function(Error, TInstance[])} callback An optional callback which will be triggered when results are available * @returns {Promise} */ find(conditions: any, options: QueryOptions, callback?: general.Callback): Promise; find(conditions?: any, options?: QueryOptions, callback?: general.Callback): Promise { if (typeof options == 'function') { callback = >options; options = {}; } if (typeof conditions == 'function') { callback = >conditions; conditions = {}; options = {}; } conditions = conditions || {}; options = options || {}; _.defaults(options, { }); return Promise.resolve().then(() => { if (options.fields) this.helpers.transform.reverse(options.fields); if (!_.isPlainObject(conditions)) conditions = this.helpers.selectOneDownstream(conditions); this.helpers.transform.reverse(conditions); var cursor = this.collection.find(conditions, { limit: options.limit, sort: options.sort, skip: options.skip, fields: options.fields }); return Promise.promisify((callback) => { cursor.toArray(callback); })(); }).then((results: TDocument[]) => { if (!results || !results.length) return Promise.resolve([]); return this.handlers.documentsReceived(conditions, results,(document, isNew?, isPartial?) => this.helpers.wrapDocument(document, isNew, isPartial), options); }).nodeify(callback); } /** * Retrieves a single document from the collection and wraps it as an instance * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ get(callback?: general.Callback): Promise; /** * Retrieves a single document from the collection with the given ID and wraps it as an instance * @param {any} id The document's unique _id field value in downstream format * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ get(id: any, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection which matches the conditions * @param {Object} conditions The MongoDB query dictating which document to return * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ get(conditions: { [key: string]: any }, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection with the given ID and wraps it as an instance * @param {any} id The document's unique _id field value in downstream format * @param {QueryOptions} options The options dictating how this function behaves * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ get(id: any, options: QueryOptions, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection which matches the conditions * @param {Object} conditions The MongoDB query dictating which document to return * @param {QueryOptions} options The options dictating how this function behaves * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ get(conditions: { [key: string]: any }, options: QueryOptions, callback?: general.Callback): Promise; get(...args: any[]): Promise { return this.get.apply(this, args); } /** * Retrieves a single document from the collection and wraps it as an instance * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ findOne(callback?: general.Callback): Promise; /** * Retrieves a single document from the collection with the given ID and wraps it as an instance * @param {any} id The document's unique _id field value in downstream format * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ findOne(id: any, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection which matches the conditions * @param {Object} conditions The MongoDB query dictating which document to return * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ findOne(conditions: { [key: string]: any }, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection with the given ID and wraps it as an instance * @param {any} id The document's unique _id field value in downstream format * @param {QueryOptions} options The options dictating how this function behaves * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ findOne(id: any, options: QueryOptions, callback?: general.Callback): Promise; /** * Retrieves a single document from the collection which matches the conditions * @param {Object} conditions The MongoDB query dictating which document to return * @param {QueryOptions} options The options dictating how this function behaves * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available * @returns {Promise} */ findOne(conditions: { [key: string]: any }, options: QueryOptions, callback?: general.Callback): Promise; findOne(...args: any[]): Promise { var conditions: { [key: string]: any } = null; var options: QueryOptions = null; var callback: general.Callback = null; for (var argI = 0; argI < args.length; argI++) { if (typeof args[argI] == 'function') callback = callback || args[argI]; else if (_.isPlainObject(args[argI])) { if (conditions) options = args[argI]; else conditions = args[argI]; } else conditions = this.helpers.selectOneDownstream(args[argI]); } conditions = conditions || {}; options = options || {}; _.defaults(options, { wrap: true, cache: true }); return Promise.resolve().bind(this).then(() => { this.helpers.transform.reverse(conditions); if (options.fields) this.helpers.transform.reverse(options.fields); return this.cache.get(conditions); }).then((cachedDocument: TDocument) => { if (cachedDocument) return cachedDocument; return new Promise((resolve, reject) => { this.collection.findOne(conditions, { fields: options.fields, skip: options.skip, sort: options.sort, limit: options.limit },(err, result) => { if (err) return reject(err); return resolve(result); }); }); }).then((document: TDocument) => { if (!document) return null; return this.handlers.documentsReceived(conditions, [document],(document, isNew?, isPartial?) => this.helpers.wrapDocument(document, isNew, isPartial), options).then((documents) => documents[0]); }).nodeify(callback); } create(objects: TDocument, callback?: general.Callback): Promise; create(objects: TDocument, options: CreateOptions, callback?: general.Callback): Promise; create(objects: TDocument[], callback?: general.Callback): Promise; create(objects: TDocument[], options: CreateOptions, callback?: general.Callback): Promise; create(...args: any[]): Promise { return this.insert.apply(this, args); } insert(objects: TDocument, callback?: general.Callback): Promise; insert(objects: TDocument, options: CreateOptions, callback?: general.Callback): Promise; insert(objects: TDocument[], callback?: general.Callback): Promise; insert(objects: TDocument[], options: CreateOptions, callback?: general.Callback): Promise; insert(objs: TDocument | TDocument[], ...args: any[]): Promise { var objects: TDocument[]; var options: CreateOptions = {}; var callback: general.Callback = null; if (typeof args[0] == 'function') callback = args[0]; else { options = args[0]; callback = args[1]; } var returnArray: boolean = false; if (Array.isArray(objs)) objects = objs; else objects = [objs]; options = options || {}; _.defaults(options, { w: 1 }); return Promise.resolve().then(() => { var queryOptions = { w: options.w, upsert: options.upsert, new: true }; if (options.upsert) return this.handlers.creatingDocuments(objects).map((object: { _id: any; }) => { return new Promise((resolve, reject) => { this.collection.findAndModify({ _id: object._id }, ["_id"], object, queryOptions,(err, result) => { if (err) return reject(err); return resolve(result); }); }); }); else return this.handlers.creatingDocuments(objects).then((objects) => { return new Promise((resolve, reject) => { this.collection.insert(objects, queryOptions,(err, results) => { if (err) return reject(err); return resolve(results); }); }); }); }).then((inserted: any[]) => { return this.handlers.documentsReceived(null, inserted,(document, isNew?, isPartial?) => this.helpers.wrapDocument(document, isNew, isPartial), { cache: options.cache }); }).then((results: TInstance[]) => { if (Array.isArray(objs)) return results; return results[0]; }).nodeify(callback); } update(conditions: any, changes: any, callback?: general.Callback): Promise; update(conditions: any, changes: any, options: UpdateOptions, callback?: general.Callback): Promise; update(conditions: any, changes: any, options?: UpdateOptions, callback?: general.Callback): Promise { if (typeof options == 'function') { callback = >options; options = {}; } _.defaults(options, { w: 1, multi: true }); this.helpers.transform.reverse(conditions); return new Promise((resolve, reject) => { this.collection.update(conditions, changes, options,(err, changes) => { if (err) return reject(err); return resolve(changes); }); }).nodeify(callback); } count(callback?: general.Callback): Promise; count(conditions: any, callback?: general.Callback): Promise; count(conditions?: any, callback?: general.Callback): Promise { if (typeof conditions == 'function') { callback = >conditions; conditions = {}; } var $this = this; return new Promise((resolve, reject) => { $this.collection.count(conditions,(err, results) => { if (err) return reject(err); return resolve(results); }); }).nodeify(callback); } remove(callback?: general.Callback): Promise; remove(conditions: any, callback?: general.Callback): Promise; remove(conditions?: any, callback?: general.Callback): Promise { if (typeof conditions == 'function') { callback = >conditions; conditions = {}; } return new Promise((resolve, reject) => { this.collection.remove(conditions,(err, results) => { if (err) return reject(err); return resolve(results); }); }).then((count) => { return this.cache.clear(conditions).then(() => count); }).nodeify(callback); } ensureIndex(specification: IndexSpecification, callback?: general.Callback): Promise; ensureIndex(specification: IndexSpecification, options: MongoDB.IndexOptions, callback?: general.Callback): Promise; ensureIndex(specification: IndexSpecification, options?: MongoDB.IndexOptions, callback?: general.Callback): Promise { if (typeof options == 'function') { callback = >options; options = {}; } return new Promise((resolve, reject) => { this.collection.ensureIndex(specification, options,(err, name: any) => { if (err) return reject(err); return resolve(name); }); }).nodeify(callback); } ensureIndices(callback?: general.Callback): Promise { return Promise.resolve(this.options.indices).map((index: Index | IndexSpecification) => { return this.ensureIndex((index).spec || index,(index).options || {}); }).nodeify(callback); } dropIndex(name: string, callback?: general.Callback): Promise; dropIndex(index: IndexSpecification, callback?: general.Callback): Promise; dropIndex(specification: string | IndexSpecification, callback?: general.Callback): Promise { var index: string; if (typeof (specification) === 'string') index = specification; else { index = _(specification).map((direction, key) => key + '_' + direction).reduce((x, y) => x + '_' + y, ''); } return new Promise((resolve, reject) => { this.collection.dropIndex(index,(err, count) => { if (err) return reject(err); return resolve(count); }); }).nodeify(callback); } dropIndexes(callback?: general.Callback): Promise { return new Promise((resolve, reject) => { this.collection.dropAllIndexes((err, count) => { if (err) return reject(err); return resolve(count); }); }).nodeify(callback); } } export interface IModelBase { collection: MongoDB.Collection; collectionName: string; core: Iridium; schema: ISchema; cache: ModelCache; cacheDirector: CacheDirector; } export interface IModelFactory { (core: Iridium): IModel; } export interface IModelOptions { hooks?: hooks.IHooks; validators?: SkmatcCore.IValidator[]; transforms?: Concoction.Ingredient[]; cache?: CacheDirector; indices?: (Index | IndexSpecification)[]; properties?: { [key: string]: (general.PropertyGetter | general.Property) }; } export interface IModel extends IModelBase { wrap(doc: TDocument, isNew?: boolean, isPartial?: boolean): TInstance; } export class ModelSpecificInstance { constructor(model: Model, instanceConstructor) { this.Constructor = function (document: TDocument, isNew?: boolean, isPartial?: boolean) { instanceConstructor.call(this, model, document, isNew, isPartial); }; util.inherits(this.Constructor, instanceConstructor); _.each(model.schema,(property, key) => { Object.defineProperty(this.Constructor.prototype, key, { get: function () { return this._modified[key]; }, set: function (value) { this._modified[key] = value; }, enumerable: true }); }); } private Constructor: (document: TDocument, isNew?: boolean, isPartial?: boolean) => void; build(document: TDocument, isNew?: boolean, isPartial?: boolean): TInstance { return new this.Constructor(document, isNew, isPartial); } } export class ModelHelpers { constructor(model: Model) { this._model = model; this._validator = new Skmatc(model.schema); this._transform = new Concoction(model.options.transforms); } private _model: Model; private _transform: concoction; /** * Gets the Concoction transforms defined for this model * @returns {Concoction} */ get transform(): Concoction { return this._transform; } private _validator: Skmatc; /** * Validates a document to ensure that it matches the model's ISchema requirements * @param {any} document The document to validate against the ISchema * @returns {SkmatcCore.IResult} The result of the validation */ validate(document: TDocument): SkmatcCore.IResult { return this._validator.validate(document); } /** * Creates a selector based on the document's unique _id field * @param {object} document The document to render the unique selector for * @returns {{_id: any}} A database selector which can be used to return only this document */ selectOne(document: TDocument): { _id: any } { var testDoc: any = _.cloneDeep(document); this.transform.reverse(testDoc); return { _id: testDoc._id }; } /** * Gets the field used in the ISchema to represent the document _id */ get identifierField(): string { var id = new String(""); var testDoc = { _id: id }; this.transform.apply(testDoc); var idField = null; for (var k in testDoc) if (testDoc[k] === id) { idField = k; break; } return idField; } /** * Creates a selector based on the document's unique _id field in downstream format * @param {any} id The downstream identifier to use when creating the selector * @returns {object} A database selector which can be used to return only this document in downstream form */ selectOneDownstream(id: TDocument): any { var conditions = {}; conditions[this.identifierField] = id; return conditions; } /** * Wraps the given document in an instance wrapper for use throughout the application * @param {any} document The document to be wrapped as an instance * @param {Boolean} isNew Whether the instance originated from the database or was created by the application * @param {Boolean} isPartial Whether the document supplied contains all information present in the database * @returns {any} An instance which wraps this document */ wrapDocument(document: TDocument, isNew?: boolean, isPartial?: boolean): TInstance { return this._model.wrap(document, isNew, isPartial); } /** * Performs a diff operation between two documents and creates a MongoDB changes object to represent the differences * @param {any} original The original document prior to changes being made * @param {any} modified The document after changes were made */ diff(original: TDocument, modified: TDocument): any { var omnom = new Omnom(); omnom.diff(original, modified); return omnom.changes; } } export class ModelHandlers { constructor(model: Model) { this._model = model; } private _model: Model; get model(): Model { return this._model; } documentsReceived(conditions: any, results: TDocument[], wrapper: (document: TDocument, isNew?: boolean, isPartial?: boolean) => TInstance, options: QueryOptions = {}): Promise { _.defaults(options, { cache: true, partial: false }); return Promise.resolve(results).map((target: any) => { return >Promise.resolve().then(() => { // Trigger the received hook if (this.model.options.hooks.retrieved) return this.model.options.hooks.retrieved(target); }).then(() => { // Cache the document if caching is enabled if (this.model.core.cache && options.cache && !options.fields) { var cacheDoc = _.cloneDeep(target); return this.model.cache.set(conditions, cacheDoc); } }).then(() => { // Transform the document this.model.helpers.transform.apply(target); // Wrap the document and trigger the ready hook var wrapped: TInstance = wrapper(target, false, !!options.fields); if (this.model.options.hooks.ready) return Promise.resolve(this.model.options.hooks.ready(wrapped)).then(() => wrapped); return wrapped; }); }); } creatingDocuments(documents: TDocument[]): Promise { return Promise.all(documents.map((document: any) => { return Promise.resolve().then(() => { if (this.model.options.hooks.retrieved) return this.model.options.hooks.creating(document); }).then(() => { var validation: SkmatcCore.IResult = this.model.helpers.validate(document); if (validation.failed) return Promise.reject(validation.error); this.model.helpers.transform.reverse(document); return document; }); })); } savingDocument(instance: TInstance, changes: any): Promise { return Promise.resolve().then(() => { if (this.model.options.hooks.saving) return this.model.options.hooks.saving(instance, changes); }).then(() => instance); } } export interface QueryOptions { cache?: boolean; fields?: { [name: string]: number }; limit?: number; skip?: number; sort?: IndexSpecification; } export interface CreateOptions { w?: any; upsert?: boolean; cache?: boolean; } export interface UpdateOptions { w?: any; multi?: boolean; } export interface IndexSpecification { [key: string]: number; } export interface Index { spec: IndexSpecification; options?: MongoDB.IndexOptions; } class ModelCache { constructor(model: IModelBase) { this._model = model; } private _model: IModelBase; get model(): IModelBase { return this._model; } set(conditions: any, value: T): Promise { if (!this.model.cacheDirector || !this.model.cacheDirector.valid(conditions)) return Promise.resolve(value); return this.model.core.cache.set(this.model.cacheDirector.buildKey(conditions), value); } get(conditions: any): Promise { if (!this.model.cacheDirector || !this.model.cacheDirector.valid(conditions)) return Promise.resolve(null); return this.model.core.cache.get(this.model.cacheDirector.buildKey(conditions)); } clear(conditions: any): Promise { if (!this.model.cacheDirector || !this.model.cacheDirector.valid(conditions)) return Promise.resolve(false); return this.model.core.cache.clear(this.model.cacheDirector.buildKey(conditions)); } } diff --git a/lib/cacheControllers/IDDirector.js.map b/lib/cacheControllers/IDDirector.js.map index ad8830d..9419f96 100644 --- a/lib/cacheControllers/IDDirector.js.map +++ b/lib/cacheControllers/IDDirector.js.map @@ -1 +1 @@ -{"version":3,"file":"IDDirector.js","sourceRoot":"","sources":["IDDirector.ts"],"names":["IDCacheDirector","IDCacheDirector.constructor","IDCacheDirector.valid","IDCacheDirector.buildKey"],"mappings":"AAIA,IAAM,eAAe;IAArBA,SAAMA,eAAeA;IAQrBC,CAACA;IAPGD,+BAAKA,GAALA,UAAMA,MAAoBA;QACtBE,MAAMA,CAACA,MAAMA,CAACA,GAAGA,CAACA;IACtBA,CAACA;IAEDF,kCAAQA,GAARA,UAASA,MAAoBA;QACzBG,MAAMA,CAACA,IAAIA,CAACA,SAASA,CAACA,MAAMA,CAACA,GAAGA,CAACA,CAACA;IACtCA,CAACA;IACLH,sBAACA;AAADA,CAACA,AARD,IAQC;AAVD,iBAAS,eAAe,CAAC"} \ No newline at end of file +{"version":3,"file":"IDDirector.js","sourceRoot":"","sources":["IDDirector.ts"],"names":["IDCacheDirector","IDCacheDirector.constructor","IDCacheDirector.valid","IDCacheDirector.buildKey"],"mappings":"AAKA,IAAM,eAAe;IAArBA,SAAMA,eAAeA;IAQrBC,CAACA;IAPGD,+BAAKA,GAALA,UAAMA,MAAoBA;QACtBE,MAAMA,CAACA,MAAMA,CAACA,GAAGA,CAACA;IACtBA,CAACA;IAEDF,kCAAQA,GAARA,UAASA,MAAoBA;QACzBG,MAAMA,CAACA,IAAIA,CAACA,SAASA,CAACA,MAAMA,CAACA,GAAGA,CAACA,CAACA;IACtCA,CAACA;IACLH,sBAACA;AAADA,CAACA,AARD,IAQC;AAVD,iBAAS,eAAe,CAAC"} \ No newline at end of file diff --git a/lib/caches/MemoryCache.js b/lib/caches/MemoryCache.js index e26ccc7..ad2937b 100644 --- a/lib/caches/MemoryCache.js +++ b/lib/caches/MemoryCache.js @@ -1,4 +1,4 @@ -/// +/// var Promise = require('bluebird'); var MemoryCache = (function () { function MemoryCache() { diff --git a/lib/caches/MemoryCache.js.map b/lib/caches/MemoryCache.js.map index a51be5b..a0ce2e1 100644 --- a/lib/caches/MemoryCache.js.map +++ b/lib/caches/MemoryCache.js.map @@ -1 +1 @@ -{"version":3,"file":"MemoryCache.js","sourceRoot":"","sources":["MemoryCache.ts"],"names":["MemoryCache","MemoryCache.constructor","MemoryCache.set","MemoryCache.get","MemoryCache.clear"],"mappings":"AACA,AADA,6DAA6D;AAC7D,IAAO,OAAO,WAAW,UAAU,CAAC,CAAC;AAKrC,IAAM,WAAW;IAAjBA,SAAMA,WAAWA;QACLC,UAAKA,GAAQA,EAAEA,CAACA;IAgB5BA,CAACA;IAdGD,yBAAGA,GAAHA,UAAOA,GAAWA,EAAEA,KAAQA;QACxBE,IAAIA,CAACA,KAAKA,CAACA,GAAGA,CAACA,GAAGA,KAAKA,CAACA;QACxBA,MAAMA,CAACA,OAAOA,CAACA,OAAOA,CAACA,KAAKA,CAACA,CAACA;IAClCA,CAACA;IAEDF,yBAAGA,GAAHA,UAAOA,GAAWA;QACdG,MAAMA,CAACA,OAAOA,CAACA,OAAOA,CAACA,IAAIA,CAACA,KAAKA,CAACA,GAAGA,CAACA,CAACA,CAACA;IAC5CA,CAACA;IAEDH,2BAAKA,GAALA,UAAMA,GAAWA;QACbI,IAAIA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,cAAcA,CAACA,GAAGA,CAACA,CAACA;QACzCA,EAAEA,CAAAA,CAACA,GAAGA,CAACA;YAACA,OAAOA,IAAIA,CAACA,KAAKA,CAACA,GAAGA,CAACA,CAACA;QAC/BA,MAAMA,CAACA,OAAOA,CAACA,OAAOA,CAACA,GAAGA,CAACA,CAACA;IAChCA,CAACA;IACLJ,kBAACA;AAADA,CAACA,AAjBD,IAiBC;AAnBD,iBAAS,WAAW,CAAC"} \ No newline at end of file +{"version":3,"file":"MemoryCache.js","sourceRoot":"","sources":["MemoryCache.ts"],"names":["MemoryCache","MemoryCache.constructor","MemoryCache.set","MemoryCache.get","MemoryCache.clear"],"mappings":"AACA,AADA,+CAA+C;AAC/C,IAAO,OAAO,WAAW,UAAU,CAAC,CAAC;AAKrC,IAAM,WAAW;IAAjBA,SAAMA,WAAWA;QACLC,UAAKA,GAAQA,EAAEA,CAACA;IAgB5BA,CAACA;IAdGD,yBAAGA,GAAHA,UAAOA,GAAWA,EAAEA,KAAQA;QACxBE,IAAIA,CAACA,KAAKA,CAACA,GAAGA,CAACA,GAAGA,KAAKA,CAACA;QACxBA,MAAMA,CAACA,OAAOA,CAACA,OAAOA,CAACA,KAAKA,CAACA,CAACA;IAClCA,CAACA;IAEDF,yBAAGA,GAAHA,UAAOA,GAAWA;QACdG,MAAMA,CAACA,OAAOA,CAACA,OAAOA,CAACA,IAAIA,CAACA,KAAKA,CAACA,GAAGA,CAACA,CAACA,CAACA;IAC5CA,CAACA;IAEDH,2BAAKA,GAALA,UAAMA,GAAWA;QACbI,IAAIA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,cAAcA,CAACA,GAAGA,CAACA,CAACA;QACzCA,EAAEA,CAAAA,CAACA,GAAGA,CAACA;YAACA,OAAOA,IAAIA,CAACA,KAAKA,CAACA,GAAGA,CAACA,CAACA;QAC/BA,MAAMA,CAACA,OAAOA,CAACA,OAAOA,CAACA,GAAGA,CAACA,CAACA;IAChCA,CAACA;IACLJ,kBAACA;AAADA,CAACA,AAjBD,IAiBC;AAnBD,iBAAS,WAAW,CAAC"} \ No newline at end of file diff --git a/lib/middleware/Express.js.map b/lib/middleware/Express.js.map index 50f6823..45fb318 100644 --- a/lib/middleware/Express.js.map +++ b/lib/middleware/Express.js.map @@ -1 +1 @@ -{"version":3,"file":"Express.js","sourceRoot":"","sources":["Express.ts"],"names":["ExpressMiddlewareFactory"],"mappings":"AAIA,SAAgB,wBAAwB,CAAC,IAAU;IAC/CA,MAAMA,CAACA,UAAUA,GAAuBA,EAAEA,GAAwBA,EAAEA,IAA0CA;QAC1G,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;YAChB,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE;gBAC7B,GAAG,EAAE;oBAAa,MAAM,CAAC,IAAI,CAAC;gBAAC,CAAC;aACnC,CAAC,CAAC;YACH,IAAI,EAAE,CAAC;QACX,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAACA;AACNA,CAACA;AATe,gCAAwB,GAAxB,wBASf,CAAA;AAIA"} \ No newline at end of file +{"version":3,"file":"Express.js","sourceRoot":"","sources":["Express.ts"],"names":["ExpressMiddlewareFactory"],"mappings":"AAKA,SAAgB,wBAAwB,CAAC,IAAU;IAC/CA,MAAMA,CAACA,UAAUA,GAAuBA,EAAEA,GAAwBA,EAAEA,IAA0CA;QAC1G,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;YAChB,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE;gBAC7B,GAAG,EAAE;oBAAa,MAAM,CAAC,IAAI,CAAC;gBAAC,CAAC;aACnC,CAAC,CAAC;YACH,IAAI,EAAE,CAAC;QACX,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAACA;AACNA,CAACA;AATe,gCAAwB,GAAxB,wBASf,CAAA;AAIA"} \ No newline at end of file diff --git a/test/Plugins.d.ts b/test/Plugins.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/Plugins.js b/test/Plugins.js index 5cfb0ee..4273943 100644 --- a/test/Plugins.js +++ b/test/Plugins.js @@ -4,12 +4,35 @@ describe("Plugins", function () { it("should be registered with an Iridium Core", function () { core.register({ newModel: function (model) { - } + }, + newInstance: function (instance, model) { + }, + validate: [] }); }); describe("newModel", function () { - it("should allow a plugin not to define a handler"); - it("should be called when a new model is created"); + it("should allow a plugin to define a handler", function () { + core.register({ + newModel: function (model) { + model.collectionName = 'changed'; + }, + newInstance: function (instance, model) { + }, + validate: [] + }); + }); + it("should allow a plugin not to define a handler", function () { + core.register({ + newInstance: function (instance, model) { + }, + validate: [] + }); + }); + it("should be called when a new model is created", function () { + var model = new Iridium.Model(core, function () { + }, 'test', {}); + chai.expect(model.collectionName).to.exist.and.equal('changed'); + }); }); describe("newInstance", function () { it("should allow a plugin not to define a handler"); diff --git a/test/Plugins.js.map b/test/Plugins.js.map index 6036fa4..666094d 100644 --- a/test/Plugins.js.map +++ b/test/Plugins.js.map @@ -1 +1 @@ -{"version":3,"file":"Plugins.js","sourceRoot":"","sources":["Plugins.ts"],"names":[],"mappings":"AAAA,IAAO,OAAO,WAAW,UAAU,CAAC,CAAC;AAErC,QAAQ,CAAC,SAAS,EAAE;IAClB,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAElD,EAAE,CAAC,2CAA2C,EAAE;QAC9C,IAAI,CAAC,QAAQ,CAAC;YACZ,QAAQ,EAAE,UAAC,KAAK;YAEhB,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE;QACnB,EAAE,CAAC,+CAA+C,CAAC,CAAC;QACpD,EAAE,CAAC,8CAA8C,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE;QACtB,EAAE,CAAC,+CAA+C,CAAC,CAAC;QACpD,EAAE,CAAC,iDAAiD,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE;QACrB,EAAE,CAAC,oDAAoD,CAAC,CAAC;QACzD,EAAE,CAAC,2DAA2D,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"Plugins.js","sourceRoot":"","sources":["Plugins.ts"],"names":[],"mappings":"AAAA,IAAO,OAAO,WAAW,UAAU,CAAC,CAAC;AAErC,QAAQ,CAAC,SAAS,EAAC;IACf,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAElD,EAAE,CAAC,2CAA2C,EAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC;YACV,QAAQ,EAAE,UAAC,KAAK;YAEhB,CAAC;YACD,WAAW,EAAE,UAAC,QAAQ,EAAE,KAAK;YAE7B,CAAC;YACD,QAAQ,EAAE,EAAE;SACf,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAC;QAChB,EAAE,CAAC,2CAA2C,EAAC;YAC3C,IAAI,CAAC,QAAQ,CAAC;gBACV,QAAQ,EAAE,UAAC,KAAK;oBACZ,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC;gBACrC,CAAC;gBACD,WAAW,EAAE,UAAC,QAAQ,EAAE,KAAK;gBAAO,CAAC;gBACrC,QAAQ,EAAE,EAAE;aACf,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,+CAA+C,EAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC;gBACV,WAAW,EAAE,UAAC,QAAQ,EAAE,KAAK;gBAAO,CAAC;gBACrC,QAAQ,EAAE,EAAE;aACf,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,8CAA8C,EAAC;YAC9C,IAAI,KAAK,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAC;YAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAC;QACnB,EAAE,CAAC,+CAA+C,CAAC,CAAC;QACpD,EAAE,CAAC,iDAAiD,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAC;QAClB,EAAE,CAAC,oDAAoD,CAAC,CAAC;QACzD,EAAE,CAAC,2DAA2D,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/test/support/chai.js b/test/support/chai.js index ba94720..6921792 100644 --- a/test/support/chai.js +++ b/test/support/chai.js @@ -1,4 +1,4 @@ -/// +/// var chai = require('chai'); var chaiAsPromised = require('chai-as-promised'); var chaiFuzzy = require('chai-fuzzy'); diff --git a/test/support/chai.js.map b/test/support/chai.js.map index e0f2e5e..c986809 100644 --- a/test/support/chai.js.map +++ b/test/support/chai.js.map @@ -1 +1 @@ -{"version":3,"file":"chai.js","sourceRoot":"","sources":["chai.ts"],"names":[],"mappings":"AACA,AADA,gDAAgD;AAChD,IAAO,IAAI,WAAW,MAAM,CAAC,CAAC;AAC9B,IAAO,cAAc,WAAW,kBAAkB,CAAC,CAAC;AAEpD,IAAI,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAEtC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACzB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEpB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;AACnB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"chai.js","sourceRoot":"","sources":["chai.ts"],"names":[],"mappings":"AACA,AADA,+CAA+C;AAC/C,IAAO,IAAI,WAAW,MAAM,CAAC,CAAC;AAC9B,IAAO,cAAc,WAAW,kBAAkB,CAAC,CAAC;AAEpD,IAAI,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAEtC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACzB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEpB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;AACnB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC"} \ No newline at end of file diff --git a/test/support/chai.ts b/test/support/chai.ts index 5498cc2..01d8d0a 100644 --- a/test/support/chai.ts +++ b/test/support/chai.ts @@ -1,4 +1,4 @@ -/// +/// import chai = require('chai'); import chaiAsPromised = require('chai-as-promised'); import Promise = require('bluebird'); diff --git a/test/support/config.js b/test/support/config.js new file mode 100644 index 0000000..f78d5c0 --- /dev/null +++ b/test/support/config.js @@ -0,0 +1,4 @@ +/// +var config = module.require('./config.json'); +global.config = config; +//# sourceMappingURL=config.js.map \ No newline at end of file diff --git a/test/support/config.js.map b/test/support/config.js.map index 53d401f..cc6e589 100644 --- a/test/support/config.js.map +++ b/test/support/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["config.ts"],"names":[],"mappings":"AAAA,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"config.js","sourceRoot":"","sources":["config.ts"],"names":[],"mappings":"AACA,AADA,gDAAgD;IAC5C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC"} \ No newline at end of file diff --git a/test/support/config.ts b/test/support/config.ts index 8ae1b23..412e442 100644 --- a/test/support/config.ts +++ b/test/support/config.ts @@ -1,3 +1,3 @@ -/// +/// var config = module.require('./config.json'); global.config = config; \ No newline at end of file