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 +4 -3
- package/dist/index.cjs +149 -30
- package/dist/index.cjs.map +3 -3
- package/dist/index.mjs +147 -32
- package/dist/index.mjs.map +4 -4
- package/dist/src/decorators/property.d.ts +27 -4
- package/dist/src/decorators/query.d.ts +1 -0
- package/dist/src/restful.d.ts +1 -0
- package/dist/src/utility/parse-bool.d.ts +8 -0
- package/dist/src/utility/query.d.ts +1 -0
- package/dist/src/utility/type-transformer.d.ts +4 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -192,7 +192,7 @@ RestfulFactory 处理 Entity 类的时候,会以这些装饰器为依据,裁
|
|
|
192
192
|
nickname: string;
|
|
193
193
|
|
|
194
194
|
@BoolColumn()
|
|
195
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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", {
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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)(
|
|
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
|
-
|
|
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
|
|
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)(
|
|
515
|
+
(0, import_typeorm.Column)(options.columnType || columnType, {
|
|
429
516
|
...columnDecoratorOptions(options),
|
|
430
|
-
transformer: new
|
|
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
|
|
623
|
+
const value = parseBool(obj[field]);
|
|
624
|
+
if (value === true) {
|
|
532
625
|
qb.andWhere(`${entityName}.${field} = TRUE`);
|
|
533
626
|
}
|
|
534
|
-
if (value === false
|
|
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
|
-
|
|
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,
|