@lenne.tech/nest-server 10.0.2 → 10.0.4
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.
- package/README.md +9 -0
- package/dist/config.env.js +47 -17
- package/dist/config.env.js.map +1 -1
- package/dist/core/common/args/filter.args.js +3 -3
- package/dist/core/common/args/filter.args.js.map +1 -1
- package/dist/core/common/args/pagination.args.js +6 -6
- package/dist/core/common/args/pagination.args.js.map +1 -1
- package/dist/core/common/decorators/restricted.decorator.js +15 -17
- package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
- package/dist/core/common/filters/http-exception-log.filter.js +1 -3
- package/dist/core/common/filters/http-exception-log.filter.js.map +1 -1
- package/dist/core/common/helpers/db.helper.js +14 -14
- package/dist/core/common/helpers/db.helper.js.map +1 -1
- package/dist/core/common/helpers/file.helper.js +2 -2
- package/dist/core/common/helpers/file.helper.js.map +1 -1
- package/dist/core/common/helpers/filter.helper.d.ts +2 -2
- package/dist/core/common/helpers/filter.helper.js +1 -1
- package/dist/core/common/helpers/filter.helper.js.map +1 -1
- package/dist/core/common/helpers/graphql.helper.js +1 -1
- package/dist/core/common/helpers/graphql.helper.js.map +1 -1
- package/dist/core/common/helpers/input.helper.js +31 -38
- package/dist/core/common/helpers/input.helper.js.map +1 -1
- package/dist/core/common/helpers/model.helper.js +7 -7
- package/dist/core/common/helpers/model.helper.js.map +1 -1
- package/dist/core/common/helpers/service.helper.js +2 -2
- package/dist/core/common/helpers/service.helper.js.map +1 -1
- package/dist/core/common/inputs/combined-filter.input.js +3 -3
- package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
- package/dist/core/common/inputs/core-input.input.js +1 -1
- package/dist/core/common/inputs/core-input.input.js.map +1 -1
- package/dist/core/common/inputs/filter.input.js +3 -3
- package/dist/core/common/inputs/filter.input.js.map +1 -1
- package/dist/core/common/inputs/single-filter.input.js +4 -4
- package/dist/core/common/inputs/single-filter.input.js.map +1 -1
- package/dist/core/common/inputs/sort.input.js +1 -1
- package/dist/core/common/inputs/sort.input.js.map +1 -1
- package/dist/core/common/interceptors/check-security.interceptor.d.ts +1 -1
- package/dist/core/common/interceptors/check-security.interceptor.js +2 -2
- package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
- package/dist/core/common/interfaces/server-options.interface.d.ts +28 -0
- package/dist/core/common/models/core-model.model.js.map +1 -1
- package/dist/core/common/models/core-persistence.model.js +3 -3
- package/dist/core/common/models/core-persistence.model.js.map +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.d.ts +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.js +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
- package/dist/core/common/scalars/any.scalar.js +2 -2
- package/dist/core/common/scalars/any.scalar.js.map +1 -1
- package/dist/core/common/scalars/date-timestamp.scalar.js +1 -1
- package/dist/core/common/scalars/date-timestamp.scalar.js.map +1 -1
- package/dist/core/common/scalars/date.scalar.js +1 -1
- package/dist/core/common/scalars/date.scalar.js.map +1 -1
- package/dist/core/common/scalars/json.scalar.js +2 -2
- package/dist/core/common/scalars/json.scalar.js.map +1 -1
- package/dist/core/common/services/config.service.js +7 -7
- package/dist/core/common/services/config.service.js.map +1 -1
- package/dist/core/common/services/core-cron-jobs.service.js +5 -5
- package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
- package/dist/core/common/services/crud.service.js +1 -1
- package/dist/core/common/services/crud.service.js.map +1 -1
- package/dist/core/common/services/mailjet.service.js +5 -5
- package/dist/core/common/services/mailjet.service.js.map +1 -1
- package/dist/core/common/services/model-doc.service.d.ts +16 -0
- package/dist/core/common/services/model-doc.service.js +107 -0
- package/dist/core/common/services/model-doc.service.js.map +1 -0
- package/dist/core/common/services/module.service.js.map +1 -1
- package/dist/core/common/services/template.service.js +3 -3
- package/dist/core/common/services/template.service.js.map +1 -1
- package/dist/core/common/types/core-model-constructor.type.d.ts +2 -2
- package/dist/core/modules/auth/core-auth.module.js +3 -3
- package/dist/core/modules/auth/core-auth.module.js.map +1 -1
- package/dist/core/modules/auth/core-auth.resolver.js +5 -5
- package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
- package/dist/core/modules/auth/guards/auth.guard.js +4 -4
- package/dist/core/modules/auth/guards/auth.guard.js.map +1 -1
- package/dist/core/modules/auth/guards/roles.guard.js +1 -1
- package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth.service.js +5 -5
- package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
- package/dist/core/modules/auth/strategies/jwt.strategy.js.map +1 -1
- package/dist/core/modules/auth/tokens.decorator.js +2 -2
- package/dist/core/modules/auth/tokens.decorator.js.map +1 -1
- package/dist/core/modules/file/core-file-info.model.js +2 -2
- package/dist/core/modules/file/core-file-info.model.js.map +1 -1
- package/dist/core/modules/file/core-file.controller.d.ts +1 -2
- package/dist/core/modules/file/core-file.controller.js +3 -6
- package/dist/core/modules/file/core-file.controller.js.map +1 -1
- package/dist/core/modules/file/core-file.service.js +1 -1
- package/dist/core/modules/file/core-file.service.js.map +1 -1
- package/dist/core/modules/file/interfaces/file-upload.interface.d.ts +1 -1
- package/dist/core/modules/health-check/core-health-check-result.model.d.ts +8 -0
- package/dist/core/modules/health-check/core-health-check-result.model.js +53 -0
- package/dist/core/modules/health-check/core-health-check-result.model.js.map +1 -0
- package/dist/core/modules/health-check/core-health-check.controller.d.ts +6 -0
- package/dist/core/modules/health-check/core-health-check.controller.js +33 -0
- package/dist/core/modules/health-check/core-health-check.controller.js.map +1 -0
- package/dist/core/modules/health-check/core-health-check.module.d.ts +2 -0
- package/dist/core/modules/health-check/core-health-check.module.js +24 -0
- package/dist/core/modules/health-check/core-health-check.module.js.map +1 -0
- package/dist/core/modules/health-check/core-health-check.resolver.d.ts +6 -0
- package/dist/core/modules/health-check/core-health-check.resolver.js +38 -0
- package/dist/core/modules/health-check/core-health-check.resolver.js.map +1 -0
- package/dist/core/modules/health-check/core-health-check.service.d.ts +11 -0
- package/dist/core/modules/health-check/core-health-check.service.js +52 -0
- package/dist/core/modules/health-check/core-health-check.service.js.map +1 -0
- package/dist/core/modules/user/core-user.model.js +5 -5
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/core-user.service.js +2 -2
- package/dist/core/modules/user/core-user.service.js.map +1 -1
- package/dist/core/modules/user/inputs/core-user.input.js +1 -1
- package/dist/core/modules/user/inputs/core-user.input.js.map +1 -1
- package/dist/core.module.js +14 -5
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/server/modules/auth/auth.service.js +1 -1
- package/dist/server/modules/auth/auth.service.js.map +1 -1
- package/dist/server/modules/file/file.controller.js +1 -1
- package/dist/server/modules/file/file.controller.js.map +1 -1
- package/dist/server/modules/file/file.resolver.js +2 -2
- package/dist/server/modules/file/file.resolver.js.map +1 -1
- package/dist/server/modules/file/file.service.js +1 -1
- package/dist/server/modules/file/file.service.js.map +1 -1
- package/dist/server/modules/file/multer-config.service.js +1 -1
- package/dist/server/modules/file/multer-config.service.js.map +1 -1
- package/dist/server/modules/user/avatar.controller.js +1 -1
- package/dist/server/modules/user/avatar.controller.js.map +1 -1
- package/dist/server/modules/user/user.resolver.js +1 -1
- package/dist/server/modules/user/user.resolver.js.map +1 -1
- package/dist/server/modules/user/user.service.js +3 -3
- package/dist/server/modules/user/user.service.js.map +1 -1
- package/dist/templates/index.ejs +2 -0
- package/dist/templates/password-reset.ejs +3 -0
- package/dist/templates/welcome.ejs +3 -0
- package/dist/test/test.helper.d.ts +1 -1
- package/dist/test/test.helper.js +7 -7
- package/dist/test/test.helper.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +32 -26
- package/src/config.env.ts +50 -20
- package/src/core/common/args/filter.args.ts +4 -4
- package/src/core/common/args/pagination.args.ts +7 -7
- package/src/core/common/decorators/graphql-service-options.decorator.ts +2 -2
- package/src/core/common/decorators/graphql-user.decorator.ts +1 -1
- package/src/core/common/decorators/rest-user.decorator.ts +1 -1
- package/src/core/common/decorators/restricted.decorator.ts +18 -18
- package/src/core/common/filters/http-exception-log.filter.ts +4 -4
- package/src/core/common/helpers/db.helper.ts +35 -40
- package/src/core/common/helpers/decorator.helper.ts +1 -1
- package/src/core/common/helpers/file.helper.ts +2 -2
- package/src/core/common/helpers/filter.helper.ts +7 -8
- package/src/core/common/helpers/graphql.helper.ts +6 -6
- package/src/core/common/helpers/input.helper.ts +54 -61
- package/src/core/common/helpers/model.helper.ts +33 -41
- package/src/core/common/helpers/service.helper.ts +8 -8
- package/src/core/common/inputs/combined-filter.input.ts +4 -4
- package/src/core/common/inputs/core-input.input.ts +2 -2
- package/src/core/common/inputs/filter.input.ts +4 -4
- package/src/core/common/inputs/single-filter.input.ts +4 -4
- package/src/core/common/inputs/sort.input.ts +1 -1
- package/src/core/common/interceptors/check-response.interceptor.ts +1 -1
- package/src/core/common/interceptors/check-security.interceptor.ts +5 -5
- package/src/core/common/interfaces/server-options.interface.ts +109 -0
- package/src/core/common/models/core-model.model.ts +6 -4
- package/src/core/common/models/core-persistence.model.ts +3 -3
- package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
- package/src/core/common/scalars/any.scalar.ts +2 -2
- package/src/core/common/scalars/date-timestamp.scalar.ts +1 -2
- package/src/core/common/scalars/date.scalar.ts +1 -2
- package/src/core/common/scalars/json.scalar.ts +4 -4
- package/src/core/common/services/config.service.ts +16 -16
- package/src/core/common/services/core-cron-jobs.service.ts +7 -7
- package/src/core/common/services/crud.service.ts +22 -22
- package/src/core/common/services/email.service.ts +1 -1
- package/src/core/common/services/mailjet.service.ts +8 -8
- package/src/core/common/services/model-doc.service.ts +140 -0
- package/src/core/common/services/module.service.ts +5 -6
- package/src/core/common/services/template.service.ts +4 -4
- package/src/core/common/types/core-model-constructor.type.ts +2 -2
- package/src/core/modules/auth/core-auth.controller.ts +2 -2
- package/src/core/modules/auth/core-auth.module.ts +4 -4
- package/src/core/modules/auth/core-auth.resolver.ts +9 -9
- package/src/core/modules/auth/guards/auth.guard.ts +8 -7
- package/src/core/modules/auth/guards/roles.guard.ts +1 -1
- package/src/core/modules/auth/services/core-auth.service.ts +9 -9
- package/src/core/modules/auth/strategies/jwt-refresh.strategy.ts +1 -1
- package/src/core/modules/auth/strategies/jwt.strategy.ts +1 -1
- package/src/core/modules/auth/tokens.decorator.ts +6 -7
- package/src/core/modules/file/core-file-info.model.ts +2 -2
- package/src/core/modules/file/core-file.controller.ts +2 -4
- package/src/core/modules/file/core-file.service.ts +6 -5
- package/src/core/modules/file/interfaces/file-upload.interface.ts +1 -1
- package/src/core/modules/health-check/core-health-check-result.model.ts +46 -0
- package/src/core/modules/health-check/core-health-check.controller.ts +24 -0
- package/src/core/modules/health-check/core-health-check.module.ts +17 -0
- package/src/core/modules/health-check/core-health-check.resolver.ts +32 -0
- package/src/core/modules/health-check/core-health-check.service.ts +62 -0
- package/src/core/modules/user/core-user.model.ts +6 -6
- package/src/core/modules/user/core-user.service.ts +10 -9
- package/src/core/modules/user/inputs/core-user.input.ts +1 -2
- package/src/core.module.ts +23 -12
- package/src/index.ts +11 -0
- package/src/main.ts +2 -2
- package/src/server/modules/auth/auth.controller.ts +1 -1
- package/src/server/modules/auth/auth.resolver.ts +3 -3
- package/src/server/modules/auth/auth.service.ts +2 -2
- package/src/server/modules/file/file.controller.ts +1 -2
- package/src/server/modules/file/file.module.ts +1 -1
- package/src/server/modules/file/file.resolver.ts +4 -3
- package/src/server/modules/file/file.service.ts +1 -1
- package/src/server/modules/file/multer-config.service.ts +1 -1
- package/src/server/modules/user/avatar.controller.ts +3 -3
- package/src/server/modules/user/user.model.ts +1 -1
- package/src/server/modules/user/user.resolver.ts +4 -4
- package/src/server/modules/user/user.service.ts +4 -4
- package/src/test/test.helper.ts +11 -11
|
@@ -28,7 +28,7 @@ export function addIds(
|
|
|
28
28
|
target: any,
|
|
29
29
|
ids: StringOrObjectId | StringOrObjectId[],
|
|
30
30
|
convert: 'string' | 'object' | 'auto' | false = 'auto',
|
|
31
|
-
options?: { unique?: boolean }
|
|
31
|
+
options?: { unique?: boolean },
|
|
32
32
|
): any[] {
|
|
33
33
|
// Set config
|
|
34
34
|
const config = {
|
|
@@ -54,17 +54,14 @@ export function addIds(
|
|
|
54
54
|
if (ids.length) {
|
|
55
55
|
// Add autoconverted ID
|
|
56
56
|
if (
|
|
57
|
-
result.length
|
|
58
|
-
convert === 'auto'
|
|
59
|
-
((result[0] instanceof Types.ObjectId && !(ids instanceof Types.ObjectId))
|
|
60
|
-
(typeof result[0] === 'string' && typeof ids !== 'string'))
|
|
57
|
+
result.length
|
|
58
|
+
&& convert === 'auto'
|
|
59
|
+
&& ((result[0] instanceof Types.ObjectId && !(ids instanceof Types.ObjectId))
|
|
60
|
+
|| (typeof result[0] === 'string' && typeof ids !== 'string'))
|
|
61
61
|
) {
|
|
62
62
|
const converted = result[0] instanceof Types.ObjectId ? getObjectIds(ids) : getStringIds(ids);
|
|
63
63
|
result.push(...(converted as any));
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Add ID
|
|
67
|
-
else {
|
|
64
|
+
} else { // Add ID
|
|
68
65
|
result.push(...ids);
|
|
69
66
|
}
|
|
70
67
|
}
|
|
@@ -109,7 +106,7 @@ export function equalIds(...ids: IdsType[]): boolean {
|
|
|
109
106
|
if (!compare) {
|
|
110
107
|
return false;
|
|
111
108
|
}
|
|
112
|
-
return ids.every(
|
|
109
|
+
return ids.every(id => getStringIds(id) === compare);
|
|
113
110
|
}
|
|
114
111
|
|
|
115
112
|
/**
|
|
@@ -124,7 +121,7 @@ export function getIncludedIds(includes: IdsType, ids: IdsType, convert?: 'objec
|
|
|
124
121
|
export function getIncludedIds<T = IdsType>(
|
|
125
122
|
includes: IdsType,
|
|
126
123
|
ids: T | IdsType,
|
|
127
|
-
convert?: 'string' | 'object'
|
|
124
|
+
convert?: 'string' | 'object',
|
|
128
125
|
): T[] | null | undefined {
|
|
129
126
|
if (!includes || !ids) {
|
|
130
127
|
return undefined;
|
|
@@ -189,7 +186,7 @@ export function getStringIds(elements: any[], options?: { deep?: boolean; unique
|
|
|
189
186
|
export function getStringIds(elements: any, options?: { deep?: boolean; unique?: boolean }): string;
|
|
190
187
|
export function getStringIds<T extends any | any[]>(
|
|
191
188
|
elements: T,
|
|
192
|
-
options?: { deep?: boolean; unique?: boolean }
|
|
189
|
+
options?: { deep?: boolean; unique?: boolean },
|
|
193
190
|
): string | string[] {
|
|
194
191
|
// Process options
|
|
195
192
|
const { deep, unique } = {
|
|
@@ -236,7 +233,7 @@ export function getObjectIds(ids: any[]): Types.ObjectId[];
|
|
|
236
233
|
export function getObjectIds(ids: any): Types.ObjectId;
|
|
237
234
|
export function getObjectIds<T extends any | any[]>(ids: T): Types.ObjectId | Types.ObjectId[] {
|
|
238
235
|
if (Array.isArray(ids)) {
|
|
239
|
-
return ids.map(
|
|
236
|
+
return ids.map(id => new Types.ObjectId(getStringId(id)));
|
|
240
237
|
}
|
|
241
238
|
return new Types.ObjectId(getStringId(ids));
|
|
242
239
|
}
|
|
@@ -250,7 +247,7 @@ export function getElementsViaIds<T = any>(
|
|
|
250
247
|
options: {
|
|
251
248
|
splice?: boolean;
|
|
252
249
|
unique?: boolean;
|
|
253
|
-
} = {}
|
|
250
|
+
} = {},
|
|
254
251
|
): T[] {
|
|
255
252
|
// Config
|
|
256
253
|
const config = {
|
|
@@ -283,7 +280,7 @@ export function getElementsViaIds<T = any>(
|
|
|
283
280
|
// Unique elements
|
|
284
281
|
if (config.unique) {
|
|
285
282
|
return elements.filter((value, index, self) => {
|
|
286
|
-
return self.findIndex(
|
|
283
|
+
return self.findIndex(e => getStringIds(e)) === index;
|
|
287
284
|
});
|
|
288
285
|
}
|
|
289
286
|
|
|
@@ -354,10 +351,9 @@ export function getPopulatOptionsFromSelections(selectionNodes: readonly Selecti
|
|
|
354
351
|
// Subfield is a primitive
|
|
355
352
|
if (!innerNode.selectionSet?.selections?.length) {
|
|
356
353
|
option.select ? option.select.push(innerNode.name.value) : (option.select = [innerNode.name.value]);
|
|
357
|
-
}
|
|
358
354
|
|
|
359
|
-
|
|
360
|
-
else {
|
|
355
|
+
// Subfield ist an object
|
|
356
|
+
} else {
|
|
361
357
|
const innerPopulate = getPopulatOptionsFromSelections([innerNode]);
|
|
362
358
|
option.populate = option.populate
|
|
363
359
|
? (option.populate as PopulateOptions[]).concat(innerPopulate)
|
|
@@ -399,7 +395,7 @@ export function objectIdsToStrings(element: any, prepared: WeakMap<any, any> = n
|
|
|
399
395
|
|
|
400
396
|
// Process array
|
|
401
397
|
if (Array.isArray(element)) {
|
|
402
|
-
return element.map(
|
|
398
|
+
return element.map(e => objectIdsToStrings(e, prepared));
|
|
403
399
|
}
|
|
404
400
|
|
|
405
401
|
// Process object
|
|
@@ -425,7 +421,7 @@ export function objectIdsToStrings(element: any, prepared: WeakMap<any, any> = n
|
|
|
425
421
|
export function removeUnresolvedReferences<T = any>(
|
|
426
422
|
populated: T,
|
|
427
423
|
populatedOptions: string | PopulateOptions | PopulateOptions[] | (string | PopulateOptions)[],
|
|
428
|
-
ignoreFirst = true
|
|
424
|
+
ignoreFirst = true,
|
|
429
425
|
): T {
|
|
430
426
|
// Check parameter
|
|
431
427
|
if (!populated || !populatedOptions) {
|
|
@@ -434,7 +430,7 @@ export function removeUnresolvedReferences<T = any>(
|
|
|
434
430
|
|
|
435
431
|
// Process array
|
|
436
432
|
if (Array.isArray(populated)) {
|
|
437
|
-
populated.forEach(
|
|
433
|
+
populated.forEach(p => removeUnresolvedReferences(p, populatedOptions, false));
|
|
438
434
|
return populated;
|
|
439
435
|
}
|
|
440
436
|
|
|
@@ -442,8 +438,8 @@ export function removeUnresolvedReferences<T = any>(
|
|
|
442
438
|
if (typeof populated === 'object') {
|
|
443
439
|
// populatedOptions is an array
|
|
444
440
|
if (Array.isArray(populatedOptions)) {
|
|
445
|
-
populatedOptions.forEach(
|
|
446
|
-
removeUnresolvedReferences(populated, ignoreFirst && typeof po === 'object' ? po.populate : po, false)
|
|
441
|
+
populatedOptions.forEach(po =>
|
|
442
|
+
removeUnresolvedReferences(populated, ignoreFirst && typeof po === 'object' ? po.populate : po, false),
|
|
447
443
|
);
|
|
448
444
|
return populated;
|
|
449
445
|
}
|
|
@@ -481,15 +477,15 @@ export async function popAndMap<T extends CoreModel>(
|
|
|
481
477
|
mongooseModel?: Model<any>,
|
|
482
478
|
options?: {
|
|
483
479
|
ignoreSelections?: boolean;
|
|
484
|
-
}
|
|
480
|
+
},
|
|
485
481
|
): Promise<T | T[]> {
|
|
486
482
|
let result;
|
|
487
483
|
let populateOptions: PopulateOptions[] = [];
|
|
488
484
|
const ignoreSelections = options?.ignoreSelections;
|
|
489
485
|
if (populate) {
|
|
490
486
|
if (
|
|
491
|
-
Array.isArray(populate)
|
|
492
|
-
(typeof (populate as string[])[0] === 'string' || typeof (populate as PopulateOptions[])[0]?.path === 'string')
|
|
487
|
+
Array.isArray(populate)
|
|
488
|
+
&& (typeof (populate as string[])[0] === 'string' || typeof (populate as PopulateOptions[])[0]?.path === 'string')
|
|
493
489
|
) {
|
|
494
490
|
populateOptions = populate as PopulateOptions[];
|
|
495
491
|
} else if (Array.isArray(populate) && typeof (populate as SelectionNode[])[0]?.kind === 'string') {
|
|
@@ -509,19 +505,19 @@ export async function popAndMap<T extends CoreModel>(
|
|
|
509
505
|
|
|
510
506
|
// Map result
|
|
511
507
|
if (Array.isArray(result)) {
|
|
512
|
-
result = result.map(
|
|
508
|
+
result = result.map(item => (modelClass as any).map(item));
|
|
513
509
|
} else {
|
|
514
510
|
result = (modelClass as any).map(result);
|
|
515
511
|
}
|
|
516
|
-
|
|
512
|
+
|
|
517
513
|
// Process documents
|
|
514
|
+
} else {
|
|
518
515
|
if (Array.isArray(queryOrDocument)) {
|
|
519
516
|
await setPopulates(queryOrDocument, populateOptions, mongooseModel, { ignoreSelections });
|
|
520
|
-
result = queryOrDocument.map(
|
|
521
|
-
}
|
|
517
|
+
result = queryOrDocument.map(item => (modelClass as any).map(item));
|
|
522
518
|
|
|
523
|
-
|
|
524
|
-
else {
|
|
519
|
+
// Process document
|
|
520
|
+
} else {
|
|
525
521
|
await setPopulates(queryOrDocument, populateOptions, mongooseModel, { ignoreSelections });
|
|
526
522
|
result = (modelClass as any).map(queryOrDocument);
|
|
527
523
|
}
|
|
@@ -568,7 +564,7 @@ export async function setPopulates<T = Query<any, any> | Document>(
|
|
|
568
564
|
queryOrDocument: T,
|
|
569
565
|
populateOptions: string[] | PopulateOptions[] | (string | PopulateOptions)[],
|
|
570
566
|
mongooseModel: Model<any>,
|
|
571
|
-
options?: { ignoreSelections: boolean }
|
|
567
|
+
options?: { ignoreSelections: boolean },
|
|
572
568
|
): Promise<T> {
|
|
573
569
|
// Check parameters
|
|
574
570
|
if (!populateOptions?.length || !queryOrDocument) {
|
|
@@ -595,11 +591,10 @@ export async function setPopulates<T = Query<any, any> | Document>(
|
|
|
595
591
|
for (const options of populateOptions) {
|
|
596
592
|
queryOrDocument = (queryOrDocument as any).populate(options);
|
|
597
593
|
}
|
|
598
|
-
}
|
|
599
594
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
else if (Array.isArray(queryOrDocument)) {
|
|
595
|
+
// Document => Non chaining
|
|
596
|
+
// Array with documents
|
|
597
|
+
} else if (Array.isArray(queryOrDocument)) {
|
|
603
598
|
const promises = [];
|
|
604
599
|
queryOrDocument.forEach((item) => {
|
|
605
600
|
if (item.populate) {
|
|
@@ -609,9 +604,9 @@ export async function setPopulates<T = Query<any, any> | Document>(
|
|
|
609
604
|
}
|
|
610
605
|
});
|
|
611
606
|
await Promise.all(promises);
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
else if ((queryOrDocument as any).populate) {
|
|
607
|
+
|
|
608
|
+
// Single document
|
|
609
|
+
} else if ((queryOrDocument as any).populate) {
|
|
615
610
|
await (queryOrDocument as any).populate(populateOptions);
|
|
616
611
|
} else {
|
|
617
612
|
return (await mongooseModel.populate(queryOrDocument as any, populateOptions as any)) as any;
|
|
@@ -28,7 +28,7 @@ export function currentUserDec(data, ctx: ExecutionContext) {
|
|
|
28
28
|
*/
|
|
29
29
|
export function graphqlPopulateDec(
|
|
30
30
|
data: { gqlPath?: string; ignoreSelections?: boolean },
|
|
31
|
-
ctx: ExecutionContext
|
|
31
|
+
ctx: ExecutionContext,
|
|
32
32
|
): PopulateOptions[] {
|
|
33
33
|
// Check context type
|
|
34
34
|
if (ctx.getType<GqlContextType>() !== 'graphql') {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { extname } from 'path';
|
|
1
2
|
import { MulterOptions } from '@nestjs/platform-express/multer/interfaces/multer-options.interface';
|
|
2
3
|
import { diskStorage } from 'multer';
|
|
3
|
-
import { extname } from 'path';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Helper class for inputs
|
|
@@ -63,7 +63,7 @@ export function multerFileFilter(fileTypeRegex = /jpeg|jpg|png/) {
|
|
|
63
63
|
if (mimetype && extName) {
|
|
64
64
|
return cb(null, true);
|
|
65
65
|
}
|
|
66
|
-
cb(
|
|
66
|
+
cb(`Error: File upload only supports the following filetypes - ${fileTypeRegex}`);
|
|
67
67
|
};
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -32,7 +32,7 @@ export class Filter {
|
|
|
32
32
|
/**
|
|
33
33
|
* Generate find options
|
|
34
34
|
*/
|
|
35
|
-
public static generateFindOptions
|
|
35
|
+
public static generateFindOptions(filterArgs: Partial<FilterArgs>): QueryOptions {
|
|
36
36
|
return generateFindOptions(filterArgs);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -86,7 +86,7 @@ export function findFilter(options?: {
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
// Filter falsy values
|
|
89
|
-
filterOptions[config.type] = filterOptions[config.type].filter(
|
|
89
|
+
filterOptions[config.type] = filterOptions[config.type].filter(value => value);
|
|
90
90
|
|
|
91
91
|
// Optimizations
|
|
92
92
|
if (!filterOptions[config.type].length) {
|
|
@@ -113,7 +113,7 @@ export function convertFilterArgsToQuery<T = any>(filterArgs: Partial<FilterArgs
|
|
|
113
113
|
*/
|
|
114
114
|
export function generateFilterQuery<T = any>(
|
|
115
115
|
filter?: Partial<FilterInput>,
|
|
116
|
-
options?: { automaticObjectIdFiltering?: boolean }
|
|
116
|
+
options?: { automaticObjectIdFiltering?: boolean },
|
|
117
117
|
): FilterQuery<T> | any {
|
|
118
118
|
// Check filter
|
|
119
119
|
if (!filter) {
|
|
@@ -156,10 +156,9 @@ export function generateFilterQuery<T = any>(
|
|
|
156
156
|
// Convert value to object ID(s)
|
|
157
157
|
if (convertToObjectId || isReference) {
|
|
158
158
|
value = getObjectIds(value);
|
|
159
|
-
}
|
|
160
159
|
|
|
161
|
-
|
|
162
|
-
else if (config.automaticObjectIdFiltering && checkStringIds(value)) {
|
|
160
|
+
// Check if value is a string ID and automatic ObjectID filtering is activated
|
|
161
|
+
} else if (config.automaticObjectIdFiltering && checkStringIds(value)) {
|
|
163
162
|
// Set both the string filter and the ObjectID filtering in an OR construction
|
|
164
163
|
const alternativeQuery = clone(filter.singleFilter, { circles: false });
|
|
165
164
|
alternativeQuery.value = getObjectIds(value);
|
|
@@ -215,9 +214,9 @@ export function generateFilterQuery<T = any>(
|
|
|
215
214
|
/**
|
|
216
215
|
* Generate find options
|
|
217
216
|
*/
|
|
218
|
-
export function generateFindOptions
|
|
217
|
+
export function generateFindOptions(
|
|
219
218
|
filterArgs: Partial<FilterArgs>,
|
|
220
|
-
options?: { maxLimit?: number }
|
|
219
|
+
options?: { maxLimit?: number },
|
|
221
220
|
): QueryOptions {
|
|
222
221
|
// Check filterArgs
|
|
223
222
|
if (!filterArgs) {
|
|
@@ -106,7 +106,7 @@ export default class GraphQLHelper {
|
|
|
106
106
|
ast: FieldNode,
|
|
107
107
|
info: GraphQLResolveInfo,
|
|
108
108
|
obj: any = {},
|
|
109
|
-
config: Partial<GraphQLFieldsConfig> = {}
|
|
109
|
+
config: Partial<GraphQLFieldsConfig> = {},
|
|
110
110
|
) {
|
|
111
111
|
return flattenAST(ast, info, obj, config);
|
|
112
112
|
}
|
|
@@ -117,7 +117,7 @@ export default class GraphQLHelper {
|
|
|
117
117
|
public static getFields(
|
|
118
118
|
info: GraphQLResolveInfo,
|
|
119
119
|
obj: Record<string, any> = {},
|
|
120
|
-
config: Partial<GraphQLFieldsConfig> = {}
|
|
120
|
+
config: Partial<GraphQLFieldsConfig> = {},
|
|
121
121
|
) {
|
|
122
122
|
return getFields(info, obj, config);
|
|
123
123
|
}
|
|
@@ -190,7 +190,7 @@ export function getArguments(ast: FieldNode) {
|
|
|
190
190
|
const valueNode = argument.value;
|
|
191
191
|
const argumentValue = !isListValueNode(valueNode)
|
|
192
192
|
? (valueNode as any).value
|
|
193
|
-
: (valueNode as any).values.map(
|
|
193
|
+
: (valueNode as any).values.map(value => value.value);
|
|
194
194
|
|
|
195
195
|
return {
|
|
196
196
|
[argument.name.value]: {
|
|
@@ -251,7 +251,7 @@ export function flattenAST(
|
|
|
251
251
|
ast: FieldNode,
|
|
252
252
|
info: GraphQLResolveInfo,
|
|
253
253
|
obj: any = {},
|
|
254
|
-
config: Partial<GraphQLFieldsConfig> = {}
|
|
254
|
+
config: Partial<GraphQLFieldsConfig> = {},
|
|
255
255
|
) {
|
|
256
256
|
// Process configuration
|
|
257
257
|
config = Object.assign(
|
|
@@ -259,7 +259,7 @@ export function flattenAST(
|
|
|
259
259
|
processArguments: false,
|
|
260
260
|
excludedFields: [],
|
|
261
261
|
},
|
|
262
|
-
config
|
|
262
|
+
config,
|
|
263
263
|
);
|
|
264
264
|
|
|
265
265
|
return getASTSelections(ast).reduce((flattened, a) => {
|
|
@@ -306,7 +306,7 @@ export function flattenAST(
|
|
|
306
306
|
export function getFields(
|
|
307
307
|
info: GraphQLResolveInfo,
|
|
308
308
|
obj: Record<string, any> = {},
|
|
309
|
-
config: Partial<GraphQLFieldsConfig> = {}
|
|
309
|
+
config: Partial<GraphQLFieldsConfig> = {},
|
|
310
310
|
) {
|
|
311
311
|
// Check info
|
|
312
312
|
if (!info || (!info.fieldNodes && !(info as any).fieldASTs)) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BadRequestException,
|
|
1
|
+
import { BadRequestException, UnauthorizedException } from '@nestjs/common';
|
|
2
2
|
import { plainToInstance } from 'class-transformer';
|
|
3
3
|
import { validate } from 'class-validator';
|
|
4
4
|
import { ValidatorOptions } from 'class-validator/types/validation/ValidatorOptions';
|
|
@@ -28,7 +28,7 @@ export default class InputHelper {
|
|
|
28
28
|
processType?: ProcessType;
|
|
29
29
|
roles?: string | string[];
|
|
30
30
|
throwError?: boolean;
|
|
31
|
-
}
|
|
31
|
+
},
|
|
32
32
|
): Promise<any> {
|
|
33
33
|
return check(value, user, options);
|
|
34
34
|
}
|
|
@@ -59,7 +59,7 @@ export default class InputHelper {
|
|
|
59
59
|
parameter: number,
|
|
60
60
|
min: number,
|
|
61
61
|
max: number,
|
|
62
|
-
falseFunction: (...params) => any = errorFunction
|
|
62
|
+
falseFunction: (...params) => any = errorFunction,
|
|
63
63
|
): boolean {
|
|
64
64
|
return isBetween(parameter, min, max, falseFunction);
|
|
65
65
|
}
|
|
@@ -105,7 +105,7 @@ export default class InputHelper {
|
|
|
105
105
|
public static isGreater(
|
|
106
106
|
parameter: number,
|
|
107
107
|
compare: number,
|
|
108
|
-
falseFunction: (...params) => any = errorFunction
|
|
108
|
+
falseFunction: (...params) => any = errorFunction,
|
|
109
109
|
): boolean {
|
|
110
110
|
return isGreater(parameter, compare, falseFunction);
|
|
111
111
|
}
|
|
@@ -116,7 +116,7 @@ export default class InputHelper {
|
|
|
116
116
|
public static isLower(
|
|
117
117
|
parameter: number,
|
|
118
118
|
compare: number,
|
|
119
|
-
falseFunction: (...params) => any = errorFunction
|
|
119
|
+
falseFunction: (...params) => any = errorFunction,
|
|
120
120
|
): boolean {
|
|
121
121
|
return isLower(parameter, compare, falseFunction);
|
|
122
122
|
}
|
|
@@ -125,7 +125,7 @@ export default class InputHelper {
|
|
|
125
125
|
* Check if parameter is a non-empty array
|
|
126
126
|
*/
|
|
127
127
|
public static isNonEmptyArray(parameter: any, falseFunction: (...params) => any = errorFunction): boolean {
|
|
128
|
-
return isNonEmptyString(parameter,
|
|
128
|
+
return isNonEmptyString(parameter, falseFunction);
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
/**
|
|
@@ -182,7 +182,7 @@ export default class InputHelper {
|
|
|
182
182
|
* @deprecated use mapClass function
|
|
183
183
|
*/
|
|
184
184
|
public static map<T>(values: Partial<T>, ctor: new () => T, cloneDeep = true): T {
|
|
185
|
-
return mapClass(values, ctor);
|
|
185
|
+
return mapClass(values, ctor, { cloneDeep });
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
|
|
@@ -194,13 +194,10 @@ export function assignPlain(target: Record<any, any>, ...args: Record<any, any>[
|
|
|
194
194
|
target,
|
|
195
195
|
...args.map(
|
|
196
196
|
// Prepare records
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
: // Return cloned record with undefined properties removed
|
|
202
|
-
filterProperties(clone(item, { circles: false }), (prop) => prop !== undefined)
|
|
203
|
-
)
|
|
197
|
+
item =>
|
|
198
|
+
// Return item if not an object or cloned record with undefined properties removed
|
|
199
|
+
!item ? item : filterProperties(clone(item, { circles: false }), prop => prop !== undefined),
|
|
200
|
+
),
|
|
204
201
|
);
|
|
205
202
|
}
|
|
206
203
|
|
|
@@ -217,7 +214,7 @@ export async function check(
|
|
|
217
214
|
roles?: string | string[];
|
|
218
215
|
throwError?: boolean;
|
|
219
216
|
validatorOptions?: ValidatorOptions;
|
|
220
|
-
}
|
|
217
|
+
},
|
|
221
218
|
): Promise<any> {
|
|
222
219
|
const config = {
|
|
223
220
|
throwError: true,
|
|
@@ -245,15 +242,15 @@ export async function check(
|
|
|
245
242
|
// Check access
|
|
246
243
|
if (
|
|
247
244
|
// check if any user, including users who are not logged in, can access
|
|
248
|
-
roles.includes(RoleEnum.S_EVERYONE)
|
|
245
|
+
roles.includes(RoleEnum.S_EVERYONE)
|
|
249
246
|
// check if user is logged in
|
|
250
|
-
(roles.includes(RoleEnum.S_USER) && user?.id)
|
|
247
|
+
|| (roles.includes(RoleEnum.S_USER) && user?.id)
|
|
251
248
|
// check if the user has at least one of the required roles
|
|
252
|
-
user?.hasRole?.(roles)
|
|
249
|
+
|| user?.hasRole?.(roles)
|
|
253
250
|
// check if the user is herself / himself
|
|
254
|
-
(roles.includes(RoleEnum.S_SELF) && equalIds(config.dbObject, user))
|
|
251
|
+
|| (roles.includes(RoleEnum.S_SELF) && equalIds(config.dbObject, user))
|
|
255
252
|
// check if the user is the creator
|
|
256
|
-
(roles.includes(RoleEnum.S_CREATOR) && equalIds(config.dbObject?.createdBy, user))
|
|
253
|
+
|| (roles.includes(RoleEnum.S_CREATOR) && equalIds(config.dbObject?.createdBy, user))
|
|
257
254
|
) {
|
|
258
255
|
valid = true;
|
|
259
256
|
}
|
|
@@ -394,10 +391,10 @@ export function errorFunction(caller: (...params) => any, message = 'Required pa
|
|
|
394
391
|
*/
|
|
395
392
|
export function filterProperties<T = Record<string, any>>(
|
|
396
393
|
obj: T,
|
|
397
|
-
filterFunction: (value?: any, key?: string, obj?: T) => boolean
|
|
394
|
+
filterFunction: (value?: any, key?: string, obj?: T) => boolean,
|
|
398
395
|
): Partial<T> {
|
|
399
396
|
return Object.keys(obj)
|
|
400
|
-
.filter(
|
|
397
|
+
.filter(key => filterFunction(obj[key], key, obj))
|
|
401
398
|
.reduce((res, key) => Object.assign(res, { [key]: obj[key] }), {});
|
|
402
399
|
}
|
|
403
400
|
|
|
@@ -454,7 +451,7 @@ export function isBetween(
|
|
|
454
451
|
parameter: number,
|
|
455
452
|
min: number,
|
|
456
453
|
max: number,
|
|
457
|
-
falseFunction: (...params) => any = errorFunction
|
|
454
|
+
falseFunction: (...params) => any = errorFunction,
|
|
458
455
|
): boolean {
|
|
459
456
|
return typeof parameter === 'number' && parameter > min && parameter < max ? true : falseFunction(isBetween);
|
|
460
457
|
}
|
|
@@ -485,12 +482,12 @@ export function isFalse(parameter: any, falseFunction: (...params) => any = erro
|
|
|
485
482
|
* Check if parameter is a valid file
|
|
486
483
|
*/
|
|
487
484
|
export function isFile(parameter: any, falseFunction: (...params) => any = errorFunction): boolean {
|
|
488
|
-
return parameter !== null
|
|
489
|
-
typeof parameter !== 'undefined'
|
|
490
|
-
parameter.name
|
|
491
|
-
parameter.path
|
|
492
|
-
parameter.type
|
|
493
|
-
parameter.size > 0
|
|
485
|
+
return parameter !== null
|
|
486
|
+
&& typeof parameter !== 'undefined'
|
|
487
|
+
&& parameter.name
|
|
488
|
+
&& parameter.path
|
|
489
|
+
&& parameter.type
|
|
490
|
+
&& parameter.size > 0
|
|
494
491
|
? true
|
|
495
492
|
: falseFunction(isFile);
|
|
496
493
|
}
|
|
@@ -508,7 +505,7 @@ export function isFunction(parameter: (...params) => any, falseFunction: (...par
|
|
|
508
505
|
export function isGreater(
|
|
509
506
|
parameter: number,
|
|
510
507
|
compare: number,
|
|
511
|
-
falseFunction: (...params) => any = errorFunction
|
|
508
|
+
falseFunction: (...params) => any = errorFunction,
|
|
512
509
|
): boolean {
|
|
513
510
|
return typeof parameter === 'number' && parameter > compare ? true : falseFunction(isGreater);
|
|
514
511
|
}
|
|
@@ -519,7 +516,7 @@ export function isGreater(
|
|
|
519
516
|
export function isLower(
|
|
520
517
|
parameter: number,
|
|
521
518
|
compare: number,
|
|
522
|
-
falseFunction: (...params) => any = errorFunction
|
|
519
|
+
falseFunction: (...params) => any = errorFunction,
|
|
523
520
|
): boolean {
|
|
524
521
|
return typeof parameter === 'number' && parameter < compare ? true : falseFunction(isLower);
|
|
525
522
|
}
|
|
@@ -528,10 +525,10 @@ export function isLower(
|
|
|
528
525
|
* Check if parameter is a non empty array
|
|
529
526
|
*/
|
|
530
527
|
export function isNonEmptyArray(parameter: any, falseFunction: (...params) => any = errorFunction): boolean {
|
|
531
|
-
return parameter !== null
|
|
532
|
-
typeof parameter !== 'undefined'
|
|
533
|
-
parameter.constructor === Array
|
|
534
|
-
parameter.length > 0
|
|
528
|
+
return parameter !== null
|
|
529
|
+
&& typeof parameter !== 'undefined'
|
|
530
|
+
&& parameter.constructor === Array
|
|
531
|
+
&& parameter.length > 0
|
|
535
532
|
? true
|
|
536
533
|
: falseFunction(isNonEmptyArray);
|
|
537
534
|
}
|
|
@@ -540,10 +537,10 @@ export function isNonEmptyArray(parameter: any, falseFunction: (...params) => an
|
|
|
540
537
|
* Check if parameter is a non empty object
|
|
541
538
|
*/
|
|
542
539
|
export function isNonEmptyObject(parameter: any, falseFunction: (...params) => any = errorFunction): boolean {
|
|
543
|
-
return parameter !== null
|
|
544
|
-
typeof parameter !== 'undefined'
|
|
545
|
-
parameter.constructor === Object
|
|
546
|
-
Object.keys(parameter).length !== 0
|
|
540
|
+
return parameter !== null
|
|
541
|
+
&& typeof parameter !== 'undefined'
|
|
542
|
+
&& parameter.constructor === Object
|
|
543
|
+
&& Object.keys(parameter).length !== 0
|
|
547
544
|
? true
|
|
548
545
|
: falseFunction(isNonEmptyObject);
|
|
549
546
|
}
|
|
@@ -593,13 +590,10 @@ export function mergePlain(target: Record<any, any>, ...args: Record<any, any>[]
|
|
|
593
590
|
target,
|
|
594
591
|
...args.map(
|
|
595
592
|
// Prepare records
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
: // Return cloned record with undefined properties removed
|
|
601
|
-
filterProperties(clone(item, { circles: false }), (prop) => prop !== undefined)
|
|
602
|
-
)
|
|
593
|
+
item =>
|
|
594
|
+
// Return item if not an object or cloned record with undefined properties removed
|
|
595
|
+
!item ? item : filterProperties(clone(item, { circles: false }), prop => prop !== undefined),
|
|
596
|
+
),
|
|
603
597
|
);
|
|
604
598
|
}
|
|
605
599
|
|
|
@@ -636,12 +630,13 @@ export function mapClass<T>(
|
|
|
636
630
|
cloneDeep?: boolean;
|
|
637
631
|
circle?: boolean;
|
|
638
632
|
proto?: boolean;
|
|
639
|
-
}
|
|
633
|
+
},
|
|
640
634
|
): T {
|
|
641
635
|
const config = {
|
|
642
636
|
cloneDeep: true,
|
|
643
637
|
circles: false,
|
|
644
638
|
proto: false,
|
|
639
|
+
...options,
|
|
645
640
|
};
|
|
646
641
|
const instance = new ctor();
|
|
647
642
|
|
|
@@ -708,7 +703,7 @@ export function processDeep(
|
|
|
708
703
|
specialClasses?: ((new (args: any[]) => any) | string)[];
|
|
709
704
|
specialFunctions?: string[];
|
|
710
705
|
specialProperties?: string[];
|
|
711
|
-
}
|
|
706
|
+
},
|
|
712
707
|
): any {
|
|
713
708
|
// Set options
|
|
714
709
|
const { processedObjects, specialClasses, specialFunctions, specialProperties } = {
|
|
@@ -722,10 +717,9 @@ export function processDeep(
|
|
|
722
717
|
// Check for falsifiable values
|
|
723
718
|
if (!data) {
|
|
724
719
|
return func(data);
|
|
725
|
-
}
|
|
726
720
|
|
|
727
|
-
|
|
728
|
-
else if (typeof data === 'object') {
|
|
721
|
+
// Prevent circular processing
|
|
722
|
+
} else if (typeof data === 'object') {
|
|
729
723
|
if (processedObjects.get(data)) {
|
|
730
724
|
return data;
|
|
731
725
|
}
|
|
@@ -734,21 +728,21 @@ export function processDeep(
|
|
|
734
728
|
|
|
735
729
|
// Process array
|
|
736
730
|
if (Array.isArray(data)) {
|
|
737
|
-
return func(data.map(
|
|
731
|
+
return func(data.map(item => processDeep(item, func, { processedObjects, specialClasses })));
|
|
738
732
|
}
|
|
739
733
|
|
|
740
734
|
// Process object
|
|
741
735
|
if (typeof data === 'object') {
|
|
742
736
|
if (
|
|
743
|
-
specialFunctions.find(
|
|
744
|
-
specialProperties.find(
|
|
737
|
+
specialFunctions.find(sF => typeof data[sF] === 'function')
|
|
738
|
+
|| specialProperties.find(sP => Object.getOwnPropertyNames(data).includes(sP))
|
|
745
739
|
) {
|
|
746
740
|
return func(data);
|
|
747
741
|
}
|
|
748
742
|
for (const specialClass of specialClasses) {
|
|
749
743
|
if (
|
|
750
|
-
(typeof specialClass === 'string' && specialClass === data.constructor?.name)
|
|
751
|
-
(typeof specialClass !== 'string' && data instanceof specialClass)
|
|
744
|
+
(typeof specialClass === 'string' && specialClass === data.constructor?.name)
|
|
745
|
+
|| (typeof specialClass !== 'string' && data instanceof specialClass)
|
|
752
746
|
) {
|
|
753
747
|
return func(data);
|
|
754
748
|
}
|
|
@@ -787,7 +781,7 @@ export function removePropertiesDeep(
|
|
|
787
781
|
properties: string[],
|
|
788
782
|
options?: {
|
|
789
783
|
processedObjects?: WeakMap<new () => any, boolean>;
|
|
790
|
-
}
|
|
784
|
+
},
|
|
791
785
|
): any {
|
|
792
786
|
// Set options
|
|
793
787
|
const { processedObjects } = {
|
|
@@ -798,10 +792,9 @@ export function removePropertiesDeep(
|
|
|
798
792
|
// Check for falsifiable values
|
|
799
793
|
if (!data) {
|
|
800
794
|
return data;
|
|
801
|
-
}
|
|
802
795
|
|
|
803
|
-
|
|
804
|
-
else if (typeof data === 'object') {
|
|
796
|
+
// Prevent circular processing
|
|
797
|
+
} else if (typeof data === 'object') {
|
|
805
798
|
if (processedObjects.get(data)) {
|
|
806
799
|
return data;
|
|
807
800
|
}
|
|
@@ -810,7 +803,7 @@ export function removePropertiesDeep(
|
|
|
810
803
|
|
|
811
804
|
// Process array
|
|
812
805
|
if (Array.isArray(data)) {
|
|
813
|
-
return data.map(
|
|
806
|
+
return data.map(item => removePropertiesDeep(item, properties, { processedObjects }));
|
|
814
807
|
}
|
|
815
808
|
|
|
816
809
|
// Process object
|