1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.processProp = void 0;
|
4 | const logSettings_1 = require("../logSettings");
|
5 | const typegoose_1 = require("../typegoose");
|
6 | const constants_1 = require("./constants");
|
7 | const errors_1 = require("./errors");
|
8 | const utils = require("./utils");
|
9 | /**
|
10 | * Function that is the actual processing of the prop's (used for caching)
|
11 | * @param input All the options needed for prop's
|
12 | */
|
13 | function processProp(input) {
|
14 | const { key, target } = input;
|
15 | const name = utils.getName(target);
|
16 | const rawOptions = Object.assign({}, input.options);
|
17 | let Type = Reflect.getMetadata(constants_1.DecoratorKeys.Type, target, key);
|
18 | const propKind = input.propType ?? detectPropType(Type);
|
19 | logSettings_1.logger.debug('Starting to process "%s.%s"', name, key);
|
20 | utils.assertion(typeof key === 'string', () => new errors_1.CannotBeSymbolError(name, key));
|
21 | // optionDeprecation(rawOptions);
|
22 | {
|
23 | // soft errors & "type"-alias mapping
|
24 | switch (propKind) {
|
25 | case constants_1.PropType.NONE:
|
26 | break;
|
27 | case constants_1.PropType.MAP:
|
28 | case constants_1.PropType.ARRAY:
|
29 | // set the "Type" to undefined if "ref" or "refPath" are defined, as an fallback in case "type" is also not defined
|
30 | if (('ref' in rawOptions || 'refPath' in rawOptions) && !('type' in rawOptions)) {
|
31 | Type = undefined;
|
32 | }
|
33 | break;
|
34 | }
|
35 | }
|
36 | if (!utils.isNullOrUndefined(rawOptions.type)) {
|
37 | logSettings_1.logger.info('Prop Option "type" is set to ', rawOptions.type);
|
38 | const gotType = utils.getType(rawOptions.type);
|
39 | Type = gotType.type;
|
40 | if (gotType.dim > 0) {
|
41 | rawOptions.dim = gotType.dim;
|
42 | }
|
43 | delete rawOptions.type;
|
44 | }
|
45 | // prevent "infinite" buildSchema loop / Maximum Stack size exceeded
|
46 | if (Type === target.constructor) {
|
47 | throw new errors_1.SelfContainingClassError(name, key);
|
48 | }
|
49 | // map to correct buffer type, otherwise it would result in "Mixed"
|
50 | if (Type === typegoose_1.mongoose.Types.Buffer) {
|
51 | Type = typegoose_1.mongoose.Schema.Types.Buffer;
|
52 | }
|
53 | // confirm that "PropType" is an ARRAY and if that the Type is still an *ARRAY, set them to Mixed
|
54 | // for issues like https://github.com/typegoose/typegoose/issues/300
|
55 | if (propKind === constants_1.PropType.ARRAY && detectPropType(Type) === constants_1.PropType.ARRAY) {
|
56 | logSettings_1.logger.debug('Type is still *ARRAY, defaulting to Mixed');
|
57 | Type = typegoose_1.mongoose.Schema.Types.Mixed;
|
58 | }
|
59 | // confirm that "PropType" is an MAP and if that the Type is still an *MAP, set them to Mixed
|
60 | if (propKind === constants_1.PropType.MAP && detectPropType(Type) === constants_1.PropType.MAP) {
|
61 | logSettings_1.logger.debug('Type is still *Map, defaulting to Mixed');
|
62 | Type = typegoose_1.mongoose.Schema.Types.Mixed;
|
63 | }
|
64 | if (utils.isNotDefined(Type)) {
|
65 | (0, typegoose_1.buildSchema)(Type);
|
66 | }
|
67 | const modelOptionsOfType = Reflect.getMetadata(constants_1.DecoratorKeys.ModelOptions, Type ?? {}) ?? {};
|
68 | // throw a error when both "discriminators" as a prop-option and as a model-option are defined
|
69 | if ('discriminators' in rawOptions && !utils.isNullOrUndefined(modelOptionsOfType?.options?.discriminators)) {
|
70 | throw new errors_1.DuplicateOptionsError(['discriminators(prop-option)', 'discriminators(model-option)']);
|
71 | }
|
72 | if ('discriminators' in rawOptions || !utils.isNullOrUndefined(modelOptionsOfType?.options?.discriminators)) {
|
73 | const discriminatorsToUse = rawOptions?.discriminators ?? modelOptionsOfType?.options?.discriminators;
|
74 | logSettings_1.logger.debug('Found option "discriminators" in "%s.%s"', name, key);
|
75 | const gotType = utils.getType(discriminatorsToUse, true);
|
76 | utils.assertion(gotType.dim === 1, () => new errors_1.OptionDoesNotSupportOptionError('discriminators', 'dim', '1', `dim: ${gotType.dim}`));
|
77 | const discriminators = gotType.type.map((val, index) => {
|
78 | if (utils.isConstructor(val)) {
|
79 | return { type: val };
|
80 | }
|
81 | if (typeof val === 'object') {
|
82 | if (!('type' in val)) {
|
83 | throw new Error(`"${name}.${key}" discriminator index "${index}" is an object, but does not contain the "type" property!`);
|
84 | }
|
85 | return val;
|
86 | }
|
87 | throw new Error(`"${name}.${key}" discriminators index "${index}" is not an object or an constructor!`);
|
88 | });
|
89 | const disMap = new Map(Reflect.getMetadata(constants_1.DecoratorKeys.NestedDiscriminators, target.constructor) ?? []);
|
90 | disMap.set(key, discriminators);
|
91 | Reflect.defineMetadata(constants_1.DecoratorKeys.NestedDiscriminators, disMap, target.constructor);
|
92 | delete rawOptions.discriminators;
|
93 | }
|
94 | // allow setting the type asynchronously
|
95 | if ('ref' in rawOptions) {
|
96 | const gotType = utils.getType(rawOptions.ref);
|
97 | utils.assertion(gotType.dim === 0, () => new errors_1.OptionDoesNotSupportOptionError('ref', 'dim', '0', `dim: ${gotType.dim}`));
|
98 | rawOptions.ref = gotType.type;
|
99 | utils.assertion(!utils.isNullOrUndefined(rawOptions.ref), () => new errors_1.RefOptionIsUndefinedError(name, key));
|
100 | rawOptions.ref =
|
101 | typeof rawOptions.ref === 'string'
|
102 | ? rawOptions.ref
|
103 | : utils.isConstructor(rawOptions.ref)
|
104 | ? utils.getName(rawOptions.ref)
|
105 | : rawOptions.ref;
|
106 | }
|
107 | if (utils.isWithVirtualPOP(rawOptions)) {
|
108 | if (!utils.includesAllVirtualPOP(rawOptions)) {
|
109 | throw new errors_1.NotAllVPOPElementsError(name, key);
|
110 | }
|
111 | const virtuals = new Map(Reflect.getMetadata(constants_1.DecoratorKeys.VirtualPopulate, target.constructor) ?? []);
|
112 | virtuals.set(key, rawOptions);
|
113 | Reflect.defineMetadata(constants_1.DecoratorKeys.VirtualPopulate, virtuals, target.constructor);
|
114 | return;
|
115 | }
|
116 | if ('justOne' in rawOptions) {
|
117 | logSettings_1.logger.warn(`Option "justOne" is defined in "${name}.${key}" but no Virtual-Populate-Options!\n` +
|
118 | 'Look here for more: https://typegoose.github.io/typegoose/docs/api/virtuals#virtual-populate');
|
119 | }
|
120 | const schemaProp = utils.getCachedSchema(input.cl);
|
121 | // do this early, because the other options (enum, ref, refPath, discriminators) should not matter for this one
|
122 | if (Type instanceof typegoose_1.Passthrough) {
|
123 | logSettings_1.logger.debug('Type is "instanceof Passthrough" ("%s.%s", %s, direct: %s)', name, key, propKind, Type.direct);
|
124 | // this is because the check above narrows down the type, which somehow is not compatible
|
125 | const newType = Type.raw;
|
126 | if (Type.direct) {
|
127 | schemaProp[key] = newType;
|
128 | return;
|
129 | }
|
130 | switch (propKind) {
|
131 | case constants_1.PropType.ARRAY:
|
132 | schemaProp[key] = utils.mapArrayOptions(rawOptions, newType, target, key);
|
133 | return;
|
134 | case constants_1.PropType.MAP:
|
135 | const mapped = utils.mapOptions(rawOptions, newType, target, key);
|
136 | schemaProp[key] = {
|
137 | ...mapped.outer,
|
138 | type: Map,
|
139 | of: { type: newType, ...mapped.inner },
|
140 | };
|
141 | return;
|
142 | case constants_1.PropType.NONE:
|
143 | schemaProp[key] = {
|
144 | ...rawOptions,
|
145 | type: newType,
|
146 | };
|
147 | return;
|
148 | default:
|
149 | throw new errors_1.InvalidPropTypeError(propKind, name, key, 'PropType(Passthrough)');
|
150 | }
|
151 | }
|
152 | // use "Type" if it is an suitable ref-type, otherwise default back to "ObjectId"
|
153 | const refType = utils.isAnRefType(Type) ? Type : typegoose_1.mongoose.Schema.Types.ObjectId;
|
154 | if ('ref' in rawOptions) {
|
155 | const ref = rawOptions.ref;
|
156 | delete rawOptions.ref;
|
157 | switch (propKind) {
|
158 | case constants_1.PropType.ARRAY:
|
159 | schemaProp[key] = utils.mapArrayOptions(rawOptions, refType, target, key, undefined, { ref });
|
160 | break;
|
161 | case constants_1.PropType.NONE:
|
162 | schemaProp[key] = {
|
163 | type: refType,
|
164 | ref,
|
165 | ...rawOptions,
|
166 | };
|
167 | break;
|
168 | case constants_1.PropType.MAP:
|
169 | const mapped = utils.mapOptions(rawOptions, refType, target, key);
|
170 | schemaProp[key] = {
|
171 | ...mapped.outer,
|
172 | type: Map,
|
173 | of: {
|
174 | type: refType,
|
175 | ref,
|
176 | ...mapped.inner,
|
177 | },
|
178 | };
|
179 | break;
|
180 | default:
|
181 | throw new errors_1.InvalidPropTypeError(propKind, name, key, 'PropType(ref)');
|
182 | }
|
183 | return;
|
184 | }
|
185 | if ('refPath' in rawOptions) {
|
186 | const refPath = rawOptions.refPath;
|
187 | delete rawOptions.refPath;
|
188 | utils.assertion(typeof refPath === 'string' && refPath.length > 0, () => new errors_1.StringLengthExpectedError(1, refPath, `${name}.${key}`, 'refPath'));
|
189 | switch (propKind) {
|
190 | case constants_1.PropType.ARRAY:
|
191 | schemaProp[key] = utils.mapArrayOptions(rawOptions, refType, target, key, undefined, { refPath });
|
192 | break;
|
193 | case constants_1.PropType.NONE:
|
194 | schemaProp[key] = {
|
195 | type: refType,
|
196 | refPath,
|
197 | ...rawOptions,
|
198 | };
|
199 | break;
|
200 | default:
|
201 | throw new errors_1.InvalidPropTypeError(propKind, name, key, 'PropType(refPath)');
|
202 | }
|
203 | return;
|
204 | }
|
205 | // check if Type is actually a real working Type
|
206 | if (utils.isNullOrUndefined(Type) || typeof Type !== 'function') {
|
207 | throw new errors_1.InvalidTypeError(name, key, Type);
|
208 | }
|
209 | const enumOption = rawOptions.enum;
|
210 | if (!utils.isNullOrUndefined(enumOption)) {
|
211 | // check if the supplied value is already "mongoose-consumable"
|
212 | if (!Array.isArray(enumOption)) {
|
213 | if (Type === String || Type === typegoose_1.mongoose.Schema.Types.String) {
|
214 | rawOptions.enum = Object.entries(enumOption) // get all key-value pairs of the enum
|
215 | // no reverse-filtering because if it is full of strings, there is no reverse mapping
|
216 | .map(([enumKey, enumValue]) => {
|
217 | // convert key-value pairs to an mongoose-usable enum
|
218 | // safeguard, this should never happen because TypeScript only sets "design:type" to "String"
|
219 | // if the enum is full of strings
|
220 | if (typeof enumValue !== 'string') {
|
221 | throw new errors_1.NotStringTypeError(name, key, enumKey, typeof enumValue);
|
222 | }
|
223 | return enumValue;
|
224 | });
|
225 | }
|
226 | else if (Type === Number || Type === typegoose_1.mongoose.Schema.Types.Number) {
|
227 | rawOptions.enum = Object.entries(enumOption) // get all key-value pairs of the enum
|
228 | // filter out the "reverse (value -> name) mappings"
|
229 | // https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings
|
230 | .filter(([enumKey, enumValue], _i, arr) => {
|
231 | // safeguard, this should never happen because typescript only sets "design:type" to "Number"
|
232 | // if the enum is full of numbers
|
233 | if (utils.isNullOrUndefined(enumValue) || arr.findIndex(([k]) => k === enumValue.toString()) <= -1) {
|
234 | // if there is no reverse mapping, throw an error
|
235 | throw new errors_1.NotNumberTypeError(name, key, enumKey, typeof enumValue);
|
236 | }
|
237 | return typeof enumValue === 'number';
|
238 | })
|
239 | .map(([enumKey, enumValue]) => {
|
240 | // convert key-value pairs to an mongoose-useable enum
|
241 | if (typeof enumValue !== 'number') {
|
242 | throw new errors_1.NotNumberTypeError(name, key, enumKey, typeof enumValue);
|
243 | }
|
244 | return enumValue;
|
245 | });
|
246 | }
|
247 | else {
|
248 | // this will happen if the enum type is not "String" or "Number"
|
249 | // most likely this error happened because the code got transpiled with babel or "tsc --transpile-only"
|
250 | throw new errors_1.InvalidEnumTypeError(name, key, Type);
|
251 | }
|
252 | }
|
253 | }
|
254 | if (!utils.isNullOrUndefined(rawOptions.addNullToEnum)) {
|
255 | rawOptions.enum = Array.isArray(rawOptions.enum) ? rawOptions.enum : [];
|
256 | rawOptions.enum.push(null);
|
257 | delete rawOptions.addNullToEnum;
|
258 | }
|
259 | {
|
260 | let included = utils.isWithStringValidate(rawOptions);
|
261 | if (!utils.isString(Type)) {
|
262 | // warn if String-Validate options are included, but is not string
|
263 | utils.warnNotCorrectTypeOptions(name, key, 'String', 'String-Validate', included);
|
264 | }
|
265 | included = utils.isWithStringTransform(rawOptions);
|
266 | if (!utils.isString(Type)) {
|
267 | // warn if String-Transform options are included, but is not string
|
268 | utils.warnNotCorrectTypeOptions(name, key, 'String', 'String-Transform', included);
|
269 | }
|
270 | included = utils.isWithNumberValidate(rawOptions);
|
271 | if (!utils.isNumber(Type)) {
|
272 | // warn if Number-Validate options are included, but is not number
|
273 | utils.warnNotCorrectTypeOptions(name, key, 'Number', 'Number-Validate', included);
|
274 | }
|
275 | included = utils.isWithEnumValidate(rawOptions);
|
276 | if (!utils.isString(Type) && !utils.isNumber(Type)) {
|
277 | // warn if "enum" is included, but is not Number or String
|
278 | utils.warnNotCorrectTypeOptions(name, key, 'String | Number', 'extra', included);
|
279 | }
|
280 | }
|
281 | /** Is this Type (/Class) in the schemas Map? */
|
282 | const hasCachedSchema = !utils.isNullOrUndefined(Reflect.getMetadata(constants_1.DecoratorKeys.CachedSchema, Type));
|
283 | if (utils.isPrimitive(Type)) {
|
284 | if (utils.isObject(Type, true)) {
|
285 | utils.warnMixed(target, key);
|
286 | }
|
287 | switch (propKind) {
|
288 | case constants_1.PropType.ARRAY:
|
289 | schemaProp[key] = utils.mapArrayOptions(rawOptions, Type, target, key);
|
290 | return;
|
291 | case constants_1.PropType.MAP:
|
292 | let mapped;
|
293 | let finalType;
|
294 | // Map the correct options for the end type
|
295 | if (utils.isTypeMeantToBeArray(rawOptions)) {
|
296 | mapped = utils.mapOptions(rawOptions, typegoose_1.mongoose.Schema.Types.Array, target, key);
|
297 | // "rawOptions" is not used here, because that would duplicate some options to where the should not be
|
298 | finalType = utils.mapArrayOptions({ ...mapped.inner, dim: rawOptions.dim }, Type, target, key);
|
299 | }
|
300 | else {
|
301 | mapped = utils.mapOptions(rawOptions, Type, target, key);
|
302 | finalType = { ...mapped.inner, type: Type };
|
303 | }
|
304 | schemaProp[key] = {
|
305 | ...mapped.outer,
|
306 | type: Map,
|
307 | of: { ...finalType },
|
308 | };
|
309 | return;
|
310 | case constants_1.PropType.NONE:
|
311 | schemaProp[key] = {
|
312 | ...rawOptions,
|
313 | type: Type,
|
314 | };
|
315 | return;
|
316 | default:
|
317 | throw new errors_1.InvalidPropTypeError(propKind, name, key, 'PropType(primitive)');
|
318 | }
|
319 | }
|
320 | // If the 'Type' is not a 'Primitive Type' and no subschema was found treat the type as 'Object'
|
321 | // so that mongoose can store it as nested document
|
322 | if (utils.isObject(Type) && !hasCachedSchema) {
|
323 | utils.warnMixed(target, key);
|
324 | 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');
|
325 | schemaProp[key] = {
|
326 | ...rawOptions,
|
327 | type: typegoose_1.mongoose.Schema.Types.Mixed,
|
328 | };
|
329 | return;
|
330 | }
|
331 | const virtualSchema = (0, typegoose_1.buildSchema)(Type);
|
332 | switch (propKind) {
|
333 | case constants_1.PropType.ARRAY:
|
334 | schemaProp[key] = utils.mapArrayOptions(rawOptions, virtualSchema, target, key, Type);
|
335 | return;
|
336 | case constants_1.PropType.MAP:
|
337 | // special handling if the lower type should be an array
|
338 | if ('dim' in rawOptions) {
|
339 | logSettings_1.logger.debug('Map SubDocument Array for "%s.%s"', name, key);
|
340 | const { type, ...outer } = utils.mapArrayOptions(rawOptions, virtualSchema, target, key, Type);
|
341 | schemaProp[key] = {
|
342 | ...outer,
|
343 | type: Map,
|
344 | of: type,
|
345 | };
|
346 | return;
|
347 | }
|
348 | const mapped = utils.mapOptions(rawOptions, virtualSchema, target, key, Type);
|
349 | schemaProp[key] = {
|
350 | ...mapped.outer,
|
351 | type: Map,
|
352 | of: { type: virtualSchema, ...mapped.inner },
|
353 | };
|
354 | return;
|
355 | case constants_1.PropType.NONE:
|
356 | schemaProp[key] = {
|
357 | ...rawOptions,
|
358 | type: virtualSchema,
|
359 | };
|
360 | return;
|
361 | default:
|
362 | throw new errors_1.InvalidPropTypeError(propKind, name, key, 'PropType(subSchema)');
|
363 | }
|
364 | }
|
365 | exports.processProp = processProp;
|
366 | // The following function ("optionDeprecation") is disabled until used again
|
367 | /**
|
368 | * Check for deprecated options, and if needed process them
|
369 | * @param options
|
370 | */
|
371 | // function optionDeprecation(options: any) {}
|
372 | /**
|
373 | * Detect "PropType" based on "Type"
|
374 | * @param Type The Type used for detection
|
375 | */
|
376 | function detectPropType(Type) {
|
377 | logSettings_1.logger.debug('Detecting PropType');
|
378 | if (Type === Array ||
|
379 | Type === typegoose_1.mongoose.Types.Array ||
|
380 | Type === typegoose_1.mongoose.Schema.Types.Array ||
|
381 | Type === typegoose_1.mongoose.Types.DocumentArray ||
|
382 | Type === typegoose_1.mongoose.Schema.Types.DocumentArray) {
|
383 | return constants_1.PropType.ARRAY;
|
384 | }
|
385 | if (Type === Map || Type === typegoose_1.mongoose.Types.Map || Type === typegoose_1.mongoose.Schema.Types.Map) {
|
386 | return constants_1.PropType.MAP;
|
387 | }
|
388 | return constants_1.PropType.NONE;
|
389 | }
|
390 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc1Byb3AuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJuYWwvcHJvY2Vzc1Byb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQXdDO0FBQ3hDLDRDQUFrRTtBQVdsRSwyQ0FBc0Q7QUFDdEQscUNBYWtCO0FBQ2xCLGlDQUFpQztBQUVqQzs7O0dBR0c7QUFDSCxTQUFnQixXQUFXLENBQUMsS0FBeUI7SUFDbkQsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDOUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxNQUFNLFVBQVUsR0FBaUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLElBQUksSUFBSSxHQUFvQixPQUFPLENBQUMsV0FBVyxDQUFDLHlCQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV4RCxvQkFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSw0QkFBbUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUVuRixpQ0FBaUM7SUFFakM7UUFDRSxxQ0FBcUM7UUFDckMsUUFBUSxRQUFRLEVBQUU7WUFDaEIsS0FBSyxvQkFBUSxDQUFDLElBQUk7Z0JBQ2hCLE1BQU07WUFDUixLQUFLLG9CQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2xCLEtBQUssb0JBQVEsQ0FBQyxLQUFLO2dCQUNq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 |
\ | No newline at end of file |