@tsed/mongoose 6.69.0 → 6.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/.mocharc.js +5 -0
  2. package/.nycrc +26 -0
  3. package/lib/index.js +1402 -10
  4. package/lib/index.js.map +1 -1
  5. package/lib/index.modern.js +1362 -0
  6. package/lib/index.modern.js.map +1 -0
  7. package/package.json +20 -19
  8. package/lib/MongooseModule.js +0 -36
  9. package/lib/MongooseModule.js.map +0 -1
  10. package/lib/constants/index.js +0 -24
  11. package/lib/constants/index.js.map +0 -1
  12. package/lib/decorators/auto.js +0 -28
  13. package/lib/decorators/auto.js.map +0 -1
  14. package/lib/decorators/discriminatorKey.js +0 -12
  15. package/lib/decorators/discriminatorKey.js.map +0 -1
  16. package/lib/decorators/dynamicRef.js +0 -46
  17. package/lib/decorators/dynamicRef.js.map +0 -1
  18. package/lib/decorators/excludeIndexes.js +0 -28
  19. package/lib/decorators/excludeIndexes.js.map +0 -1
  20. package/lib/decorators/expires.js +0 -28
  21. package/lib/decorators/expires.js.map +0 -1
  22. package/lib/decorators/immutable.js +0 -30
  23. package/lib/decorators/immutable.js.map +0 -1
  24. package/lib/decorators/index.js +0 -30
  25. package/lib/decorators/index.js.map +0 -1
  26. package/lib/decorators/indexed.js +0 -26
  27. package/lib/decorators/indexed.js.map +0 -1
  28. package/lib/decorators/lowercase.js +0 -28
  29. package/lib/decorators/lowercase.js.map +0 -1
  30. package/lib/decorators/model.js +0 -67
  31. package/lib/decorators/model.js.map +0 -1
  32. package/lib/decorators/mongooseIndex.js +0 -39
  33. package/lib/decorators/mongooseIndex.js.map +0 -1
  34. package/lib/decorators/mongooseIndexes.d.ts +0 -32
  35. package/lib/decorators/mongooseIndexes.js +0 -39
  36. package/lib/decorators/mongooseIndexes.js.map +0 -1
  37. package/lib/decorators/mongoosePlugin.js +0 -22
  38. package/lib/decorators/mongoosePlugin.js.map +0 -1
  39. package/lib/decorators/numberDecimal.js +0 -75
  40. package/lib/decorators/numberDecimal.js.map +0 -1
  41. package/lib/decorators/objectID.js +0 -26
  42. package/lib/decorators/objectID.js.map +0 -1
  43. package/lib/decorators/postHook.js +0 -26
  44. package/lib/decorators/postHook.js.map +0 -1
  45. package/lib/decorators/preHook.js +0 -71
  46. package/lib/decorators/preHook.js.map +0 -1
  47. package/lib/decorators/ref.js +0 -65
  48. package/lib/decorators/ref.js.map +0 -1
  49. package/lib/decorators/schema.js +0 -32
  50. package/lib/decorators/schema.js.map +0 -1
  51. package/lib/decorators/schemaIgnore.js +0 -27
  52. package/lib/decorators/schemaIgnore.js.map +0 -1
  53. package/lib/decorators/select.js +0 -28
  54. package/lib/decorators/select.js.map +0 -1
  55. package/lib/decorators/sparse.js +0 -30
  56. package/lib/decorators/sparse.js.map +0 -1
  57. package/lib/decorators/text.js +0 -29
  58. package/lib/decorators/text.js.map +0 -1
  59. package/lib/decorators/trim.js +0 -27
  60. package/lib/decorators/trim.js.map +0 -1
  61. package/lib/decorators/unique.js +0 -27
  62. package/lib/decorators/unique.js.map +0 -1
  63. package/lib/decorators/uppercase.js +0 -28
  64. package/lib/decorators/uppercase.js.map +0 -1
  65. package/lib/decorators/versionKey.js +0 -12
  66. package/lib/decorators/versionKey.js.map +0 -1
  67. package/lib/decorators/virtualRef.js +0 -36
  68. package/lib/decorators/virtualRef.js.map +0 -1
  69. package/lib/interfaces/MongooseConnectionOptions.js +0 -3
  70. package/lib/interfaces/MongooseConnectionOptions.js.map +0 -1
  71. package/lib/interfaces/MongooseDocument.js +0 -3
  72. package/lib/interfaces/MongooseDocument.js.map +0 -1
  73. package/lib/interfaces/MongooseModel.js +0 -3
  74. package/lib/interfaces/MongooseModel.js.map +0 -1
  75. package/lib/interfaces/MongooseModelOptions.js +0 -3
  76. package/lib/interfaces/MongooseModelOptions.js.map +0 -1
  77. package/lib/interfaces/MongooseSchemaOptions.js +0 -3
  78. package/lib/interfaces/MongooseSchemaOptions.js.map +0 -1
  79. package/lib/interfaces/MongooseSchemaTypes.js +0 -10
  80. package/lib/interfaces/MongooseSchemaTypes.js.map +0 -1
  81. package/lib/interfaces/MongooseVirtualRefOptions.js +0 -3
  82. package/lib/interfaces/MongooseVirtualRefOptions.js.map +0 -1
  83. package/lib/interfaces/index.js +0 -10
  84. package/lib/interfaces/index.js.map +0 -1
  85. package/lib/registries/MongooseModels.js +0 -5
  86. package/lib/registries/MongooseModels.js.map +0 -1
  87. package/lib/services/MongooseConnections.js +0 -51
  88. package/lib/services/MongooseConnections.js.map +0 -1
  89. package/lib/services/MongooseService.js +0 -73
  90. package/lib/services/MongooseService.js.map +0 -1
  91. package/lib/utils/createModel.js +0 -57
  92. package/lib/utils/createModel.js.map +0 -1
  93. package/lib/utils/createSchema.js +0 -160
  94. package/lib/utils/createSchema.js.map +0 -1
  95. package/lib/utils/index.js +0 -6
  96. package/lib/utils/index.js.map +0 -1
  97. package/lib/utils/resolveRefType.js +0 -19
  98. package/lib/utils/resolveRefType.js.map +0 -1
  99. package/lib/utils/schemaOptions.js +0 -60
  100. package/lib/utils/schemaOptions.js.map +0 -1
