diff --git a/mongoose/CHANGELOG.md b/mongoose/CHANGELOG.md index d44cc9a..2806d5f 100644 --- a/mongoose/CHANGELOG.md +++ b/mongoose/CHANGELOG.md @@ -1,3 +1,6 @@ +# Mongoose#1.2.0 +* Model DI + # Mongoose#1.1.2 * New `options` parameter for `Model` decorator to pass in Schema Type options * `Set` and `Option` decorators are now deprecated and will be removed in a future release diff --git a/mongoose/README.md b/mongoose/README.md index 441c349..8c25fb7 100644 --- a/mongoose/README.md +++ b/mongoose/README.md @@ -10,25 +10,28 @@ npm install @decorators/mongoose --save ### API #### Functions -* **bootstrapMongoose(MongooseModel)** - Function to generate model for class. +* **bootstrapMongoose(MongooseModel || Injectable)** - Function to generate model for class, where Injectable: +```typescript +{ provide: MongooseModel, deps: [UserService] } +``` * **ref(collectionRef)** - helper function to define reference to another collection/model * **ModelClass** - interface provides all properties and functions to the class #### Decorators ##### Class -* @Model(name: string, options?: SchemaTypeOpts) +* **@Model(name: string, options?: SchemaTypeOpts)** - registers model with defined name and options ##### Method -* @Static() -* @Query() -* @Instance() -* @Virtual() +* **@Static()** - registers static method +* **@Query()** - registers query +* **@Instance()** - registers instance method +* **@Virtual()** - registers virtual property ##### Property -* @SchemaField(schemaFieldDefinition) -* @Static() -* @Index() -* @Set() = @Option() (*deprecated* Use options parameter of Model decorator instead) +* **@SchemaField(schemaFieldDefinition)** - registers schema field +* **@Static()** - registers static property +* **@Index()** - registers index property +* **@Set()** = **@Option()** (*deprecated* Use options parameter of Model decorator instead) ### Example Mongoose Model ```typescript diff --git a/mongoose/package.json b/mongoose/package.json index 8249562..505cb7c 100644 --- a/mongoose/package.json +++ b/mongoose/package.json @@ -1,6 +1,6 @@ { "name": "@decorators/mongoose", - "version": "1.1.2", + "version": "1.2.0", "description": "node decorators", "main": "index.js", "dependencies": { diff --git a/types/mongoose.d.ts b/mongoose/src/interfaces.ts similarity index 61% rename from types/mongoose.d.ts rename to mongoose/src/interfaces.ts index 4929547..d5c0ad0 100644 --- a/types/mongoose.d.ts +++ b/mongoose/src/interfaces.ts @@ -1,4 +1,4 @@ -interface MongooseMeta { +export interface MongooseMeta { name: string; schema: any; statics: [ [string, Function] | string ]; @@ -9,6 +9,13 @@ interface MongooseMeta { options: string[]; } -interface MongooseClass extends Object { +export interface MongooseClass extends Object { __meta__: MongooseMeta; + + new (...deps: any[]); +} + +export interface Injectable { + provide: Function; + deps: any[]; } diff --git a/mongoose/src/meta.ts b/mongoose/src/meta.ts index 51277bb..1922bae 100644 --- a/mongoose/src/meta.ts +++ b/mongoose/src/meta.ts @@ -1,3 +1,5 @@ +import { MongooseClass, MongooseMeta } from './interfaces'; + export function getMongooseMeta(target: MongooseClass): MongooseMeta { if (!target.__meta__) { target.__meta__ = { diff --git a/mongoose/src/mongoose.ts b/mongoose/src/mongoose.ts index 098f1f3..388e71c 100644 --- a/mongoose/src/mongoose.ts +++ b/mongoose/src/mongoose.ts @@ -1,4 +1,6 @@ import { Schema, model as Model, Model as IModel, Document } from 'mongoose'; + +import { MongooseClass, Injectable, MongooseMeta } from './interfaces'; import { getMongooseMeta, extend } from './meta'; /** @@ -15,13 +17,16 @@ export function ref(collectionRef: string): { type: any, ref: string } { * @param DecoratedClass * @returns {Object} Mongoose model itself */ -export function bootstrapMongoose(DecoratedClass): IModel { - let meta: MongooseMeta = getMongooseMeta(DecoratedClass.prototype), - classInstance = new DecoratedClass(), - schema: Schema = new Schema(meta.schema), - statics = {}, - indexes = {}, - model; +export function bootstrapMongoose(injectable: Injectable | Function): IModel { + let DecoratedModel: any = (injectable).provide || injectable; + let deps = (injectable).deps || []; + + let meta: MongooseMeta = getMongooseMeta(DecoratedModel.prototype); + let classInstance = new DecoratedModel(...deps); + let schema: Schema = new Schema(meta.schema); + let statics = {}; + let indexes = {}; + let model; meta.statics.forEach((stat: [string, Function] | string) => { if (typeof stat[1] === 'function') { diff --git a/playground/mongoose/model.ts b/playground/mongoose/model.ts index 49e0a19..470d0aa 100644 --- a/playground/mongoose/model.ts +++ b/playground/mongoose/model.ts @@ -28,11 +28,16 @@ interface TestModelType extends mongoose.Model { } @Model('Test') - class TestModelClass extends ModelClass { +class TestModelClass extends ModelClass { @SchemaField(String) testField: string; + constructor(...args) { + super(); + console.log(args); + } + @Static() staticMethod() { console.log('static test method'); @@ -46,4 +51,6 @@ interface TestModelType extends mongoose.Model { } -export let TestModel = bootstrapMongoose(TestModelClass); +export let TestModel = bootstrapMongoose({ + provide: TestModelClass, deps: [1, 2, 3] +});