@nestjs/mongoose
Advanced tools
Comparing version 7.1.1 to 7.1.2
@@ -32,22 +32,27 @@ "use strict"; | ||
} | ||
static inspectTypeDefinition(options) { | ||
if (typeof options === 'function') { | ||
if (this.isPrimitive(options)) { | ||
return options; | ||
static inspectTypeDefinition(optionsOrType) { | ||
if (typeof optionsOrType === 'function') { | ||
if (this.isPrimitive(optionsOrType)) { | ||
return optionsOrType; | ||
} | ||
else if (this.isMongooseSchemaType(options)) { | ||
return options; | ||
else if (this.isMongooseSchemaType(optionsOrType)) { | ||
return optionsOrType; | ||
} | ||
return this.createForClass(options); | ||
const schemaDefinition = this.createForClass(optionsOrType); | ||
const schemaMetadata = type_metadata_storage_1.TypeMetadataStorage.getSchemaMetadataByTarget(optionsOrType); | ||
if (schemaMetadata === null || schemaMetadata === void 0 ? void 0 : schemaMetadata.options) { | ||
return new mongoose.Schema(schemaDefinition, schemaMetadata.options); | ||
} | ||
return schemaDefinition; | ||
} | ||
else if (typeof options.type === 'function') { | ||
options.type = this.inspectTypeDefinition(options.type); | ||
return options; | ||
else if (typeof optionsOrType.type === 'function') { | ||
optionsOrType.type = this.inspectTypeDefinition(optionsOrType.type); | ||
return optionsOrType; | ||
} | ||
else if (Array.isArray(options)) { | ||
return options.length > 0 | ||
? [this.inspectTypeDefinition(options[0])] | ||
: options; | ||
else if (Array.isArray(optionsOrType)) { | ||
return optionsOrType.length > 0 | ||
? [this.inspectTypeDefinition(optionsOrType[0])] | ||
: optionsOrType; | ||
} | ||
return options; | ||
return optionsOrType; | ||
} | ||
@@ -54,0 +59,0 @@ static isPrimitive(type) { |
@@ -1,12 +0,4 @@ | ||
import { Connection, Document, Model } from 'mongoose'; | ||
import { Provider } from '@nestjs/common'; | ||
import { AsyncModelFactory, ModelDefinition } from './interfaces'; | ||
export declare function createMongooseProviders(connectionName?: string, options?: ModelDefinition[]): { | ||
provide: string; | ||
useFactory: (connection: Connection) => Model<Document, {}>; | ||
inject: string[]; | ||
}[]; | ||
export declare function createMongooseAsyncProviders(connectionName?: string, modelFactories?: AsyncModelFactory[]): { | ||
provide: string; | ||
useFactory: (connection: Connection, ...args: unknown[]) => Promise<Model<Document, {}>>; | ||
inject: any[]; | ||
}[]; | ||
export declare function createMongooseProviders(connectionName?: string, options?: ModelDefinition[]): Provider[]; | ||
export declare function createMongooseAsyncProviders(connectionName?: string, modelFactories?: AsyncModelFactory[]): Provider[]; |
@@ -12,39 +12,40 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const common_1 = require("@nestjs/common"); | ||
const mongoose_utils_1 = require("./common/mongoose.utils"); | ||
function addDiscriminators(model, discriminators) { | ||
if (discriminators) { | ||
for (const { name, schema } of discriminators) { | ||
model.discriminator(name, schema); | ||
} | ||
} | ||
return model; | ||
function addDiscriminators(model, discriminators = []) { | ||
discriminators.forEach(({ name, schema }) => model.discriminator(name, schema)); | ||
} | ||
function createMongooseProviders(connectionName, options = []) { | ||
const providers = (options || []).map((option) => ({ | ||
provide: mongoose_utils_1.getModelToken(option.name), | ||
useFactory: (connection) => { | ||
const model = connection.model(option.name, option.schema, option.collection); | ||
return addDiscriminators(model, option.discriminators); | ||
}, | ||
inject: [mongoose_utils_1.getConnectionToken(connectionName)], | ||
})); | ||
return providers; | ||
} | ||
exports.createMongooseProviders = createMongooseProviders; | ||
function createMongooseAsyncProviders(connectionName, modelFactories = []) { | ||
const providers = (modelFactories || []).map((option) => [ | ||
return options.reduce((providers, option) => [ | ||
...providers, | ||
...createMongooseProviders(connectionName, option.discriminators), | ||
{ | ||
provide: mongoose_utils_1.getModelToken(option.name), | ||
useFactory: (connection, ...args) => __awaiter(this, void 0, void 0, function* () { | ||
const schema = yield option.useFactory(...args); | ||
const model = connection.model(option.name, schema, option.collection); | ||
useFactory: (connection) => { | ||
const model = connection.model(option.name, option.schema, option.collection); | ||
addDiscriminators(model, option.discriminators); | ||
return model; | ||
}), | ||
inject: [mongoose_utils_1.getConnectionToken(connectionName), ...(option.inject || [])], | ||
}, | ||
inject: [mongoose_utils_1.getConnectionToken(connectionName)], | ||
}, | ||
]); | ||
return common_1.flatten(providers); | ||
], []); | ||
} | ||
exports.createMongooseProviders = createMongooseProviders; | ||
function createMongooseAsyncProviders(connectionName, modelFactories = []) { | ||
return modelFactories.reduce((providers, option) => { | ||
return [ | ||
...providers, | ||
{ | ||
provide: mongoose_utils_1.getModelToken(option.name), | ||
useFactory: (connection, ...args) => __awaiter(this, void 0, void 0, function* () { | ||
const schema = yield option.useFactory(...args); | ||
const model = connection.model(option.name, schema, option.collection); | ||
addDiscriminators(model, option.discriminators); | ||
return model; | ||
}), | ||
inject: [mongoose_utils_1.getConnectionToken(connectionName), ...(option.inject || [])], | ||
}, | ||
...createMongooseAsyncProviders(connectionName, (option.discriminators || []).map(({ name, schema }) => ({ name, useFactory: () => __awaiter(this, void 0, void 0, function* () { return schema; }) }))), | ||
]; | ||
}, []); | ||
} | ||
exports.createMongooseAsyncProviders = createMongooseAsyncProviders; |
{ | ||
"name": "@nestjs/mongoose", | ||
"version": "7.1.1", | ||
"version": "7.1.2", | ||
"description": "Nest - modern, fast, powerful node.js web framework (@mongoose)", | ||
@@ -32,4 +32,4 @@ "author": "Kamil Mysliwiec", | ||
"@types/node": "11.15.0", | ||
"@typescript-eslint/eslint-plugin": "4.8.1", | ||
"@typescript-eslint/parser": "4.8.1", | ||
"@typescript-eslint/eslint-plugin": "4.8.2", | ||
"@typescript-eslint/parser": "4.8.2", | ||
"eslint": "7.14.0", | ||
@@ -40,3 +40,3 @@ "eslint-config-prettier": "6.15.0", | ||
"jest": "26.6.3", | ||
"lint-staged": "10.5.1", | ||
"lint-staged": "10.5.2", | ||
"mongoose": "5.10.15", | ||
@@ -43,0 +43,0 @@ "prettier": "2.2.0", |
@@ -1,8 +0,47 @@ | ||
import { HttpStatus, INestApplication } from '@nestjs/common'; | ||
import { DynamicModule, HttpStatus, INestApplication } from '@nestjs/common'; | ||
import { Test } from '@nestjs/testing'; | ||
import { Server } from 'http'; | ||
import * as request from 'supertest'; | ||
import { AppModule } from '../src/app.module'; | ||
import { MongooseModule } from '../../lib'; | ||
import { EventModule } from '../src/event/event.module'; | ||
import { | ||
ClickLinkEvent, | ||
ClieckLinkEventSchema, | ||
} from '../src/event/schemas/click-link-event.schema'; | ||
import { Event, EventSchema } from '../src/event/schemas/event.schema'; | ||
import { | ||
SignUpEvent, | ||
SignUpEventSchema, | ||
} from '../src/event/schemas/sign-up-event.schema'; | ||
describe('Discriminator', () => { | ||
const testCase: [string, DynamicModule][] = [ | ||
[ | ||
'forFeature', | ||
MongooseModule.forFeature([ | ||
{ | ||
name: Event.name, | ||
schema: EventSchema, | ||
discriminators: [ | ||
{ name: ClickLinkEvent.name, schema: ClieckLinkEventSchema }, | ||
{ name: SignUpEvent.name, schema: SignUpEventSchema }, | ||
], | ||
}, | ||
]), | ||
], | ||
[ | ||
'forFeatureAsync', | ||
MongooseModule.forFeatureAsync([ | ||
{ | ||
name: Event.name, | ||
useFactory: async () => EventSchema, | ||
discriminators: [ | ||
{ name: ClickLinkEvent.name, schema: ClieckLinkEventSchema }, | ||
{ name: SignUpEvent.name, schema: SignUpEventSchema }, | ||
], | ||
}, | ||
]), | ||
], | ||
]; | ||
describe.each(testCase)('Discriminator - %s', (_, features) => { | ||
let server: Server; | ||
@@ -13,3 +52,6 @@ let app: INestApplication; | ||
const module = await Test.createTestingModule({ | ||
imports: [AppModule], | ||
imports: [ | ||
MongooseModule.forRoot('mongodb://localhost:27017/test'), | ||
EventModule.forFeature(features), | ||
], | ||
}).compile(); | ||
@@ -16,0 +58,0 @@ |
import { Module } from '@nestjs/common'; | ||
import { MongooseModule } from '../../lib'; | ||
import { CatsModule } from './cats/cats.module'; | ||
import { EventModule } from './event/event.module'; | ||
@@ -10,5 +9,4 @@ @Module({ | ||
CatsModule, | ||
EventModule, | ||
], | ||
}) | ||
export class AppModule {} |
import { Body, Controller, Get, Post } from '@nestjs/common'; | ||
import { EventService } from './event.service'; | ||
import { CreateClickLinkEventDto } from './dto/create-click-link-event.dto'; | ||
import { CreateSignUpEventDto } from './dto/create-sign-up-event.dto'; | ||
import { EventService } from './event.service'; | ||
import { ClickLinkEvent } from './schemas/click-link-event.schema'; | ||
import { Event } from './schemas/event.schema'; | ||
import { ClieckLinkEvent } from './schemas/click-link-event.schema'; | ||
import { SignUpEvent } from './schemas/sign-up-event.schema'; | ||
@@ -20,3 +20,3 @@ | ||
time: new Date(), | ||
kind: ClieckLinkEvent.name, | ||
kind: ClickLinkEvent.name, | ||
}); | ||
@@ -23,0 +23,0 @@ } |
@@ -1,28 +0,15 @@ | ||
import { Module } from '@nestjs/common'; | ||
import { MongooseModule } from '../../../lib'; | ||
import { DynamicModule, Module } from '@nestjs/common'; | ||
import { EventService } from './event.service'; | ||
import { EventController } from './event.controller'; | ||
import { Event, EventSchema } from './schemas/event.schema'; | ||
import { | ||
ClieckLinkEvent, | ||
ClieckLinkEventSchema, | ||
} from './schemas/click-link-event.schema'; | ||
import { SignUpEvent, SignUpEventSchema } from './schemas/sign-up-event.schema'; | ||
@Module({ | ||
imports: [ | ||
MongooseModule.forFeature([ | ||
{ | ||
name: Event.name, | ||
schema: EventSchema, | ||
discriminators: [ | ||
{ name: ClieckLinkEvent.name, schema: ClieckLinkEventSchema }, | ||
{ name: SignUpEvent.name, schema: SignUpEventSchema }, | ||
], | ||
}, | ||
]), | ||
], | ||
controllers: [EventController], | ||
providers: [EventService], | ||
}) | ||
export class EventModule {} | ||
@Module({}) | ||
export class EventModule { | ||
static forFeature(module: DynamicModule): DynamicModule { | ||
return { | ||
imports: [module], | ||
module: EventModule, | ||
controllers: [EventController], | ||
providers: [EventService], | ||
}; | ||
} | ||
} |
@@ -6,3 +6,5 @@ import { Injectable } from '@nestjs/common'; | ||
import { CreateSignUpEventDto } from './dto/create-sign-up-event.dto'; | ||
import { ClickLinkEvent } from './schemas/click-link-event.schema'; | ||
import { Event } from './schemas/event.schema'; | ||
import { SignUpEvent } from './schemas/sign-up-event.schema'; | ||
@@ -14,2 +16,8 @@ @Injectable() | ||
private readonly eventModel: Model<Event & Document>, | ||
@InjectModel(ClickLinkEvent.name) | ||
private readonly clickEventModel: Model<Event & Document>, | ||
@InjectModel(SignUpEvent.name) | ||
private readonly signUpEventModel: Model<Event & Document>, | ||
) {} | ||
@@ -16,0 +24,0 @@ |
@@ -5,3 +5,3 @@ import { Prop, Schema, SchemaFactory } from '../../../../lib'; | ||
@Schema({}) | ||
export class ClieckLinkEvent implements Event { | ||
export class ClickLinkEvent implements Event { | ||
kind: string; | ||
@@ -16,3 +16,3 @@ | ||
export const ClieckLinkEventSchema = SchemaFactory.createForClass( | ||
ClieckLinkEvent, | ||
ClickLinkEvent, | ||
); |
import { Prop, Schema, SchemaFactory } from '../../../../lib'; | ||
import { ClieckLinkEvent } from './click-link-event.schema'; | ||
import { ClickLinkEvent } from './click-link-event.schema'; | ||
import { SignUpEvent } from './sign-up-event.schema'; | ||
@@ -10,3 +10,3 @@ | ||
required: true, | ||
enum: [ClieckLinkEvent.name, SignUpEvent.name], | ||
enum: [ClickLinkEvent.name, SignUpEvent.name], | ||
}) | ||
@@ -13,0 +13,0 @@ kind: string; |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
67279
83
1186