UNPKG

tsgoose

Version:

TypeScript decorators for Mongoose

91 lines (90 loc) 3.23 kB
"use strict"; var __assign = (this && this.__assign) || Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; Object.defineProperty(exports, "__esModule", { value: true }); var mongoose = require("mongoose"); var data_1 = require("./data"); var TSGoose_1 = require("./TSGoose"); var Mixed = mongoose.Schema.Types.Mixed; var ObjectId = mongoose.Schema.Types.ObjectId; var PRIMITIVES = ['String', 'Number', 'Boolean', 'Date']; var isPrimitive = function (type) { return PRIMITIVES.indexOf(type.name) > -1; }; var isTSGoose = function (type) { var prototype = type.prototype; var name = type.name; while (name) { if (name === 'TSGoose') { return true; } prototype = Object.getPrototypeOf(prototype); name = prototype ? prototype.constructor.name : null; } return false; }; function TSGooseProp(options) { // console.log('TSGooseProp options', options); if (options === void 0) { options = {}; } return function (target, propertyKey) { var name = target.constructor.name; var type = Reflect.getMetadata('design:type', target, propertyKey); var isVirtual = Object.getOwnPropertyDescriptor(target, propertyKey); if (isVirtual) { data_1.virtuals[name] = data_1.virtuals[name] || []; data_1.virtuals[name].push({ name: propertyKey, get: isVirtual.get, set: isVirtual.set //tslint:disable-line }); return; } var isArray = type === Array; if (isArray) { if (!options.arrayType) { throw new Error('Property is array. Please define array type in prop options `arrayType`.'); } type = options.arrayType; } if (options.enum) { options.enum = Object.keys(options.enum).map(function (key) { return options.enum[key]; }); type = String; } data_1.schemas[name] = data_1.schemas[name] || {}; var schema = data_1.schemas[name]; var mongooseDef = { type: type }; if (isPrimitive(type)) { if (isArray) { mongooseDef.type = [mongooseDef.type]; } var extraOptions = __assign({}, options); delete extraOptions.arrayType; delete extraOptions.ref; Object.assign(mongooseDef, extraOptions); } else { if (isTSGoose(type)) { TSGoose_1.getTSGooseModel(type); if (options.ref) { mongooseDef.type = ObjectId; mongooseDef.ref = type.name; } else { mongooseDef = TSGoose_1.getTSGooseSchema(type); } } else { mongooseDef.type = Mixed; } if (isArray) { mongooseDef = [mongooseDef]; } } schema[propertyKey] = mongooseDef; }; } exports.TSGooseProp = TSGooseProp;