nicot 1.1.37 → 1.2.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.
package/dist/index.cjs CHANGED
@@ -40,7 +40,6 @@ var index_exports = {};
40
40
  __export(index_exports, {
41
41
  BlankCursorPaginationReturnMessageDto: () => BlankCursorPaginationReturnMessageDto,
42
42
  BoolColumn: () => BoolColumn,
43
- CreatePipe: () => CreatePipe,
44
43
  CrudBase: () => CrudBase,
45
44
  CrudService: () => CrudService,
46
45
  CursorPaginationDto: () => CursorPaginationDto,
@@ -49,7 +48,14 @@ __export(index_exports, {
49
48
  EnumColumn: () => EnumColumn,
50
49
  FloatColumn: () => FloatColumn,
51
50
  GenericCursorPaginationReturnMessageDto: () => GenericCursorPaginationReturnMessageDto,
52
- GetPipe: () => GetPipe,
51
+ GetMutator: () => GetMutator,
52
+ GetMutatorBool: () => GetMutatorBool,
53
+ GetMutatorFloat: () => GetMutatorFloat,
54
+ GetMutatorFloatSeparated: () => GetMutatorFloatSeparated,
55
+ GetMutatorInt: () => GetMutatorInt,
56
+ GetMutatorIntSeparated: () => GetMutatorIntSeparated,
57
+ GetMutatorJson: () => GetMutatorJson,
58
+ GetMutatorStringSeparated: () => GetMutatorStringSeparated,
53
59
  IdBase: () => IdBase,
54
60
  ImportDataBaseDto: () => ImportDataBaseDto,
55
61
  ImportDataDto: () => ImportDataDto,
@@ -60,10 +66,15 @@ __export(index_exports, {
60
66
  JsonColumn: () => JsonColumn,
61
67
  NotChangeable: () => NotChangeable,
62
68
  NotColumn: () => NotColumn,
69
+ NotCreatable: () => NotCreatable,
63
70
  NotInResult: () => NotInResult,
64
71
  NotQueryable: () => NotQueryable,
65
72
  NotWritable: () => NotWritable,
73
+ OmitPipe: () => OmitPipe,
74
+ OptionalDataPipe: () => OptionalDataPipe,
66
75
  PageSettingsDto: () => PageSettingsDto,
76
+ PickPipe: () => PickPipe,
77
+ QueryAnd: () => QueryAnd,
67
78
  QueryColumn: () => QueryColumn,
68
79
  QueryCondition: () => QueryCondition,
69
80
  QueryEqual: () => QueryEqual,
@@ -71,16 +82,24 @@ __export(index_exports, {
71
82
  QueryFullText: () => QueryFullText,
72
83
  QueryGreater: () => QueryGreater,
73
84
  QueryGreaterEqual: () => QueryGreaterEqual,
85
+ QueryIn: () => QueryIn,
86
+ QueryJsonbHas: () => QueryJsonbHas,
74
87
  QueryLess: () => QueryLess,
75
88
  QueryLessEqual: () => QueryLessEqual,
76
89
  QueryLike: () => QueryLike,
90
+ QueryManual: () => QueryManual,
77
91
  QueryMatchBoolean: () => QueryMatchBoolean,
78
92
  QueryMatchBooleanMySQL: () => QueryMatchBooleanMySQL,
79
93
  QueryNotEqual: () => QueryNotEqual,
94
+ QueryNotIn: () => QueryNotIn,
80
95
  QueryOperator: () => QueryOperator,
96
+ QueryOr: () => QueryOr,
81
97
  QuerySearch: () => QuerySearch,
98
+ QueryWrap: () => QueryWrap,
99
+ QueryWrapInfo: () => QueryWrapInfo,
82
100
  Relation: () => Relation,
83
101
  RelationComputed: () => RelationComputed,
102
+ RequireGetMutator: () => RequireGetMutator,
84
103
  RestfulFactory: () => RestfulFactory,
85
104
  SimpleJsonColumn: () => SimpleJsonColumn,
86
105
  StringColumn: () => StringColumn,
@@ -88,7 +107,6 @@ __export(index_exports, {
88
107
  StringJsonColumn: () => StringJsonColumn,
89
108
  TextColumn: () => TextColumn,
90
109
  TimeBase: () => TimeBase,
91
- UpdatePipe: () => UpdatePipe,
92
110
  UuidColumn: () => UuidColumn,
93
111
  applyQueryMatchBoolean: () => applyQueryMatchBoolean,
94
112
  applyQueryMatchBooleanMySQL: () => applyQueryMatchBooleanMySQL,
@@ -96,8 +114,12 @@ __export(index_exports, {
96
114
  applyQueryPropertyLike: () => applyQueryPropertyLike,
97
115
  applyQueryPropertySearch: () => applyQueryPropertySearch,
98
116
  applyQueryPropertyZeroNullable: () => applyQueryPropertyZeroNullable,
117
+ createGetMutator: () => createGetMutator,
118
+ createQueryArrayify: () => createQueryArrayify,
99
119
  createQueryCondition: () => createQueryCondition,
100
- createQueryOperator: () => createQueryOperator
120
+ createQueryOperator: () => createQueryOperator,
121
+ createQueryOperatorArrayify: () => createQueryOperatorArrayify,
122
+ createQueryWrap: () => createQueryWrap
101
123
  });
102
124
  module.exports = __toCommonJS(index_exports);
103
125
  __reExport(index_exports, require("nesties"), module.exports);
@@ -144,7 +166,6 @@ var import_swagger3 = require("@nestjs/swagger");
144
166
  var import_nesties6 = require("nesties");
145
167
 
146
168
  // src/decorators/access.ts
147
- var import_class_transformer2 = require("class-transformer");
148
169
  var import_class_validator2 = require("class-validator");
149
170
 
150
171
  // src/utility/metadata.ts
@@ -171,13 +192,14 @@ function getNotInResultFields(obj, keepEntityVersioningDates = false) {
171
192
  // src/decorators/access.ts
172
193
  var import_nesties2 = require("nesties");
173
194
  var NotWritable = () => (0, import_nesties2.MergePropertyDecorators)([
174
- (0, import_class_transformer2.Expose)({ groups: ["r"] }),
175
195
  (0, import_class_validator2.IsOptional)(),
176
- Metadata.set("notWritable", true, "notWritableFields"),
177
- Metadata.set("notChangeable", true, "notChangeableFields")
196
+ Metadata.set("notWritable", true, "notWritableFields")
197
+ ]);
198
+ var NotCreatable = () => (0, import_nesties2.MergePropertyDecorators)([
199
+ (0, import_class_validator2.IsOptional)(),
200
+ Metadata.set("notCreatable", true, "notCreatableFields")
178
201
  ]);
179
202
  var NotChangeable = () => (0, import_nesties2.MergePropertyDecorators)([
180
- (0, import_class_transformer2.Expose)({ groups: ["r", "c"] }),
181
203
  Metadata.set("notChangeable", true, "notChangeableFields")
182
204
  ]);
183
205
  var NotQueryable = () => Metadata.set("notQueryable", true, "notQueryableFields");
@@ -188,7 +210,7 @@ var import_swagger2 = require("@nestjs/swagger");
188
210
  var import_nesties3 = require("nesties");
189
211
  var import_typeorm = require("typeorm");
190
212
  var import_class_validator3 = require("class-validator");
191
- var import_class_transformer3 = require("class-transformer");
213
+ var import_class_transformer2 = require("class-transformer");
192
214
 
193
215
  // src/utility/bigint.ts
194
216
  var BigintTransformer = class {
@@ -304,21 +326,45 @@ var parseBool = (value) => {
304
326
  }
305
327
  return void 0;
306
328
  };
307
- var parseBoolObject = (obj, boolFields) => {
308
- const newObj = { ...obj };
309
- for (const field of boolFields) {
310
- newObj[field] = parseBool(newObj[field]);
329
+
330
+ // src/decorators/get-mutator.ts
331
+ var RequireGetMutator = () => Metadata.set("requireGetMutator", true, "requireGetMutatorFields");
332
+ var GetMutator = (mutator, options = {}) => Metadata.set("getMutator", { mutator, ...options }, "getMutatorFields");
333
+ var createGetMutator = (mutator, defaultOptions = {}) => (options = {}) => GetMutator(mutator, {
334
+ ...defaultOptions,
335
+ ...options,
336
+ apiPropertyExtras: {
337
+ ...defaultOptions.apiPropertyExtras || {},
338
+ ...options.apiPropertyExtras || {}
311
339
  }
312
- return newObj;
313
- };
314
- var ParseBoolObjectPipe = class {
315
- constructor(boolFields) {
316
- this.boolFields = boolFields;
340
+ });
341
+ var GetMutatorBool = createGetMutator(parseBool, {
342
+ enum: ["0", "1"],
343
+ example: "1"
344
+ });
345
+ var GetMutatorInt = createGetMutator((s) => parseInt(s, 10));
346
+ var GetMutatorFloat = createGetMutator((s) => parseFloat(s));
347
+ var GetMutatorStringSeparated = (separator = ",", options = {}) => GetMutator((s) => s.split(separator), {
348
+ example: `value1${separator}value2${separator}value3`,
349
+ ...options
350
+ });
351
+ var GetMutatorIntSeparated = (separator = ",", options = {}) => GetMutator(
352
+ (s) => s.split(separator).map((item) => parseInt(item.trim(), 10)),
353
+ {
354
+ example: `1${separator}2${separator}3`,
355
+ ...options
317
356
  }
318
- transform(obj) {
319
- return parseBoolObject(obj, this.boolFields);
357
+ );
358
+ var GetMutatorFloatSeparated = (separator = ",", options = {}) => GetMutator(
359
+ (s) => s.split(separator).map((item) => parseFloat(item.trim())),
360
+ {
361
+ example: `1.5${separator}2.5${separator}3.5`,
362
+ ...options
320
363
  }
321
- };
364
+ );
365
+ var GetMutatorJson = createGetMutator((s) => JSON.parse(s), {
366
+ example: `{"key1":"value1","key2":2,"key3":[1,2,3]}`
367
+ });
322
368
 
323
369
  // src/decorators/property.ts
324
370
  var NotRequiredButHasDefaultDec = () => Metadata.set(
@@ -476,7 +522,7 @@ var DateColumn = (options = {}) => {
476
522
  columnDecoratorOptions(options)
477
523
  ),
478
524
  (0, import_class_validator3.IsDate)(),
479
- (0, import_class_transformer3.Transform)(
525
+ (0, import_class_transformer2.Transform)(
480
526
  (v) => {
481
527
  const value = v.value;
482
528
  if (value == null || value instanceof Date) return value;
@@ -513,19 +559,19 @@ var EnumColumn = (targetEnum, options = {}) => {
513
559
  };
514
560
  var BoolColumn = (options = {}) => (0, import_nesties3.MergePropertyDecorators)([
515
561
  (0, import_typeorm.Index)(),
516
- (0, import_class_transformer3.Transform)((v) => {
562
+ (0, import_class_transformer2.Transform)((v) => {
517
563
  return parseBool(v.value);
518
564
  }),
519
565
  (0, import_typeorm.Column)("boolean", columnDecoratorOptions(options)),
520
566
  validatorDecorator(options),
521
567
  swaggerDecorator(options, { type: Boolean }),
522
- Metadata.set("boolColumn", true, "boolColumnFields")
568
+ GetMutatorBool()
523
569
  ]);
524
570
  var createJsonColumnDef = (columnType = "jsonb", typeTransformerClass = TypeTransformer) => (definition, options = {}) => {
525
571
  const cl = (0, import_nesties4.getClassFromClassOrArray)(definition);
526
572
  return (0, import_nesties3.MergePropertyDecorators)([
527
- NotQueryable(),
528
- (0, import_class_transformer3.Type)(() => cl),
573
+ RequireGetMutator(),
574
+ (0, import_class_transformer2.Type)(() => cl),
529
575
  (0, import_class_validator3.ValidateNested)(),
530
576
  (0, import_typeorm.Column)(options.columnType || columnType, {
531
577
  ...columnDecoratorOptions(options),
@@ -542,7 +588,7 @@ var StringJsonColumn = createJsonColumnDef(
542
588
  TypeTransformerString
543
589
  );
544
590
  var NotColumn = (options = {}, specials = {}) => (0, import_nesties3.MergePropertyDecorators)([
545
- (0, import_class_transformer3.Exclude)(),
591
+ (0, import_class_transformer2.Exclude)(),
546
592
  swaggerDecorator({
547
593
  required: false,
548
594
  ...options
@@ -572,89 +618,48 @@ var RelationComputed = (type) => (obj, propertyKey) => {
572
618
 
573
619
  // src/decorators/pipes.ts
574
620
  var import_common = require("@nestjs/common");
575
- var CreatePipe = () => new import_common.ValidationPipe({
576
- transform: true,
577
- transformOptions: { groups: ["c"], enableImplicitConversion: true }
578
- });
579
- var GetPipe = () => new import_common.ValidationPipe({
621
+ var OptionalDataPipe = () => new import_common.ValidationPipe({
580
622
  transform: true,
581
- transformOptions: { groups: ["r"], enableImplicitConversion: true },
623
+ transformOptions: { enableImplicitConversion: true },
582
624
  skipMissingProperties: true,
583
625
  skipNullProperties: true,
584
626
  skipUndefinedProperties: true
585
627
  });
586
- var UpdatePipe = () => new import_common.ValidationPipe({
587
- transform: true,
588
- transformOptions: { groups: ["u"], enableImplicitConversion: true },
589
- skipMissingProperties: true,
590
- skipNullProperties: true,
591
- skipUndefinedProperties: true
592
- });
593
-
594
- // src/utility/query.ts
595
- function createQueryCondition(cond) {
596
- return (obj, qb, entityName, ...fields) => {
597
- for (const field of fields) {
598
- if (obj[field] == null) {
599
- continue;
600
- }
601
- const ret = cond(obj, qb, entityName, field);
602
- if (typeof ret === "string") {
603
- qb.andWhere(ret);
604
- } else if (typeof ret === "object" && typeof ret["query"] === "string") {
605
- const _ret = ret;
606
- qb.andWhere(_ret.query, _ret.params);
607
- }
608
- }
609
- return qb;
610
- };
611
- }
612
- var applyQueryProperty = createQueryCondition(
613
- (obj, qb, entityName, field) => qb.andWhere(`${entityName}.${field} = :${field}`, { [field]: obj[field] })
614
- );
615
- var applyQueryPropertyLike = createQueryCondition(
616
- (obj, qb, entityName, field) => qb.andWhere(`${entityName}.${field} like (:${field} || '%')`, {
617
- [field]: obj[field]
618
- })
619
- );
620
- var applyQueryPropertySearch = createQueryCondition(
621
- (obj, qb, entityName, field) => qb.andWhere(`${entityName}.${field} like ('%' || :${field} || '%')`, {
622
- [field]: obj[field]
623
- })
624
- );
625
- var applyQueryPropertyZeroNullable = createQueryCondition(
626
- (obj, qb, entityName, field) => {
627
- if ([0, "0"].indexOf(obj[field]) !== -1) {
628
- qb.andWhere(`${entityName}.${field} IS NULL`);
629
- } else {
630
- qb.andWhere(`${entityName}.${field} = :${field}`, {
631
- [field]: obj[field]
632
- });
633
- }
634
- }
635
- );
636
- var applyQueryMatchBoolean = createQueryCondition(
637
- (obj, qb, entityName, field) => {
638
- const value = parseBool(obj[field]);
639
- if (value === true) {
640
- qb.andWhere(`${entityName}.${field} = TRUE`);
628
+ var PickPipe = (fields) => ({
629
+ transform(obj) {
630
+ if (obj === null || typeof obj !== "object") {
631
+ return obj;
641
632
  }
642
- if (value === false) {
643
- qb.andWhere(`${entityName}.${field} = FALSE`);
633
+ const proto = Object.getPrototypeOf(obj);
634
+ const clone = Object.create(proto);
635
+ const fieldSet = new Set(fields);
636
+ for (const key of fieldSet) {
637
+ const desc = Object.getOwnPropertyDescriptor(obj, key);
638
+ if (desc) {
639
+ Object.defineProperty(clone, key, desc);
640
+ }
644
641
  }
642
+ return clone;
645
643
  }
646
- );
647
- var applyQueryMatchBooleanMySQL = createQueryCondition(
648
- (obj, qb, entityName, field) => {
649
- const value = parseBool(obj[field]);
650
- if (value === true) {
651
- qb.andWhere(`${entityName}.${field} = 1`);
644
+ });
645
+ var OmitPipe = (fields) => ({
646
+ transform(obj) {
647
+ if (obj === null || typeof obj !== "object") {
648
+ return obj;
652
649
  }
653
- if (value === false) {
654
- qb.andWhere(`${entityName}.${field} = 0`);
650
+ const proto = Object.getPrototypeOf(obj);
651
+ const clone = Object.create(proto);
652
+ const omitSet = new Set(fields);
653
+ for (const key of Reflect.ownKeys(obj)) {
654
+ if (omitSet.has(key)) continue;
655
+ const desc = Object.getOwnPropertyDescriptor(obj, key);
656
+ if (desc) {
657
+ Object.defineProperty(clone, key, desc);
658
+ }
655
659
  }
660
+ return clone;
656
661
  }
657
- );
662
+ });
658
663
 
659
664
  // src/decorators/query.ts
660
665
  var import_nesties5 = require("nesties");
@@ -689,31 +694,118 @@ var getSubject = (qb, alias) => {
689
694
  };
690
695
 
691
696
  // src/decorators/query.ts
697
+ var import_typeorm2 = require("typeorm");
692
698
  var QueryCondition = (cond) => Metadata.set(
693
699
  "queryCondition",
694
700
  cond,
695
701
  "queryConditionFields"
696
702
  );
697
- var QueryEqual = () => QueryCondition(applyQueryProperty);
698
- var QueryLike = () => QueryCondition(applyQueryPropertyLike);
699
- var QuerySearch = () => QueryCondition(applyQueryPropertySearch);
700
- var QueryEqualZeroNullable = () => QueryCondition(applyQueryPropertyZeroNullable);
701
- var QueryMatchBoolean = () => QueryCondition(applyQueryMatchBoolean);
702
- var QueryMatchBooleanMySQL = () => QueryCondition(applyQueryMatchBooleanMySQL);
703
- var QueryOperator = (operator, field) => QueryCondition((obj, qb, entityName, key) => {
703
+ var QueryManual = () => QueryCondition((obj, qb, entityName, key) => {
704
+ });
705
+ var QueryWrapInfo = class {
706
+ constructor(obj, key, field) {
707
+ this.obj = obj;
708
+ this.key = key;
709
+ this.field = field;
710
+ this._value = obj[key];
711
+ }
712
+ get value() {
713
+ return this._value;
714
+ }
715
+ mutateValue(next) {
716
+ this._value = next;
717
+ }
718
+ };
719
+ var queryWrapCounters = /* @__PURE__ */ new WeakMap();
720
+ var getQueryVarName = (obj, key) => {
721
+ const queryCounters = queryWrapCounters.get(obj) || {};
722
+ let useField = `_qw_` + key;
723
+ if (queryCounters[key] == null) {
724
+ queryCounters[key] = 0;
725
+ } else {
726
+ useField += `__${queryCounters[key].toString(36)}`;
727
+ ++queryCounters[key];
728
+ }
729
+ queryWrapCounters.set(obj, queryCounters);
730
+ return useField;
731
+ };
732
+ var QueryWrap = (wrapper, field) => QueryCondition((obj, qb, entityName, key) => {
704
733
  if (obj[key] == null) return;
705
734
  const fieldName = field || key;
706
- const typeormField = `_query_operator_${entityName}_${fieldName}_${key}`;
707
- qb.andWhere(`${entityName}.${fieldName} ${operator} :${typeormField}`, {
708
- [typeormField]: obj[key]
709
- });
735
+ const varField = getQueryVarName(obj, key);
736
+ const entityExpr = `${entityName}.${fieldName}`;
737
+ const varExpr = `:${varField}`;
738
+ const info = new QueryWrapInfo(obj, key, fieldName);
739
+ const expr = wrapper(entityExpr, varExpr, info);
740
+ if (expr) {
741
+ qb.andWhere(expr, {
742
+ [varField]: info.value
743
+ });
744
+ }
710
745
  });
746
+ var createQueryWrap = (wrapper) => (field) => QueryWrap(wrapper, field);
747
+ var QueryLike = createQueryWrap(
748
+ (entityExpr, varExpr) => `${entityExpr} LIKE (${varExpr} || '%')`
749
+ );
750
+ var QuerySearch = createQueryWrap(
751
+ (entityExpr, varExpr) => `${entityExpr} LIKE ('%' || ${varExpr} || '%')`
752
+ );
753
+ var QueryEqualZeroNullable = createQueryWrap(
754
+ (entityExpr, varExpr, info) => [0, "0"].indexOf(info.value) !== -1 ? `${entityExpr} IS NULL` : `${entityExpr} = ${varExpr}`
755
+ );
756
+ var QueryMatchBoolean = createQueryWrap(
757
+ (entityExpr, varExpr, info) => {
758
+ const value = parseBool(info.value);
759
+ if (value === true) {
760
+ return `${entityExpr} = TRUE`;
761
+ }
762
+ if (value === false) {
763
+ return `${entityExpr} = FALSE`;
764
+ }
765
+ }
766
+ );
767
+ var QueryMatchBooleanMySQL = createQueryWrap(
768
+ (entityExpr, varExpr, info) => {
769
+ const value = parseBool(info.value);
770
+ if (value === true) {
771
+ return `${entityExpr} = 1`;
772
+ }
773
+ if (value === false) {
774
+ return `${entityExpr} = 0`;
775
+ }
776
+ }
777
+ );
778
+ var QueryOperator = (operator, field) => QueryWrap(
779
+ (entityExpr, varExpr) => `${entityExpr} ${operator} ${varExpr}`,
780
+ field
781
+ );
711
782
  var createQueryOperator = (operator) => (field) => QueryOperator(operator, field);
783
+ var QueryEqual = createQueryOperator("=");
712
784
  var QueryGreater = createQueryOperator(">");
713
785
  var QueryGreaterEqual = createQueryOperator(">=");
714
786
  var QueryLess = createQueryOperator("<");
715
787
  var QueryLessEqual = createQueryOperator("<=");
716
788
  var QueryNotEqual = createQueryOperator("!=");
789
+ var QueryJsonbHas = createQueryOperator("?");
790
+ var createQueryArrayify = (newWrapper, singleFallbackWrapper) => createQueryWrap((entityExpr, varExpr, info) => {
791
+ const value = info.value;
792
+ const items = Array.isArray(value) ? value : typeof value === "string" ? value.split(",") : [value];
793
+ if (items.length === 1 && singleFallbackWrapper) {
794
+ const singleRes = singleFallbackWrapper(entityExpr, varExpr, info);
795
+ if (singleRes) {
796
+ return singleRes;
797
+ }
798
+ }
799
+ info.mutateValue(items);
800
+ const newVarExpr = `(:...${varExpr.slice(1)})`;
801
+ return newWrapper(entityExpr, newVarExpr, info);
802
+ });
803
+ var createQueryOperatorArrayify = (operator, singleFallback) => createQueryArrayify(
804
+ (entityExpr, varExpr) => `${entityExpr} ${operator} ${varExpr}`,
805
+ typeof singleFallback === "string" ? singleFallback.length ? (entityExpr, varExpr) => `${entityExpr} ${singleFallback} ${varExpr}` : void 0 : singleFallback
806
+ );
807
+ var QueryIn = createQueryOperatorArrayify("IN", "=");
808
+ var QueryNotIn = createQueryOperatorArrayify("NOT IN", "!=");
717
809
  var QueryFullText = (options = {}) => {
718
810
  const configurationName = options.parser ? `nicot_parser_${options.parser}` : options.configuration || "english";
719
811
  const tsQueryFunction = options.tsQueryFunction || "websearch_to_tsquery";
@@ -721,7 +813,7 @@ var QueryFullText = (options = {}) => {
721
813
  QueryCondition((obj, qb, entityName, key) => {
722
814
  if (obj[key] == null) return;
723
815
  const fieldName = key;
724
- const typeormField = key;
816
+ const typeormField = getQueryVarName(obj, key);
725
817
  const tsVectorStatement = `to_tsvector('${configurationName}', "${entityName}"."${fieldName}")`;
726
818
  const tsQueryStatement = `${tsQueryFunction}('${configurationName}', :${typeormField})`;
727
819
  qb.andWhere(`${tsVectorStatement} @@ ${tsQueryStatement}`, {
@@ -747,6 +839,36 @@ var QueryFullText = (options = {}) => {
747
839
  )
748
840
  ]);
749
841
  };
842
+ var QueryAnd = (...decs) => {
843
+ const conditions = decs.map(
844
+ (dec) => reflector.getMetadataFromDecorator(dec, "queryCondition")
845
+ );
846
+ return QueryCondition(
847
+ (obj, qb, entityName, key) => conditions.forEach((cond) => cond(obj, qb, entityName, key))
848
+ );
849
+ };
850
+ var QueryOr = (...decs) => {
851
+ const conditions = decs.map(
852
+ (dec) => reflector.getMetadataFromDecorator(dec, "queryCondition")
853
+ );
854
+ return QueryCondition((obj, qb, entityName, key) => {
855
+ if (!conditions.length) {
856
+ return;
857
+ }
858
+ qb.andWhere(
859
+ new import_typeorm2.Brackets((orQb) => {
860
+ const innerBrackets = conditions.map(
861
+ (cond) => new import_typeorm2.Brackets((andQb) => {
862
+ cond(obj, andQb, entityName, key);
863
+ })
864
+ );
865
+ const [first, ...rest] = innerBrackets;
866
+ orQb.where(first);
867
+ rest.forEach((bracket) => orQb.orWhere(bracket));
868
+ })
869
+ );
870
+ });
871
+ };
750
872
 
751
873
  // src/dto/cursor-pagination.ts
752
874
  var CursorPaginationDto = class {
@@ -819,10 +941,10 @@ function CursorPaginationReturnMessageDto(type) {
819
941
  }
820
942
 
821
943
  // src/crud-base.ts
822
- var import_typeorm6 = require("typeorm");
944
+ var import_typeorm7 = require("typeorm");
823
945
 
824
946
  // src/bases/time-base.ts
825
- var import_typeorm2 = require("typeorm");
947
+ var import_typeorm3 = require("typeorm");
826
948
 
827
949
  // src/bases/page-settings.ts
828
950
  var import_class_validator5 = require("class-validator");
@@ -899,26 +1021,26 @@ var TimeBase = class extends PageSettingsDto {
899
1021
  }
900
1022
  };
901
1023
  __decorateClass([
902
- (0, import_typeorm2.CreateDateColumn)({ select: false }),
1024
+ (0, import_typeorm3.CreateDateColumn)({ select: false }),
903
1025
  NotColumn(),
904
1026
  NotInResult({ entityVersioningDate: true }),
905
1027
  Reflect.metadata("design:type", Date)
906
1028
  ], TimeBase.prototype, "createTime", 2);
907
1029
  __decorateClass([
908
- (0, import_typeorm2.UpdateDateColumn)({ select: false }),
1030
+ (0, import_typeorm3.UpdateDateColumn)({ select: false }),
909
1031
  NotColumn(),
910
1032
  NotInResult({ entityVersioningDate: true }),
911
1033
  Reflect.metadata("design:type", Date)
912
1034
  ], TimeBase.prototype, "updateTime", 2);
913
1035
  __decorateClass([
914
- (0, import_typeorm2.DeleteDateColumn)({ select: false }),
1036
+ (0, import_typeorm3.DeleteDateColumn)({ select: false }),
915
1037
  NotColumn(),
916
1038
  NotInResult({ entityVersioningDate: true }),
917
1039
  Reflect.metadata("design:type", Date)
918
1040
  ], TimeBase.prototype, "deleteTime", 2);
919
1041
 
920
1042
  // src/bases/id-base.ts
921
- var import_typeorm3 = require("typeorm");
1043
+ var import_typeorm4 = require("typeorm");
922
1044
  var import_class_validator6 = require("class-validator");
923
1045
  var import_nesties7 = require("nesties");
924
1046
  function IdBase(idOptions = {}) {
@@ -938,7 +1060,7 @@ function IdBase(idOptions = {}) {
938
1060
  columnExtras: { nullable: false, primary: true }
939
1061
  }),
940
1062
  Reflect.metadata("design:type", Number),
941
- (0, import_typeorm3.Generated)("increment"),
1063
+ (0, import_typeorm4.Generated)("increment"),
942
1064
  QueryEqual()
943
1065
  ]);
944
1066
  dec(cl.prototype, "id");
@@ -979,10 +1101,10 @@ var import_lodash3 = __toESM(require("lodash"));
979
1101
  var import_nesties8 = require("nesties");
980
1102
 
981
1103
  // src/utility/get-typeorm-relations.ts
982
- var import_typeorm4 = require("typeorm");
1104
+ var import_typeorm5 = require("typeorm");
983
1105
  var import_lodash = __toESM(require("lodash"));
984
1106
  function getTypeormRelations(cl) {
985
- const relations = (0, import_typeorm4.getMetadataArgsStorage)().relations.filter(
1107
+ const relations = (0, import_typeorm5.getMetadataArgsStorage)().relations.filter(
986
1108
  (r) => r.target === cl
987
1109
  );
988
1110
  const typeormRelations = relations.map((relation) => {
@@ -1029,7 +1151,7 @@ function getTypeormRelations(cl) {
1029
1151
  }
1030
1152
 
1031
1153
  // src/utility/cursor-pagination-utils.ts
1032
- var import_typeorm5 = require("typeorm");
1154
+ var import_typeorm6 = require("typeorm");
1033
1155
  var import_lodash2 = __toESM(require("lodash"));
1034
1156
  var import_superjson = __toESM(require("superjson"));
1035
1157
 
@@ -1248,8 +1370,8 @@ async function getPaginatedResult(qb, entityClass, entityAliasName, take, cursor
1248
1370
  ).filter((s) => !s.includes("__never__"));
1249
1371
  if (expressionMatrix.length) {
1250
1372
  qb.andWhere(
1251
- new import_typeorm5.Brackets((sqb) => {
1252
- const levelToBrackets = (level) => new import_typeorm5.Brackets((qb2) => {
1373
+ new import_typeorm6.Brackets((sqb) => {
1374
+ const levelToBrackets = (level) => new import_typeorm6.Brackets((qb2) => {
1253
1375
  level.forEach((expr, i) => {
1254
1376
  if (i === 0) {
1255
1377
  qb2.where(expr);
@@ -1366,11 +1488,14 @@ var CrudBase = class {
1366
1488
  cl,
1367
1489
  this.crudOptions.keepEntityVersioningDates
1368
1490
  );
1491
+ if (cl === this.entityClass && this.crudOptions.outputFieldsToOmit) {
1492
+ fields.push(...this.crudOptions.outputFieldsToOmit);
1493
+ }
1369
1494
  for (const field of fields) {
1370
1495
  delete o[field];
1371
1496
  }
1372
1497
  visited.add(o);
1373
- for (const relation of this._typeormRelations) {
1498
+ for (const relation of getTypeormRelations(cl)) {
1374
1499
  const propertyName = relation.propertyName;
1375
1500
  if (o[propertyName]) {
1376
1501
  if (Array.isArray(o[propertyName])) {
@@ -1411,7 +1536,7 @@ var CrudBase = class {
1411
1536
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
1412
1537
  // @ts-ignore
1413
1538
  where: {
1414
- id: (0, import_typeorm6.In)(chunk)
1539
+ id: (0, import_typeorm7.In)(chunk)
1415
1540
  },
1416
1541
  select: this.crudOptions.createOrUpdate ? void 0 : ["id", "deleteTime"],
1417
1542
  withDeleted: true
@@ -1854,8 +1979,8 @@ function CrudService(entityClass, crudOptions = {}) {
1854
1979
  // src/restful.ts
1855
1980
  var import_common3 = require("@nestjs/common");
1856
1981
  var import_nesties10 = require("nesties");
1857
- var import_swagger7 = require("@nestjs/swagger");
1858
- var import_lodash4 = __toESM(require("lodash"));
1982
+ var import_swagger6 = require("@nestjs/swagger");
1983
+ var import_lodash5 = __toESM(require("lodash"));
1859
1984
  var import_nesties11 = require("nesties");
1860
1985
 
1861
1986
  // src/bases/base-restful-controller.ts
@@ -1871,175 +1996,249 @@ var BaseRestfulController = class {
1871
1996
  constructor(serviceOrRepo, _options = {}) {
1872
1997
  this._options = _options;
1873
1998
  if (serviceOrRepo instanceof CrudBase) {
1874
- this.service = serviceOrRepo;
1999
+ this._service = serviceOrRepo;
1875
2000
  } else {
1876
2001
  const crudServiceClass = CrudService(this._options.entityClass, {
1877
2002
  relations: this._options.relations
1878
2003
  });
1879
- this.service = new crudServiceClass(serviceOrRepo);
2004
+ this._service = new crudServiceClass(serviceOrRepo);
1880
2005
  }
1881
2006
  }
1882
2007
  findOne(id) {
1883
- return this.service.findOne(id);
2008
+ return this._service.findOne(id);
1884
2009
  }
1885
2010
  findAll(dto) {
1886
2011
  if (this._options.paginateType === "cursor") {
1887
- return this.service.findAllCursorPaginated(dto);
2012
+ return this._service.findAllCursorPaginated(dto);
1888
2013
  }
1889
2014
  if (this._options.paginateType === "offset") {
1890
- return this.service.findAll(dto);
2015
+ return this._service.findAll(dto);
1891
2016
  }
1892
2017
  dto["recordsPerPage"] ??= 99999;
1893
- return this.service.findAll(dto);
2018
+ return this._service.findAll(dto);
1894
2019
  }
1895
2020
  create(dto) {
1896
- return this.service.create(dto);
2021
+ return this._service.create(dto);
1897
2022
  }
1898
2023
  update(id, dto) {
1899
- return this.service.update(id, dto);
2024
+ return this._service.update(id, dto);
1900
2025
  }
1901
2026
  delete(id) {
1902
- return this.service.delete(id);
2027
+ return this._service.delete(id);
1903
2028
  }
1904
2029
  import(data) {
1905
- return this.service.importEntities(data.data);
2030
+ return this._service.importEntities(data.data);
1906
2031
  }
1907
2032
  };
1908
2033
 
1909
2034
  // src/utility/omit-type-exclude.ts
1910
2035
  var import_swagger5 = require("@nestjs/swagger");
1911
- var import_class_transformer4 = require("class-transformer");
2036
+ var import_class_transformer3 = require("class-transformer");
1912
2037
  var OmitTypeExclude = (cl, keys) => {
1913
2038
  const omitted = (0, import_swagger5.OmitType)(cl, keys);
1914
2039
  for (const key of keys) {
1915
- (0, import_class_transformer4.Exclude)()(omitted.prototype, key);
2040
+ (0, import_class_transformer3.Exclude)()(omitted.prototype, key);
1916
2041
  }
1917
2042
  return omitted;
1918
2043
  };
2044
+ var PickTypeExpose = (cl, keys) => {
2045
+ const picked = (0, import_swagger5.OmitType)(
2046
+ cl,
2047
+ Object.keys(cl.prototype).filter((k) => !keys.includes(k))
2048
+ );
2049
+ for (const key of keys) {
2050
+ (0, import_class_transformer3.Expose)()(picked.prototype, key);
2051
+ }
2052
+ return picked;
2053
+ };
1919
2054
 
1920
2055
  // src/utility/patch-column-in-get.ts
1921
- var import_swagger6 = require("@nestjs/swagger");
1922
2056
  var import_nesties9 = require("nesties");
2057
+ var import_lodash4 = __toESM(require("lodash"));
2058
+ var import_constants = require("@nestjs/swagger/dist/constants");
1923
2059
  var PatchColumnsInGet = (cl, originalCl = cl, fieldsToOmit = []) => {
1924
2060
  const omit2 = new Set(fieldsToOmit);
1925
- const boolFields = getSpecificFields(originalCl || cl, "boolColumn").filter(
2061
+ const useCl = originalCl || cl;
2062
+ const mutateFields = getSpecificFields(useCl, "getMutator").filter(
1926
2063
  (f) => !omit2.has(f)
1927
2064
  );
1928
- for (const field of boolFields) {
2065
+ for (const field of mutateFields) {
1929
2066
  const originalApiProp = (0, import_nesties9.getApiProperty)(originalCl, field);
1930
- (0, import_swagger6.ApiProperty)({
1931
- ...originalApiProp,
1932
- type: String,
1933
- required: false,
1934
- enum: ["0", "1"],
1935
- default: originalApiProp?.default === true ? "1" : originalApiProp?.default === false ? "0" : void 0
1936
- })(cl.prototype, field);
2067
+ const info = reflector.get("getMutator", useCl, field);
2068
+ Reflect.defineMetadata(
2069
+ import_constants.DECORATORS.API_MODEL_PROPERTIES,
2070
+ {
2071
+ ...originalApiProp,
2072
+ type: String,
2073
+ required: false,
2074
+ example: info.example ?? void 0,
2075
+ enum: info.enum ?? void 0,
2076
+ default: void 0,
2077
+ ...info.apiPropertyExtras || {}
2078
+ },
2079
+ cl.prototype,
2080
+ field
2081
+ );
2082
+ }
2083
+ const queryableFieldsRemaining = import_lodash4.default.difference(
2084
+ getSpecificFields(useCl, "queryCondition"),
2085
+ mutateFields
2086
+ );
2087
+ for (const field of queryableFieldsRemaining) {
2088
+ const originalApiProp = (0, import_nesties9.getApiProperty)(originalCl, field);
2089
+ Reflect.defineMetadata(
2090
+ import_constants.DECORATORS.API_MODEL_PROPERTIES,
2091
+ {
2092
+ ...originalApiProp,
2093
+ default: void 0
2094
+ // we remove every default value in get
2095
+ },
2096
+ cl.prototype,
2097
+ field
2098
+ );
1937
2099
  }
1938
2100
  return cl;
1939
2101
  };
1940
2102
 
2103
+ // src/utility/memorize.ts
2104
+ var Memorize = () => {
2105
+ const cache = /* @__PURE__ */ new WeakMap();
2106
+ return function(_target, propertyKey, descriptor) {
2107
+ const getter = descriptor.get;
2108
+ descriptor.get = function() {
2109
+ if (cache.has(this)) return cache.get(this);
2110
+ const value = getter.call(this);
2111
+ cache.set(this, value);
2112
+ return value;
2113
+ };
2114
+ };
2115
+ };
2116
+
2117
+ // src/utility/mutate-pipe.ts
2118
+ var MutatorPipe = class {
2119
+ constructor(entityClass) {
2120
+ this.entityClass = entityClass;
2121
+ this.mutatorFields = getSpecificFields(this.entityClass, "getMutator");
2122
+ }
2123
+ transform(obj) {
2124
+ if (obj === null || typeof obj !== "object") {
2125
+ return obj;
2126
+ }
2127
+ const newObj = { ...obj };
2128
+ for (const field of this.mutatorFields) {
2129
+ const v = newObj[field];
2130
+ if (v == null) {
2131
+ continue;
2132
+ }
2133
+ const mutator = reflector.get("getMutator", this.entityClass, field);
2134
+ newObj[field] = mutator.mutator(v);
2135
+ }
2136
+ return newObj;
2137
+ }
2138
+ };
2139
+
1941
2140
  // src/restful.ts
1942
2141
  var getCurrentLevelRelations = (relations) => relations.filter((r) => !r.includes("."));
1943
2142
  var getNextLevelRelations = (relations, enteringField) => relations.filter((r) => r.includes(".") && r.startsWith(`${enteringField}.`)).map((r) => r.split(".").slice(1).join("."));
1944
- var RestfulFactory = class _RestfulFactory {
2143
+ var _RestfulFactory = class _RestfulFactory {
1945
2144
  constructor(entityClass, options = {}, __resolveVisited = /* @__PURE__ */ new Map()) {
1946
2145
  this.entityClass = entityClass;
1947
2146
  this.options = options;
1948
2147
  this.__resolveVisited = __resolveVisited;
1949
- this.fieldsToOmit = import_lodash4.default.uniq([
2148
+ if (options.relations) {
2149
+ filterRelations(entityClass, options.relations);
2150
+ }
2151
+ }
2152
+ getEntityClassName() {
2153
+ return this.options.entityClassName || this.entityClass.name;
2154
+ }
2155
+ get fieldsToOmit() {
2156
+ return import_lodash5.default.uniq([
1950
2157
  ...getSpecificFields(this.entityClass, "notColumn"),
1951
2158
  ...this.options.fieldsToOmit || [],
1952
2159
  ...getTypeormRelations(this.entityClass).map(
1953
2160
  (r) => r.propertyName
1954
2161
  )
1955
2162
  ]);
1956
- this.basicInputDto = OmitTypeExclude(
1957
- this.entityClass,
1958
- this.fieldsToOmit
1959
- );
1960
- this.createDto = (0, import_nesties11.RenameClass)(
1961
- OmitTypeExclude(
1962
- this.basicInputDto,
1963
- getSpecificFields(this.entityClass, "notWritable")
1964
- ),
2163
+ }
2164
+ get fieldsInCreateToOmit() {
2165
+ return import_lodash5.default.uniq([
2166
+ ...this.fieldsToOmit,
2167
+ ...this.options.writeFieldsToOmit || [],
2168
+ ...this.options.createFieldsToOmit || [],
2169
+ ...getSpecificFields(this.entityClass, "notWritable"),
2170
+ ...getSpecificFields(this.entityClass, "notCreatable")
2171
+ ]);
2172
+ }
2173
+ get createDto() {
2174
+ return (0, import_nesties11.RenameClass)(
2175
+ OmitTypeExclude(this.entityClass, this.fieldsInCreateToOmit),
1965
2176
  `Create${this.entityClass.name}Dto`
1966
2177
  );
1967
- this.importDto = ImportDataDto(this.createDto);
1968
- this.fieldsInGetToOmit = import_lodash4.default.uniq([
2178
+ }
2179
+ get fieldsInUpdateToOmit() {
2180
+ return import_lodash5.default.uniq([
1969
2181
  ...this.fieldsToOmit,
1970
- ...getSpecificFields(this.entityClass, "notQueryable")
2182
+ ...this.options.writeFieldsToOmit || [],
2183
+ ...this.options.updateFieldsToOmit || [],
2184
+ ...getSpecificFields(this.entityClass, "notWritable"),
2185
+ ...getSpecificFields(this.entityClass, "notChangeable")
1971
2186
  ]);
1972
- this.findAllDto = (0, import_nesties11.RenameClass)(
1973
- (0, import_swagger7.PartialType)(
1974
- PatchColumnsInGet(
1975
- OmitTypeExclude(
1976
- this.entityClass instanceof PageSettingsDto ? this.entityClass : (0, import_swagger7.IntersectionType)(
1977
- this.entityClass,
1978
- PageSettingsDto
1979
- ),
1980
- this.fieldsInGetToOmit
2187
+ }
2188
+ get updateDto() {
2189
+ return (0, import_nesties11.RenameClass)(
2190
+ (0, import_swagger6.PartialType)(OmitTypeExclude(this.entityClass, this.fieldsInUpdateToOmit)),
2191
+ `Update${this.entityClass.name}Dto`
2192
+ );
2193
+ }
2194
+ get importDto() {
2195
+ return ImportDataDto(this.createDto);
2196
+ }
2197
+ get fieldsInGetToOmit() {
2198
+ return import_lodash5.default.uniq([
2199
+ ...this.fieldsToOmit,
2200
+ ...getSpecificFields(this.entityClass, "notQueryable"),
2201
+ ...import_lodash5.default.difference(
2202
+ getSpecificFields(this.entityClass, "requireGetMutator"),
2203
+ getSpecificFields(this.entityClass, "getMutator")
2204
+ )
2205
+ ]);
2206
+ }
2207
+ get queryableFields() {
2208
+ return import_lodash5.default.difference(
2209
+ getSpecificFields(this.entityClass, "queryCondition"),
2210
+ this.fieldsInGetToOmit
2211
+ );
2212
+ }
2213
+ get findAllDto() {
2214
+ let cl = (0, import_swagger6.PartialType)(
2215
+ PatchColumnsInGet(
2216
+ OmitTypeExclude(
2217
+ this.entityClass instanceof PageSettingsDto ? this.entityClass : (0, import_swagger6.IntersectionType)(
2218
+ this.entityClass,
2219
+ PageSettingsDto
1981
2220
  ),
1982
- this.entityClass,
1983
2221
  this.fieldsInGetToOmit
1984
- )
1985
- ),
1986
- `Find${this.entityClass.name}Dto`
2222
+ ),
2223
+ this.entityClass,
2224
+ this.fieldsInGetToOmit
2225
+ )
1987
2226
  );
1988
- this.findAllCursorPaginatedDto = (0, import_nesties11.RenameClass)(
1989
- (0, import_swagger7.IntersectionType)(
2227
+ if (this.options.skipNonQueryableFields) {
2228
+ cl = PickTypeExpose(cl, this.queryableFields);
2229
+ }
2230
+ return (0, import_nesties11.RenameClass)(cl, `Find${this.entityClass.name}Dto`);
2231
+ }
2232
+ get findAllCursorPaginatedDto() {
2233
+ return (0, import_nesties11.RenameClass)(
2234
+ (0, import_swagger6.IntersectionType)(
1990
2235
  OmitTypeExclude(this.findAllDto, ["pageCount"]),
1991
2236
  CursorPaginationDto
1992
2237
  ),
1993
2238
  `Find${this.entityClass.name}CursorPaginatedDto`
1994
2239
  );
1995
- this.updateDto = (0, import_nesties11.RenameClass)(
1996
- (0, import_swagger7.PartialType)(
1997
- OmitTypeExclude(
1998
- this.createDto,
1999
- getSpecificFields(this.entityClass, "notChangeable")
2000
- )
2001
- ),
2002
- `Update${this.entityClass.name}Dto`
2003
- );
2004
- this.entityResultDto = this.resolveEntityResultDto();
2005
- this.entityCreateResultDto = (0, import_nesties11.RenameClass)(
2006
- (0, import_swagger7.OmitType)(this.entityResultDto, [
2007
- ...getTypeormRelations(this.entityClass).map(
2008
- (r) => r.propertyName
2009
- ),
2010
- ...getSpecificFields(
2011
- this.entityClass,
2012
- "notColumn",
2013
- (m) => !m.keepInCreate
2014
- )
2015
- ]),
2016
- `${this.getEntityClassName()}CreateResultDto`
2017
- );
2018
- this.entityReturnMessageDto = (0, import_nesties10.ReturnMessageDto)(this.entityResultDto);
2019
- this.entityCreateReturnMessageDto = (0, import_nesties10.ReturnMessageDto)(
2020
- this.entityCreateResultDto
2021
- );
2022
- this.entityArrayReturnMessageDto = (0, import_nesties10.PaginatedReturnMessageDto)(
2023
- this.entityResultDto
2024
- );
2025
- this.entityCursorPaginationReturnMessageDto = CursorPaginationReturnMessageDto(this.entityResultDto);
2026
- this.importReturnMessageDto = (0, import_nesties10.ReturnMessageDto)([
2027
- ImportEntryDto(this.entityCreateResultDto)
2028
- ]);
2029
- // eslint-disable-next-line @typescript-eslint/ban-types
2030
- this.idType = Reflect.getMetadata(
2031
- "design:type",
2032
- this.entityClass.prototype,
2033
- "id"
2034
- );
2035
- if (options.relations) {
2036
- filterRelations(entityClass, options.relations);
2037
- }
2038
- }
2039
- getEntityClassName() {
2040
- return this.options.entityClassName || this.entityClass.name;
2041
2240
  }
2042
- resolveEntityResultDto() {
2241
+ get entityResultDto() {
2043
2242
  const relations = getTypeormRelations(this.entityClass);
2044
2243
  const currentLevelRelations = this.options.relations && new Set(
2045
2244
  getCurrentLevelRelations(
@@ -2054,7 +2253,7 @@ var RestfulFactory = class _RestfulFactory {
2054
2253
  ...this.options.outputFieldsToOmit || [],
2055
2254
  ...this.options.relations ? relations.map((r) => r.propertyName).filter((r) => !currentLevelRelations.has(r)) : []
2056
2255
  ]);
2057
- const resultDto = (0, import_swagger7.OmitType)(this.entityClass, [...outputFieldsToOmit]);
2256
+ const resultDto = (0, import_swagger6.OmitType)(this.entityClass, [...outputFieldsToOmit]);
2058
2257
  for (const relation of relations) {
2059
2258
  if (outputFieldsToOmit.has(relation.propertyName)) continue;
2060
2259
  if (nonTransformableTypes.has(relation.propertyClass)) continue;
@@ -2063,7 +2262,7 @@ var RestfulFactory = class _RestfulFactory {
2063
2262
  this.entityClass,
2064
2263
  relation.propertyName
2065
2264
  );
2066
- (0, import_swagger7.ApiProperty)({
2265
+ (0, import_swagger6.ApiProperty)({
2067
2266
  ...oldApiProperty,
2068
2267
  required: false,
2069
2268
  type: () => relation.isArray ? [useClass[0]] : useClass[0]
@@ -2079,7 +2278,7 @@ var RestfulFactory = class _RestfulFactory {
2079
2278
  const relationFactory = new _RestfulFactory(
2080
2279
  relation.propertyClass,
2081
2280
  {
2082
- entityClassName: `${this.getEntityClassName()}${this.options.relations ? (0, import_lodash4.upperFirst)(relation.propertyName) : relation.propertyClass.name}`,
2281
+ entityClassName: `${this.getEntityClassName()}${this.options.relations ? (0, import_lodash5.upperFirst)(relation.propertyName) : relation.propertyClass.name}`,
2083
2282
  relations: this.options.relations && getNextLevelRelations(
2084
2283
  this.options.relations.map(extractRelationName),
2085
2284
  relation.propertyName
@@ -2103,7 +2302,7 @@ var RestfulFactory = class _RestfulFactory {
2103
2302
  ).filter((f) => !outputFieldsToOmit.has(f));
2104
2303
  for (const field of notRequiredButHasDefaultFields) {
2105
2304
  const oldApiProperty = (0, import_nesties10.getApiProperty)(resultDto, field);
2106
- (0, import_swagger7.ApiProperty)({
2305
+ (0, import_swagger6.ApiProperty)({
2107
2306
  ...oldApiProperty,
2108
2307
  required: true
2109
2308
  })(resultDto.prototype, field);
@@ -2118,6 +2317,40 @@ var RestfulFactory = class _RestfulFactory {
2118
2317
  }
2119
2318
  return res;
2120
2319
  }
2320
+ get entityCreateResultDto() {
2321
+ return (0, import_nesties11.RenameClass)(
2322
+ (0, import_swagger6.OmitType)(this.entityResultDto, [
2323
+ ...getTypeormRelations(this.entityClass).map(
2324
+ (r) => r.propertyName
2325
+ ),
2326
+ ...getSpecificFields(
2327
+ this.entityClass,
2328
+ "notColumn",
2329
+ (m) => !m.keepInCreate
2330
+ )
2331
+ ]),
2332
+ `${this.getEntityClassName()}CreateResultDto`
2333
+ );
2334
+ }
2335
+ get entityReturnMessageDto() {
2336
+ return (0, import_nesties10.ReturnMessageDto)(this.entityResultDto);
2337
+ }
2338
+ get entityCreateReturnMessageDto() {
2339
+ return (0, import_nesties10.ReturnMessageDto)(this.entityCreateResultDto);
2340
+ }
2341
+ get entityArrayReturnMessageDto() {
2342
+ return (0, import_nesties10.PaginatedReturnMessageDto)(this.entityResultDto);
2343
+ }
2344
+ get entityCursorPaginationReturnMessageDto() {
2345
+ return CursorPaginationReturnMessageDto(this.entityResultDto);
2346
+ }
2347
+ get importReturnMessageDto() {
2348
+ return (0, import_nesties10.ReturnMessageDto)([ImportEntryDto(this.entityCreateResultDto)]);
2349
+ }
2350
+ // eslint-disable-next-line @typescript-eslint/ban-types
2351
+ get idType() {
2352
+ return Reflect.getMetadata("design:type", this.entityClass.prototype, "id");
2353
+ }
2121
2354
  usePrefix(methodDec, path) {
2122
2355
  if (path) {
2123
2356
  if (this.options.prefix) {
@@ -2137,31 +2370,31 @@ var RestfulFactory = class _RestfulFactory {
2137
2370
  return (0, import_nesties10.MergeMethodDecorators)([
2138
2371
  this.usePrefix(import_common3.Post),
2139
2372
  (0, import_common3.HttpCode)(200),
2140
- (0, import_swagger7.ApiOperation)({
2373
+ (0, import_swagger6.ApiOperation)({
2141
2374
  summary: `Create a new ${this.getEntityClassName()}`,
2142
2375
  ...extras
2143
2376
  }),
2144
- (0, import_swagger7.ApiBody)({ type: this.createDto }),
2145
- (0, import_swagger7.ApiOkResponse)({ type: this.entityCreateReturnMessageDto }),
2146
- (0, import_swagger7.ApiBadRequestResponse)({
2377
+ (0, import_swagger6.ApiBody)({ type: this.createDto }),
2378
+ (0, import_swagger6.ApiOkResponse)({ type: this.entityCreateReturnMessageDto }),
2379
+ (0, import_swagger6.ApiBadRequestResponse)({
2147
2380
  type: import_nesties10.BlankReturnMessageDto,
2148
2381
  description: `The ${this.getEntityClassName()} is not valid`
2149
2382
  })
2150
2383
  ]);
2151
2384
  }
2152
2385
  createParam() {
2153
- return (0, import_common3.Body)(CreatePipe());
2386
+ return (0, import_common3.Body)((0, import_nesties10.DataPipe)(), OmitPipe(this.fieldsInCreateToOmit));
2154
2387
  }
2155
2388
  findOne(extras = {}) {
2156
2389
  return (0, import_nesties10.MergeMethodDecorators)([
2157
2390
  this.usePrefix(import_common3.Get, ":id"),
2158
- (0, import_swagger7.ApiOperation)({
2391
+ (0, import_swagger6.ApiOperation)({
2159
2392
  summary: `Find a ${this.getEntityClassName()} by id`,
2160
2393
  ...extras
2161
2394
  }),
2162
- (0, import_swagger7.ApiParam)({ name: "id", type: this.idType, required: true }),
2163
- (0, import_swagger7.ApiOkResponse)({ type: this.entityReturnMessageDto }),
2164
- (0, import_swagger7.ApiNotFoundResponse)({
2395
+ (0, import_swagger6.ApiParam)({ name: "id", type: this.idType, required: true }),
2396
+ (0, import_swagger6.ApiOkResponse)({ type: this.entityReturnMessageDto }),
2397
+ (0, import_swagger6.ApiNotFoundResponse)({
2165
2398
  type: import_nesties10.BlankReturnMessageDto,
2166
2399
  description: `The ${this.getEntityClassName()} with the given id was not found`
2167
2400
  })
@@ -2177,78 +2410,82 @@ var RestfulFactory = class _RestfulFactory {
2177
2410
  findAll(extras = {}) {
2178
2411
  return (0, import_nesties10.MergeMethodDecorators)([
2179
2412
  this.usePrefix(import_common3.Get),
2180
- (0, import_swagger7.ApiOperation)({
2413
+ (0, import_swagger6.ApiOperation)({
2181
2414
  summary: `Find all ${this.getEntityClassName()}`,
2182
2415
  ...extras
2183
2416
  }),
2184
- (0, import_swagger7.ApiOkResponse)({ type: this.entityArrayReturnMessageDto })
2417
+ (0, import_swagger6.ApiOkResponse)({ type: this.entityArrayReturnMessageDto })
2185
2418
  ]);
2186
2419
  }
2187
2420
  findAllCursorPaginated(extras = {}) {
2188
2421
  return (0, import_nesties10.MergeMethodDecorators)([
2189
2422
  this.usePrefix(import_common3.Get),
2190
- (0, import_swagger7.ApiOperation)({
2423
+ (0, import_swagger6.ApiOperation)({
2191
2424
  summary: `Find all ${this.getEntityClassName()}`,
2192
2425
  ...extras
2193
2426
  }),
2194
- (0, import_swagger7.ApiOkResponse)({ type: this.entityCursorPaginationReturnMessageDto })
2427
+ (0, import_swagger6.ApiOkResponse)({ type: this.entityCursorPaginationReturnMessageDto })
2195
2428
  ]);
2196
2429
  }
2197
- getBoolColumns() {
2198
- const boolColumns = getSpecificFields(this.entityClass, "boolColumn");
2199
- return import_lodash4.default.difference(boolColumns, this.fieldsInGetToOmit);
2430
+ getMutatorColumns() {
2431
+ const mutatorColumns = getSpecificFields(this.entityClass, "getMutator");
2432
+ return import_lodash5.default.difference(mutatorColumns, this.fieldsInGetToOmit);
2200
2433
  }
2201
2434
  findAllParam() {
2202
- const boolColumns = this.getBoolColumns();
2203
- if (boolColumns.length) {
2204
- return (0, import_common3.Query)(new ParseBoolObjectPipe(boolColumns), GetPipe());
2435
+ const mutatorColumns = this.getMutatorColumns();
2436
+ const restPipes = [OptionalDataPipe(), OmitPipe(this.fieldsInGetToOmit)];
2437
+ if (this.options.skipNonQueryableFields) {
2438
+ restPipes.push(PickPipe(this.queryableFields));
2439
+ }
2440
+ if (mutatorColumns.length) {
2441
+ return (0, import_common3.Query)(new MutatorPipe(this.entityClass), ...restPipes);
2205
2442
  } else {
2206
- return (0, import_common3.Query)(GetPipe());
2443
+ return (0, import_common3.Query)(...restPipes);
2207
2444
  }
2208
2445
  }
2209
2446
  update(extras = {}) {
2210
2447
  return (0, import_nesties10.MergeMethodDecorators)([
2211
2448
  this.usePrefix(import_common3.Patch, ":id"),
2212
2449
  (0, import_common3.HttpCode)(200),
2213
- (0, import_swagger7.ApiOperation)({
2450
+ (0, import_swagger6.ApiOperation)({
2214
2451
  summary: `Update a ${this.getEntityClassName()} by id`,
2215
2452
  ...extras
2216
2453
  }),
2217
- (0, import_swagger7.ApiParam)({ name: "id", type: this.idType, required: true }),
2218
- (0, import_swagger7.ApiBody)({ type: this.updateDto }),
2219
- (0, import_swagger7.ApiOkResponse)({ type: import_nesties10.BlankReturnMessageDto }),
2220
- (0, import_swagger7.ApiNotFoundResponse)({
2454
+ (0, import_swagger6.ApiParam)({ name: "id", type: this.idType, required: true }),
2455
+ (0, import_swagger6.ApiBody)({ type: this.updateDto }),
2456
+ (0, import_swagger6.ApiOkResponse)({ type: import_nesties10.BlankReturnMessageDto }),
2457
+ (0, import_swagger6.ApiNotFoundResponse)({
2221
2458
  type: import_nesties10.BlankReturnMessageDto,
2222
2459
  description: `The ${this.getEntityClassName()} with the given id was not found`
2223
2460
  }),
2224
- (0, import_swagger7.ApiBadRequestResponse)({
2461
+ (0, import_swagger6.ApiBadRequestResponse)({
2225
2462
  type: import_nesties10.BlankReturnMessageDto,
2226
2463
  description: `The ${this.getEntityClassName()} is not valid`
2227
2464
  }),
2228
- (0, import_swagger7.ApiInternalServerErrorResponse)({
2465
+ (0, import_swagger6.ApiInternalServerErrorResponse)({
2229
2466
  type: import_nesties10.BlankReturnMessageDto,
2230
2467
  description: "Internal error"
2231
2468
  })
2232
2469
  ]);
2233
2470
  }
2234
2471
  updateParam() {
2235
- return (0, import_common3.Body)(UpdatePipe());
2472
+ return (0, import_common3.Body)(OptionalDataPipe(), OmitPipe(this.fieldsInUpdateToOmit));
2236
2473
  }
2237
2474
  delete(extras = {}) {
2238
2475
  return (0, import_nesties10.MergeMethodDecorators)([
2239
2476
  this.usePrefix(import_common3.Delete, ":id"),
2240
2477
  (0, import_common3.HttpCode)(200),
2241
- (0, import_swagger7.ApiOperation)({
2478
+ (0, import_swagger6.ApiOperation)({
2242
2479
  summary: `Delete a ${this.getEntityClassName()} by id`,
2243
2480
  ...extras
2244
2481
  }),
2245
- (0, import_swagger7.ApiParam)({ name: "id", type: this.idType, required: true }),
2246
- (0, import_swagger7.ApiOkResponse)({ type: import_nesties10.BlankReturnMessageDto }),
2247
- (0, import_swagger7.ApiNotFoundResponse)({
2482
+ (0, import_swagger6.ApiParam)({ name: "id", type: this.idType, required: true }),
2483
+ (0, import_swagger6.ApiOkResponse)({ type: import_nesties10.BlankReturnMessageDto }),
2484
+ (0, import_swagger6.ApiNotFoundResponse)({
2248
2485
  type: import_nesties10.BlankReturnMessageDto,
2249
2486
  description: `The ${this.getEntityClassName()} with the given id was not found`
2250
2487
  }),
2251
- (0, import_swagger7.ApiInternalServerErrorResponse)({
2488
+ (0, import_swagger6.ApiInternalServerErrorResponse)({
2252
2489
  type: import_nesties10.BlankReturnMessageDto,
2253
2490
  description: "Internal error"
2254
2491
  })
@@ -2258,13 +2495,13 @@ var RestfulFactory = class _RestfulFactory {
2258
2495
  return (0, import_nesties10.MergeMethodDecorators)([
2259
2496
  (0, import_common3.Post)("import"),
2260
2497
  (0, import_common3.HttpCode)(200),
2261
- (0, import_swagger7.ApiOperation)({
2498
+ (0, import_swagger6.ApiOperation)({
2262
2499
  summary: `Import ${this.getEntityClassName()}`,
2263
2500
  ...extras
2264
2501
  }),
2265
- (0, import_swagger7.ApiBody)({ type: this.importDto }),
2266
- (0, import_swagger7.ApiOkResponse)({ type: this.importReturnMessageDto }),
2267
- (0, import_swagger7.ApiInternalServerErrorResponse)({
2502
+ (0, import_swagger6.ApiBody)({ type: this.importDto }),
2503
+ (0, import_swagger6.ApiOkResponse)({ type: this.importReturnMessageDto }),
2504
+ (0, import_swagger6.ApiInternalServerErrorResponse)({
2268
2505
  type: import_nesties10.BlankReturnMessageDto,
2269
2506
  description: "Internal error"
2270
2507
  })
@@ -2298,7 +2535,7 @@ var RestfulFactory = class _RestfulFactory {
2298
2535
  },
2299
2536
  findAll: {
2300
2537
  paramTypes: [
2301
- routeOptions.paginateType === "cursor" ? this.findAllCursorPaginatedDto : routeOptions.paginateType === "none" ? (0, import_swagger7.OmitType)(this.findAllDto, [
2538
+ routeOptions.paginateType === "cursor" ? this.findAllCursorPaginatedDto : routeOptions.paginateType === "none" ? (0, import_swagger6.OmitType)(this.findAllDto, [
2302
2539
  "pageCount",
2303
2540
  "recordsPerPage"
2304
2541
  ]) : this.findAllDto
@@ -2386,15 +2623,135 @@ var RestfulFactory = class _RestfulFactory {
2386
2623
  crudService(options = {}) {
2387
2624
  return CrudService(this.entityClass, {
2388
2625
  relations: this.options.relations,
2626
+ outputFieldsToOmit: this.options.outputFieldsToOmit,
2389
2627
  ...options
2390
2628
  });
2391
2629
  }
2392
2630
  };
2631
+ __decorateClass([
2632
+ Memorize()
2633
+ ], _RestfulFactory.prototype, "fieldsToOmit", 1);
2634
+ __decorateClass([
2635
+ Memorize()
2636
+ ], _RestfulFactory.prototype, "fieldsInCreateToOmit", 1);
2637
+ __decorateClass([
2638
+ Memorize()
2639
+ ], _RestfulFactory.prototype, "createDto", 1);
2640
+ __decorateClass([
2641
+ Memorize()
2642
+ ], _RestfulFactory.prototype, "fieldsInUpdateToOmit", 1);
2643
+ __decorateClass([
2644
+ Memorize()
2645
+ ], _RestfulFactory.prototype, "updateDto", 1);
2646
+ __decorateClass([
2647
+ Memorize()
2648
+ ], _RestfulFactory.prototype, "importDto", 1);
2649
+ __decorateClass([
2650
+ Memorize()
2651
+ ], _RestfulFactory.prototype, "fieldsInGetToOmit", 1);
2652
+ __decorateClass([
2653
+ Memorize()
2654
+ ], _RestfulFactory.prototype, "queryableFields", 1);
2655
+ __decorateClass([
2656
+ Memorize()
2657
+ ], _RestfulFactory.prototype, "findAllDto", 1);
2658
+ __decorateClass([
2659
+ Memorize()
2660
+ ], _RestfulFactory.prototype, "findAllCursorPaginatedDto", 1);
2661
+ __decorateClass([
2662
+ Memorize()
2663
+ ], _RestfulFactory.prototype, "entityResultDto", 1);
2664
+ __decorateClass([
2665
+ Memorize()
2666
+ ], _RestfulFactory.prototype, "entityCreateResultDto", 1);
2667
+ __decorateClass([
2668
+ Memorize()
2669
+ ], _RestfulFactory.prototype, "entityReturnMessageDto", 1);
2670
+ __decorateClass([
2671
+ Memorize()
2672
+ ], _RestfulFactory.prototype, "entityCreateReturnMessageDto", 1);
2673
+ __decorateClass([
2674
+ Memorize()
2675
+ ], _RestfulFactory.prototype, "entityArrayReturnMessageDto", 1);
2676
+ __decorateClass([
2677
+ Memorize()
2678
+ ], _RestfulFactory.prototype, "entityCursorPaginationReturnMessageDto", 1);
2679
+ __decorateClass([
2680
+ Memorize()
2681
+ ], _RestfulFactory.prototype, "importReturnMessageDto", 1);
2682
+ __decorateClass([
2683
+ Memorize()
2684
+ ], _RestfulFactory.prototype, "idType", 1);
2685
+ var RestfulFactory = _RestfulFactory;
2686
+
2687
+ // src/utility/query.ts
2688
+ function createQueryCondition(cond) {
2689
+ return (obj, qb, entityName, ...fields) => {
2690
+ for (const field of fields) {
2691
+ if (obj[field] == null) {
2692
+ continue;
2693
+ }
2694
+ const ret = cond(obj, qb, entityName, field);
2695
+ if (typeof ret === "string") {
2696
+ qb.andWhere(ret);
2697
+ } else if (typeof ret === "object" && typeof ret["query"] === "string") {
2698
+ const _ret = ret;
2699
+ qb.andWhere(_ret.query, _ret.params);
2700
+ }
2701
+ }
2702
+ return qb;
2703
+ };
2704
+ }
2705
+ var applyQueryProperty = createQueryCondition(
2706
+ (obj, qb, entityName, field) => qb.andWhere(`${entityName}.${field} = :${field}`, { [field]: obj[field] })
2707
+ );
2708
+ var applyQueryPropertyLike = createQueryCondition(
2709
+ (obj, qb, entityName, field) => qb.andWhere(`${entityName}.${field} like (:${field} || '%')`, {
2710
+ [field]: obj[field]
2711
+ })
2712
+ );
2713
+ var applyQueryPropertySearch = createQueryCondition(
2714
+ (obj, qb, entityName, field) => qb.andWhere(`${entityName}.${field} like ('%' || :${field} || '%')`, {
2715
+ [field]: obj[field]
2716
+ })
2717
+ );
2718
+ var applyQueryPropertyZeroNullable = createQueryCondition(
2719
+ (obj, qb, entityName, field) => {
2720
+ if ([0, "0"].indexOf(obj[field]) !== -1) {
2721
+ qb.andWhere(`${entityName}.${field} IS NULL`);
2722
+ } else {
2723
+ qb.andWhere(`${entityName}.${field} = :${field}`, {
2724
+ [field]: obj[field]
2725
+ });
2726
+ }
2727
+ }
2728
+ );
2729
+ var applyQueryMatchBoolean = createQueryCondition(
2730
+ (obj, qb, entityName, field) => {
2731
+ const value = parseBool(obj[field]);
2732
+ if (value === true) {
2733
+ qb.andWhere(`${entityName}.${field} = TRUE`);
2734
+ }
2735
+ if (value === false) {
2736
+ qb.andWhere(`${entityName}.${field} = FALSE`);
2737
+ }
2738
+ }
2739
+ );
2740
+ var applyQueryMatchBooleanMySQL = createQueryCondition(
2741
+ (obj, qb, entityName, field) => {
2742
+ const value = parseBool(obj[field]);
2743
+ if (value === true) {
2744
+ qb.andWhere(`${entityName}.${field} = 1`);
2745
+ }
2746
+ if (value === false) {
2747
+ qb.andWhere(`${entityName}.${field} = 0`);
2748
+ }
2749
+ }
2750
+ );
2393
2751
  // Annotate the CommonJS export names for ESM import in node:
2394
2752
  0 && (module.exports = {
2395
2753
  BlankCursorPaginationReturnMessageDto,
2396
2754
  BoolColumn,
2397
- CreatePipe,
2398
2755
  CrudBase,
2399
2756
  CrudService,
2400
2757
  CursorPaginationDto,
@@ -2403,7 +2760,14 @@ var RestfulFactory = class _RestfulFactory {
2403
2760
  EnumColumn,
2404
2761
  FloatColumn,
2405
2762
  GenericCursorPaginationReturnMessageDto,
2406
- GetPipe,
2763
+ GetMutator,
2764
+ GetMutatorBool,
2765
+ GetMutatorFloat,
2766
+ GetMutatorFloatSeparated,
2767
+ GetMutatorInt,
2768
+ GetMutatorIntSeparated,
2769
+ GetMutatorJson,
2770
+ GetMutatorStringSeparated,
2407
2771
  IdBase,
2408
2772
  ImportDataBaseDto,
2409
2773
  ImportDataDto,
@@ -2414,10 +2778,15 @@ var RestfulFactory = class _RestfulFactory {
2414
2778
  JsonColumn,
2415
2779
  NotChangeable,
2416
2780
  NotColumn,
2781
+ NotCreatable,
2417
2782
  NotInResult,
2418
2783
  NotQueryable,
2419
2784
  NotWritable,
2785
+ OmitPipe,
2786
+ OptionalDataPipe,
2420
2787
  PageSettingsDto,
2788
+ PickPipe,
2789
+ QueryAnd,
2421
2790
  QueryColumn,
2422
2791
  QueryCondition,
2423
2792
  QueryEqual,
@@ -2425,16 +2794,24 @@ var RestfulFactory = class _RestfulFactory {
2425
2794
  QueryFullText,
2426
2795
  QueryGreater,
2427
2796
  QueryGreaterEqual,
2797
+ QueryIn,
2798
+ QueryJsonbHas,
2428
2799
  QueryLess,
2429
2800
  QueryLessEqual,
2430
2801
  QueryLike,
2802
+ QueryManual,
2431
2803
  QueryMatchBoolean,
2432
2804
  QueryMatchBooleanMySQL,
2433
2805
  QueryNotEqual,
2806
+ QueryNotIn,
2434
2807
  QueryOperator,
2808
+ QueryOr,
2435
2809
  QuerySearch,
2810
+ QueryWrap,
2811
+ QueryWrapInfo,
2436
2812
  Relation,
2437
2813
  RelationComputed,
2814
+ RequireGetMutator,
2438
2815
  RestfulFactory,
2439
2816
  SimpleJsonColumn,
2440
2817
  StringColumn,
@@ -2442,7 +2819,6 @@ var RestfulFactory = class _RestfulFactory {
2442
2819
  StringJsonColumn,
2443
2820
  TextColumn,
2444
2821
  TimeBase,
2445
- UpdatePipe,
2446
2822
  UuidColumn,
2447
2823
  applyQueryMatchBoolean,
2448
2824
  applyQueryMatchBooleanMySQL,
@@ -2450,8 +2826,12 @@ var RestfulFactory = class _RestfulFactory {
2450
2826
  applyQueryPropertyLike,
2451
2827
  applyQueryPropertySearch,
2452
2828
  applyQueryPropertyZeroNullable,
2829
+ createGetMutator,
2830
+ createQueryArrayify,
2453
2831
  createQueryCondition,
2454
2832
  createQueryOperator,
2833
+ createQueryOperatorArrayify,
2834
+ createQueryWrap,
2455
2835
  ...require("nesties")
2456
2836
  });
2457
2837
  //# sourceMappingURL=index.cjs.map