tsgoose
Version:
TypeScript decorators for Mongoose
91 lines (90 loc) • 3.23 kB
JavaScript
;
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;