1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.Passthrough = exports.getDiscriminatorModelForClass = exports.deleteModelWithClass = exports.deleteModel = exports.addModelToTypegoose = exports.buildSchema = exports.getModelWithString = exports.getModelForClass = exports.PropType = exports.Severity = exports.getName = exports.getClass = exports.getClassForDocument = exports.types = exports.errors = exports.defaultClasses = exports.LogLevels = exports.setLogLevel = exports.setGlobalOptions = exports.mongoose = void 0;
|
4 | const tslib_1 = require("tslib");
|
5 | /* imports */
|
6 | const mongoose = require("mongoose");
|
7 | exports.mongoose = mongoose;
|
8 | require("reflect-metadata");
|
9 | const semver = require("semver");
|
10 | const utils_1 = require("./internal/utils");
|
11 | /* istanbul ignore next */
|
12 | if (!(0, utils_1.isNullOrUndefined)(process === null || process === void 0 ? void 0 : process.version) && !(0, utils_1.isNullOrUndefined)(mongoose === null || mongoose === void 0 ? void 0 : mongoose.version)) {
|
13 | // for usage on client side
|
14 | /* istanbul ignore next */
|
15 | if (semver.lt(mongoose === null || mongoose === void 0 ? void 0 : mongoose.version, '6.3.5')) {
|
16 | throw new Error(`Please use mongoose 6.3.5 or higher (Current mongoose: ${mongoose.version}) [E001]`);
|
17 | }
|
18 | /* istanbul ignore next */
|
19 | if (semver.lt(process.version.slice(1), '12.22.0')) {
|
20 | throw new Error('You are using a NodeJS Version below 12.22.0, Please Upgrade! [E002]');
|
21 | }
|
22 | }
|
23 | const globalOptions_1 = require("./globalOptions");
|
24 | Object.defineProperty(exports, "setGlobalOptions", { enumerable: true, get: function () { return globalOptions_1.setGlobalOptions; } });
|
25 | const constants_1 = require("./internal/constants");
|
26 | const data_1 = require("./internal/data");
|
27 | const schema_1 = require("./internal/schema");
|
28 | const logSettings_1 = require("./logSettings");
|
29 | const typeguards_1 = require("./typeguards");
|
30 | const errors_1 = require("./internal/errors");
|
31 | var logSettings_2 = require("./logSettings");
|
32 | Object.defineProperty(exports, "setLogLevel", { enumerable: true, get: function () { return logSettings_2.setLogLevel; } });
|
33 | Object.defineProperty(exports, "LogLevels", { enumerable: true, get: function () { return logSettings_2.LogLevels; } });
|
34 | (0, tslib_1.__exportStar)(require("./prop"), exports);
|
35 | (0, tslib_1.__exportStar)(require("./hooks"), exports);
|
36 | (0, tslib_1.__exportStar)(require("./plugin"), exports);
|
37 | (0, tslib_1.__exportStar)(require("./index"), exports);
|
38 | (0, tslib_1.__exportStar)(require("./modelOptions"), exports);
|
39 | (0, tslib_1.__exportStar)(require("./queryMethod"), exports);
|
40 | (0, tslib_1.__exportStar)(require("./typeguards"), exports);
|
41 | exports.defaultClasses = require("./defaultClasses");
|
42 | exports.errors = require("./internal/errors");
|
43 | exports.types = require("./types");
|
44 | var utils_2 = require("./internal/utils");
|
45 | Object.defineProperty(exports, "getClassForDocument", { enumerable: true, get: function () { return utils_2.getClassForDocument; } });
|
46 | Object.defineProperty(exports, "getClass", { enumerable: true, get: function () { return utils_2.getClass; } });
|
47 | Object.defineProperty(exports, "getName", { enumerable: true, get: function () { return utils_2.getName; } });
|
48 | var constants_2 = require("./internal/constants");
|
49 | Object.defineProperty(exports, "Severity", { enumerable: true, get: function () { return constants_2.Severity; } });
|
50 | Object.defineProperty(exports, "PropType", { enumerable: true, get: function () { return constants_2.PropType; } });
|
51 | (0, globalOptions_1.parseENV)(); // call this before anything to ensure they are applied
|
52 | /**
|
53 | * Build a Model From a Class
|
54 | * @param cl The Class to build a Model from
|
55 | * @param options Overwrite SchemaOptions (Merged with Decorator)
|
56 | * @returns The finished Model
|
57 | * @public
|
58 | * @example
|
59 | * ```ts
|
60 | * class ClassName {}
|
61 | *
|
62 | * const NameModel = getModelForClass(ClassName);
|
63 | * ```
|
64 | */
|
65 | function getModelForClass(cl, options) {
|
66 | var _a, _b, _c, _d, _e, _f;
|
67 | (0, utils_1.assertionIsClass)(cl);
|
68 | const rawOptions = typeof options === 'object' ? options : {};
|
69 | const mergedOptions = (0, utils_1.mergeMetadata)(constants_1.DecoratorKeys.ModelOptions, rawOptions, cl);
|
70 | const name = (0, utils_1.getName)(cl, rawOptions); // use "rawOptions" instead of "mergedOptions" to consistently differentiate between classes & models
|
71 | if (data_1.models.has(name)) {
|
72 | return data_1.models.get(name);
|
73 | }
|
74 | const model = (_d = (_b = (_a = mergedOptions === null || mergedOptions === void 0 ? void 0 : mergedOptions.existingConnection) === null || _a === void 0 ? void 0 : _a.model.bind(mergedOptions.existingConnection)) !== null && _b !== void 0 ? _b : (_c = mergedOptions === null || mergedOptions === void 0 ? void 0 : mergedOptions.existingMongoose) === null || _c === void 0 ? void 0 : _c.model.bind(mergedOptions.existingMongoose)) !== null && _d !== void 0 ? _d : mongoose.model.bind(mongoose);
|
75 | const compiledmodel = model(name, buildSchema(cl, mergedOptions.schemaOptions, rawOptions));
|
76 | const refetchedOptions = (_e = Reflect.getMetadata(constants_1.DecoratorKeys.ModelOptions, cl)) !== null && _e !== void 0 ? _e : {};
|
77 | if ((_f = refetchedOptions === null || refetchedOptions === void 0 ? void 0 : refetchedOptions.options) === null || _f === void 0 ? void 0 : _f.runSyncIndexes) {
|
78 | // no async/await, to wait for execution on connection in the background
|
79 | compiledmodel.syncIndexes();
|
80 | }
|
81 | return addModelToTypegoose(compiledmodel, cl, {
|
82 | existingMongoose: mergedOptions === null || mergedOptions === void 0 ? void 0 : mergedOptions.existingMongoose,
|
83 | existingConnection: mergedOptions === null || mergedOptions === void 0 ? void 0 : mergedOptions.existingConnection,
|
84 | });
|
85 | }
|
86 | exports.getModelForClass = getModelForClass;
|
87 | /**
|
88 | * Get Model from internal cache
|
89 | * @param key Model's name key
|
90 | * @example
|
91 | * ```ts
|
92 | * class ClassName {}
|
93 | * getModelForClass(ClassName); // build the model
|
94 | * const NameModel = getModelWithString<typeof ClassName>("ClassName");
|
95 | * ```
|
96 | */
|
97 | function getModelWithString(key) {
|
98 | (0, utils_1.assertion)(typeof key === 'string', () => new errors_1.ExpectedTypeError('key', 'string', key));
|
99 | return data_1.models.get(key);
|
100 | }
|
101 | exports.getModelWithString = getModelWithString;
|
102 | /**
|
103 | * Generates a Mongoose schema out of class props, iterating through all parents
|
104 | * @param cl The Class to build a Schema from
|
105 | * @param options Overwrite SchemaOptions (Merged with Decorator)
|
106 | * @param overwriteOptions Overwrite ModelOptions (aside from schemaOptions) (Not Merged with Decorator)
|
107 | * @returns Returns the Build Schema
|
108 | * @example
|
109 | * ```ts
|
110 | * class ClassName {}
|
111 | * const NameSchema = buildSchema(ClassName);
|
112 | * const NameModel = mongoose.model("Name", NameSchema);
|
113 | * ```
|
114 | */
|
115 | function buildSchema(cl, options, overwriteOptions) {
|
116 | (0, utils_1.assertionIsClass)(cl);
|
117 | logSettings_1.logger.debug('buildSchema called for "%s"', (0, utils_1.getName)(cl, overwriteOptions));
|
118 | const mergedOptions = (0, utils_1.mergeSchemaOptions)(options, cl);
|
119 | let sch = undefined;
|
120 | /** Parent Constructor */
|
121 | let parentCtor = Object.getPrototypeOf(cl.prototype).constructor;
|
122 | /* This array is to execute from lowest class to highest (when extending) */
|
123 | const parentClasses = [];
|
124 | // iterate trough all parents
|
125 | while ((parentCtor === null || parentCtor === void 0 ? void 0 : parentCtor.name) !== 'Object') {
|
126 | // add lower classes (when extending) to the front of the arrray to be processed first
|
127 | parentClasses.unshift(parentCtor);
|
128 | // set next parent
|
129 | parentCtor = Object.getPrototypeOf(parentCtor.prototype).constructor;
|
130 | }
|
131 | // iterate and build class schemas from lowest to highest (when extending classes, the lower class will get build first) see https://github.com/typegoose/typegoose/pull/243
|
132 | for (const parentClass of parentClasses) {
|
133 | // extend schema
|
134 | sch = (0, schema_1._buildSchema)(parentClass, sch, mergedOptions, false);
|
135 | }
|
136 | // get schema of current model
|
137 | sch = (0, schema_1._buildSchema)(cl, sch, mergedOptions, true, overwriteOptions);
|
138 | return sch;
|
139 | }
|
140 | exports.buildSchema = buildSchema;
|
141 | /**
|
142 | * Add a Class-Model Pair to the Typegoose Cache
|
143 | * This can be used to add custom Models to Typegoose, with the type information of "cl"
|
144 | * Note: no gurantee that the type information is fully correct when used manually
|
145 | * @param model The Model to store
|
146 | * @param cl The Class to store
|
147 | * @param options Overwrite existingMongoose or existingConnection
|
148 | * @example
|
149 | * ```ts
|
150 | * class ClassName {}
|
151 | *
|
152 | * const schema = buildSchema(ClassName);
|
153 | * // modifications to the schame can be done
|
154 | * const model = addModelToTypegoose(mongoose.model("Name", schema), ClassName);
|
155 | * ```
|
156 | */
|
157 | function addModelToTypegoose(model, cl, options) {
|
158 | var _a, _b, _c;
|
159 | const mongooseModel = ((_a = options === null || options === void 0 ? void 0 : options.existingMongoose) === null || _a === void 0 ? void 0 : _a.Model) || ((_c = (_b = options === null || options === void 0 ? void 0 : options.existingConnection) === null || _b === void 0 ? void 0 : _b.base) === null || _c === void 0 ? void 0 : _c.Model) || mongoose.Model;
|
160 | (0, utils_1.assertion)(model.prototype instanceof mongooseModel, new errors_1.NotValidModelError(model, 'addModelToTypegoose.model'));
|
161 | (0, utils_1.assertionIsClass)(cl);
|
162 | const name = model.modelName;
|
163 | (0, utils_1.assertion)(!data_1.models.has(name), new errors_1.FunctionCalledMoreThanSupportedError('addModelToTypegoose', 1, `This was caused because the model name "${name}" already exists in the typegoose-internal "models" cache`));
|
164 | if (data_1.constructors.get(name)) {
|
165 | logSettings_1.logger.info('Class "%s" already existed in the constructors Map', name);
|
166 | }
|
167 | data_1.models.set(name, model);
|
168 | data_1.constructors.set(name, cl);
|
169 | return data_1.models.get(name);
|
170 | }
|
171 | exports.addModelToTypegoose = addModelToTypegoose;
|
172 | /**
|
173 | * Deletes a existing model so that it can be overwritten with another model
|
174 | * (deletes from mongoose.connection and typegoose models cache and typegoose constructors cache)
|
175 | * @param name The Model's mongoose name
|
176 | * @example
|
177 | * ```ts
|
178 | * class ClassName {}
|
179 | * const NameModel = getModelForClass(ClassName);
|
180 | * deleteModel("ClassName");
|
181 | * ```
|
182 | */
|
183 | function deleteModel(name) {
|
184 | (0, utils_1.assertion)(typeof name === 'string', () => new errors_1.ExpectedTypeError('name', 'string', name));
|
185 | logSettings_1.logger.debug('Deleting Model "%s"', name);
|
186 | const model = data_1.models.get(name);
|
187 | if (!(0, utils_1.isNullOrUndefined)(model)) {
|
188 | model.db.deleteModel(name);
|
189 | }
|
190 | data_1.models.delete(name);
|
191 | data_1.constructors.delete(name);
|
192 | }
|
193 | exports.deleteModel = deleteModel;
|
194 | /**
|
195 | * Delete a model, with the given class
|
196 | * Same as "deleteModel", only that it can be done with the class instead of the name
|
197 | * @param cl The Class to delete the model from
|
198 | * @example
|
199 | * ```ts
|
200 | * class ClassName {}
|
201 | * const NameModel = getModelForClass(ClassName);
|
202 | * deleteModelWithClass(ClassName);
|
203 | * ```
|
204 | */
|
205 | function deleteModelWithClass(cl) {
|
206 | (0, utils_1.assertionIsClass)(cl);
|
207 | let name = (0, utils_1.getName)(cl);
|
208 | if (!data_1.models.has(name)) {
|
209 | logSettings_1.logger.debug(`Class "${name}" is not in "models", trying to find in "constructors"`);
|
210 | let found = false;
|
211 | // type "Map" does not have a "find" function, and using "get" would maybe result in the incorrect values
|
212 | for (const [cname, constructor] of data_1.constructors) {
|
213 | if (constructor === cl) {
|
214 | logSettings_1.logger.debug(`Found Class in "constructors" with class name "${name}" and entered name "${cname}""`);
|
215 | name = cname;
|
216 | found = true;
|
217 | }
|
218 | }
|
219 | if (!found) {
|
220 | logSettings_1.logger.debug(`Could not find class "${name}" in constructors`);
|
221 | return;
|
222 | }
|
223 | }
|
224 | return deleteModel(name);
|
225 | }
|
226 | exports.deleteModelWithClass = deleteModelWithClass;
|
227 | function getDiscriminatorModelForClass(from, cl, value_or_options, options) {
|
228 | (0, utils_1.assertion)((0, typeguards_1.isModel)(from), new errors_1.NotValidModelError(from, 'getDiscriminatorModelForClass.from'));
|
229 | (0, utils_1.assertionIsClass)(cl);
|
230 | const value = typeof value_or_options === 'string' ? value_or_options : undefined;
|
231 | const rawOptions = typeof value_or_options !== 'string' ? value_or_options : typeof options === 'object' ? options : {};
|
232 | const mergedOptions = (0, utils_1.mergeMetadata)(constants_1.DecoratorKeys.ModelOptions, rawOptions, cl);
|
233 | const name = (0, utils_1.getName)(cl, rawOptions); // use "rawOptions" instead of "mergedOptions" to consistently differentiate between classes & models
|
234 | if (data_1.models.has(name)) {
|
235 | return data_1.models.get(name);
|
236 | }
|
237 | const sch = buildSchema(cl, mergedOptions.schemaOptions, rawOptions);
|
238 | const discriminatorKey = sch.get('discriminatorKey');
|
239 | if (!!discriminatorKey && sch.path(discriminatorKey)) {
|
240 | sch.paths[discriminatorKey].options.$skipDiscriminatorCheck = true;
|
241 | }
|
242 | const model = from.discriminator(name, sch, value ? value : name);
|
243 | return addModelToTypegoose(model, cl);
|
244 | }
|
245 | exports.getDiscriminatorModelForClass = getDiscriminatorModelForClass;
|
246 | /**
|
247 | * Use this class if raw mongoose for a path is wanted
|
248 | * It is still recommended to use the typegoose classes directly
|
249 | * @see Using `Passthrough`, the paths created will also result as an `Schema` (since mongoose 6.0), see {@link https://github.com/Automattic/mongoose/issues/7181 Mongoose#7181}
|
250 | * @example
|
251 | * ```ts
|
252 | * class Dummy {
|
253 | * @prop({ type: () => new Passthrough({ somePath: String }) })
|
254 | * public somepath: { somePath: string };
|
255 | * }
|
256 | *
|
257 | * class Dummy {
|
258 | * @prop({ type: () => new Passthrough({ somePath: String }, true) })
|
259 | * public somepath: { somePath: string };
|
260 | * }
|
261 | * ```
|
262 | */
|
263 | class Passthrough {
|
264 | /**
|
265 | * Use this like `new mongoose.Schema()`
|
266 | * @param raw The Schema definition
|
267 | * @param direct Directly insert "raw", instead of using "type" (this will not apply any other inner options)
|
268 | */
|
269 | constructor(raw, direct) {
|
270 | this.raw = raw;
|
271 | this.direct = direct !== null && direct !== void 0 ? direct : false;
|
272 | }
|
273 | }
|
274 | exports.Passthrough = Passthrough;
|
275 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWdvb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3R5cGVnb29zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsYUFBYTtBQUNiLHFDQUFxQztBQThCNUIsNEJBQVE7QUE3QmpCLDRCQUEwQjtBQUMxQixpQ0FBaUM7QUFDakMsNENBQThIO0FBRTlILDBCQUEwQjtBQUMxQixJQUFJLENBQUMsSUFBQSx5QkFBaUIsRUFBQyxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFBLHlCQUFpQixFQUFDLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxPQUFPLENBQUMsRUFBRTtJQUNqRiwyQkFBMkI7SUFDM0IsMEJBQTBCO0lBQzFCLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELFFBQVEsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxDQUFDO0tBQ3ZHO0lBRUQsMEJBQTBCO0lBQzFCLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7S0FDekY7Q0FDRjtBQUVELG1EQUE2RDtBQVcxQyxpR0FYQSxnQ0FBZ0IsT0FXQTtBQVZuQyxvREFBcUQ7QUFDckQsMENBQXVEO0FBQ3ZELDhDQUFpRDtBQUNqRCwrQ0FBdUM7QUFDdkMsNkNBQXVDO0FBRXZDLDhDQUFnSDtBQUtoSCw2Q0FBdUQ7QUFBOUMsMEdBQUEsV0FBVyxPQUFBO0FBQUUsd0dBQUEsU0FBUyxPQUFBO0FBQy9CLHNEQUF1QjtBQUN2Qix1REFBd0I7QUFDeEIsd0RBQXlCO0FBQ3pC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 |
\ | No newline at end of file |