nicot 1.1.32 → 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/dist/index.mjs CHANGED
@@ -118,6 +118,7 @@ import {
118
118
  IsOptional as IsOptional2,
119
119
  IsString,
120
120
  IsUUID,
121
+ Max,
121
122
  MaxLength,
122
123
  Min,
123
124
  ValidateNested as ValidateNested2
@@ -212,6 +213,47 @@ var TypeTransformer = class {
212
213
  return entValue;
213
214
  }
214
215
  };
216
+ var TypeTransformerString = class extends TypeTransformer {
217
+ from(dbValue) {
218
+ if (dbValue == null) {
219
+ return dbValue;
220
+ }
221
+ return super.from(JSON.parse(dbValue));
222
+ }
223
+ to(entValue) {
224
+ if (entValue == null) {
225
+ return entValue;
226
+ }
227
+ return JSON.stringify(super.to(entValue));
228
+ }
229
+ };
230
+
231
+ // src/utility/parse-bool.ts
232
+ var parseBool = (value) => {
233
+ const trueValues = ["true", "1", "yes", "on", true, 1];
234
+ const falseValues = ["false", "0", "no", "off", false, 0];
235
+ if (trueValues.indexOf(value) !== -1) return true;
236
+ if (falseValues.indexOf(value) !== -1) return false;
237
+ if (!!value) {
238
+ return true;
239
+ }
240
+ return void 0;
241
+ };
242
+ var parseBoolObject = (obj, boolFields) => {
243
+ const newObj = { ...obj };
244
+ for (const field of boolFields) {
245
+ newObj[field] = parseBool(newObj[field]);
246
+ }
247
+ return newObj;
248
+ };
249
+ var ParseBoolObjectPipe = class {
250
+ constructor(boolFields) {
251
+ this.boolFields = boolFields;
252
+ }
253
+ transform(obj) {
254
+ return parseBoolObject(obj, this.boolFields);
255
+ }
256
+ };
215
257
 
216
258
  // src/decorators/property.ts
