Socket
Socket
Sign inDemoInstall

@typegoose/typegoose

Package Overview
Dependencies
Maintainers
1
Versions
221
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@typegoose/typegoose - npm Package Compare versions

Comparing version 5.9.2 to 6.0.0

lib/defaultClasses.d.ts

67

lib/hooks.d.ts

@@ -1,32 +0,45 @@

import { MongooseDocument } from 'mongoose';
declare type ClassDecorator = (constructor: any) => void;
declare type HookNextFn = (err?: Error) => void;
declare type PreDoneFn = () => void;
declare type TypegooseDoc<T> = T & MongooseDocument;
declare type DocumentPreSerialFn<T> = (this: TypegooseDoc<T>, next: HookNextFn) => void;
declare type DocumentPreParallelFn<T> = (this: TypegooseDoc<T>, next: HookNextFn, done: PreDoneFn) => void;
declare type SimplePreSerialFn<T> = (next: HookNextFn, docs?: any[]) => void;
declare type SimplePreParallelFn<T> = (next: HookNextFn, done: PreDoneFn) => void;
declare type ModelPostFn<T> = (result: any, next?: HookNextFn) => void;
declare type PostNumberResponse<T> = (result: number, next?: HookNextFn) => void;
declare type PostSingleResponse<T> = (result: TypegooseDoc<T>, next?: HookNextFn) => void;
declare type PostMultipleResponse<T> = (result: TypegooseDoc<T>[], next?: HookNextFn) => void;
declare type PostNumberWithError<T> = (error: Error, result: number, next: HookNextFn) => void;
declare type PostSingleWithError<T> = (error: Error, result: TypegooseDoc<T>, next: HookNextFn) => void;
declare type PostMultipleWithError<T> = (error: Error, result: TypegooseDoc<T>[], next: HookNextFn) => void;
import { Query } from 'mongoose';
import { DocumentType } from './typegoose';
import { EmptyVoidFn } from './types';
declare type NDA<T> = number | DocumentType<T> | DocumentType<T>[];
declare type ClassDecorator = (target: any) => void;
declare type HookNextErrorFn = (err?: Error) => void;
declare type PreFnWithDT<T> = (this: DocumentType<T>, next?: EmptyVoidFn) => void;
declare type PreFnWithQuery<T> = (this: Query<T>, next?: (error?: Error) => void, done?: EmptyVoidFn) => void;
declare type ModelPostFn<T> = (result: any, next?: EmptyVoidFn) => void;
declare type PostNumberResponse<T> = (result: number, next?: EmptyVoidFn) => void;
declare type PostSingleResponse<T> = (result: DocumentType<T>, next?: EmptyVoidFn) => void;
declare type PostMultipleResponse<T> = (result: DocumentType<T>[], next?: EmptyVoidFn) => void;
declare type PostRegExpResponse<T> = (result: NDA<T>, next?: EmptyVoidFn) => void;
declare type PostArrayResponse<T> = (result: NDA<T>, next?: EmptyVoidFn) => void;
declare type PostNumberWithError<T> = (error: Error, result: number, next: HookNextErrorFn) => void;
declare type PostSingleWithError<T> = (error: Error, result: DocumentType<T>, next: HookNextErrorFn) => void;
declare type PostMultipleWithError<T> = (error: Error, result: DocumentType<T>[], next: HookNextErrorFn) => void;
declare type PostRegExpWithError<T> = (error: Error, result: NDA<T>, next: HookNextErrorFn) => void;
declare type PostArrayWithError<T> = (error: Error, result: NDA<T>, next: EmptyVoidFn) => void;
declare type DocumentMethod = 'init' | 'validate' | 'save' | 'remove';
declare type SingleMethod = 'findOne' | 'findOneAndRemove' | 'findOneAndUpdate' | DocumentMethod;
declare type MultipleMethod = 'find' | 'update';
declare type QueryMethod = 'count' | 'find' | 'findOne' | 'findOneAndRemove' | 'findOneAndUpdate' | 'update' | 'updateOne' | 'updateMany';
declare type ModelMethod = 'insertMany';
declare type QMR = QueryMethod | ModelMethod | RegExp;
declare type QDM = QMR | DocumentMethod;
declare type DR = DocumentMethod | RegExp;
export declare const pre: {
<T>(method: RegExp | "init" | "validate" | "save" | "remove", fn: DocumentPreSerialFn<T>): ClassDecorator;
<T>(method: RegExp | "init" | "validate" | "save" | "remove", parallel: boolean, fn: DocumentPreParallelFn<T>): ClassDecorator;
<T>(method: RegExp | "count" | "find" | "findOne" | "findOneAndRemove" | "findOneAndUpdate" | "update" | "updateOne" | "updateMany" | "insertMany", fn: SimplePreSerialFn<T>): ClassDecorator;
<T>(method: RegExp | "count" | "find" | "findOne" | "findOneAndRemove" | "findOneAndUpdate" | "update" | "updateOne" | "updateMany" | "insertMany", parallel: boolean, fn: SimplePreParallelFn<T>): ClassDecorator;
<T>(method: RegExp | "init" | "validate" | "save" | "remove" | DR[], fn: PreFnWithDT<T>): ClassDecorator;
<T_1>(method: RegExp | "count" | "find" | "findOne" | "findOneAndRemove" | "findOneAndUpdate" | "update" | "updateOne" | "updateMany" | "insertMany" | QMR[], fn: PreFnWithQuery<T_1>): ClassDecorator;
};
export declare const post: {
<T>(method: RegExp | "count", fn: PostNumberResponse<T>): ClassDecorator;
<T>(method: RegExp | "count", fn: PostNumberWithError<T>): ClassDecorator;
<T>(method: RegExp | "init" | "validate" | "save" | "remove" | "findOne" | "findOneAndRemove" | "findOneAndUpdate", fn: PostSingleResponse<T>): ClassDecorator;
<T>(method: RegExp | "init" | "validate" | "save" | "remove" | "findOne" | "findOneAndRemove" | "findOneAndUpdate", fn: PostSingleWithError<T>): ClassDecorator;
<T>(method: RegExp | "find" | "update", fn: PostMultipleResponse<T>): ClassDecorator;
<T>(method: RegExp | "find" | "update", fn: PostMultipleWithError<T>): ClassDecorator;
<T>(method: RegExp | "insertMany", fn: ModelPostFn<T> | PostMultipleResponse<T>): ClassDecorator;
<T>(method: RegExp, fn: PostRegExpResponse<T>): ClassDecorator;
<T_1>(method: RegExp, fn: PostRegExpWithError<T_1>): ClassDecorator;
<T_2>(method: QDM[], fn: PostArrayResponse<T_2>): ClassDecorator;
<T_3>(method: QDM[], fn: PostArrayWithError<T_3>): ClassDecorator;
<T_4>(method: "count", fn: PostNumberResponse<T_4>): ClassDecorator;
<T_5>(method: "count", fn: PostNumberWithError<T_5>): ClassDecorator;
<T_6>(method: SingleMethod, fn: PostSingleResponse<T_6>): ClassDecorator;
<T_7>(method: SingleMethod, fn: PostSingleWithError<T_7>): ClassDecorator;
<T_8>(method: MultipleMethod, fn: PostMultipleResponse<T_8>): ClassDecorator;
<T_9>(method: MultipleMethod, fn: PostMultipleWithError<T_9>): ClassDecorator;
<T_10>(method: "insertMany", fn: ModelPostFn<T_10> | PostMultipleResponse<T_10>): ClassDecorator;
};
export {};
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const data_1 = require("./data");
const util_1 = require("util");
const data_1 = require("./internal/data");
const utils_1 = require("./internal/utils");
// Note: Documentation for the hooks cant be added without adding it to *every* overload
const hooks = {
pre(...args) {
return (constructor) => {
addToHooks(constructor.name, 'pre', args);
};
return (target) => addToHooks(utils_1.getName(target), 'pre', args);
},
post(...args) {
return (constructor) => {
addToHooks(constructor.name, 'post', args);
};
},
return (target) => addToHooks(utils_1.getName(target), 'post', args);
}
};
/**
* Add a hook to the hooks Array
* @param name With wich name should they be registered
* @param hookType What type is it
* @param args All Arguments, that should be passed-throught
*/
function addToHooks(name, hookType, args) {
if (!data_1.hooks[name]) {
data_1.hooks[name] = { pre: [], post: [] };
if (!data_1.hooks.get(name)) {
data_1.hooks.set(name, {
post: [],
pre: []
});
}
data_1.hooks[name][hookType].push(args);
// Convert Method to array if only a string is provided
const methods = util_1.isArray(args[0]) ? args[0] : [args[0]];
if (typeof args[1] !== 'function') {
throw new TypeError(`"${name}.${hookType}.${methods.join(' ')}"'s function is not a function!`);
}
const func = args[1];
for (const method of methods) {
switch (hookType) {
case 'post':
data_1.hooks.get(name).post.push({ method, func });
break;
case 'pre':
data_1.hooks.get(name).pre.push({ method, func });
break;
}
}
}
exports.pre = hooks.pre;
exports.post = hooks.post;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9va3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaG9va3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxpQ0FBNEM7QUFpRTVDLE1BQU0sS0FBSyxHQUFVO0lBQ25CLEdBQUcsQ0FBQyxHQUFHLElBQUk7UUFDVCxPQUFPLENBQUMsV0FBZ0IsRUFBRSxFQUFFO1lBQzFCLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxDQUFDLEdBQUcsSUFBSTtRQUNWLE9BQU8sQ0FBQyxXQUFnQixFQUFFLEVBQUU7WUFDMUIsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDO0FBUUYsU0FBUyxVQUFVLENBQUMsSUFBWSxFQUFFLFFBQXdCLEVBQUUsSUFBUztJQUNuRSxJQUFJLENBQUMsWUFBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3BCLFlBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO0tBQ3pDO0lBQ0QsWUFBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRVksUUFBQSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztBQUNoQixRQUFBLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDIn0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9va3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaG9va3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwrQkFBK0I7QUFDL0IsMENBQTZEO0FBQzdELDRDQUEyQztBQXNFM0Msd0ZBQXdGO0FBQ3hGLE1BQU0sS0FBSyxHQUFVO0lBQ25CLEdBQUcsQ0FBQyxHQUFHLElBQUk7UUFDVCxPQUFPLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsSUFBSSxDQUFDLEdBQUcsSUFBSTtRQUNWLE9BQU8sQ0FBQyxNQUFXLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BFLENBQUM7Q0FDRixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFZLEVBQUUsUUFBd0IsRUFBRSxJQUFXO0lBQ3JFLElBQUksQ0FBQyxZQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3hCLFlBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQ2xCLElBQUksRUFBRSxFQUFFO1lBQ1IsR0FBRyxFQUFFLEVBQUU7U0FDRSxDQUFDLENBQUM7S0FDZDtJQUVELHVEQUF1RDtJQUN2RCxNQUFNLE9BQU8sR0FBVSxjQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RCxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsRUFBRTtRQUNqQyxNQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0tBQ2pHO0lBQ0QsTUFBTSxJQUFJLEdBQWdCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsQyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtRQUM1QixRQUFRLFFBQVEsRUFBRTtZQUNoQixLQUFLLE1BQU07Z0JBQ1QsWUFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2hELE1BQU07WUFDUixLQUFLLEtBQUs7Z0JBQ1IsWUFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQy9DLE1BQU07U0FDVDtLQUNGO0FBQ0gsQ0FBQztBQUVZLFFBQUEsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFDaEIsUUFBQSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyJ9
export interface IndexOptions<T> {
/**
* Mongoose-specific syntactic sugar, uses ms to convert
* expires option into seconds for the expireAfterSeconds in the above link.
*/
expires?: string;
/**
* Creates an unique index.
*/
unique?: boolean;
/**
* Creates a sparse index.
*/
sparse?: boolean;
/**
* Creates the index in the background, yielding whenever possible.
*/
background?: boolean;
/**
* A unique index cannot be created on a key that has pre-existing duplicate values.
* If you would like to create the index anyway, keeping the first document the database indexes and
* deleting all subsequent documents that have duplicate value
*/
dropDups?: boolean;
/**
* For geo spatial indexes set the lower bound for the co-ordinates.
*/
min?: number;
/**
* For geo spatial indexes set the high bound for the co-ordinates.
*/
max?: number;
/**
* Specify the format version of the indexes.
*/
v?: number;
/**
* Allows you to expire data on indexes applied to a data (MongoDB 2.2 or higher)
*/
expireAfterSeconds?: number;
/**
* Override the auto generated index name (useful if the resulting name is larger than 128 bytes)
*/
name?: string;
/**
* Creates a partial index based on the given filter object (MongoDB 3.2 or higher)
*/
partialFilterExpression?: any;

@@ -22,2 +58,12 @@ collation?: object;

}
export declare function index<T>(fields: T, options?: IndexOptions<T>): (constructor: any) => void;
/**
* Defines an index (most likely compound) for this schema.
* @param fields Wich fields to give the Options
* @param options Options to pass to MongoDB driver's createIndex() function
* @example Example:
* ```
* @index({ article: 1, user: 1 }, { unique: true })
* class Name {}
* ```
*/
export declare function index<T>(fields: T, options?: IndexOptions<T>): (target: any) => void;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const constants_1 = require("./internal/constants");
/**
* Defines an index (most likely compound) for this schema.
* @param fields Wich fields to give the Options
* @param options Options to pass to MongoDB driver's createIndex() function
* @example Example:
* ```
* @index({ article: 1, user: 1 }, { unique: true })
* class Name {}
* ```
*/
function index(fields, options) {
return (constructor) => {
const indices = Reflect.getMetadata('typegoose:indices', constructor) || [];
return (target) => {
const indices = Reflect.getMetadata(constants_1.DecoratorKeys.Index, target) || [];
indices.push({ fields, options });
Reflect.defineMetadata('typegoose:indices', indices, constructor);
Reflect.defineMetadata(constants_1.DecoratorKeys.Index, indices, target);
};
}
exports.index = index;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwRUEsU0FBZ0IsS0FBSyxDQUFJLE1BQVMsRUFBRSxPQUF5QjtJQUMzRCxPQUFPLENBQUMsV0FBZ0IsRUFBRSxFQUFFO1FBQzFCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVFLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsQyxPQUFPLENBQUMsY0FBYyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRSxDQUFDLENBQUM7QUFDSixDQUFDO0FBTkQsc0JBTUMifQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxvREFBcUQ7QUFrRXJEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLEtBQUssQ0FBSSxNQUFTLEVBQUUsT0FBeUI7SUFDM0QsT0FBTyxDQUFDLE1BQVcsRUFBRSxFQUFFO1FBQ3JCLE1BQU0sT0FBTyxHQUFVLE9BQU8sQ0FBQyxXQUFXLENBQUMseUJBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlFLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsQyxPQUFPLENBQUMsY0FBYyxDQUFDLHlCQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUM7QUFDSixDQUFDO0FBTkQsc0JBTUMifQ==

@@ -1,2 +0,11 @@

export declare function staticMethod(target: any, key: string, descriptor: TypedPropertyDescriptor<any>): void;
export declare function instanceMethod(target: any, key: string, descriptor: TypedPropertyDescriptor<any>): void;
/**
* Set the function below as a Static Method
* Note: you need to add static before the name
* @deprecated
*/
export declare const staticMethod: (_1: any, _2: any) => any;
/**
* Set the function below as an Instance Method
* @deprecated
*/
export declare const instanceMethod: (_1: any, _2: any) => any;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const data_1 = require("./data");
function baseMethod(target, key, descriptor, methodType) {
if (descriptor === undefined) {
descriptor = Object.getOwnPropertyDescriptor(target, key);
}
let name;
if (methodType === 'instanceMethods') {
name = target.constructor.name;
}
if (methodType === 'staticMethods') {
name = target.name;
}
if (!data_1.methods[methodType][name]) {
data_1.methods[methodType][name] = {};
}
const method = descriptor.value;
data_1.methods[methodType][name] = Object.assign({}, data_1.methods[methodType][name], { [key]: method });
}
function staticMethod(target, key, descriptor) {
return baseMethod(target, key, descriptor, 'staticMethods');
}
exports.staticMethod = staticMethod;
function instanceMethod(target, key, descriptor) {
return baseMethod(target, key, descriptor, 'instanceMethods');
}
exports.instanceMethod = instanceMethod;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldGhvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUFpQztBQVdqQyxTQUFTLFVBQVUsQ0FBQyxNQUFXLEVBQUUsR0FBVyxFQUFFLFVBQXdDLEVBQUUsVUFBc0I7SUFDNUcsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1FBQzVCLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQzNEO0lBRUQsSUFBSSxJQUFTLENBQUM7SUFDZCxJQUFJLFVBQVUsS0FBSyxpQkFBaUIsRUFBRTtRQUNwQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7S0FDaEM7SUFDRCxJQUFJLFVBQVUsS0FBSyxlQUFlLEVBQUU7UUFDbEMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7S0FDcEI7SUFFRCxJQUFJLENBQUMsY0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzlCLGNBQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDaEM7SUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ2hDLGNBQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQ3BCLGNBQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFDNUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQ2QsQ0FBQztBQUNKLENBQUM7QUFjRCxTQUFnQixZQUFZLENBQUMsTUFBVyxFQUFFLEdBQVcsRUFBRSxVQUF3QztJQUM3RixPQUFPLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRkQsb0NBRUM7QUFhRCxTQUFnQixjQUFjLENBQUMsTUFBVyxFQUFFLEdBQVcsRUFBRSxVQUF3QztJQUMvRixPQUFPLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFGRCx3Q0FFQyJ9
/* istanbul ignore file */
const util_1 = require("util");
/**
* Set the function below as a Static Method
* Note: you need to add static before the name
* @deprecated
*/
exports.staticMethod = util_1.deprecate((_1, _2) => undefined, '"staticMethod" is deprecated, look at README#Migrate to 6.0.0');
/**
* Set the function below as an Instance Method
* @deprecated
*/
exports.instanceMethod = util_1.deprecate((_1, _2) => undefined, '"instanceMethod" is deprecated, look at README#Migrate to 6.0.0');
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldGhvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBCQUEwQjtBQUMxQiwrQkFBaUM7QUFFakM7Ozs7R0FJRztBQUNVLFFBQUEsWUFBWSxHQUFHLGdCQUFTLENBQ25DLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUNyQiwrREFBK0QsQ0FDaEUsQ0FBQztBQUVGOzs7R0FHRztBQUNVLFFBQUEsY0FBYyxHQUFHLGdCQUFTLENBQ3JDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUNyQixpRUFBaUUsQ0FDbEUsQ0FBQyJ9

@@ -1,1 +0,7 @@

export declare function plugin(mongoosePlugin: any, options?: any): (constructor: any) => void;
import { Func } from './types';
/**
* Add a Middleware-Plugin
* @param mongoosePlugin The Plugin to plug-in
* @param options Options for the Plugin, if any
*/
export declare function plugin(mongoosePlugin: Func, options?: any): (target: any) => void;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const data_1 = require("./data");
const data_1 = require("./internal/data");
/**
* Add a Middleware-Plugin
* @param mongoosePlugin The Plugin to plug-in
* @param options Options for the Plugin, if any
*/
function plugin(mongoosePlugin, options) {
return (constructor) => {
const name = constructor.name;
if (!data_1.plugins[name]) {
data_1.plugins[name] = [];
return (target) => {
const name = target.name;
/* istanbul ignore else */
if (!data_1.plugins.get(name)) {
data_1.plugins.set(name, []);
}
data_1.plugins[name].push({ mongoosePlugin, options });
data_1.plugins.get(name).push({ mongoosePlugin, options });
};
}
exports.plugin = plugin;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUFpQztBQU9qQyxTQUFnQixNQUFNLENBQUMsY0FBbUIsRUFBRSxPQUFhO0lBQ3ZELE9BQU8sQ0FBQyxXQUFnQixFQUFFLEVBQUU7UUFDMUIsTUFBTSxJQUFJLEdBQVcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUN0QyxJQUFJLENBQUMsY0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xCLGNBQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDcEI7UUFDRCxjQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVJELHdCQVFDIn0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBDQUEwQztBQUcxQzs7OztHQUlHO0FBQ0gsU0FBZ0IsTUFBTSxDQUFDLGNBQW9CLEVBQUUsT0FBYTtJQUN4RCxPQUFPLENBQUMsTUFBVyxFQUFFLEVBQUU7UUFDckIsTUFBTSxJQUFJLEdBQVcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNqQywwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLGNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEIsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDdkI7UUFDRCxjQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUMsQ0FBQztBQUNKLENBQUM7QUFURCx3QkFTQyJ9

@@ -1,63 +0,19 @@

import * as mongoose from 'mongoose';
export declare type Func = (...args: any[]) => any;
export declare type RequiredType = boolean | [boolean, string] | string | Func | [Func, string];
export declare type ValidatorFunction = (value: any) => boolean | Promise<boolean>;
export declare type Validator = ValidatorFunction | RegExp | {
validator: ValidatorFunction;
message?: string;
};
export interface BasePropOptions {
select?: boolean;
required?: RequiredType;
enum?: string[] | object;
default?: any;
validate?: Validator | Validator[];
unique?: boolean;
index?: boolean;
sparse?: boolean;
expires?: string | number;
_id?: boolean;
}
export interface PropOptions extends BasePropOptions {
ref?: any;
refPath?: string;
alias?: string;
}
export interface ValidateNumberOptions {
min?: number | [number, string];
max?: number | [number, string];
}
export interface ValidateStringOptions {
match?: RegExp | [RegExp, string];
enum?: string[];
minlength?: number | [number, string];
maxlength?: number | [number, string];
}
export interface TransformStringOptions {
lowercase?: boolean;
uppercase?: boolean;
trim?: boolean;
}
export interface VirtualOptions {
ref: string;
localField: string;
foreignField: string;
justOne: boolean;
overwrite: boolean;
}
export declare type PropOptionsWithNumberValidate = PropOptions & ValidateNumberOptions;
export declare type PropOptionsWithStringValidate = PropOptions & TransformStringOptions & ValidateStringOptions;
export declare type PropOptionsWithValidate = PropOptionsWithNumberValidate | PropOptionsWithStringValidate | VirtualOptions;
import { ArrayPropOptions, MapPropOptions, PropOptionsWithValidate } from './types';
/**
* Set Property Options for the property below
* @param options Options
* @public
*/
export declare function prop(options?: PropOptionsWithValidate): (target: any, key: string) => void;
export interface ArrayPropOptions extends BasePropOptions {
items?: any;
itemsRef?: any;
itemsRefPath?: any;
}
export interface MapPropOptions extends BasePropOptions {
of?: any;
mapDefault?: any;
}
/**
* Set Property(that are Maps) Options for the property below
* @param options Options for the Map
* @public
*/
export declare function mapProp(options: MapPropOptions): (target: any, key: string) => void;
/**
* Set Property(that are Arrays) Options for the property below
* @param options Options
* @public
*/
export declare function arrayProp(options: ArrayPropOptions): (target: any, key: string) => void;
export declare type Ref<T> = T | mongoose.Schema.Types.ObjectId;

@@ -16,149 +16,197 @@ "use strict";

const util_1 = require("util");
const data_1 = require("./data");
const errors_1 = require("./errors");
const utils_1 = require("./utils");
const constants_1 = require("./internal/constants");
const data_1 = require("./internal/data");
const errors_1 = require("./internal/errors");
const utils = require("./internal/utils");
const logSettings_1 = require("./logSettings");
const typegoose_1 = require("./typegoose");
/** This Enum is meant for baseProp to decide for diffrent props (like if it is an arrayProp or prop or mapProp) */
var WhatIsIt;
(function (WhatIsIt) {
WhatIsIt["ARRAY"] = "Array";
WhatIsIt["MAP"] = "Map";
WhatIsIt["NONE"] = "";
WhatIsIt[WhatIsIt["ARRAY"] = 0] = "ARRAY";
WhatIsIt[WhatIsIt["MAP"] = 1] = "MAP";
WhatIsIt[WhatIsIt["NONE"] = 2] = "NONE";
})(WhatIsIt || (WhatIsIt = {}));
function isWithStringValidate(options) {
return !util_1.isNullOrUndefined(options.match
|| options.enum
|| options.minlength
|| options.maxlength);
}
function isWithStringTransform(options) {
return !util_1.isNullOrUndefined(options.lowercase || options.uppercase || options.trim);
}
function isWithNumberValidate(options) {
return !util_1.isNullOrUndefined(options.min || options.max);
}
/**
* Base Function for prop & arrayProp
* @param rawOptions The options (like require)
* @param Type What Type it is
* @param target Target Class
* @param key Value Key of target class
* @param isArray is it an array?
*/
function baseProp(rawOptions, Type, target, key, whatis = WhatIsIt.NONE) {
const name = target.constructor.name;
const isGetterSetter = Object.getOwnPropertyDescriptor(target, key);
if (isGetterSetter) {
if (isGetterSetter.get) {
if (!data_1.virtuals[name]) {
data_1.virtuals[name] = {};
if (Type === target) {
throw new Error('It seems like the type used is the same as the target class, which is currently not supported\n'
+ `Please look at https://github.com/typegoose/typegoose/issues/42 for more infomation, for now please avoid using it!`);
}
const initname = utils.createUniqueID(target);
data_1.decoratorCache.get(initname).decorators.set(key, () => {
if (utils.isNotDefined(Type)) {
if (Type !== target) { // prevent "infinite" buildSchema loop / Maximum Class size exceeded
typegoose_1.buildSchema(Type, { _id: typeof rawOptions._id === 'boolean' ? rawOptions._id : true });
}
if (!data_1.virtuals[name][key]) {
data_1.virtuals[name][key] = {};
}
const name = utils.getName(target.constructor);
rawOptions = Object.assign(rawOptions, {});
if (!data_1.virtuals.get(name)) {
data_1.virtuals.set(name, new Map());
}
if (utils.isWithVirtualPOP(rawOptions)) {
if (!utils.includesAllVirtualPOP(rawOptions)) {
throw new errors_1.NotAllVPOPElementsError(name, key);
}
data_1.virtuals[name][key] = Object.assign({}, data_1.virtuals[name][key], { get: isGetterSetter.get, options: rawOptions });
data_1.virtuals.get(name).set(key, rawOptions);
return;
}
if (isGetterSetter.set) {
if (!data_1.virtuals[name]) {
data_1.virtuals[name] = {};
if (whatis === WhatIsIt.ARRAY) {
utils.initAsArray(name, key);
}
else {
utils.initAsObject(name, key);
}
if (!util_1.isNullOrUndefined(rawOptions.set) || !util_1.isNullOrUndefined(rawOptions.get)) {
if (typeof rawOptions.set !== 'function') {
throw new TypeError(`"${name}.${key}" does not have a set function!`);
}
if (!data_1.virtuals[name][key]) {
data_1.virtuals[name][key] = {};
if (typeof rawOptions.get !== 'function') {
throw new TypeError(`"${name}.${key}" does not have a get function!`);
}
data_1.virtuals[name][key] = Object.assign({}, data_1.virtuals[name][key], { set: isGetterSetter.set, options: rawOptions });
const newType = rawOptions && rawOptions.type ? rawOptions.type : Type;
if (rawOptions && rawOptions.type) {
delete rawOptions.type;
}
/*
* Note:
* this dosnt have a check if prop & returntype of the function is the same,
* because it cant be accessed at runtime
*/
data_1.schemas.get(name)[key] = Object.assign(Object.assign(Object.assign({}, data_1.schemas.get(name)[key]), { type: newType }), rawOptions);
return;
}
return;
}
if (whatis === WhatIsIt.ARRAY) {
utils_1.initAsArray(name, key);
}
else {
utils_1.initAsObject(name, key);
}
const ref = rawOptions.ref;
if (typeof ref === 'string') {
data_1.schema[name][key] = Object.assign({}, data_1.schema[name][key], { type: mongoose.Schema.Types.ObjectId, ref });
return;
}
else if (ref) {
data_1.schema[name][key] = Object.assign({}, data_1.schema[name][key], { type: mongoose.Schema.Types.ObjectId, ref: ref.name });
return;
}
const itemsRef = rawOptions.itemsRef;
if (typeof itemsRef === 'string') {
data_1.schema[name][key][0] = Object.assign({}, data_1.schema[name][key][0], { type: mongoose.Schema.Types.ObjectId, ref: itemsRef });
return;
}
else if (itemsRef) {
data_1.schema[name][key][0] = Object.assign({}, data_1.schema[name][key][0], { type: mongoose.Schema.Types.ObjectId, ref: itemsRef.name });
return;
}
const refPath = rawOptions.refPath;
if (refPath && typeof refPath === 'string') {
data_1.schema[name][key] = Object.assign({}, data_1.schema[name][key], { type: mongoose.Schema.Types.ObjectId, refPath });
return;
}
const itemsRefPath = rawOptions.itemsRefPath;
if (itemsRefPath && typeof itemsRefPath === 'string') {
data_1.schema[name][key][0] = Object.assign({}, data_1.schema[name][key][0], { type: mongoose.Schema.Types.ObjectId, refPath: itemsRefPath });
return;
}
const enumOption = rawOptions.enum;
if (enumOption) {
if (!Array.isArray(enumOption)) {
rawOptions.enum = Object.keys(enumOption).map(propKey => enumOption[propKey]);
const ref = rawOptions.ref;
const refType = rawOptions.refType || mongoose.Schema.Types.ObjectId;
if (ref) {
delete rawOptions.ref;
data_1.schemas.get(name)[key] = Object.assign(Object.assign(Object.assign({}, data_1.schemas.get(name)[key]), { type: refType, ref: typeof ref === 'string' ? ref : utils.getName(ref) }), rawOptions);
return;
}
}
const selectOption = rawOptions.select;
if (typeof selectOption === 'boolean') {
data_1.schema[name][key] = Object.assign({}, data_1.schema[name][key], { select: selectOption });
}
if (isWithStringValidate(rawOptions) && !utils_1.isString(Type)) {
throw new errors_1.NotStringTypeError(key);
}
if (isWithNumberValidate(rawOptions) && !utils_1.isNumber(Type)) {
throw new errors_1.NotNumberTypeError(key);
}
if (isWithStringTransform(rawOptions) && !utils_1.isString(Type)) {
throw new errors_1.NotStringTypeError(key);
}
const instance = new Type();
const subSchema = data_1.schema[instance.constructor.name];
if (!subSchema && !utils_1.isPrimitive(Type) && !utils_1.isObject(Type)) {
throw new errors_1.InvalidPropError(Type.name, key);
}
const { ['ref']: r, ['items']: i, ['of']: o } = rawOptions, options = __rest(rawOptions, ['ref', 'items', 'of']);
if (utils_1.isPrimitive(Type)) {
if (whatis === WhatIsIt.ARRAY) {
data_1.schema[name][key] = Object.assign({}, data_1.schema[name][key][0], options, { type: [Type.name === 'ObjectID' ? 'ObjectId' : Type] });
const itemsRef = rawOptions.itemsRef;
const itemsRefType = rawOptions.itemsRefType || mongoose.Schema.Types.ObjectId;
if (itemsRef) {
const itemsRefName = typeof itemsRef === 'string' ? itemsRef : utils.getName(itemsRef);
delete rawOptions.itemsRef;
data_1.schemas.get(name)[key][0] = Object.assign(Object.assign(Object.assign({}, data_1.schemas.get(name)[key][0]), { type: itemsRefType, ref: itemsRefName }), rawOptions);
return;
}
if (whatis === WhatIsIt.MAP) {
const { mapDefault } = options;
delete options.mapDefault;
data_1.schema[name][key] = Object.assign({}, data_1.schema[name][key], { type: Map, default: mapDefault, of: Object.assign({ type: Type }, options) });
const refPath = rawOptions.refPath;
if (refPath && typeof refPath === 'string') {
delete rawOptions.refPath;
data_1.schemas.get(name)[key] = Object.assign(Object.assign(Object.assign({}, data_1.schemas.get(name)[key]), { type: itemsRefType, refPath }), rawOptions);
return;
}
data_1.schema[name][key] = Object.assign({}, data_1.schema[name][key], options, { type: Type });
return;
}
if (utils_1.isObject(Type) && !subSchema) {
data_1.schema[name][key] = Object.assign({}, data_1.schema[name][key], options, { type: Object });
return;
}
if (whatis === WhatIsIt.ARRAY) {
data_1.schema[name][key] = Object.assign({}, data_1.schema[name][key][0], options, { type: [Object.assign({}, (typeof options._id !== 'undefined' ? { _id: options._id } : {}), subSchema)] });
return;
}
if (whatis === WhatIsIt.MAP) {
data_1.schema[name][key] = Object.assign({}, data_1.schema[name][key], { type: Map }, options);
data_1.schema[name][key].of = Object.assign({}, data_1.schema[name][key].of, subSchema);
return;
}
const Schema = mongoose.Schema;
const supressSubschemaId = rawOptions._id === false;
const virtualSchema = new Schema(Object.assign({}, subSchema), supressSubschemaId ? { _id: false } : {});
const schemaInstanceMethods = data_1.methods.instanceMethods[instance.constructor.name];
if (schemaInstanceMethods) {
virtualSchema.methods = schemaInstanceMethods;
}
data_1.schema[name][key] = Object.assign({}, data_1.schema[name][key], options, { type: virtualSchema });
return;
const itemsRefPath = rawOptions.itemsRefPath;
if (itemsRefPath && typeof itemsRefPath === 'string') {
delete rawOptions.itemsRefPath;
data_1.schemas.get(name)[key][0] = Object.assign(Object.assign(Object.assign({}, data_1.schemas.get(name)[key][0]), { type: itemsRefType, refPath: itemsRefPath }), rawOptions);
return;
}
const enumOption = rawOptions.enum;
if (enumOption) {
if (!Array.isArray(enumOption)) {
rawOptions.enum = Object.keys(enumOption).map((propKey) => enumOption[propKey]);
}
}
const selectOption = rawOptions.select;
if (typeof selectOption === 'boolean') {
data_1.schemas.get(name)[key] = Object.assign(Object.assign({}, data_1.schemas.get(name)[key]), { select: selectOption });
}
// check if Type is actually a real working Type
if (util_1.isNullOrUndefined(Type) || typeof Type !== 'function') {
throw new errors_1.InvalidTypeError(target.constructor.name, key, Type);
}
// check for validation inconsistencies
if (utils.isWithStringValidate(rawOptions) && !utils.isString(Type)) {
throw new errors_1.NotStringTypeError(key);
}
// check for transform inconsistencies
if (utils.isWithStringTransform(rawOptions) && !utils.isString(Type)) {
throw new errors_1.NotStringTypeError(key);
}
if (utils.isWithNumberValidate(rawOptions) && !utils.isNumber(Type)) {
throw new errors_1.NotNumberTypeError(key);
}
const subSchema = data_1.schemas.get(utils.getName(Type));
if (!subSchema && !utils.isPrimitive(Type) && !utils.isObject(Type)) {
throw new errors_1.InvalidPropError(Type.name, key); // This seems to be never thrown!
}
const { ['items']: items } = rawOptions, options = __rest(rawOptions, ['items']);
if (utils.isPrimitive(Type)) {
switch (whatis) {
case WhatIsIt.ARRAY:
data_1.schemas.get(name)[key] = Object.assign(Object.assign(Object.assign({}, data_1.schemas.get(name)[key][0]), options), { type: [Type] });
return;
case WhatIsIt.MAP:
// "default" is a reserved keyword, thats why "_default" is used
const { default: _default } = options;
delete options.default;
delete options.of;
data_1.schemas.get(name)[key] = Object.assign(Object.assign({}, data_1.schemas.get(name)[key]), { type: Map, default: _default, of: Object.assign({ type: Type }, options) });
return;
case WhatIsIt.NONE:
data_1.schemas.get(name)[key] = Object.assign(Object.assign(Object.assign({}, data_1.schemas.get(name)[key]), options), { type: Type });
return;
default:
throw new Error(`"${whatis}"(whatis(primitive)) is invalid for "${name}.${key}"`);
}
}
// If the 'Type' is not a 'Primitive Type' and no subschema was found treat the type as 'Object'
// so that mongoose can store it as nested document
if (utils.isObject(Type) && !subSchema) {
data_1.schemas.get(name)[key] = Object.assign(Object.assign(Object.assign({}, data_1.schemas.get(name)[key]), options), { type: Object // i think this could take some improvements
});
return;
}
switch (whatis) {
case WhatIsIt.ARRAY:
const virtualSchemaArrayItem = typegoose_1.buildSchema(Type, {
_id: typeof rawOptions._id === 'boolean' ? rawOptions._id : true
});
data_1.schemas.get(name)[key] = Object.assign(Object.assign(Object.assign({}, data_1.schemas.get(name)[key][0]), options), { type: [virtualSchemaArrayItem] });
return;
case WhatIsIt.MAP:
data_1.schemas.get(name)[key] = Object.assign(Object.assign(Object.assign({}, data_1.schemas.get(name)[key]), { type: Map }), options);
data_1.schemas.get(name)[key].of = Object.assign(Object.assign({}, data_1.schemas.get(name)[key].of), subSchema);
return;
case WhatIsIt.NONE:
const virtualSchema = typegoose_1.buildSchema(Type, {
_id: typeof rawOptions._id === 'boolean' ? rawOptions._id : true
});
data_1.schemas.get(name)[key] = Object.assign(Object.assign(Object.assign({}, data_1.schemas.get(name)[key]), options), { type: virtualSchema });
return;
default:
throw new Error(`"${whatis}"(whatis(subSchema)) is invalid for "${name}.${key}"`);
}
});
}
/**
* Set Property Options for the property below
* @param options Options
* @public
*/
function prop(options = {}) {
return (target, key) => {
const Type = Reflect.getMetadata('design:type', target, key);
const Type = Reflect.getMetadata(constants_1.DecoratorKeys.Prop, target, key);
if (!Type) {
throw new errors_1.NoMetadataError(key);
}
// soft errors
{
if ('items' in options) {
logSettings_1.logger.warn(new Error('You might not want to use option "items" in a @prop'));
}
if ('of' in options) {
logSettings_1.logger.warn(new Error('You might not want to use option "of" in a @prop'));
}
}
baseProp(options, Type, target, key, WhatIsIt.NONE);

@@ -168,5 +216,13 @@ };

exports.prop = prop;
/**
* Set Property(that are Maps) Options for the property below
* @param options Options for the Map
* @public
*/
function mapProp(options) {
return (target, key) => {
const Type = options.of;
if ('items' in options) {
logSettings_1.logger.warn(new Error('You might not want to use option "items" in a @mapProp'));
}
baseProp(options, Type, target, key, WhatIsIt.MAP);

@@ -176,5 +232,13 @@ };

exports.mapProp = mapProp;
/**
* Set Property(that are Arrays) Options for the property below
* @param options Options
* @public
*/
function arrayProp(options) {
return (target, key) => {
const Type = options.items;
if ('of' in options) {
logSettings_1.logger.warn(new Error('You might not want to use option "of" in a @arrayProp'));
}
baseProp(options, Type, target, key, WhatIsIt.ARRAY);

@@ -184,2 +248,2 @@ };

exports.arrayProp = arrayProp;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm9wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBcUM7QUFFckMsK0JBQXlDO0FBQ3pDLGlDQUFtRDtBQUNuRCxxQ0FBcUc7QUFDckcsbUNBQStGO0FBK0cvRixJQUFLLFFBSUo7QUFKRCxXQUFLLFFBQVE7SUFDWCwyQkFBZSxDQUFBO0lBQ2YsdUJBQVcsQ0FBQTtJQUNYLHFCQUFTLENBQUE7QUFDWCxDQUFDLEVBSkksUUFBUSxLQUFSLFFBQVEsUUFJWjtBQU1ELFNBQVMsb0JBQW9CLENBQUMsT0FBc0M7SUFDbEUsT0FBTyxDQUFDLHdCQUFpQixDQUN2QixPQUFPLENBQUMsS0FBSztXQUNWLE9BQU8sQ0FBQyxJQUFJO1dBQ1osT0FBTyxDQUFDLFNBQVM7V0FDakIsT0FBTyxDQUFDLFNBQVMsQ0FDckIsQ0FBQztBQUNKLENBQUM7QUFNRCxTQUFTLHFCQUFxQixDQUFDLE9BQXNDO0lBQ25FLE9BQU8sQ0FBQyx3QkFBaUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BGLENBQUM7QUFNRCxTQUFTLG9CQUFvQixDQUFDLE9BQXNDO0lBQ2xFLE9BQU8sQ0FBQyx3QkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBVUQsU0FBUyxRQUFRLENBQUMsVUFBZSxFQUFFLElBQVMsRUFBRSxNQUFXLEVBQUUsR0FBVyxFQUFFLFNBQW1CLFFBQVEsQ0FBQyxJQUFJO0lBQ3RHLE1BQU0sSUFBSSxHQUFXLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQzdDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDcEUsSUFBSSxj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
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm9wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBcUM7QUFFckMsK0JBQXlDO0FBQ3pDLG9EQUFxRDtBQUNyRCwwQ0FBb0U7QUFDcEUsOENBTzJCO0FBRTNCLDBDQUEwQztBQUMxQywrQ0FBdUM7QUFDdkMsMkNBQTBDO0FBUzFDLG1IQUFtSDtBQUNuSCxJQUFLLFFBSUo7QUFKRCxXQUFLLFFBQVE7SUFDWCx5Q0FBSyxDQUFBO0lBQ0wscUNBQUcsQ0FBQTtJQUNILHVDQUFJLENBQUE7QUFDTixDQUFDLEVBSkksUUFBUSxLQUFSLFFBQVEsUUFJWjtBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLFFBQVEsQ0FDZixVQUFlLEVBQ2YsSUFBOEIsRUFDOUIsTUFBVyxFQUNYLEdBQVcsRUFDWCxTQUFtQixRQUFRLENBQUMsSUFBSTtJQUVoQyxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpR0FBaUc7Y0FDN0cscUhBQXFILENBQUMsQ0FBQztLQUM1SDtJQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFOUMscUJBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO1FBQ3BELElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1QixJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsRUFBRSxvRUFBb0U7Z0JBQ3pGLHVCQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sVUFBVSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7YUFDekY7U0FDRjtRQUNELE1BQU0sSUFBSSxHQUFXLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsZUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QixlQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDL0I7UUFFRCxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUM1QyxNQUFNLElBQUksZ0NBQXVCLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsZUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRXhDLE9BQU87U0FDUjtRQUVELElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDN0IsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDOUI7YUFBTTtZQUNMLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO1FBRUQsSUFBSSxDQUFDLHdCQUFpQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHdCQUFpQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM1RSxJQUFJLE9BQU8sVUFBVSxDQUFDLEdBQUcsS0FBSyxVQUFVLEVBQUU7Z0JBQ3hDLE1BQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLElBQUksR0FBRyxpQ0FBaUMsQ0FBQyxDQUFDO2FBQ3ZFO1lBQ0QsSUFBSSxPQUFPLFVBQVUsQ0FBQyxHQUFHLEtBQUssVUFBVSxFQUFFO2dCQUN4QyxNQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxJQUFJLEdBQUcsaUNBQWlDLENBQUMsQ0FBQzthQUN2RTtZQUVELE1BQU0sT0FBTyxHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDdkUsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLElBQUksRUFBRTtnQkFDakMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO2FBQ3hCO1lBQ0Q7Ozs7ZUFJRztZQUNILGNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLGlEQUNqQixjQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUN6QixJQUFJLEVBQUUsT0FBTyxLQUNWLFVBQVUsQ0FDZCxDQUFDO1lBRUYsT0FBTztTQUNSO1FBRUQsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUMzQixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNyRSxJQUFJLEdBQUcsRUFBRTtZQUNQLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUN0QixjQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpREFDakIsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FDekIsSUFBSSxFQUFFLE9BQU8sRUFDYixHQUFHLEVBQUUsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQ3BELFVBQVUsQ0FDZCxDQUFDO1lBRUYsT0FBTztTQUNSO1FBRUQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNyQyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvRSxJQUFJLFFBQVEsRUFBRTtZQUNaLE1BQU0sWUFBWSxHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZGLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUMzQixjQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpREFDcEIsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FDNUIsSUFBSSxFQUFFLFlBQVksRUFDbEIsR0FBRyxFQUFFLFlBQVksS0FDZCxVQUFVLENBQ2QsQ0FBQztZQUVGLE9BQU87U0FDUjtRQUVELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDbkMsSUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO1lBQzFDLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUMxQixjQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpREFDakIsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FDekIsSUFBSSxFQUFFLFlBQVksRUFDbEIsT0FBTyxLQUNKLFVBQVUsQ0FDZCxDQUFDO1lBRUYsT0FBTztTQUNSO1FBRUQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztRQUM3QyxJQUFJLFlBQVksSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUU7WUFDcEQsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBQy9CLGNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlEQUNwQixjQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUM1QixJQUFJLEVBQUUsWUFBWSxFQUNsQixPQUFPLEVBQUUsWUFBWSxLQUNsQixVQUFVLENBQ2QsQ0FBQztZQUVGLE9BQU87U0FDUjtRQUVELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDbkMsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDOUIsVUFBVSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDakY7U0FDRjtRQUVELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDdkMsSUFBSSxPQUFPLFlBQVksS0FBSyxTQUFTLEVBQUU7WUFDckMsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsbUNBQ2pCLGNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQ3pCLE1BQU0sRUFBRSxZQUFZLEdBQ3JCLENBQUM7U0FDSDtRQUVELGdEQUFnRDtRQUNoRCxJQUFJLHdCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsRUFBRTtZQUN6RCxNQUFNLElBQUkseUJBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsdUNBQXVDO1FBQ3ZDLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuRSxNQUFNLElBQUksMkJBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDbkM7UUFFRCxzQ0FBc0M7UUFDdEMsSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BFLE1BQU0sSUFBSSwyQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNuQztRQUVELElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuRSxNQUFNLElBQUksMkJBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDbkM7UUFFRCxNQUFNLFNBQVMsR0FBRyxjQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbkUsTUFBTSxJQUFJLHlCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7U0FDOUU7UUFFRCxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEtBQWlCLFVBQVUsRUFBekIsdUNBQXlCLENBQUM7UUFDcEQsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNCLFFBQVEsTUFBTSxFQUFFO2dCQUNkLEtBQUssUUFBUSxDQUFDLEtBQUs7b0JBQ2pCLGNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLGlEQUNqQixjQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUN6QixPQUFPLEtBQ1YsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQ2IsQ0FBQztvQkFFRixPQUFPO2dCQUNULEtBQUssUUFBUSxDQUFDLEdBQUc7b0JBQ2YsZ0VBQWdFO29CQUNoRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFnQixPQUFPLENBQUM7b0JBQ25ELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztvQkFDdkIsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNsQixjQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQ0FDakIsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FDekIsSUFBSSxFQUFFLEdBQUcsRUFDVCxPQUFPLEVBQUUsUUFBUSxFQUNqQixFQUFFLGtCQUFJLElBQUksRUFBRSxJQUFJLElBQUssT0FBTyxJQUM3QixDQUFDO29CQUVGLE9BQU87Z0JBQ1QsS0FBSyxRQUFRLENBQUMsSUFBSTtvQkFDaEIsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsaURBQ2pCLGNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQ3RCLE9BQU8sS0FDVixJQUFJLEVBQUUsSUFBSSxHQUNYLENBQUM7b0JBRUYsT0FBTztnQkFDVDtvQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksTUFBTSx3Q0FBd0MsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDckY7U0FDRjtRQUVELGdHQUFnRztRQUNoRyxtREFBbUQ7UUFDbkQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3RDLGNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLGlEQUNqQixjQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUN0QixPQUFPLEtBQ1YsSUFBSSxFQUFFLE1BQU0sQ0FBQyw0Q0FBNEM7ZUFDMUQsQ0FBQztZQUVGLE9BQU87U0FDUjtRQUVELFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyxRQUFRLENBQUMsS0FBSztnQkFDakIsTUFBTSxzQkFBc0IsR0FBRyx1QkFBVyxDQUFDLElBQUksRUFBRTtvQkFDL0MsR0FBRyxFQUFFLE9BQU8sVUFBVSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUk7aUJBQ2pFLENBQUMsQ0FBQztnQkFDSCxjQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpREFDakIsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FDekIsT0FBTyxLQUNWLElBQUksRUFBRSxDQUFDLHNCQUFzQixDQUFDLEdBQy9CLENBQUM7Z0JBRUYsT0FBTztZQUNULEtBQUssUUFBUSxDQUFDLEdBQUc7Z0JBQ2YsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsaURBQ2pCLGNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQ3pCLElBQUksRUFBRSxHQUFHLEtBQ04sT0FBTyxDQUNYLENBQUM7Z0JBQ0QsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQTRDLENBQUMsRUFBRSxtQ0FDL0QsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQTRDLENBQUMsRUFBRSxHQUNyRSxTQUFTLENBQ2IsQ0FBQztnQkFFRixPQUFPO1lBQ1QsS0FBSyxRQUFRLENBQUMsSUFBSTtnQkFDaEIsTUFBTSxhQUFhLEdBQUcsdUJBQVcsQ0FBQyxJQUFJLEVBQUU7b0JBQ3RDLEdBQUcsRUFBRSxPQUFPLFVBQVUsQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJO2lCQUNqRSxDQUFDLENBQUM7Z0JBQ0gsY0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsaURBQ2pCLGNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQ3RCLE9BQU8sS0FDVixJQUFJLEVBQUUsYUFBYSxHQUNwQixDQUFDO2dCQUVGLE9BQU87WUFDVDtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksTUFBTSx3Q0FBd0MsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDckY7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFDLFVBQW1DLEVBQUU7SUFDeEQsT0FBTyxDQUFDLE1BQVcsRUFBRSxHQUFXLEVBQUUsRUFBRTtRQUNsQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLHlCQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsTUFBTSxJQUFJLHdCQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEM7UUFFRCxjQUFjO1FBQ2Q7WUFDRSxJQUFJLE9BQU8sSUFBSSxPQUFPLEVBQUU7Z0JBQ3RCLG9CQUFNLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUMsQ0FBQzthQUMvRTtZQUVELElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRTtnQkFDbkIsb0JBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQyxDQUFDO2FBQzVFO1NBQ0Y7UUFFRCxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBcEJELG9CQW9CQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixPQUFPLENBQUMsT0FBdUI7SUFDN0MsT0FBTyxDQUFDLE1BQVcsRUFBRSxHQUFXLEVBQUUsRUFBRTtRQUNsQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBRXhCLElBQUksT0FBTyxJQUFJLE9BQU8sRUFBRTtZQUN0QixvQkFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDLENBQUM7U0FDbEY7UUFFRCxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUM7QUFDSixDQUFDO0FBVkQsMEJBVUM7QUFDRDs7OztHQUlHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLE9BQXlCO0lBQ2pELE9BQU8sQ0FBQyxNQUFXLEVBQUUsR0FBVyxFQUFFLEVBQUU7UUFDbEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUUzQixJQUFJLElBQUksSUFBSSxPQUFPLEVBQUU7WUFDbkIsb0JBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQyxDQUFDO1NBQ2pGO1FBRUQsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVZELDhCQVVDIn0=
import * as mongoose from 'mongoose';
import 'reflect-metadata';
import * as defaultClasses from './defaultClasses';
import { AnyParamConstructor, DocumentType, IModelOptions, Ref, ReturnModelType } from './types';
export { mongoose };
export { setLogLevel, LogLevels } from './logSettings';
export * from './method';

@@ -9,14 +13,73 @@ export * from './prop';

export * from './typeguards';
export { getClassForDocument } from './utils';
export declare type InstanceType<T> = T & mongoose.Document;
export declare type ModelType<T> = mongoose.Model<InstanceType<T>> & T;
export interface GetModelForClassOptions {
existingMongoose?: mongoose.Mongoose;
schemaOptions?: mongoose.SchemaOptions;
existingConnection?: mongoose.Connection;
export * from './optionsProp';
export { defaultClasses };
export { DocumentType, Ref, ReturnModelType };
export { getClassForDocument } from './internal/utils';
/** @deprecated */
export declare abstract class Typegoose {
constructor();
/** @deprecated */
getModelForClass<T, U extends AnyParamConstructor<T>>(cl: U, settings?: any): ReturnModelType<U, unknown>;
/** @deprecated */
setModelForClass<T, U extends AnyParamConstructor<T>>(cl: U, settings?: any): ReturnModelType<U, unknown>;
/** @deprecated */
buildSchema<T, U extends AnyParamConstructor<T>>(cl: U): mongoose.Schema<U>;
}
export declare class Typegoose {
getModelForClass<T>(t: T, { existingMongoose, schemaOptions, existingConnection }?: GetModelForClassOptions): mongoose.Model<InstanceType<this>, {}> & this & T;
setModelForClass<T>(t: T, { existingMongoose, schemaOptions, existingConnection }?: GetModelForClassOptions): mongoose.Model<InstanceType<this>, {}> & this & T;
buildSchema<T>(t: T, { schemaOptions }?: GetModelForClassOptions): mongoose.Schema<any>;
}
/**
* Get a Model for a Class
* Executes .setModelForClass if it cant find it already
* @param cl The uninitialized Class
* @returns The Model
* @public
* @example
* ```ts
* class Name {}
*
* const NameModel = getModelForClass(Name);
* ```
*/
export declare function getModelForClass<T, U extends AnyParamConstructor<T>>(cl: U, options?: IModelOptions): ReturnModelType<U, T>;
/**
* Builds the Schema & The Model
* DEPRECTAED: use getModelForClass
* @param cl The uninitialized Class
* @returns The Model
* @deprecated
*/
export declare function setModelForClass<T, U extends AnyParamConstructor<T>>(cl: U): ReturnModelType<U, unknown>;
/**
* Generates a Mongoose schema out of class props, iterating through all parents
* @param cl The not initialized Class
* @returns Returns the Build Schema
*/
export declare function buildSchema<T, U extends AnyParamConstructor<T>>(cl: U, options?: mongoose.SchemaOptions): mongoose.Schema<U>;
/**
* This can be used to add custom Models to Typegoose, with the type infomation of cl
* Note: no gurantee that the type infomation is fully correct
* @param model The model to store
* @param cl The Class to store
* @example
* ```ts
* class T {}
*
* const schema = buildSchema(T);
* // modifications to the schame can be done
* const model = addModelToTypegoose(mongoose.model(schema), T);
* ```
*/
export declare function addModelToTypegoose<T, U extends AnyParamConstructor<T>>(model: mongoose.Model<any>, cl: U): ReturnModelType<U, T>;
/**
* Build a Model from a given class and return the model
* @param from The Model to build From
* @param cl The Class to make a model out
* @param id The Identifier to use to differentiate documents (default: cl.name)
* @example
* ```ts
* class C1 {}
* class C2 extends C1 {}
*
* const C1Model = getModelForClass(C1);
* const C2Model = getDiscriminatorModelForClass(C1Model, C1);
* ```
*/
export declare function getDiscriminatorModelForClass<T, U extends AnyParamConstructor<T>>(from: mongoose.Model<any>, cl: U, id?: string): ReturnModelType<U, T>;

@@ -6,5 +6,17 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
/* imports */
const mongoose = require("mongoose");
exports.mongoose = mongoose;
require("reflect-metadata");
const data_1 = require("./data");
const util_1 = require("util");
const defaultClasses = require("./defaultClasses");
exports.defaultClasses = defaultClasses;
const constants_1 = require("./internal/constants");
const data_1 = require("./internal/data");
const errors_1 = require("./internal/errors");
const schema_1 = require("./internal/schema");
const utils_1 = require("./internal/utils");
var logSettings_1 = require("./logSettings");
exports.setLogLevel = logSettings_1.setLogLevel;
exports.LogLevels = logSettings_1.LogLevels;
__export(require("./method"));

@@ -16,99 +28,166 @@ __export(require("./prop"));

__export(require("./typeguards"));
var utils_1 = require("./utils");
exports.getClassForDocument = utils_1.getClassForDocument;
__export(require("./optionsProp"));
var utils_2 = require("./internal/utils");
exports.getClassForDocument = utils_2.getClassForDocument;
/** @deprecated */
class Typegoose {
getModelForClass(t, { existingMongoose, schemaOptions, existingConnection } = {}) {
const name = this.constructor.name;
if (!data_1.models[name]) {
this.setModelForClass(t, {
existingMongoose,
schemaOptions,
existingConnection,
});
}
return data_1.models[name];
/* istanbul ignore next */
constructor() {
// tslint:disable-next-line:no-empty
util_1.deprecate(() => { }, 'Typegoose Class is Deprecated!')();
}
setModelForClass(t, { existingMongoose, schemaOptions, existingConnection } = {}) {
const name = this.constructor.name;
const sch = this.buildSchema(t, { existingMongoose, schemaOptions });
let model = mongoose.model.bind(mongoose);
if (existingConnection) {
model = existingConnection.model.bind(existingConnection);
}
else if (existingMongoose) {
model = existingMongoose.model.bind(existingMongoose);
}
data_1.models[name] = model(name, sch);
data_1.constructors[name] = this.constructor;
return data_1.models[name];
/* istanbul ignore next */
/** @deprecated */
getModelForClass(cl, settings) {
utils_1.assignMetadata(constants_1.DecoratorKeys.ModelOptions, settings, cl);
return util_1.deprecate(getModelForClass, 'Typegoose Class is Deprecated!')(cl);
}
buildSchema(t, { schemaOptions } = {}) {
const name = this.constructor.name;
let sch = _buildSchema(t, name, schemaOptions);
let parentCtor = Object.getPrototypeOf(this.constructor.prototype).constructor;
while (parentCtor && parentCtor.name !== 'Typegoose' && parentCtor.name !== 'Object') {
sch = _buildSchema(t, parentCtor.name, schemaOptions, sch);
parentCtor = Object.getPrototypeOf(parentCtor.prototype).constructor;
}
return sch;
/* istanbul ignore next */
/** @deprecated */
setModelForClass(cl, settings) {
utils_1.assignMetadata(constants_1.DecoratorKeys.ModelOptions, settings, cl);
return util_1.deprecate(setModelForClass, 'Typegoose Class is Deprecated!')(cl);
}
/* istanbul ignore next */
/** @deprecated */
buildSchema(cl) {
return util_1.deprecate(buildSchema, 'Typegoose Class is Deprecated!')(cl);
}
}
exports.Typegoose = Typegoose;
function _buildSchema(t, name, schemaOptions, sch) {
const Schema = mongoose.Schema;
if (!sch) {
sch = schemaOptions ? new Schema(data_1.schema[name], schemaOptions) : new Schema(data_1.schema[name]);
/**
* Get a Model for a Class
* Executes .setModelForClass if it cant find it already
* @param cl The uninitialized Class
* @returns The Model
* @public
* @example
* ```ts
* class Name {}
*
* const NameModel = getModelForClass(Name);
* ```
*/
function getModelForClass(cl, options) {
if (typeof cl !== 'function') {
throw new errors_1.NoValidClass(cl);
}
else {
sch.add(data_1.schema[name]);
const roptions = utils_1.mergeMetadata(constants_1.DecoratorKeys.ModelOptions, options || {}, cl);
const name = utils_1.getName(cl);
if (data_1.models.get(name)) {
return data_1.models.get(name);
}
const staticMethods = data_1.methods.staticMethods[name];
if (staticMethods) {
sch.statics = Object.assign(staticMethods, sch.statics || {});
let model = mongoose.model.bind(mongoose);
if (!util_1.isNullOrUndefined(roptions.existingConnection)) {
model = roptions.existingConnection.model.bind(roptions.existingConnection);
}
else {
sch.statics = sch.statics || {};
else if (!util_1.isNullOrUndefined(roptions.existingMongoose)) {
model = roptions.existingMongoose.model.bind(roptions.existingMongoose);
}
const instanceMethods = data_1.methods.instanceMethods[name];
if (instanceMethods) {
sch.methods = Object.assign(instanceMethods, sch.methods || {});
return addModelToTypegoose(model(name, buildSchema(cl, roptions.schemaOptions)), cl);
}
exports.getModelForClass = getModelForClass;
/* istanbul ignore next */
/**
* Builds the Schema & The Model
* DEPRECTAED: use getModelForClass
* @param cl The uninitialized Class
* @returns The Model
* @deprecated
*/
function setModelForClass(cl) {
return util_1.deprecate(getModelForClass(cl), 'setModelForClass is deprecated, please use getModelForClasse (see README#Migrate to 6.0.0');
}
exports.setModelForClass = setModelForClass;
/**
* Generates a Mongoose schema out of class props, iterating through all parents
* @param cl The not initialized Class
* @returns Returns the Build Schema
*/
function buildSchema(cl, options) {
if (typeof cl !== 'function') {
throw new errors_1.NoValidClass(cl);
}
else {
sch.methods = sch.methods || {};
const mergedOptions = utils_1.mergeSchemaOptions(options, cl);
let sch;
/** Parent Constructor */
let parentCtor = Object.getPrototypeOf(cl.prototype).constructor;
// iterate trough all parents
while (parentCtor && parentCtor.name !== 'Object') {
/* istanbul ignore next */
if (parentCtor.name === 'Typegoose') { // TODO: remove this "if", if the Typegoose class gets removed [DEPRECATION]
util_1.deprecate(() => undefined, 'The Typegoose Class is deprecated, please try to remove it')();
break;
}
// extend schema
sch = schema_1._buildSchema(parentCtor, sch, mergedOptions);
// set next parent
parentCtor = Object.getPrototypeOf(parentCtor.prototype).constructor;
}
if (data_1.hooks[name]) {
data_1.hooks[name].pre.forEach(preHookArgs => {
sch.pre(...preHookArgs);
});
data_1.hooks[name].post.forEach(postHookArgs => {
sch.post(...postHookArgs);
});
// get schema of current model
sch = schema_1._buildSchema(cl, sch, mergedOptions);
return sch;
}
exports.buildSchema = buildSchema;
/**
* This can be used to add custom Models to Typegoose, with the type infomation of cl
* Note: no gurantee that the type infomation is fully correct
* @param model The model to store
* @param cl The Class to store
* @example
* ```ts
* class T {}
*
* const schema = buildSchema(T);
* // modifications to the schame can be done
* const model = addModelToTypegoose(mongoose.model(schema), T);
* ```
*/
function addModelToTypegoose(model, cl) {
if (!(model.prototype instanceof mongoose.Model)) {
throw new TypeError(`"${model}" is not a valid Model!`);
}
if (data_1.plugins[name]) {
for (const plugin of data_1.plugins[name]) {
sch.plugin(plugin.mongoosePlugin, plugin.options);
}
if (typeof cl !== 'function') {
throw new errors_1.NoValidClass(cl);
}
const getterSetters = data_1.virtuals[name];
if (getterSetters) {
for (const key of Object.keys(getterSetters)) {
if (getterSetters[key].options && getterSetters[key].options.overwrite) {
sch.virtual(key, getterSetters[key].options);
}
else {
if (getterSetters[key].get) {
sch.virtual(key, getterSetters[key].options).get(getterSetters[key].get);
}
if (getterSetters[key].set) {
sch.virtual(key, getterSetters[key].options).set(getterSetters[key].set);
}
}
}
const name = utils_1.getName(cl);
if (data_1.constructors.get(name)) {
// tslint:disable-next-line:no-console
console.error(new Error('It seems like "addModelToTypegoose" got called twice\n'
+ 'Or multiple classes with the same name are used, which currently isnt supported!'
+ `"Erroring" class is ${name}`));
}
const indices = Reflect.getMetadata('typegoose:indices', t) || [];
for (const index of indices) {
sch.index(index.fields, index.options);
data_1.models.set(name, model);
data_1.constructors.set(name, cl);
return data_1.models.get(name);
}
exports.addModelToTypegoose = addModelToTypegoose;
/**
* Build a Model from a given class and return the model
* @param from The Model to build From
* @param cl The Class to make a model out
* @param id The Identifier to use to differentiate documents (default: cl.name)
* @example
* ```ts
* class C1 {}
* class C2 extends C1 {}
*
* const C1Model = getModelForClass(C1);
* const C2Model = getDiscriminatorModelForClass(C1Model, C1);
* ```
*/
function getDiscriminatorModelForClass(from, cl, id) {
const name = utils_1.getName(cl);
if (data_1.models.get(name)) {
return data_1.models.get(name);
}
return sch;
const sch = buildSchema(cl);
const discriminatorKey = sch.get('discriminatorKey');
if (sch.path(discriminatorKey)) {
sch.paths[discriminatorKey].options.$skipDiscriminatorCheck = true;
}
const model = from.discriminator(name, sch, id ? id : name);
return addModelToTypegoose(model, cl);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWdvb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3R5cGVnb29zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLHFDQUFxQztBQUNyQyw0QkFBMEI7QUFFMUIsaUNBQXlGO0FBR3pGLDhCQUF5QjtBQUN6Qiw0QkFBdUI7QUFDdkIsNkJBQXdCO0FBQ3hCLDhCQUF5QjtBQUN6Qix1QkFBa0I7QUFDbEIsa0NBQTZCO0FBQzdCLGlDQUE4QztBQUFyQyxzQ0FBQSxtQkFBbUIsQ0FBQTtBQWlCNUIsTUFBYSxTQUFTO0lBWWIsZ0JBQWdCLENBQ3JCLENBQUksRUFDSixFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxrQkFBa0IsS0FBOEIsRUFBRTtRQUVyRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZCLGdCQUFnQjtnQkFDaEIsYUFBYTtnQkFDYixrQkFBa0I7YUFDbkIsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxPQUFPLGFBQU0sQ0FBQyxJQUFJLENBQXdCLENBQUM7SUFDN0MsQ0FBQztJQVlNLGdCQUFnQixDQUNyQixDQUFJLEVBQ0osRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEtBQThCLEVBQUU7UUFFckYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFFbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBSSxDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRXhFLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksa0JBQWtCLEVBQUU7WUFDdEIsS0FBSyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUMzRDthQUFNLElBQUksZ0JBQWdCLEVBQUU7WUFDM0IsS0FBSyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUN2RDtRQUVELGFBQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLG1CQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUV0QyxPQUFPLGFBQU0sQ0FBQyxJQUFJLENBQXdCLENBQUM7SUFDN0MsQ0FBQztJQVFNLFdBQVcsQ0FBSSxDQUFJLEVBQUUsRUFBRSxhQUFhLEtBQThCLEVBQUU7UUFDekUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFHbkMsSUFBSSxHQUFHLEdBQUcsWUFBWSxDQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFbEQsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUUvRSxPQUFPLFVBQVUsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUVwRixHQUFHLEdBQUcsWUFBWSxDQUFJLENBQUMsRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUU5RCxVQUFVLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxDQUFDO1NBQ3RFO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUFqRkQsOEJBaUZDO0FBWUQsU0FBUyxZQUFZLENBQUksQ0FBSSxFQUFFLElBQVksRUFBRSxhQUFrQixFQUFFLEdBQXFCO0lBRXBGLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFFL0IsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLEdBQUcsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLGFBQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsYUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDMUY7U0FBTTtRQUNMLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDdkI7SUFHRCxNQUFNLGFBQWEsR0FBRyxjQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELElBQUksYUFBYSxFQUFFO1FBQ2pCLEdBQUcsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztLQUMvRDtTQUFNO1FBQ0wsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztLQUNqQztJQUdELE1BQU0sZUFBZSxHQUFHLGNBQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsSUFBSSxlQUFlLEVBQUU7UUFDbkIsR0FBRyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ2pFO1NBQU07UUFDTCxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO0tBQ2pDO0lBRUQsSUFBSSxZQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDZixZQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNuQyxHQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFDSCxZQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNyQyxHQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUVELElBQUksY0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2pCLEtBQUssTUFBTSxNQUFNLElBQUksY0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkQ7S0FDRjtJQUdELE1BQU0sYUFBYSxHQUFHLGVBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxJQUFJLGFBQWEsRUFBRTtRQUNqQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDNUMsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO2dCQUN0RSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDOUM7aUJBQU07Z0JBQ0wsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFO29CQUMxQixHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDMUU7Z0JBRUQsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFO29CQUMxQixHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDMUU7YUFDRjtTQUNGO0tBQ0Y7SUFHRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsRSxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRTtRQUMzQixHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ3hDO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIn0=
exports.getDiscriminatorModelForClass = getDiscriminatorModelForClass;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWdvb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3R5cGVnb29zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGFBQWE7QUFDYixxQ0FBcUM7QUFhNUIsNEJBQVE7QUFaakIsNEJBQTBCO0FBQzFCLCtCQUFvRDtBQUVwRCxtREFBbUQ7QUFrQjFDLHdDQUFjO0FBakJ2QixvREFBcUQ7QUFDckQsMENBQXVEO0FBQ3ZELDhDQUFpRDtBQUNqRCw4Q0FBaUQ7QUFDakQsNENBQThGO0FBSzlGLDZDQUF1RDtBQUE5QyxvQ0FBQSxXQUFXLENBQUE7QUFBRSxrQ0FBQSxTQUFTLENBQUE7QUFDL0IsOEJBQXlCO0FBQ3pCLDRCQUF1QjtBQUN2Qiw2QkFBd0I7QUFDeEIsOEJBQXlCO0FBQ3pCLHVCQUFrQjtBQUNsQixrQ0FBNkI7QUFDN0IsbUNBQThCO0FBRzlCLDBDQUF1RDtBQUE5QyxzQ0FBQSxtQkFBbUIsQ0FBQTtBQUU1QixrQkFBa0I7QUFDbEIsTUFBc0IsU0FBUztJQUM3QiwwQkFBMEI7SUFDMUI7UUFDRSxvQ0FBb0M7UUFDcEMsZ0JBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsZ0NBQWdDLENBQUMsRUFBRSxDQUFDO0lBQzNELENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsa0JBQWtCO0lBQ1gsZ0JBQWdCLENBQXNDLEVBQUssRUFBRSxRQUFjO1FBQ2hGLHNCQUFjLENBQUMseUJBQWEsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXpELE9BQU8sZ0JBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsa0JBQWtCO0lBQ1gsZ0JBQWdCLENBQXNDLEVBQUssRUFBRSxRQUFjO1FBQ2hGLHNCQUFjLENBQUMseUJBQWEsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxD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

@@ -1,4 +0,12 @@

import { Ref } from './prop';
import { InstanceType } from './typegoose';
export declare function isDocument<T>(doc: Ref<T>): doc is InstanceType<T>;
export declare function isDocumentArray<T>(docs: Ref<T>[]): docs is InstanceType<T>[];
import { DocumentType, Ref } from './typegoose';
import { RefType } from './types';
/**
* Check if the given document is already populated
* @param doc The Ref with uncertain type
*/
export declare function isDocument<T, S extends RefType>(doc: Ref<T, S>): doc is DocumentType<T>;
/**
* Check if the given array is already populated
* @param docs The Array of Refs with uncertain type
*/
export declare function isDocumentArray<T, S extends RefType>(docs: Ref<T, S>[]): docs is DocumentType<T>[];
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const mongoose = require("mongoose");
/**
* Check if the given document is already populated
* @param doc The Ref with uncertain type
*/
function isDocument(doc) {

@@ -8,6 +12,10 @@ return doc instanceof mongoose.Model;

exports.isDocument = isDocument;
/**
* Check if the given array is already populated
* @param docs The Array of Refs with uncertain type
*/
function isDocumentArray(docs) {
return Array.isArray(docs) && docs.every(v => isDocument(v));
return Array.isArray(docs) && docs.every((v) => isDocument(v));
}
exports.isDocumentArray = isDocumentArray;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWd1YXJkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90eXBlZ3VhcmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEscUNBQXFDO0FBU3JDLFNBQWdCLFVBQVUsQ0FBSSxHQUFXO0lBQ3ZDLE9BQU8sR0FBRyxZQUFZLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDdkMsQ0FBQztBQUZELGdDQUVDO0FBTUQsU0FBZ0IsZUFBZSxDQUFJLElBQWM7SUFDL0MsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsMENBRUMifQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWd1YXJkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90eXBlZ3VhcmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscUNBQXFDO0FBS3JDOzs7R0FHRztBQUNILFNBQWdCLFVBQVUsQ0FBdUIsR0FBYztJQUM3RCxPQUFPLEdBQUcsWUFBWSxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQ3ZDLENBQUM7QUFGRCxnQ0FFQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGVBQWUsQ0FBdUIsSUFBaUI7SUFDckUsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFGRCwwQ0FFQyJ9
{
"name": "@typegoose/typegoose",
"version": "5.9.2",
"description": "Define Mongoose models using TypeScript classes.",
"version": "6.0.0",
"description": "Define Mongoose models using TypeScript classes",
"main": "lib/typegoose.js",

@@ -28,3 +28,3 @@ "types": "lib/typegoose.d.ts",

},
"repository": "github:hasezoey/typegoose",
"repository": "github:typegoose/typegoose",
"author": "Akos Szokodi <akos@codingsans.com> (http://codingsans.com)",

@@ -37,33 +37,35 @@ "contributors": [

"peerDependencies": {
"mongoose": "^5.6.7"
"mongoose": "^5.7.1"
},
"devDependencies": {
"@istanbuljs/nyc-config-typescript": "^0.1.3",
"@types/chai": "^4.1.7",
"@types/chai-as-promised": "^7.1.0",
"@types/chai": "^4.2.3",
"@types/chai-as-promised": "^7.1.2",
"@types/mocha": "^5.2.7",
"@types/mongoose": "^5.5.11",
"@types/node": "^8.10.51",
"@types/mongoose": "^5.5.18",
"@types/node": "^8.10.53",
"chai": "^4.2.0",
"chai-as-promised": "^7.1.1",
"coveralls": "^3.0.5",
"mocha": "^6.2.0",
"mongodb-memory-server-global": "^5.1.9",
"mongoose": "^5.6.7",
"mongoose-findorcreate": "3.0.0",
"nyc": "*14.1.1",
"coveralls": "^3.0.6",
"mocha": "^6.2.1",
"mongodb-memory-server-global": "^5.2.5",
"mongoose": "^5.7.1",
"mongoose-findorcreate": "^3.0.0",
"nyc": "^14.1.1",
"prettier": "^1.18.2",
"prettier-tslint": "^0.4.2",
"rimraf": "*2.6.3",
"source-map-support": "^0.5.12",
"ts-node": "^8.3.0",
"tslint": "*5.18.0",
"tslint-config-prettier": "^1.18.0",
"tslint-eslint-rules": "^5.4.0",
"rimraf": "3.0.0",
"source-map-support": "^0.5.13",
"ts-node": "^8.4.1",
"tslint": "5.20.0",
"tslint-eslint-rules": "*5.4.0",
"typedoc": "*0.15.0",
"typescript": "*3.5.3"
"typescript": "3.6.3"
},
"dependencies": {
"loglevel": "^1.6.4",
"reflect-metadata": "^0.1.13"
},
"publishConfig": {
"access": "public"
}
}
# Typegoose
[![Build Status](https://travis-ci.com/typegoose/typegoose.svg?branch=old/5.x)](https://travis-ci.com/typegoose/typegoose)
[![Coverage Status](https://coveralls.io/repos/github/typegoose/typegoose/badge.svg?branch=old/5.x#feb282019)](https://coveralls.io/github/typegoose/typegoose?branch=old/5.x)
[![npm](https://img.shields.io/npm/dt/@typegoose/typegoose.svg)](https://npmjs.com/package/@typegoose/typegoose)
<sub>(These badges are from typegoose:master)</sub>
[![Build Status](https://travis-ci.com/typegoose/typegoose.svg?branch=master)](https://travis-ci.com/typegoose/typegoose)
[![Coverage Status](https://coveralls.io/repos/github/typegoose/typegoose/badge.svg?branch=master#feb282019)](https://coveralls.io/github/typegoose/typegoose?branch=master)
[![npm](https://img.shields.io/npm/dt/@typegoose/typegoose.svg)](https://www.npmjs.com/package/@typegoose/typegoose)
Define Mongoose models using TypeScript classes.
This Repository is the continuation of [the old one](https://github.com/szokodiakos/typegoose)
## Basic usage
```ts
import { prop, Typegoose, ModelType, InstanceType } from '@typegoose/typegoose';
import { prop, getModelForClass } from '@typegoose/typegoose';
import * as mongoose from 'mongoose';
mongoose.connect('mongodb://localhost:27017/typegoose');
class User extends Typegoose {
class User {
@prop()

@@ -24,9 +21,11 @@ name?: string;

const UserModel = new User().getModelForClass(User);
const UserModel = getModelForClass(User);
// UserModel is a regular Mongoose Model with correct types
(async () => {
const u = await UserModel.create({ name: 'JohnDoe' });
const user = await UserModel.findOne();
await mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
const { _id: id } = await UserModel.create({ name: 'JohnDoe' });
const user = await UserModel.findById(id).exec();
console.log(user);

@@ -43,3 +42,3 @@ // prints { _id: 59218f686409d670a97e53e0, name: 'JohnDoe', __v: 0 }

Under the hood it uses the [reflect-metadata](https://github.com/rbuckton/reflect-metadata) API to retrieve the types of the properties, so redundancy can be significantly reduced.
Under the hood it uses the Reflect & [reflect-metadata](https://github.com/rbuckton/reflect-metadata) API to retrieve the types of the properties, so redundancy can be significantly reduced.

@@ -91,3 +90,3 @@ Instead of:

class Car extends Typegoose {
class Car {
@prop()

@@ -97,3 +96,3 @@ model?: string;

class User extends Typegoose {
class User {
@prop()

@@ -115,7 +114,9 @@ name?: string;

---
## Requirements
* TypeScript 3.2+
* Node 8.10+
* mongoose ^5.6.7
* Node 8+
* mongoose ^5.7.1
* `emitDecoratorMetadata` and `experimentalDecorators` must be enabled in `tsconfig.json`

@@ -125,8 +126,10 @@

`npm install -s @typegoose/typegoose`
`npm i -s @typegoose/typegoose`
You also need to install `mongoose`, in versions < 5.0, these packages were listed as dependencies in `package.json`, starting with version 5.0 these packages are listed as peer dependencies.
You also need to install `mongoose`, since version 5 it is listed as a peer-dependency
`npm install -s mongoose`
`npm i -s mongoose`
## [Migrate to 6.0.0](https://typegoose.github.io/typegoose/guides/migrate-to-6/)
## Testing

@@ -138,9 +141,11 @@

`Major.Minor.Fix` (or how npm expresses it `Major.Minor.Patch`)
`Major.Minor.Fix` (or how npm expresses it `Major.Minor.Patch`)
(This Project should comply with [Semver](https://semver.org))
* `0.0.x` is for minor fixes, like hot-fixes
* `0.x.0` is for Minor things like adding features, that are non-breaking (or at least should not be breaking anything)
* `x.0.0` is for Major things like adding features that are breaking or refactoring which is a breaking change
* `0.0.0-x` is for a Pre-Release, that are not yet ready to be published
## Join Our Discord Server
To ask questions or just talk with us [join our Discord Server](https://discord.gg/BpGjTTD)
---
## API Documentation

@@ -150,28 +155,19 @@

This is the class which your schema defining classes must extend.
Since 6.0.0 deprecated, please try to remove it
#### Methods:
### Methods
`getModelForClass<T>(t: T, options?: GetModelForClassOptions)`
`getModelForClass<T>(cl: T)`
This method returns the corresponding Mongoose Model for the class (`T`). If no Mongoose model exists for this class yet, one will be created automatically (by calling the method `setModelForClass`).
`setModelForClass<T>(cl: T)`
`setModelForClass<T>(t: T, options?: GetModelForClassOptions)`
This Method is Deprecated see [Migrate to 6.0.0](https://typegoose.github.io/typegoose/guides/migrate-to-6/)
This method assembles the Mongoose Schema from the decorated schema defining class, creates the Mongoose Model and returns it. For typing reasons, the schema defining class must be passed down to it.
## Property decorators
Hint: If a Mongoose Model already exists for this class, it will be overwritten.
The `GetModelForClassOptions` provides multiple optional configurations:
* `existingMongoose: mongoose`: An existing Mongoose instance can also be passed down. If given, Typegoose uses this Mongoose instance's `model` methods.
* `schemaOptions: mongoose.SchemaOptions`: Additional [schema options](http://mongoosejs.com/docs/guide.html#options) can be passed down to the schema-to-be-created.
* `existingConnection: mongoose.Connection`: An existing Mongoose connection can also be passed down. If given, Typegoose uses this Mongoose instance's `model` methods.
### Property decorators
Typegoose comes with TypeScript decorators, which responsibility is to connect the Mongoose schema behind the TypeScript class.
#### prop(options)
### prop(options)

@@ -252,8 +248,8 @@ The `prop` decorator adds the target class property to the Mongoose schema as a property. Typegoose checks the decorated property's type and sets the schema property accordingly. If another Typegoose extending class is given as the type, Typegoose will recognize this property as a sub document.

```
- `_id`: When false, no \_id is added to the subdocument
```ts
class Car extends Typegoose {}
class Car {}
@prop({ _id: false })

@@ -266,3 +262,3 @@ car?: Car;

```ts
class Car extends Typegoose {}
class Car {}

@@ -276,7 +272,7 @@ @prop({ ref: Car })

```ts
class Car extends Typegoose {}
class Shop extends Typegoose {}
class Car {}
class Shop {}
// in another class
class Another extends Typegoose {
class Another {
@prop({ required: true, enum: 'Car' | 'Shop' })

@@ -304,3 +300,2 @@ which!: string;

- `validate` (custom validators): You can define your own validator function/regex using this. The function has to return a `boolean` or a Promise (async validation).

@@ -316,3 +311,3 @@

@prop({ validate: (value) => { return new Promise(res => { res(isEmail(value)) }) })
@prop({ validate: async (value) => { await isEmail(value) })
email?: string;

@@ -351,4 +346,5 @@

- `alias` (alias): Same as [Mongoose Alias](https://mongoosejs.com/docs/guide.html#aliases), only difference is the extra property for type completion
```ts
class Dummy extends Typegoose {
class Dummy {
@prop({ alias: "helloWorld" })

@@ -360,26 +356,91 @@ public hello: string; // will be included in the DB

Mongoose gives developers the option to create [virtual properties](http://mongoosejs.com/docs/api.html#schema_Schema-virtual). This means that actual database read/write will not occur these are just 'calculated properties'. A virtual property can have a setter and a getter. TypeScript also has a similar feature which Typegoose uses for virtual property definitions (using the `prop` decorator).
#### Virtuals
```ts
@prop()
firstName?: string;
- Mongoose gives developers the option to create [virtual properties](http://mongoosejs.com/docs/api.html#schema_Schema-virtual). This means that actual database read/write will not occur these are just 'calculated properties'. A virtual property can have a setter and a getter. TypeScript also has a similar feature which Typegoose uses for virtual property definitions (using the `prop` decorator).
@prop()
lastName?: string;
example:
@prop() // this will create a virtual property called 'fullName'
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
set fullName(full) {
const [firstName, lastName] = full.split(' ');
this.firstName = firstName;
this.lastName = lastName;
}
```
```ts
class Name {
@prop()
firstName?: string;
TODO: add documentation for virtual population
@prop()
lastName?: string;
#### arrayProp(options)
// this will create a virtual property called 'fullName'
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
set fullName(full) {
const [firstName, lastName] = full.split(' ');
this.firstName = firstName;
this.lastName = lastName;
}
}
```
DB Document:
```js
{
_id: ObjectId("<some long id>"),
firstName: "Will",
lastName: "Smith"
}
```
- Non-Virtuals are supported too:
example:
```ts
function setFullName(val: string[]): string {
return val.join(' ');
}
function getFullname(val: string): string[] {
return val.split(' ');
}
class Name {
@prop({ set: setFullName, get: getFullname })
fullname: string[]; // this is just for type completion & getting the type for the schema
}
...
await NameModel.create({ fullname: ['Will', 'Smith'] });
const [first, last]: string[] = (await NameModel.findOne({}).exec()).fullname;
```
DB Document:
```js
{
_id: ObjectId("<some long id>"),
fullname: "Will Smith"
}
```
- Virtual-Populate is also supported by doing
```ts
class RefClass {
@prop({ required: true, ref: Virtual })
public refToName: Ref<Virtual>;
}
class Name {
@prop({ ref: RefClass, foreignField: 'refToName', localField: '_id', justOne: false })
public somevalue: Ref<RefClass>;
}
```
Options ([look here for more details](https://mongoosejs.com/docs/api/schema.html#schema_Schema-virtual)):
- `ref`: This is like a normal ref [Required]
- `foreignField`: Which property(on the ref-Class) to match `localField` against [Required]
- `localField`: Which property(on the current-Class) to match `foreignField` against [Required]
- `justOne`: Return as One Document(true) or as Array(false) [Optional]
- `count`: Return the number of Documents found instead of the actual Documents [Optional]
### arrayProp(options)
The `arrayProp` is a `prop` decorator which makes it possible to create array schema properties.

@@ -401,3 +462,3 @@

```ts
class Car extends Typegoose {}
class Car {}

@@ -412,8 +473,8 @@ // in another class

```ts
class Car extends Typegoose {}
class Shop extends Typegoose {}
class Car {}
class Shop {}
// in another class
class Another extends Typegoose {
@prop({ required: true, enum: 'Car' | 'Shop' })
class Another {
@prop({ required: true, enum: ['Car', 'Shop'] })
which!: string;

@@ -426,3 +487,3 @@

#### mapProp(options)
### mapProp(options)

@@ -436,3 +497,3 @@ The `mapProp` is a `prop` decorator which makes it possible to create map schema properties.

```ts
class Car extends Typegoose {
class Car {
@mapProp({ of: Car })

@@ -443,55 +504,26 @@ public keys?: Map<string, Car>;

- `mapDefault` : This will set the default value for the map.
```ts
enum ProjectState {
WORKING = 'working',
BROKEN = 'broken',
MAINTAINANCE = 'maintainance',
}
class Car extends Typegoose {
@mapProp({ of: String, enum: ProjectState,mapDefault: { 'MainProject' : ProjectState.WORKING }})
public projects?: Map<string, ProjectState>;
}
```
### Method decorators
In Mongoose we can attach two types of methods for our schemas: static (model) methods and instance methods. Both of them are supported by Typegoose.
Method Decorators are deprecated see [Migrate to 6.0.0](https://typegoose.github.io/typegoose/guides/migrate-to-6/)
#### staticMethod
### Class decorators
Static Mongoose methods must be declared with `static` keyword on the Typegoose extending class. This will ensure, that these methods are callable on the Mongoose model (TypeScript won't throw development-time error for unexisting method on model object).
Mongoose allows the developer to add pre and post [hooks / middlewares](http://mongoosejs.com/docs/middleware.html) to the schema. With this it is possible to add document transformations and observations before or after validation, save and more.
If we want to use another static method of the model (built-in or created by us) we have to override the `this` in the method using the [type specifying of `this` for functions](https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript#specifying-the-type-of-this-for-functions). If we don't do this, TypeScript will throw development-time error on missing methods.
Typegoose provides this functionality through TypeScript's class decorators.
```ts
@staticMethod
static findByAge(this: ModelType<User> & typeof User, age: number) {
return this.findOne({ age });
}
```
#### modelOptions
Note that the `& typeof T` is only mandatory if we want to use the developer defined static methods inside this static method. If not then the `ModelType<T>` is sufficient, which will be explained in the Types section.
The Model Options can be used like below
#### instanceMethod
Instance methods are on the Mongoose document instances, thus they must be defined as non-static methods. Again if we want to call other instance methods the type of `this` must be redefined to `InstanceType<T>` (see Types).
```ts
@instanceMethod
incrementAge(this: InstanceType<User>) {
const age = this.age || 1;
this.age = age + 1;
return this.save();
}
@modelOptions({ existingMongoose, schemaOptions, existingConnection })
class Name {}
```
### Class decorators
The Options for `@modelOptions`:
* `existingMongoose: mongoose`: An existing Mongoose instance can also be passed down. If given, Typegoose uses this Mongoose instance's `model` methods.
* `schemaOptions: mongoose.SchemaOptions`: Additional [schema options](http://mongoosejs.com/docs/guide.html#options) can be passed down to the schema-to-be-created.
* `existingConnection: mongoose.Connection`: An existing Mongoose connection can also be passed down. If given, Typegoose uses this Mongoose instance's `model` methods.
Mongoose allows the developer to add pre and post [hooks / middlewares](http://mongoosejs.com/docs/middleware.html) to the schema. With this it is possible to add document transformations and observations before or after validation, save and more.
Typegoose provides this functionality through TypeScript's class decorators.
#### pre

@@ -503,3 +535,3 @@

```ts
@pre<Car>('save', function(next) { // or @pre(this: Car, 'save', ...
@pre<Car>('save', function(next) {
if (this.model === 'Tesla') {

@@ -510,3 +542,3 @@ this.isFast = true;

})
class Car extends Typegoose {
class Car {
@prop({ required: true })

@@ -535,3 +567,3 @@ model!: string;

})
class Car extends Typegoose {
class Car {
@prop({ required: true })

@@ -557,12 +589,10 @@ model!: string;

@plugin(findOrCreate)
class User extends Typegoose {
class User {
// this isn't the complete method signature, just an example
static findOrCreate(condition: InstanceType<User>):
Promise<{ doc: InstanceType<User>, created: boolean }>;
static findOrCreate(condition: DocumentType<User>):
Promise<{ doc: DocumentType<User>, created: boolean }>;
}
const UserModel = new User().getModelForClass(User);
UserModel.findOrCreate({ ... }).then(findOrCreateResult => {
...
});
const UserModel = getModelForClass(User);
const result = await UserModel.findOrCreate({ ... });
```

@@ -582,3 +612,3 @@

@index({ article: 1 }, { partialFilterExpression: { stars: { $gte: 4.5 } } })
export class Location extends Typegoose {
class Location {
@prop()

@@ -600,14 +630,13 @@ article?: number;

Some additional types were added to make Typegoose more user friendly.
Some additional types were added to make Typegoose more user friendly.
(for some additional types, that are not exported by default can be accessed via `import * as types from 'typegoose/types'`)
#### InstanceType<T>
#### DocumentType<T>
This is basically the logical 'and' of the `T` and the `mongoose.Document`, so that both the Mongoose instance properties/functions and the user defined properties/instance methods are available on the instance.
Note: TypeScript has its own InstanceType, you should import it from Typegoose
#### ReturnModelType<T>
#### ModelType<T>
This is the logical 'and' of `mongoose.Model<DocumentType<T>>` and `T`, so that the Mongoose model creates `DocumentType<T>` typed instances and all user defined static methods are available on the model.
This is the logical 'and' of `mongoose.Model<InstanceType<T>>` and `T`, so that the Mongoose model creates `InstanceType<T>` typed instances and all user defined static methods are available on the model.
#### Ref<T>

@@ -617,17 +646,21 @@

`Ref<T>` - `T` if populated and `ObjectID` if unpopulated.
-> there are TypeGuards for this to check named:
* `isDocument(T)`: returns `true` if `T` is populated, false otherwise
* `isDocumentArray(T)`: returns `true` if `T` is an Array **AND** is fully populated
---
## Improvements
* Add frequently used (currently not present) features if needed
* Create more tests (break down current huge one into multiple unit tests)
* Add Tests for:
- Hooks: add hook test for pre & post with error
- test for the errors (if invalid arguments are given)
- improve baseProp `required` handeling ()
### Notes
## Notes
* `mongoose` is a peer-dependency, and a dev dependency to install it for dev purposes
* Please dont add comments with `+1` or something like it, use the Reactions
* Please dont add comments with `+1` or something like that, use the Reactions
* Typegoose **cannot** be used with classes of the same name, it will always return the first build class with that name
* All Models in Typegoose are set to strict by default, and when you really want it to be changed, try `getModelForClass(class, {schemaOptions:{strict:false}})`
* All Models in Typegoose are set to strict by default, and **cant** be changed!
* `npm run doc` generates all documentation for all files that can be used as modules (is used for github-pages)
* `npm run doc:all` generates documentation even for internal modules
* This module should not be used with `ts-node --transpile-only`, `--type-check` must be added at least, szokodiakos#196

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc