@typegoose/typegoose
Version:
Define Mongoose models using TypeScript classes
416 lines • 41 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.processProp = processProp;
const tslib_1 = require("tslib");
const logSettings_1 = require("../logSettings");
const typegoose_1 = require("../typegoose");
const constants_1 = require("./constants");
const errors_1 = require("./errors");
const utils = tslib_1.__importStar(require("./utils"));
/**
* Function that is the actual processing of the prop's (used for caching)
* @param input All the options needed for prop's
*/
function processProp(input) {
const { key, target, mergedOptions } = input;
const name = utils.getName(target);
const rawOptions = Object.assign({}, input.options);
let Type = Reflect.getMetadata(constants_1.DecoratorKeys.Type, target, key);
let propKind = input.propType ?? detectPropType(Type);
logSettings_1.logger.debug('Starting to process "%s.%s"', name, key);
utils.assertion(typeof key === 'string', () => new errors_1.CannotBeSymbolError(name, key));
// optionDeprecation(rawOptions);
{
// soft errors & "type"-alias mapping
switch (propKind) {
case constants_1.PropType.NONE:
break;
case constants_1.PropType.MAP:
case constants_1.PropType.ARRAY:
// set the "Type" to undefined if "ref" or "refPath" are defined, as an fallback in case "type" is also not defined
if (('ref' in rawOptions || 'refPath' in rawOptions) && !('type' in rawOptions)) {
Type = undefined;
}
break;
}
}
if (!utils.isNullOrUndefined(rawOptions.type)) {
logSettings_1.logger.info('Prop Option "type" is set to ', rawOptions.type);
const gotType = utils.getType(rawOptions.type);
Type = gotType.type;
if (gotType.dim > 0) {
rawOptions.dim = gotType.dim;
// Infer "type: [TYPE]" as a array, only if the PropType is not manually set or already inferred as something else
// This is useful if reflection fails or when working without "emitDecoratorMetadata"
if (utils.isNullOrUndefined(input.propType) && propKind == constants_1.PropType.NONE) {
logSettings_1.logger.debug('Detected "type" being set to a array, using PropType.ARRAY');
propKind = constants_1.PropType.ARRAY;
}
}
delete rawOptions.type;
}
// prevent "infinite" buildSchema loop / Maximum Stack size exceeded
if (Type === target.constructor) {
throw new errors_1.SelfContainingClassError(name, key);
}
// map to correct buffer type, otherwise it would result in "Mixed"
if (Type === typegoose_1.mongoose.Types.Buffer) {
Type = typegoose_1.mongoose.Schema.Types.Buffer;
}
// confirm that "PropType" is an ARRAY and if that the Type is still an *ARRAY, set them to Mixed
// for issues like https://github.com/typegoose/typegoose/issues/300
if (propKind === constants_1.PropType.ARRAY && detectPropType(Type) === constants_1.PropType.ARRAY) {
logSettings_1.logger.debug('Type is still *ARRAY, defaulting to Mixed');
Type = typegoose_1.mongoose.Schema.Types.Mixed;
}
// confirm that "PropType" is an MAP and if that the Type is still an *MAP, set them to Mixed
if (propKind === constants_1.PropType.MAP && detectPropType(Type) === constants_1.PropType.MAP) {
logSettings_1.logger.debug('Type is still *Map, defaulting to Mixed');
Type = typegoose_1.mongoose.Schema.Types.Mixed;
}
if (utils.isNotDefined(Type)) {
(0, typegoose_1.buildSchema)(Type);
}
const modelOptionsOfType = Reflect.getMetadata(constants_1.DecoratorKeys.ModelOptions, Type ?? {}) ?? {};
// throw a error when both "discriminators" as a prop-option and as a model-option are defined
if ('discriminators' in rawOptions && !utils.isNullOrUndefined(modelOptionsOfType?.options?.discriminators)) {
throw new errors_1.DuplicateOptionsError(['discriminators(prop-option)', 'discriminators(model-option)']);
}
if ('discriminators' in rawOptions || !utils.isNullOrUndefined(modelOptionsOfType?.options?.discriminators)) {
const discriminatorsToUse = rawOptions?.discriminators ?? modelOptionsOfType?.options?.discriminators;
logSettings_1.logger.debug('Found option "discriminators" in "%s.%s"', name, key);
const gotType = utils.getType(discriminatorsToUse, true);
utils.assertion(gotType.dim === 1, () => new errors_1.OptionDoesNotSupportOptionError('discriminators', 'dim', '1', `dim: ${gotType.dim}`));
const discriminators = gotType.type.map((val, index) => {
if (utils.isConstructor(val)) {
return { type: val };
}
if (typeof val === 'object') {
if (!('type' in val)) {
throw new Error(`"${name}.${key}" discriminator index "${index}" is an object, but does not contain the "type" property!`);
}
return val;
}
throw new Error(`"${name}.${key}" discriminators index "${index}" is not an object or an constructor!`);
});
const disMap = new Map(Reflect.getMetadata(constants_1.DecoratorKeys.NestedDiscriminators, target.constructor) ?? []);
disMap.set(key, discriminators);
Reflect.defineMetadata(constants_1.DecoratorKeys.NestedDiscriminators, disMap, target.constructor);
delete rawOptions.discriminators;
}
// allow setting the type asynchronously
if ('ref' in rawOptions) {
const gotType = utils.getType(rawOptions.ref);
utils.assertion(gotType.dim === 0, () => new errors_1.OptionDoesNotSupportOptionError('ref', 'dim', '0', `dim: ${gotType.dim}`));
rawOptions.ref = gotType.type;
utils.assertion(!utils.isNullOrUndefined(rawOptions.ref), () => new errors_1.RefOptionIsUndefinedError(name, key));
rawOptions.ref =
typeof rawOptions.ref === 'string'
? rawOptions.ref
: utils.isConstructor(rawOptions.ref)
? utils.getName(rawOptions.ref)
: rawOptions.ref;
}
if (utils.isWithVirtualPOP(rawOptions)) {
if (!utils.includesAllVirtualPOP(rawOptions)) {
throw new errors_1.NotAllVPOPElementsError(name, key);
}
const virtuals = new Map(Reflect.getMetadata(constants_1.DecoratorKeys.VirtualPopulate, target.constructor) ?? []);
virtuals.set(key, rawOptions);
Reflect.defineMetadata(constants_1.DecoratorKeys.VirtualPopulate, virtuals, target.constructor);
return;
}
if ('justOne' in rawOptions) {
logSettings_1.logger.warn(`Option "justOne" is defined in "${name}.${key}" but no Virtual-Populate-Options!\n` +
'Look here for more: https://typegoose.github.io/typegoose/docs/api/virtuals#virtual-populate');
}
const schemaProp = utils.getCachedSchema(input.cl);
// do this early, because the other options (enum, ref, refPath, discriminators) should not matter for this one
if (Type instanceof typegoose_1.Passthrough) {
logSettings_1.logger.debug('Type is "instanceof Passthrough" ("%s.%s", %s, direct: %s)', name, key, propKind, Type.direct);
// this is because the check above narrows down the type, which somehow is not compatible
const newType = Type.raw;
if (Type.direct) {
schemaProp[key] = newType;
return;
}
switch (propKind) {
case constants_1.PropType.ARRAY:
schemaProp[key] = utils.mapArrayOptions(rawOptions, newType, target, key, mergedOptions);
return;
case constants_1.PropType.MAP: {
const mapped = utils.mapOptions(rawOptions, newType, target, key, mergedOptions);
schemaProp[key] = {
...mapped.outer,
type: Map,
of: { type: newType, ...mapped.inner },
};
return;
}
case constants_1.PropType.NONE:
schemaProp[key] = {
...rawOptions,
type: newType,
};
return;
default:
throw new errors_1.InvalidPropTypeError(propKind, name, key, 'PropType(Passthrough)');
}
}
// use "Type" if it is an suitable ref-type, otherwise default back to "ObjectId"
const refType = utils.isAnRefType(Type) ? Type : typegoose_1.mongoose.Schema.Types.ObjectId;
if ('ref' in rawOptions) {
const ref = rawOptions.ref;
delete rawOptions.ref;
switch (propKind) {
case constants_1.PropType.ARRAY:
schemaProp[key] = utils.mapArrayOptions(rawOptions, refType, target, key, mergedOptions, undefined, { ref });
break;
case constants_1.PropType.NONE:
schemaProp[key] = {
type: refType,
ref,
...rawOptions,
};
break;
case constants_1.PropType.MAP: {
const mapped = utils.mapOptions(rawOptions, refType, target, key, mergedOptions);
schemaProp[key] = {
...mapped.outer,
type: Map,
of: {
type: refType,
ref,
...mapped.inner,
},
};
break;
}
default:
throw new errors_1.InvalidPropTypeError(propKind, name, key, 'PropType(ref)');
}
return;
}
if ('refPath' in rawOptions) {
const refPath = rawOptions.refPath;
delete rawOptions.refPath;
utils.assertion(typeof refPath === 'string' && refPath.length > 0, () => new errors_1.StringLengthExpectedError(1, refPath, `${name}.${key}`, 'refPath'));
switch (propKind) {
case constants_1.PropType.ARRAY:
schemaProp[key] = utils.mapArrayOptions(rawOptions, refType, target, key, mergedOptions, undefined, { refPath });
break;
case constants_1.PropType.NONE:
schemaProp[key] = {
type: refType,
refPath,
...rawOptions,
};
break;
default:
throw new errors_1.InvalidPropTypeError(propKind, name, key, 'PropType(refPath)');
}
return;
}
// check if Type is actually a real working Type
if (utils.isNullOrUndefined(Type) || typeof Type !== 'function') {
throw new errors_1.InvalidTypeError(name, key, Type);
}
if (!utils.isNullOrUndefined(rawOptions.enum)) {
let useType = rawOptions.enum;
let inValues = false;
if (rawOptions.enum?.constructor === Object && 'values' in rawOptions.enum) {
useType = rawOptions.enum.values;
inValues = true;
}
// disabling lint line, because eslint seemingly cant handle a changing value and a unchanging value in the same destruction
// eslint-disable-next-line prefer-const
let { dim: enumDim, type: enumType } = utils.getType(useType, true);
utils.assertion(enumDim === 1 || enumDim === 0, () => new errors_1.OptionDoesNotSupportOptionError('enum', 'dim', '0 or 1', `dim: ${enumDim}`));
// check if the option is already a array (mongoose enum), if not convert it
if (!Array.isArray(enumType)) {
if (Type === String || Type === typegoose_1.mongoose.Schema.Types.String) {
enumType = Object.entries(enumType) // get all key-value pairs of the enum
// no reverse-filtering because if it is full of strings, there is no reverse mapping
.map(([enumKey, enumValue]) => {
// convert key-value pairs to an mongoose-usable enum
// safeguard, this should never happen because TypeScript only sets "design:type" to "String"
// if the enum is full of strings
if (typeof enumValue !== 'string') {
throw new errors_1.NotStringTypeError(name, key, enumKey, typeof enumValue);
}
return enumValue;
});
}
else if (Type === Number || Type === typegoose_1.mongoose.Schema.Types.Number) {
enumType = Object.entries(enumType) // get all key-value pairs of the enum
// filter out the "reverse (value -> name) mappings"
// https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings
.filter(([enumKey, enumValue], _i, arr) => {
// safeguard, this should never happen because typescript only sets "design:type" to "Number"
// if the enum is full of numbers
if (utils.isNullOrUndefined(enumValue) || arr.findIndex(([k]) => k === enumValue.toString()) <= -1) {
// if there is no reverse mapping, throw an error
throw new errors_1.NotNumberTypeError(name, key, enumKey, typeof enumValue);
}
return typeof enumValue === 'number';
})
.map(([enumKey, enumValue]) => {
// convert key-value pairs to an mongoose-useable enum
if (typeof enumValue !== 'number') {
throw new errors_1.NotNumberTypeError(name, key, enumKey, typeof enumValue);
}
return enumValue;
});
}
else {
// this will happen if the enum type is not "String" or "Number"
// most likely this error happened because the code got transpiled with babel or "tsc --transpile-only"
throw new errors_1.InvalidEnumTypeError(name, key, Type);
}
}
// re-assign the option with the updated type
if (inValues) {
rawOptions.enum.values = enumType;
}
else {
rawOptions.enum = enumType;
}
}
if (!utils.isNullOrUndefined(rawOptions.addNullToEnum)) {
rawOptions.enum = Array.isArray(rawOptions.enum) ? rawOptions.enum : [];
rawOptions.enum.push(null);
delete rawOptions.addNullToEnum;
}
{
let included = utils.isWithStringValidate(rawOptions);
if (!utils.isString(Type)) {
// warn if String-Validate options are included, but is not string
utils.warnNotCorrectTypeOptions(name, key, 'String', 'String-Validate', included);
}
included = utils.isWithStringTransform(rawOptions);
if (!utils.isString(Type)) {
// warn if String-Transform options are included, but is not string
utils.warnNotCorrectTypeOptions(name, key, 'String', 'String-Transform', included);
}
included = utils.isWithNumberValidate(rawOptions);
if (!utils.isNumber(Type)) {
// warn if Number-Validate options are included, but is not number
utils.warnNotCorrectTypeOptions(name, key, 'Number', 'Number-Validate', included);
}
included = utils.isWithEnumValidate(rawOptions);
if (!utils.isString(Type) && !utils.isNumber(Type)) {
// warn if "enum" is included, but is not Number or String
utils.warnNotCorrectTypeOptions(name, key, 'String | Number', 'extra', included);
}
}
/** Is this Type (/Class) in the schemas Map? */
const hasCachedSchema = !utils.isNullOrUndefined(Reflect.getMetadata(constants_1.DecoratorKeys.CachedSchema, Type));
if (utils.isPrimitive(Type)) {
if (utils.isObject(Type, true)) {
utils.warnMixed(target, key, mergedOptions);
}
switch (propKind) {
case constants_1.PropType.ARRAY:
schemaProp[key] = utils.mapArrayOptions(rawOptions, Type, target, key, mergedOptions);
return;
case constants_1.PropType.MAP: {
let mapped;
let finalType;
// Map the correct options for the end type
if (utils.isTypeMeantToBeArray(rawOptions)) {
mapped = utils.mapOptions(rawOptions, typegoose_1.mongoose.Schema.Types.Array, target, key, mergedOptions);
// "rawOptions" is not used here, because that would duplicate some options to where the should not be
finalType = utils.mapArrayOptions({ ...mapped.inner, dim: rawOptions.dim }, Type, target, key, mergedOptions);
}
else {
mapped = utils.mapOptions(rawOptions, Type, target, key, mergedOptions);
finalType = { ...mapped.inner, type: Type };
}
schemaProp[key] = {
...mapped.outer,
type: Map,
of: { ...finalType },
};
return;
}
case constants_1.PropType.NONE:
schemaProp[key] = {
...rawOptions,
type: Type,
};
return;
default:
throw new errors_1.InvalidPropTypeError(propKind, name, key, 'PropType(primitive)');
}
}
// 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) && !hasCachedSchema) {
utils.warnMixed(target, key, mergedOptions);
logSettings_1.logger.warn('if someone can see this message, please open an new issue at https://github.com/typegoose/typegoose/issues with reproduction code for tests');
schemaProp[key] = {
...rawOptions,
type: typegoose_1.mongoose.Schema.Types.Mixed,
};
return;
}
const virtualSchema = (0, typegoose_1.buildSchema)(Type);
switch (propKind) {
case constants_1.PropType.ARRAY:
schemaProp[key] = utils.mapArrayOptions(rawOptions, virtualSchema, target, key, Type);
return;
case constants_1.PropType.MAP: {
// special handling if the lower type should be an array
if ('dim' in rawOptions) {
logSettings_1.logger.debug('Map SubDocument Array for "%s.%s"', name, key);
const { type, ...outer } = utils.mapArrayOptions(rawOptions, virtualSchema, target, key, Type);
schemaProp[key] = {
...outer,
type: Map,
of: type,
};
return;
}
const mapped = utils.mapOptions(rawOptions, virtualSchema, target, key, Type);
schemaProp[key] = {
...mapped.outer,
type: Map,
of: { type: virtualSchema, ...mapped.inner },
};
return;
}
case constants_1.PropType.NONE:
schemaProp[key] = {
...rawOptions,
type: virtualSchema,
};
return;
default:
throw new errors_1.InvalidPropTypeError(propKind, name, key, 'PropType(subSchema)');
}
}
// The following function ("optionDeprecation") is disabled until used again
/**
* Check for deprecated options, and if needed process them
* @param options
*/
// function optionDeprecation(options: any) {}
/**
* Detect "PropType" based on "Type"
* @param Type The Type used for detection
*/
function detectPropType(Type) {
logSettings_1.logger.debug('Detecting PropType');
if (Type === Array ||
Type === typegoose_1.mongoose.Types.Array ||
Type === typegoose_1.mongoose.Schema.Types.Array ||
Type === typegoose_1.mongoose.Types.DocumentArray ||
Type === typegoose_1.mongoose.Schema.Types.DocumentArray) {
return constants_1.PropType.ARRAY;
}
if (Type === Map || Type === typegoose_1.mongoose.Types.Map || Type === typegoose_1.mongoose.Schema.Types.Map) {
return constants_1.PropType.MAP;
}
return constants_1.PropType.NONE;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc1Byb3AuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJuYWwvcHJvY2Vzc1Byb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpQ0Esa0NBNmNDOztBQTllRCxnREFBd0M7QUFDeEMsNENBQWtFO0FBV2xFLDJDQUFzRDtBQUN0RCxxQ0Fha0I7QUFDbEIsdURBQWlDO0FBRWpDOzs7R0FHRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUF5QjtJQUNuRCxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDN0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxNQUFNLFVBQVUsR0FBaUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLElBQUksSUFBSSxHQUFvQixPQUFPLENBQUMsV0FBVyxDQUFDLHlCQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV0RCxvQkFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSw0QkFBbUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUVuRixpQ0FBaUM7SUFFakMsQ0FBQztRQUNDLHFDQUFxQztRQUNyQyxRQUFRLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLEtBQUssb0JBQVEsQ0FBQyxJQUFJO2dCQUNoQixNQUFNO1lBQ1IsS0FBSyxvQkFBUSxDQUFDLEdBQUcsQ0FB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