nicot 1.1.33 → 1.1.34

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 CHANGED
@@ -192,7 +192,7 @@ RestfulFactory 处理 Entity 类的时候,会以这些装饰器为依据,裁
192
192
  nickname: string;
193
193
 
194
194
  @BoolColumn()
195
- @QueryEqual()
195
+ @QueryMatchBoolean()
196
196
  isActive: boolean;
197
197
  ```
198
198
 
@@ -209,6 +209,7 @@ NICOT 提供了一套查询装饰器,用于在 Entity 字段上声明支持的
209
209
  | `@QueryEqual()` | 精确匹配:`WHERE field = :value` |
210
210
  | `@QueryLike()` | 前缀模糊匹配:`WHERE field LIKE :value%` |
211
211
  | `@QuerySearch()` | 宽泛模糊搜索:`WHERE field LIKE %:value%` |
212
+ | `@QueryMatchBoolean()` | `true/false/1/0` 转换为布尔类型查询 |
212
213
  | `@QueryEqualZeroNullable()` | `0 → IS NULL`,否则 `= :value`(适合 nullable) |
213
214
  | `@QueryGreater(field)` | 大于查询:`WHERE field > :value` |
214
215
  | `@QueryLess(field)` | 小于查询:`WHERE field < :value` |
@@ -286,7 +287,7 @@ views: number;
286
287
  title: string;
287
288
 
288
289
  @BoolColumn()
289
- @QueryEqual()
290
+ @QueryMatchBoolean()
290
291
  isPublished: boolean;
291
292
 
292
293
  @NotWritable()
@@ -473,7 +474,7 @@ NICOT 提供了 `RestfulFactory(Entity)` 工厂函数,自动为实体生成标
473
474
  name: string;
474
475
 
475
476
  @BoolColumn()
476
- @QueryEqual()
477
+ @QueryMatchBoolean()
477
478
  isActive: boolean;
478
479
  ```
479
480
 