217
259
  function swaggerDecorator(options, injected = {}) {
@@ -241,13 +283,24 @@ function columnDecoratorOptions(options) {
241
283
  }
242
284
  var StringColumn = (length, options = {}) => {
243
285
  return MergePropertyDecorators2([
244
- Column("varchar", { length, ...columnDecoratorOptions(options) }),
286
+ Column(options.columnType || "varchar", {
287
+ length,
288
+ ...columnDecoratorOptions(options)
289
+ }),
245
290
  IsString(),
246
291
  MaxLength(length),
247
292
  validatorDecorator(options),
248
293
  swaggerDecorator(options, { type: String, maxLength: length })
249
294
  ]);
250
295
  };
296
+ var TextColumn = (options = {}) => {
297
+ return MergePropertyDecorators2([
298
+ Column(options.columnType || "text", columnDecoratorOptions(options)),
299
+ IsString(),
300
+ validatorDecorator(options),
301
+ swaggerDecorator(options, { type: String })
302
+ ]);
303
+ };
251
304
  var UuidColumn = (options = {}) => {
252
305
  return MergePropertyDecorators2([
253
306
  Column("uuid", {
@@ -266,8 +319,28 @@ var UuidColumn = (options = {}) => {
266
319
  })
267
320
  ]);
268
321
  };
322
+ var intMaxList = {
323
+ tinyint: 127,
324
+ smallint: 32767,
325
+ mediumint: 8388607,
326
+ int: 2147483647,
327
+ bigint: Number.MAX_SAFE_INTEGER
328
+ };
269
329
  var IntColumn = (type, options = {}) => {
270
- const decs = [
330
+ let max = intMaxList[type] || Number.MAX_SAFE_INTEGER;
331
+ if (max !== Number.MAX_SAFE_INTEGER && options.unsigned) {
332
+ max = max * 2 + 1;
333
+ }
334
+ let min = options.unsigned ? 0 : -max - 1;
335
+ if (options.range) {
336
+ if (typeof options.range.min === "number" && options.range.min > min) {
337
+ min = options.range.min;
338
+ }
339
+ if (typeof options.range.max === "number" && options.range.max < max) {
340
+ max = options.range.max;
341
+ }
342
+ }
343
+ return MergePropertyDecorators2([
271
344
  Column(type, {
272
345
  default: options.default,
273
346
  unsigned: options.unsigned,
@@ -275,39 +348,53 @@ var IntColumn = (type, options = {}) => {
275
348
  ...columnDecoratorOptions(options)
276
349
  }),
277
350
  IsInt(),
351
+ ...min > Number.MIN_SAFE_INTEGER ? [Min(min)] : [],
352
+ ...max < Number.MAX_SAFE_INTEGER ? [Max(max)] : [],
278
353
  validatorDecorator(options),
279
354
  swaggerDecorator(options, {
280
355
  type: Number,
281
- minimum: options.unsigned ? 0 : void 0
356
+ minimum: min > Number.MIN_SAFE_INTEGER ? min : void 0,
357
+ maximum: max < Number.MAX_SAFE_INTEGER ? max : void 0
282
358
  })
283
- ];
284
- if (options.unsigned) {
285
- decs.push(Min(0));
286
- }
287
- return MergePropertyDecorators2(decs);
359
+ ]);
288
360
  };
289
361
  var FloatColumn = (type, options = {}) => {
290
- const decs = [
362
+ let min = options.unsigned ? 0 : Number.MIN_SAFE_INTEGER;
363
+ let max = Number.MAX_SAFE_INTEGER;
364
+ if (options.columnExtras?.precision != null && options.columnExtras?.scale != null) {
365
+ const precision = options.columnExtras.precision;
366
+ const scale = options.columnExtras.scale;
367
+ const intDigits = precision - scale;
368
+ if (intDigits > 0) {
369
+ const maxIntPart = Math.pow(10, intDigits) - 1;
370
+ const maxDecimalPart = scale > 0 ? (Math.pow(10, scale) - 1) / Math.pow(10, scale) : 0;
371
+ max = maxIntPart + maxDecimalPart;
372
+ min = options.unsigned ? 0 : -max;
373
+ }
374
+ }
375
+ return MergePropertyDecorators2([
291
376
  Column(type, {
292
377
  default: options.default,
293
378
  unsigned: options.unsigned,
294
379
  ...columnDecoratorOptions(options)
295
380
  }),
296
381
  IsNumber(),
382
+ ...min > Number.MIN_SAFE_INTEGER ? [Min(min)] : [],
383
+ ...max < Number.MAX_SAFE_INTEGER ? [Max(max)] : [],
297
384
  validatorDecorator(options),
298
385
  swaggerDecorator(options, {
299
386
  type: Number,
300
- minimum: options.unsigned ? 0 : void 0
387
+ minimum: min > Number.MIN_SAFE_INTEGER ? min : void 0,
388
+ maximum: max < Number.MAX_SAFE_INTEGER ? max : void 0
301
389
  })
302
- ];
303
- if (options.unsigned) {
304
- decs.push(Min(0));
305
- }
306
- return MergePropertyDecorators2(decs);
390
+ ]);
307
391
  };
308
392
  var DateColumn = (options = {}) => {
309
393
  return MergePropertyDecorators2([
310
- Column("timestamp", columnDecoratorOptions(options)),
394
+ Column(
395
+ options.columnType || "timestamp",
396
+ columnDecoratorOptions(options)
397
+ ),
311
398
  IsDate(),
312
399
  Transform(
313
400
  (v) => {
@@ -347,30 +434,33 @@ var EnumColumn = (targetEnum, options = {}) => {
347
434
  var BoolColumn = (options = {}) => MergePropertyDecorators2([
348
435
  Index(),
349
436
  Transform((v) => {
350
- const trueValues = ["true", "1", "yes", "on", true, 1];
351
- const falseValues = ["false", "0", "no", "off", false, 0];
352
- if (trueValues.indexOf(v.value) !== -1) return true;
353
- if (falseValues.indexOf(v.value) !== -1) return false;
354
- return void 0;
437
+ return parseBool(v.value);
355
438
  }),
356
439
  Column("boolean", columnDecoratorOptions(options)),
357
440
  validatorDecorator(options),
358
- swaggerDecorator(options, { type: Boolean })
441
+ swaggerDecorator(options, { type: Boolean }),
442
+ Metadata.set("boolColumn", true, "boolColumnFields")
359
443
  ]);
360
- var JsonColumn = (definition, options = {}) => {
444
+ var createJsonColumnDef = (columnType = "jsonb", typeTransformerClass = TypeTransformer) => (definition, options = {}) => {
361
445
  const cl = getClassFromClassOrArray2(definition);
362
446
  return MergePropertyDecorators2([
363
447
  NotQueryable(),
364
448
  Type2(() => cl),
365
449
  ValidateNested2(),
366
- Column("jsonb", {
450
+ Column(options.columnType || columnType, {
367
451
  ...columnDecoratorOptions(options),
368
- transformer: new TypeTransformer(definition)
452
+ transformer: new typeTransformerClass(definition)
369
453
  }),
370
454
  validatorDecorator(options),
371
455
  swaggerDecorator(options, { type: definition })
372
456
  ]);
373
457
  };
458
+ var JsonColumn = createJsonColumnDef();
459
+ var SimpleJsonColumn = createJsonColumnDef("json");
460
+ var StringJsonColumn = createJsonColumnDef(
461
+ "text",
462
+ TypeTransformerString
463
+ );
374
464
  var NotColumn = (options = {}, specials = {}) => MergePropertyDecorators2([
375
465
  Exclude(),
376
466
  swaggerDecorator({
@@ -465,21 +555,26 @@ var applyQueryPropertyZeroNullable = createQueryCondition(
465
555
  );
466
556
  var applyQueryMatchBoolean = createQueryCondition(
467
557
  (obj, qb, entityName, field) => {
468
- const value = obj[field];
469
- if (value === true || value === "true" || value === 1 || value === "1") {
558
+ const value = parseBool(obj[field]);
559
+ if (value === true) {
470
560
  qb.andWhere(`${entityName}.${field} = TRUE`);
471
561
  }
472
- if (value === false || value === "false" || value === 0 || value === "0") {
562
+ if (value === false) {
473
563
  qb.andWhere(`${entityName}.${field} = FALSE`);
474
564
  }
475
565
  }
476
566
  );
477
-
478
- // src/utility/rename-class.ts
479
- function RenameClass(cls, name) {
480
- Object.defineProperty(cls, "name", { value: name });
481
- return cls;
482
- }
567
+ var applyQueryMatchBooleanMySQL = createQueryCondition(
568
+ (obj, qb, entityName, field) => {
569
+ const value = parseBool(obj[field]);
570
+ if (value === true) {
571
+ qb.andWhere(`${entityName}.${field} = 1`);
572
+ }
573
+ if (value === false) {
574
+ qb.andWhere(`${entityName}.${field} = 0`);
575
+ }
576
+ }
577
+ );
483
578
 
484
579
  // src/decorators/query.ts
485
580
  import { MergePropertyDecorators as MergePropertyDecorators3 } from "nesties";
@@ -524,6 +619,7 @@ var QueryLike = () => QueryCondition(applyQueryPropertyLike);
524
619
  var QuerySearch = () => QueryCondition(applyQueryPropertySearch);
525
620
  var QueryEqualZeroNullable = () => QueryCondition(applyQueryPropertyZeroNullable);
526
621
  var QueryMatchBoolean = () => QueryCondition(applyQueryMatchBoolean);
622
+ var QueryMatchBooleanMySQL = () => QueryCondition(applyQueryMatchBooleanMySQL);
527
623
  var QueryOperator = (operator, field) => QueryCondition((obj, qb, entityName, key) => {
528
624
  if (obj[key] == null) return;
529
625
  const fieldName = field || key;
@@ -748,7 +844,7 @@ __decorateClass([
748
844
  ], TimeBase.prototype, "deleteTime", 2);
749
845
 
750
846
  // src/bases/id-base.ts
751
- import { Generated as Generated2 } from "typeorm";
847
+ import { Generated } from "typeorm";
752
848
  import { IsNotEmpty as IsNotEmpty2 } from "class-validator";
753
849
  import { MergePropertyDecorators as MergePropertyDecorators4 } from "nesties";
754
850
  function IdBase(idOptions = {}) {
@@ -768,7 +864,7 @@ function IdBase(idOptions = {}) {
768
864
  columnExtras: { nullable: false, primary: true }
769
865
  }),
770
866
  Reflect.metadata("design:type", Number),
771
- Generated2("increment"),
867
+ Generated("increment"),
772
868
  QueryEqual()
773
869
  ]);
774
870
  dec(cl.prototype, "id");
@@ -1701,7 +1797,8 @@ import {
1701
1797
  BlankReturnMessageDto as BlankReturnMessageDto3,
1702
1798
  MergeMethodDecorators,
1703
1799
  PaginatedReturnMessageDto as PaginatedReturnMessageDto2,
1704
- ReturnMessageDto as ReturnMessageDto2
1800
+ ReturnMessageDto as ReturnMessageDto2,
1801
+ getApiProperty as getApiProperty2
1705
1802
  } from "nesties";
1706
1803
  import {
1707
1804
  ApiBadRequestResponse,
@@ -1711,13 +1808,13 @@ import {
1711
1808
  ApiOkResponse,
1712
1809
  ApiOperation,
1713
1810
  ApiParam,
1714
- ApiProperty as ApiProperty5,
1811
+ ApiProperty as ApiProperty6,
1715
1812
  IntersectionType,
1716
1813
  OmitType as OmitType2,
1717
1814
  PartialType
1718
1815
  } from "@nestjs/swagger";
1719
1816
  import _4, { upperFirst } from "lodash";
1720
- import { DECORATORS } from "@nestjs/swagger/dist/constants";
1817
+ import { RenameClass } from "nesties";
1721
1818
 
1722
1819
  // src/bases/base-restful-controller.ts
1723
1820
  var RestfulMethods = [
@@ -1778,6 +1875,27 @@ var OmitTypeExclude = (cl, keys) => {
1778
1875
  return omitted;
1779
1876
  };
1780
1877
 
1878
+ // src/utility/patch-column-in-get.ts
1879
+ import { ApiProperty as ApiProperty5 } from "@nestjs/swagger";
1880
+ import { getApiProperty } from "nesties";
1881
+ var PatchColumnsInGet = (cl, originalCl = cl, fieldsToOmit = []) => {
1882
+ const omit2 = new Set(fieldsToOmit);
1883
+ const boolFields = getSpecificFields(originalCl || cl, "boolColumn").filter(
1884
+ (f) => !omit2.has(f)
1885
+ );
1886
+ for (const field of boolFields) {
1887
+ const originalApiProp = getApiProperty(originalCl, field);
1888
+ ApiProperty5({
1889
+ ...originalApiProp,
1890
+ type: String,
1891
+ required: false,
1892
+ enum: ["0", "1"],
1893
+ default: originalApiProp?.default === true ? "1" : originalApiProp?.default === false ? "0" : void 0
1894
+ })(cl.prototype, field);
1895
+ }
1896
+ return cl;
1897
+ };
1898
+
1781
1899
  // src/restful.ts
1782
1900
  var getCurrentLevelRelations = (relations) => relations.filter((r) => !r.includes("."));
1783
1901
  var getNextLevelRelations = (relations, enteringField) => relations.filter((r) => r.includes(".") && r.startsWith(`${enteringField}.`)).map((r) => r.split(".").slice(1).join("."));
@@ -1805,14 +1923,22 @@ var RestfulFactory = class _RestfulFactory {
1805
1923
  `Create${this.entityClass.name}Dto`
1806
1924
  );
1807
1925
  this.importDto = ImportDataDto(this.createDto);
1926
+ this.fieldsInGetToOmit = _4.uniq([
1927
+ ...this.fieldsToOmit,
1928
+ ...getSpecificFields(this.entityClass, "notQueryable")
1929
+ ]);
1808
1930
  this.findAllDto = RenameClass(
1809
1931
  PartialType(
1810
- OmitTypeExclude(
1811
- this.entityClass instanceof PageSettingsDto ? this.basicInputDto : IntersectionType(
1812
- this.basicInputDto,
1813
- PageSettingsDto
1932
+ PatchColumnsInGet(
1933
+ OmitTypeExclude(
1934
+ this.entityClass instanceof PageSettingsDto ? this.entityClass : IntersectionType(
1935
+ this.entityClass,
1936
+ PageSettingsDto
1937
+ ),
1938
+ this.fieldsInGetToOmit
1814
1939
  ),
1815
- getSpecificFields(this.entityClass, "notQueryable")
1940
+ this.entityClass,
1941
+ this.fieldsInGetToOmit
1816
1942
  )
1817
1943
  ),
1818
1944
  `Find${this.entityClass.name}Dto`
@@ -1891,12 +2017,11 @@ var RestfulFactory = class _RestfulFactory {
1891
2017
  if (outputFieldsToOmit.has(relation.propertyName)) continue;
1892
2018
  if (nonTransformableTypes.has(relation.propertyClass)) continue;
1893
2019
  const replace = (useClass) => {
1894
- const oldApiProperty = Reflect.getMetadata(
1895
- DECORATORS.API_MODEL_PROPERTIES,
1896
- this.entityClass.prototype,
2020
+ const oldApiProperty = getApiProperty2(
2021
+ this.entityClass,
1897
2022
  relation.propertyName
1898
- ) || {};
1899
- ApiProperty5({
2023
+ );
2024
+ ApiProperty6({
1900
2025
  ...oldApiProperty,
1901
2026
  required: false,
1902
2027
  type: () => relation.isArray ? [useClass[0]] : useClass[0]
@@ -2016,8 +2141,17 @@ var RestfulFactory = class _RestfulFactory {
2016
2141
  ApiOkResponse({ type: this.entityCursorPaginationReturnMessageDto })
2017
2142
  ]);
2018
2143
  }
2144
+ getBoolColumns() {
2145
+ const boolColumns = getSpecificFields(this.entityClass, "boolColumn");
2146
+ return _4.difference(boolColumns, this.fieldsInGetToOmit);
2147
+ }
2019
2148
  findAllParam() {
2020
- return Query(GetPipe());
2149
+ const boolColumns = this.getBoolColumns();
2150
+ if (boolColumns.length) {
2151
+ return Query(new ParseBoolObjectPipe(boolColumns), GetPipe());
2152
+ } else {
2153
+ return Query(GetPipe());
2154
+ }
2021
2155
  }
2022
2156
  update(extras = {}) {
2023
2157
  return MergeMethodDecorators([
@@ -2241,19 +2375,23 @@ export {
2241
2375
  QueryLessEqual,
2242
2376
  QueryLike,
2243
2377
  QueryMatchBoolean,
2378
+ QueryMatchBooleanMySQL,
2244
2379
  QueryNotEqual,
2245
2380
  QueryOperator,
2246
2381
  QuerySearch,
2247
2382
  Relation,
2248
2383
  RelationComputed,
2249
- RenameClass,
2250
2384
  RestfulFactory,
2385
+ SimpleJsonColumn,
2251
2386
  StringColumn,
2252
2387
  StringIdBase,
2388
+ StringJsonColumn,
2389
+ TextColumn,
2253
2390
  TimeBase,
2254
2391
  UpdatePipe,
2255
2392
  UuidColumn,
2256
2393
  applyQueryMatchBoolean,
2394
+ applyQueryMatchBooleanMySQL,
2257
2395
  applyQueryProperty,
2258
2396
  applyQueryPropertyLike,
2259
2397
  applyQueryPropertySearch,