@@ -1,160 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSchemaTypeOptions = exports.buildMongooseSchema = exports.getSchemaToken = exports.getSchema = exports.createSchema = void 0;
4
- const tslib_1 = require("tslib");
5
- const core_1 = require("@tsed/core");
6
- const json_mapper_1 = require("@tsed/json-mapper");
7
- const schema_1 = require("@tsed/schema");
8
- const change_case_1 = require("change-case");
9
- const mongoose_1 = tslib_1.__importDefault(require("mongoose"));
10
- const constants_1 = require("../constants");
11
- const resolveRefType_1 = require("./resolveRefType");
12
- const schemaOptions_1 = require("./schemaOptions");
13
- const MONGOOSE_RESERVED_KEYS = ["_id"];
14
- /**
15
- * @ignore
16
- */
17
- function setUpSchema({ schema, virtuals }, options) {
18
- const mongooseSchema = new mongoose_1.default.Schema(schema, options);
19
- for (const [key, options] of virtuals.entries()) {
20
- mongooseSchema.virtual(key, options);
21
- }
22
- return mongooseSchema;
23
- }
24
- /**
25
- * @ignore
26
- */
27
- function isVirtualRef(target) {
28
- return !!(target.ref && target.localField && target.foreignField);
29
- }
30
- function hasVersionField(schema, versionKey) {
31
- // Check if versioning was disabled explicitly
32
- if (!versionKey)
33
- return false;
34
- // Check for alternative version field in schema
35
- return versionKey in schema.paths;
36
- }
37
- function createSchema(target, options = {}) {
38
- var _a;
39
- const schemaOptionsFromStore = core_1.Store.from(target).get(constants_1.MONGOOSE_SCHEMA_OPTIONS) || {};
40
- options.schemaOptions = { ...options.schemaOptions, ...schemaOptionsFromStore };
41
- const schema = setUpSchema(buildMongooseSchema(target), options.schemaOptions);
42
- schemaOptions_1.schemaOptions(target, options);
43
- const outputVersionKey = hasVersionField(schema, (_a = options.schemaOptions) === null || _a === void 0 ? void 0 : _a.versionKey);
44
- schema.methods.toClass = function toClass() {
45
- return json_mapper_1.deserialize(this.toObject({
46
- versionKey: outputVersionKey,
47
- flattenMaps: true
48
- }), {
49
- type: target,
50
- useAlias: false,
51
- additionalProperties: true,
52
- groups: false
53
- });
54
- };
55
- schema.methods.toJSON = function toJSON(options) {
56
- return json_mapper_1.serialize(this.toClass(), options);
57
- };
58
- schema.loadClass(target);
59
- core_1.Store.from(target).set(constants_1.MONGOOSE_SCHEMA, schema);
60
- return schema;
61
- }
62
- exports.createSchema = createSchema;
63
- /**
64
- * Get a schema already created. If the schema doesn't exists in registry, it'll be created.
65
- * @param target
66
- * @param options
67
- */
68
- function getSchema(target, options = {}) {
69
- const store = core_1.Store.from(target);
70
- if (!store.has(constants_1.MONGOOSE_SCHEMA)) {
71
- createSchema(target, options);
72
- }
73
- return store.get(constants_1.MONGOOSE_SCHEMA);
74
- }
75
- exports.getSchema = getSchema;
76
- function getSchemaToken(target, options) {
77
- const collectionName = options.name || core_1.nameOf(target);
78
- const token = Symbol.for(change_case_1.pascalCase(`${collectionName}Schema`));
79
- return { token, collectionName };
80
- }
81
- exports.getSchemaToken = getSchemaToken;
82
- /**
83
- * @ignore
84
- */
85
- function buildMongooseSchema(target) {
86
- const properties = schema_1.getProperties(target, { withIgnoredProps: true, mongoose: true, groups: false });
87
- const schema = { schema: {}, virtuals: new Map() };
88
- properties.forEach((propertyMetadata, key) => {
89
- if (MONGOOSE_RESERVED_KEYS.includes(key)) {
90
- return;
91
- }
92
- // Keeping the Mongoose Schema separate so it can overwrite everything once schema has been built.
93
- const schemaTypeOptions = propertyMetadata.store.get(constants_1.MONGOOSE_SCHEMA) || {};
94
- if (schemaTypeOptions.schemaIgnore) {
95
- return;
96
- }
97
- if (schemaTypeOptions.ref) {
98
- schemaTypeOptions.ref = resolveRefType_1.resolveRefType(schemaTypeOptions.ref);
99
- }
100
- if (isVirtualRef(schemaTypeOptions)) {
101
- schema.virtuals.set(key, schemaTypeOptions);
102
- return;
103
- }
104
- schema.schema[key] = createSchemaTypeOptions(propertyMetadata);
105
- });
106
- return schema;
107
- }
108
- exports.buildMongooseSchema = buildMongooseSchema;
109
- /**
110
- * @ignore
111
- */
112
- function createSchemaTypeOptions(propEntity) {
113
- const key = propEntity.propertyKey;
114
- const rawMongooseSchema = propEntity.store.get(constants_1.MONGOOSE_SCHEMA) || {};
115
- let schemaTypeOptions = {
116
- required: propEntity.required
117
- ? function () {
118
- return propEntity.isRequired(this[key]);
119
- }
120
- : false
121
- };
122
- if (!propEntity.isClass) {
123
- const jsonSchema = propEntity.itemSchema.toJSON();
124
- const { minimum: min, maximum: max, minLength: minlength, maxLength: maxlength } = jsonSchema;
125
- let match = jsonSchema.pattern;
126
- if (match) {
127
- match = new RegExp(match);
128
- }
129
- schemaTypeOptions = {
130
- ...schemaTypeOptions,
131
- type: propEntity.type,
132
- match: match,
133
- min,
134
- max,
135
- minlength,
136
- maxlength,
137
- enum: jsonSchema["enum"],
138
- default: jsonSchema["default"]
139
- };
140
- }
141
- else if (!rawMongooseSchema.ref) {
142
- // References are handled by the final merge
143
- schemaTypeOptions = { ...schemaTypeOptions, type: getSchema(propEntity.type) };
144
- }
145
- schemaTypeOptions = core_1.cleanObject({ ...schemaTypeOptions, ...rawMongooseSchema });
146
- if (propEntity.isCollection) {
147
- if (propEntity.isArray) {
148
- return [schemaTypeOptions];
149
- }
150
- // Can be a Map or a Set;
151
- // Mongoose implements only Map;
152
- if (propEntity.collectionType !== Map) {
153
- throw new Error(`Invalid collection type. ${core_1.nameOf(propEntity.collectionType)} is not supported.`);
154
- }
155
- return { type: Map, of: schemaTypeOptions };
156
- }
157
- return schemaTypeOptions;
158
- }
159
- exports.createSchemaTypeOptions = createSchemaTypeOptions;
160
- //# sourceMappingURL=createSchema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createSchema.js","sourceRoot":"","sources":["../../src/utils/createSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import {cleanObject, nameOf, Store, Type} from \"@tsed/core\";\nimport {deserialize, serialize} from \"@tsed/json-mapper\";\nimport {getProperties, JsonEntityStore} from \"@tsed/schema\";\nimport {pascalCase} from \"change-case\";\nimport mongoose, {Schema, SchemaDefinition, SchemaOptions, SchemaTypeOptions} from \"mongoose\";\nimport {MONGOOSE_SCHEMA, MONGOOSE_SCHEMA_OPTIONS} from \"../constants\";\nimport {MongooseSchemaOptions} from \"../interfaces\";\nimport {MongooseVirtualRefOptions} from \"../interfaces/MongooseVirtualRefOptions\";\nimport {resolveRefType} from \"./resolveRefType\";\nimport {schemaOptions} from \"./schemaOptions\";\n\nconst MONGOOSE_RESERVED_KEYS = [\"_id\"];\n\nexport interface MongooseSchemaMetadata {\n schema: SchemaDefinition;\n virtuals: Map<string, MongooseVirtualRefOptions>;\n}\n\n/**\n * @ignore\n */\nfunction setUpSchema({schema, virtuals}: MongooseSchemaMetadata, options?: SchemaOptions) {\n const mongooseSchema = new mongoose.Schema(schema, options);\n\n for (const [key, options] of virtuals.entries()) {\n mongooseSchema.virtual(key, options);\n }\n\n return mongooseSchema;\n}\n\n/**\n * @ignore\n */\nfunction isVirtualRef(target: Partial<MongooseVirtualRefOptions>): target is MongooseVirtualRefOptions {\n return !!(target.ref && target.localField && target.foreignField);\n}\n\nfunction hasVersionField(schema: mongoose.Schema, versionKey?: string | boolean) {\n // Check if versioning was disabled explicitly\n if (!versionKey) return false;\n\n // Check for alternative version field in schema\n return (versionKey as string) in schema.paths;\n}\n\nexport function createSchema(target: Type<any>, options: MongooseSchemaOptions = {}): mongoose.Schema {\n const schemaOptionsFromStore = Store.from(target).get(MONGOOSE_SCHEMA_OPTIONS) || {};\n options.schemaOptions = {...options.schemaOptions, ...schemaOptionsFromStore};\n\n const schema = setUpSchema(buildMongooseSchema(target), options.schemaOptions);\n\n schemaOptions(target, options);\n\n const outputVersionKey = hasVersionField(schema, options.schemaOptions?.versionKey);\n\n schema.methods.toClass = function toClass() {\n return deserialize(\n this.toObject({\n versionKey: outputVersionKey,\n flattenMaps: true\n }),\n {\n type: target,\n useAlias: false,\n additionalProperties: true,\n groups: false\n }\n );\n };\n\n schema.methods.toJSON = function toJSON(options?: any) {\n return serialize((this as any).toClass(), options);\n };\n\n schema.loadClass(target);\n\n Store.from(target).set(MONGOOSE_SCHEMA, schema);\n\n return schema;\n}\n\n/**\n * Get a schema already created. If the schema doesn't exists in registry, it'll be created.\n * @param target\n * @param options\n */\nexport function getSchema(target: Type<any>, options: MongooseSchemaOptions = {}): Schema {\n const store = Store.from(target);\n\n if (!store.has(MONGOOSE_SCHEMA)) {\n createSchema(target, options);\n }\n\n return store.get(MONGOOSE_SCHEMA);\n}\n\nexport function getSchemaToken(target: Type<any>, options?: any) {\n const collectionName = options.name || nameOf(target);\n const token = Symbol.for(pascalCase(`${collectionName}Schema`));\n\n return {token, collectionName};\n}\n\n/**\n * @ignore\n */\nexport function buildMongooseSchema(target: any): MongooseSchemaMetadata {\n const properties = getProperties(target, {withIgnoredProps: true, mongoose: true, groups: false});\n const schema: MongooseSchemaMetadata = {schema: {}, virtuals: new Map()};\n\n properties.forEach((propertyMetadata, key) => {\n if (MONGOOSE_RESERVED_KEYS.includes(key as string)) {\n return;\n }\n\n // Keeping the Mongoose Schema separate so it can overwrite everything once schema has been built.\n const schemaTypeOptions: any = propertyMetadata.store.get(MONGOOSE_SCHEMA) || {};\n\n if (schemaTypeOptions.schemaIgnore) {\n return;\n }\n\n if (schemaTypeOptions.ref) {\n schemaTypeOptions.ref = resolveRefType(schemaTypeOptions.ref as any);\n }\n\n if (isVirtualRef(schemaTypeOptions)) {\n schema.virtuals.set(key as string, schemaTypeOptions);\n\n return;\n }\n\n schema.schema[key as string] = createSchemaTypeOptions(propertyMetadata);\n });\n\n return schema;\n}\n\n/**\n * @ignore\n */\nexport function createSchemaTypeOptions<T = any>(propEntity: JsonEntityStore): SchemaTypeOptions<T> | SchemaTypeOptions<T>[] {\n const key = propEntity.propertyKey;\n const rawMongooseSchema = propEntity.store.get(MONGOOSE_SCHEMA) || {};\n\n let schemaTypeOptions: SchemaTypeOptions<T> = {\n required: propEntity.required\n ? function () {\n return propEntity.isRequired(this[key]);\n }\n : false\n };\n\n if (!propEntity.isClass) {\n const jsonSchema = propEntity.itemSchema.toJSON();\n const {minimum: min, maximum: max, minLength: minlength, maxLength: maxlength} = jsonSchema;\n\n let match: string | RegExp = jsonSchema.pattern;\n if (match) {\n match = new RegExp(match);\n }\n\n schemaTypeOptions = {\n ...schemaTypeOptions,\n type: propEntity.type,\n match: match as RegExp,\n min,\n max,\n minlength,\n maxlength,\n enum: jsonSchema[\"enum\"],\n default: jsonSchema[\"default\"]\n };\n } else if (!rawMongooseSchema.ref) {\n // References are handled by the final merge\n schemaTypeOptions = {...schemaTypeOptions, type: getSchema(propEntity.type) as any};\n }\n\n schemaTypeOptions = cleanObject({...schemaTypeOptions, ...rawMongooseSchema});\n\n if (propEntity.isCollection) {\n if (propEntity.isArray) {\n return [schemaTypeOptions];\n }\n // Can be a Map or a Set;\n // Mongoose implements only Map;\n if (propEntity.collectionType !== Map) {\n throw new Error(`Invalid collection type. ${nameOf(propEntity.collectionType)} is not supported.`);\n }\n\n return ({type: Map, of: schemaTypeOptions} as unknown) as SchemaTypeOptions<T>;\n }\n\n return schemaTypeOptions;\n}\n"]}
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./createSchema"), exports);
5
- tslib_1.__exportStar(require("./createModel"), exports);
6
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,yDAA+B;AAC/B,wDAA8B","sourcesContent":["export * from \"./createSchema\";\nexport * from \"./createModel\";\n"]}
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolveRefType = void 0;
4
- const core_1 = require("@tsed/core");
5
- const constants_1 = require("../constants");
6
- /**
7
- * @ignore
8
- */
9
- function resolveRefType(type) {
10
- if (core_1.isString(type)) {
11
- return type;
12
- }
13
- if (!core_1.isClass(type)) {
14
- type = type();
15
- }
16
- return core_1.Store.from(type).get(constants_1.MONGOOSE_MODEL_NAME) || core_1.nameOf(type);
17
- }
18
- exports.resolveRefType = resolveRefType;
19
- //# sourceMappingURL=resolveRefType.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolveRefType.js","sourceRoot":"","sources":["../../src/utils/resolveRefType.ts"],"names":[],"mappings":";;;AAAA,qCAAkE;AAClE,4CAAiD;AAEjD;;GAEG;AACH,SAAgB,cAAc,CAAC,IAA4C;IACzE,IAAI,eAAQ,CAAC,IAAI,CAAC,EAAE;QAClB,OAAO,IAAI,CAAC;KACb;IAED,IAAI,CAAC,cAAO,CAAC,IAAI,CAAC,EAAE;QAClB,IAAI,GAAI,IAAY,EAAE,CAAC;KACxB;IAED,OAAO,YAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,+BAAmB,CAAC,IAAI,aAAM,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAVD,wCAUC","sourcesContent":["import {isClass, isString, nameOf, Store, Type} from \"@tsed/core\";\nimport {MONGOOSE_MODEL_NAME} from \"../constants\";\n\n/**\n * @ignore\n */\nexport function resolveRefType(type: string | (() => Type<any>) | Type<any>): string {\n if (isString(type)) {\n return type;\n }\n\n if (!isClass(type)) {\n type = (type as any)();\n }\n\n return Store.from(type).get(MONGOOSE_MODEL_NAME) || nameOf(type);\n}\n"]}
@@ -1,60 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.applySchemaOptions = exports.buildPreHook = exports.schemaOptions = void 0;
4
- const core_1 = require("@tsed/core");
5
- const constants_1 = require("../constants");
6
- /**
7
- * @ignore
8
- */
9
- function schemaOptions(target, options) {
10
- const store = core_1.Store.from(target);
11
- if (!store.has(constants_1.MONGOOSE_SCHEMA_OPTIONS)) {
12
- store.set(constants_1.MONGOOSE_SCHEMA_OPTIONS, {});
13
- }
14
- if (options) {
15
- store.set(constants_1.MONGOOSE_SCHEMA_OPTIONS, core_1.deepMerge(store.get(constants_1.MONGOOSE_SCHEMA_OPTIONS), options));
16
- }
17
- return store.get(constants_1.MONGOOSE_SCHEMA_OPTIONS);
18
- }
19
- exports.schemaOptions = schemaOptions;
20
- function mapHookArgs(hook) {
21
- return [hook.method, hook.options || hook.fn, hook.options ? hook.fn : undefined].filter(Boolean);
22
- }
23
- /**
24
- * @ignore
25
- */
26
- function buildPreHook(fn) {
27
- return fn.length === 2
28
- ? function (next) {
29
- return fn(this, next);
30
- }
31
- : function (next, options) {
32
- return fn(this, next, options);
33
- };
34
- }
35
- exports.buildPreHook = buildPreHook;
36
- /**
37
- * @ignore
38
- */
39
- function applySchemaOptions(schema, options) {
40
- if (options.plugins) {
41
- options.plugins.forEach((item) => schema.plugin(item.plugin, item.options));
42
- }
43
- if (options.indexes) {
44
- options.indexes.forEach((item) => schema.index(item.fields, item.options));
45
- }
46
- if (options.pre) {
47
- options.pre.forEach((item) => {
48
- item = {
49
- ...item,
50
- fn: buildPreHook(item.fn)
51
- };
52
- schema.pre(...mapHookArgs(item));
53
- });
54
- }
55
- if (options.post) {
56
- options.post.forEach((item) => schema.post(...mapHookArgs(item)));
57
- }
58
- }
59
- exports.applySchemaOptions = applySchemaOptions;
60
- //# sourceMappingURL=schemaOptions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schemaOptions.js","sourceRoot":"","sources":["../../src/utils/schemaOptions.ts"],"names":[],"mappings":";;;AAAA,qCAAyD;AAEzD,4CAAqD;AAGrD;;GAEG;AACH,SAAgB,aAAa,CAAC,MAAW,EAAE,OAA+B;IACxE,MAAM,KAAK,GAAG,YAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAuB,CAAC,EAAE;QACvC,KAAK,CAAC,GAAG,CAAC,mCAAuB,EAAE,EAAE,CAAC,CAAC;KACxC;IAED,IAAI,OAAO,EAAE;QACX,KAAK,CAAC,GAAG,CAAC,mCAAuB,EAAE,gBAAS,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAuB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;KAC5F;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,mCAAuB,CAAC,CAAC;AAC5C,CAAC;AAZD,sCAYC;AAED,SAAS,WAAW,CAAC,IAAwC;IAC3D,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAQ,CAAC;AAC3G,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,EAAY;IACvC,OAAO,EAAE,CAAC,MAAM,KAAK,CAAC;QACpB,CAAC,CAAC,UAAU,IAAoB;YAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxB,CAAC;QACH,CAAC,CAAC,UAAU,IAAoB,EAAE,OAAY;YAC1C,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC;AACR,CAAC;AARD,oCAQC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,MAAc,EAAE,OAA8B;IAC/E,IAAI,OAAO,CAAC,OAAO,EAAE;QACnB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;KAC7E;IAED,IAAI,OAAO,CAAC,OAAO,EAAE;QACnB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;KAC5E;IAED,IAAI,OAAO,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3B,IAAI,GAAG;gBACL,GAAG,IAAI;gBACP,EAAE,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;aAC1B,CAAC;YAED,MAAM,CAAC,GAAW,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;KACJ;IAED,IAAI,OAAO,CAAC,IAAI,EAAE;QAChB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAE,MAAM,CAAC,IAAY,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC5E;AACH,CAAC;AAvBD,gDAuBC","sourcesContent":["import {cleanObject, deepMerge, Store} from \"@tsed/core\";\nimport {Schema} from \"mongoose\";\nimport {MONGOOSE_SCHEMA_OPTIONS} from \"../constants\";\nimport {MongooseNextCB, MongoosePostHook, MongoosePreHook, MongooseSchemaOptions} from \"../interfaces\";\n\n/**\n * @ignore\n */\nexport function schemaOptions(target: any, options?: MongooseSchemaOptions) {\n const store = Store.from(target);\n\n if (!store.has(MONGOOSE_SCHEMA_OPTIONS)) {\n store.set(MONGOOSE_SCHEMA_OPTIONS, {});\n }\n\n if (options) {\n store.set(MONGOOSE_SCHEMA_OPTIONS, deepMerge(store.get(MONGOOSE_SCHEMA_OPTIONS), options));\n }\n\n return store.get(MONGOOSE_SCHEMA_OPTIONS);\n}\n\nfunction mapHookArgs(hook: MongoosePreHook | MongoosePostHook): [string | RegExp, Function] {\n return [hook.method, hook.options || hook.fn, hook.options ? hook.fn : undefined].filter(Boolean) as any;\n}\n\n/**\n * @ignore\n */\nexport function buildPreHook(fn: Function) {\n return fn.length === 2\n ? function (next: MongooseNextCB) {\n return fn(this, next);\n }\n : function (next: MongooseNextCB, options: any) {\n return fn(this, next, options);\n };\n}\n\n/**\n * @ignore\n */\nexport function applySchemaOptions(schema: Schema, options: MongooseSchemaOptions) {\n if (options.plugins) {\n options.plugins.forEach((item) => schema.plugin(item.plugin, item.options));\n }\n\n if (options.indexes) {\n options.indexes.forEach((item) => schema.index(item.fields, item.options));\n }\n\n if (options.pre) {\n options.pre.forEach((item) => {\n item = {\n ...item,\n fn: buildPreHook(item.fn)\n };\n\n (schema.pre as any)(...mapHookArgs(item));\n });\n }\n\n if (options.post) {\n options.post.forEach((item) => (schema.post as any)(...mapHookArgs(item)));\n }\n}\n"]}