package/dist/index.cjs CHANGED
@@ -75,18 +75,23 @@ __export(index_exports, {
75
75
  QueryLessEqual: () => QueryLessEqual,
76
76
  QueryLike: () => QueryLike,
77
77
  QueryMatchBoolean: () => QueryMatchBoolean,
78
+ QueryMatchBooleanMySQL: () => QueryMatchBooleanMySQL,
78
79
  QueryNotEqual: () => QueryNotEqual,
79
80
  QueryOperator: () => QueryOperator,
80
81
  QuerySearch: () => QuerySearch,
81
82
  Relation: () => Relation,
82
83
  RelationComputed: () => RelationComputed,
83
84
  RestfulFactory: () => RestfulFactory,
85
+ SimpleJsonColumn: () => SimpleJsonColumn,
84
86
  StringColumn: () => StringColumn,
85
87
  StringIdBase: () => StringIdBase,
88
+ StringJsonColumn: () => StringJsonColumn,
89
+ TextColumn: () => TextColumn,
86
90
  TimeBase: () => TimeBase,
87
91
  UpdatePipe: () => UpdatePipe,
88
92
  UuidColumn: () => UuidColumn,
89
93
  applyQueryMatchBoolean: () => applyQueryMatchBoolean,
94
+ applyQueryMatchBooleanMySQL: () => applyQueryMatchBooleanMySQL,
90
95
  applyQueryProperty: () => applyQueryProperty,
91
96
  applyQueryPropertyLike: () => applyQueryPropertyLike,
92
97
  applyQueryPropertySearch: () => applyQueryPropertySearch,
@@ -273,6 +278,47 @@ var TypeTransformer = class {
273
278
  return entValue;
274
279
  }
275
280
  };
281
+ var TypeTransformerString = class extends TypeTransformer {
282
+ from(dbValue) {
283
+ if (dbValue == null) {
284
+ return dbValue;
285
+ }
286
+ return super.from(JSON.parse(dbValue));
287
+ }
288
+ to(entValue) {
289
+ if (entValue == null) {
290
+ return entValue;
291
+ }
292
+ return JSON.stringify(super.to(entValue));
293
+ }
294
+ };
295
+
296
+ // src/utility/parse-bool.ts
297
+ var parseBool = (value) => {
298
+ const trueValues = ["true", "1", "yes", "on", true, 1];
299
+ const falseValues = ["false", "0", "no", "off", false, 0];
300
+ if (trueValues.indexOf(value) !== -1) return true;
301
+ if (falseValues.indexOf(value) !== -1) return false;
302
+ if (!!value) {
303
+ return true;
304
+ }
305
+ return void 0;
306
+ };
307
+ var parseBoolObject = (obj, boolFields) => {
308
+ const newObj = { ...obj };
309
+ for (const field of boolFields) {
310
+ newObj[field] = parseBool(newObj[field]);
311
+ }
312
+ return newObj;
313
+ };
314
+ var ParseBoolObjectPipe = class {
315
+ constructor(boolFields) {
316
+ this.boolFields = boolFields;
317
+ }
318
+ transform(obj) {
319
+ return parseBoolObject(obj, this.boolFields);
320
+ }
321
+ };
276
322
 
277
323
  // src/decorators/property.ts
278
324
  function swaggerDecorator(options, injected = {}) {
@@ -302,13 +348,24 @@ function columnDecoratorOptions(options) {
302
348
  }
303
349
  var StringColumn = (length, options = {}) => {
304
350
  return (0, import_nesties3.MergePropertyDecorators)([
305
- (0, import_typeorm.Column)("varchar", { length, ...columnDecoratorOptions(options) }),
351
+ (0, import_typeorm.Column)(options.columnType || "varchar", {
352
+ length,
353
+ ...columnDecoratorOptions(options)
354
+ }),
306
355
  (0, import_class_validator3.IsString)(),
307
356
  (0, import_class_validator3.MaxLength)(length),
308
357
  validatorDecorator(options),
309
358
  swaggerDecorator(options, { type: String, maxLength: length })
310
359
  ]);
311
360
  };
361
+ var TextColumn = (options = {}) => {
362
+ return (0, import_nesties3.MergePropertyDecorators)([
363
+ (0, import_typeorm.Column)(options.columnType || "text", columnDecoratorOptions(options)),
364
+ (0, import_class_validator3.IsString)(),
365
+ validatorDecorator(options),
366
+ swaggerDecorator(options, { type: String })
367
+ ]);
368
+ };
312
369
  var UuidColumn = (options = {}) => {
313
370
  return (0, import_nesties3.MergePropertyDecorators)([
314
371
  (0, import_typeorm.Column)("uuid", {
@@ -327,8 +384,28 @@ var UuidColumn = (options = {}) => {
327
384
  })
328
385
  ]);
329
386
  };
387
+ var intMaxList = {
388
+ tinyint: 127,
389
+ smallint: 32767,
390
+ mediumint: 8388607,
391
+ int: 2147483647,
392
+ bigint: Number.MAX_SAFE_INTEGER
393
+ };
330
394
  var IntColumn = (type, options = {}) => {
331
- const decs = [
395
+ let max = intMaxList[type] || Number.MAX_SAFE_INTEGER;
396
+ if (max !== Number.MAX_SAFE_INTEGER && options.unsigned) {
397
+ max = max * 2 + 1;
398
+ }
399
+ let min = options.unsigned ? 0 : -max - 1;
400
+ if (options.range) {
401
+ if (typeof options.range.min === "number" && options.range.min > min) {
402
+ min = options.range.min;
403
+ }
404
+ if (typeof options.range.max === "number" && options.range.max < max) {
405
+ max = options.range.max;
406
+ }
407
+ }
408
+ return (0, import_nesties3.MergePropertyDecorators)([
332
409
  (0, import_typeorm.Column)(type, {
333
410
  default: options.default,
334
411
  unsigned: options.unsigned,
@@ -336,39 +413,53 @@ var IntColumn = (type, options = {}) => {
336
413
  ...columnDecoratorOptions(options)
337
414
  }),
338
415
  (0, import_class_validator3.IsInt)(),
416
+ ...min > Number.MIN_SAFE_INTEGER ? [(0, import_class_validator3.Min)(min)] : [],
417
+ ...max < Number.MAX_SAFE_INTEGER ? [(0, import_class_validator3.Max)(max)] : [],
339
418
  validatorDecorator(options),
340
419
  swaggerDecorator(options, {
341
420
  type: Number,
342
- minimum: options.unsigned ? 0 : void 0
421
+ minimum: min > Number.MIN_SAFE_INTEGER ? min : void 0,
422
+ maximum: max < Number.MAX_SAFE_INTEGER ? max : void 0
343
423
  })
344
- ];
345
- if (options.unsigned) {
346
- decs.push((0, import_class_validator3.Min)(0));
347
- }
348
- return (0, import_nesties3.MergePropertyDecorators)(decs);
424
+ ]);
349
425
  };
350
426
  var FloatColumn = (type, options = {}) => {
351
- const decs = [
427
+ let min = options.unsigned ? 0 : Number.MIN_SAFE_INTEGER;
428
+ let max = Number.MAX_SAFE_INTEGER;
429
+ if (options.columnExtras?.precision != null && options.columnExtras?.scale != null) {
430
+ const precision = options.columnExtras.precision;
431
+ const scale = options.columnExtras.scale;
432
+ const intDigits = precision - scale;
433
+ if (intDigits > 0) {
434
+ const maxIntPart = Math.pow(10, intDigits) - 1;
435
+ const maxDecimalPart = scale > 0 ? (Math.pow(10, scale) - 1) / Math.pow(10, scale) : 0;
436
+ max = maxIntPart + maxDecimalPart;
437
+ min = options.unsigned ? 0 : -max;
438
+ }
439
+ }
440
+ return (0, import_nesties3.MergePropertyDecorators)([
352
441
  (0, import_typeorm.Column)(type, {
353
442
  default: options.default,
354
443
  unsigned: options.unsigned,
355
444
  ...columnDecoratorOptions(options)
356
445
  }),
357
446
  (0, import_class_validator3.IsNumber)(),
447
+ ...min > Number.MIN_SAFE_INTEGER ? [(0, import_class_validator3.Min)(min)] : [],
448
+ ...max < Number.MAX_SAFE_INTEGER ? [(0, import_class_validator3.Max)(max)] : [],
358
449
  validatorDecorator(options),
359
450
  swaggerDecorator(options, {
360
451
  type: Number,
361
- minimum: options.unsigned ? 0 : void 0
452
+ minimum: min > Number.MIN_SAFE_INTEGER ? min : void 0,
453
+ maximum: max < Number.MAX_SAFE_INTEGER ? max : void 0
362
454
  })
363
- ];
364
- if (options.unsigned) {
365
- decs.push((0, import_class_validator3.Min)(0));
366
- }
367
- return (0, import_nesties3.MergePropertyDecorators)(decs);
455
+ ]);
368
456
  };
369
457
  var DateColumn = (options = {}) => {
370
458
  return (0, import_nesties3.MergePropertyDecorators)([
371
- (0, import_typeorm.Column)("timestamp", columnDecoratorOptions(options)),
459
+ (0, import_typeorm.Column)(
460
+ options.columnType || "timestamp",
461
+ columnDecoratorOptions(options)
462
+ ),
372
463
  (0, import_class_validator3.IsDate)(),
373
464
  (0, import_class_transformer3.Transform)(
374
465
  (v) => {
@@ -408,31 +499,33 @@ var EnumColumn = (targetEnum, options = {}) => {
408
499
  var BoolColumn = (options = {}) => (0, import_nesties3.MergePropertyDecorators)([
409
500
  (0, import_typeorm.Index)(),
410
501
  (0, import_class_transformer3.Transform)((v) => {
411
- const trueValues = ["true", "1", "yes", "on", true, 1];
412
- const falseValues = ["false", "0", "no", "off", false, 0];
413
- if (trueValues.indexOf(v.value) !== -1) return true;
414
- if (falseValues.indexOf(v.value) !== -1) return false;
415
- return void 0;
502
+ return parseBool(v.value);
416
503
  }),
417
504
  (0, import_typeorm.Column)("boolean", columnDecoratorOptions(options)),
418
505
  validatorDecorator(options),
419
506
  swaggerDecorator(options, { type: Boolean }),
420
507
  Metadata.set("boolColumn", true, "boolColumnFields")
421
508
  ]);
422
- var JsonColumn = (definition, options = {}) => {
509
+ var createJsonColumnDef = (columnType = "jsonb", typeTransformerClass = TypeTransformer) => (definition, options = {}) => {
423
510
  const cl = (0, import_nesties4.getClassFromClassOrArray)(definition);
424
511
  return (0, import_nesties3.MergePropertyDecorators)([
425
512
  NotQueryable(),
426
513
  (0, import_class_transformer3.Type)(() => cl),
427
514
  (0, import_class_validator3.ValidateNested)(),
428
- (0, import_typeorm.Column)("jsonb", {
515
+ (0, import_typeorm.Column)(options.columnType || columnType, {
429
516
  ...columnDecoratorOptions(options),
430
- transformer: new TypeTransformer(definition)
517
+ transformer: new typeTransformerClass(definition)
431
518
  }),
432
519
  validatorDecorator(options),
433
520
  swaggerDecorator(options, { type: definition })
434
521
  ]);
435
522
  };
523
+ var JsonColumn = createJsonColumnDef();
524
+ var SimpleJsonColumn = createJsonColumnDef("json");
525
+ var StringJsonColumn = createJsonColumnDef(
526
+ "text",
527
+ TypeTransformerString
528
+ );
436
529
  var NotColumn = (options = {}, specials = {}) => (0, import_nesties3.MergePropertyDecorators)([
437
530
  (0, import_class_transformer3.Exclude)(),
438
531
  swaggerDecorator({
@@ -527,15 +620,26 @@ var applyQueryPropertyZeroNullable = createQueryCondition(
527
620
  );
528
621
  var applyQueryMatchBoolean = createQueryCondition(
529
622
  (obj, qb, entityName, field) => {
530
- const value = obj[field];
531
- if (value === true || value === "true" || value === 1 || value === "1") {
623
+ const value = parseBool(obj[field]);
624
+ if (value === true) {
532
625
  qb.andWhere(`${entityName}.${field} = TRUE`);
533
626
  }
534
- if (value === false || value === "false" || value === 0 || value === "0") {
627
+ if (value === false) {
535
628
  qb.andWhere(`${entityName}.${field} = FALSE`);
536
629
  }
537
630
  }
538
631
  );
632
+ var applyQueryMatchBooleanMySQL = createQueryCondition(
633
+ (obj, qb, entityName, field) => {
634
+ const value = parseBool(obj[field]);
635
+ if (value === true) {
636
+ qb.andWhere(`${entityName}.${field} = 1`);
637
+ }
638
+ if (value === false) {
639
+ qb.andWhere(`${entityName}.${field} = 0`);
640
+ }
641
+ }
642
+ );
539
643
 
540
644
  // src/decorators/query.ts
541
645
  var import_nesties5 = require("nesties");
@@ -580,6 +684,7 @@ var QueryLike = () => QueryCondition(applyQueryPropertyLike);
580
684
  var QuerySearch = () => QueryCondition(applyQueryPropertySearch);
581
685
  var QueryEqualZeroNullable = () => QueryCondition(applyQueryPropertyZeroNullable);
582
686
  var QueryMatchBoolean = () => QueryCondition(applyQueryMatchBoolean);
687
+ var QueryMatchBooleanMySQL = () => QueryCondition(applyQueryMatchBooleanMySQL);
583
688
  var QueryOperator = (operator, field) => QueryCondition((obj, qb, entityName, key) => {
584
689
  if (obj[key] == null) return;
585
690
  const fieldName = field || key;
@@ -1811,8 +1916,8 @@ var PatchColumnsInGet = (cl, originalCl = cl, fieldsToOmit = []) => {
1811
1916
  ...originalApiProp,
1812
1917
  type: String,
1813
1918
  required: false,
1814
- enum: ["", "1"],
1815
- default: originalApiProp?.default === true ? "1" : originalApiProp?.default === false ? "" : void 0
1919
+ enum: ["0", "1"],
1920
+ default: originalApiProp?.default === true ? "1" : originalApiProp?.default === false ? "0" : void 0
1816
1921
  })(cl.prototype, field);
1817
1922
  }
1818
1923
  return cl;
@@ -2063,8 +2168,17 @@ var RestfulFactory = class _RestfulFactory {
2063
2168
  (0, import_swagger7.ApiOkResponse)({ type: this.entityCursorPaginationReturnMessageDto })
2064
2169
  ]);
2065
2170
  }
2171
+ getBoolColumns() {
2172
+ const boolColumns = getSpecificFields(this.entityClass, "boolColumn");
2173
+ return import_lodash4.default.difference(boolColumns, this.fieldsInGetToOmit);
2174
+ }
2066
2175
  findAllParam() {
2067
- return (0, import_common3.Query)(GetPipe());
2176
+ const boolColumns = this.getBoolColumns();
2177
+ if (boolColumns.length) {
2178
+ return (0, import_common3.Query)(new ParseBoolObjectPipe(boolColumns), GetPipe());
2179
+ } else {
2180
+ return (0, import_common3.Query)(GetPipe());
2181
+ }
2068
2182
  }
2069
2183
  update(extras = {}) {
2070
2184
  return (0, import_nesties10.MergeMethodDecorators)([
@@ -2289,18 +2403,23 @@ var RestfulFactory = class _RestfulFactory {
2289
2403
  QueryLessEqual,
2290
2404
  QueryLike,
2291
2405
  QueryMatchBoolean,
2406
+ QueryMatchBooleanMySQL,
2292
2407
  QueryNotEqual,
2293
2408
  QueryOperator,
2294
2409
  QuerySearch,
2295
2410
  Relation,
2296
2411
  RelationComputed,
2297
2412
  RestfulFactory,
2413
+ SimpleJsonColumn,
2298
2414
  StringColumn,
2299
2415
  StringIdBase,
2416
+ StringJsonColumn,
2417
+ TextColumn,
2300
2418
  TimeBase,
2301
2419
  UpdatePipe,
2302
2420
  UuidColumn,
2303
2421
  applyQueryMatchBoolean,
2422
+ applyQueryMatchBooleanMySQL,
2304
2423
  applyQueryProperty,
2305
2424
  applyQueryPropertyLike,
2306
2425
  applyQueryPropertySearch,