@e22m4u/js-repository 0.6.4 → 0.7.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.
Files changed (90) hide show
  1. package/README.md +6 -532
  2. package/dist/cjs/index.cjs +141 -1156
  3. package/package.json +7 -7
  4. package/src/adapter/adapter.d.ts +2 -4
  5. package/src/adapter/adapter.js +2 -6
  6. package/src/adapter/adapter.spec.js +3 -15
  7. package/src/adapter/builtin/memory-adapter.js +41 -12
  8. package/src/adapter/builtin/memory-adapter.spec.js +47 -0
  9. package/src/adapter/decorator/index.d.ts +0 -2
  10. package/src/adapter/decorator/index.js +0 -2
  11. package/src/definition/model/index.d.ts +0 -2
  12. package/src/definition/model/index.js +0 -2
  13. package/src/definition/model/properties/index.d.ts +0 -2
  14. package/src/definition/model/properties/index.js +0 -2
  15. package/src/definition/model/properties/properties-definition-validator.js +0 -169
  16. package/src/definition/model/properties/properties-definition-validator.spec.js +0 -162
  17. package/src/definition/model/properties/property-definition.d.ts +1 -5
  18. package/src/definition/model/properties/property-uniqueness-validator.js +2 -2
  19. package/src/filter/filter-clause.d.ts +3 -4
  20. package/src/filter/where-clause-tool.js +2 -2
  21. package/src/utils/index.d.ts +1 -5
  22. package/src/utils/index.js +1 -5
  23. package/src/utils/is-plain-object.d.ts +6 -0
  24. package/src/utils/{is-pure-object.js → is-plain-object.js} +2 -2
  25. package/src/utils/is-plain-object.spec.js +25 -0
  26. package/src/utils/model-name-to-model-key.js +0 -4
  27. package/src/utils/model-name-to-model-key.spec.js +0 -23
  28. package/tsconfig.json +2 -2
  29. package/src/adapter/decorator/data-transformation-decorator.d.ts +0 -14
  30. package/src/adapter/decorator/data-transformation-decorator.js +0 -54
  31. package/src/adapter/decorator/data-transformation-decorator.spec.js +0 -193
  32. package/src/adapter/decorator/data-validation-decorator.d.ts +0 -14
  33. package/src/adapter/decorator/data-validation-decorator.js +0 -54
  34. package/src/adapter/decorator/data-validation-decorator.spec.js +0 -105
  35. package/src/definition/model/model-data-transformer.d.ts +0 -16
  36. package/src/definition/model/model-data-transformer.js +0 -170
  37. package/src/definition/model/model-data-transformer.spec.js +0 -2312
  38. package/src/definition/model/model-data-validator.d.ts +0 -16
  39. package/src/definition/model/model-data-validator.js +0 -318
  40. package/src/definition/model/model-data-validator.spec.js +0 -4528
  41. package/src/definition/model/properties/property-transformer/builtin/index.d.ts +0 -3
  42. package/src/definition/model/properties/property-transformer/builtin/index.js +0 -3
  43. package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.d.ts +0 -6
  44. package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.js +0 -19
  45. package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.spec.js +0 -39
  46. package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.d.ts +0 -6
  47. package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.js +0 -19
  48. package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.spec.js +0 -39
  49. package/src/definition/model/properties/property-transformer/builtin/trim-transformer.d.ts +0 -6
  50. package/src/definition/model/properties/property-transformer/builtin/trim-transformer.js +0 -19
  51. package/src/definition/model/properties/property-transformer/builtin/trim-transformer.spec.js +0 -39
  52. package/src/definition/model/properties/property-transformer/index.d.ts +0 -2
  53. package/src/definition/model/properties/property-transformer/index.js +0 -2
  54. package/src/definition/model/properties/property-transformer/property-transformer-registry.d.ts +0 -29
  55. package/src/definition/model/properties/property-transformer/property-transformer-registry.js +0 -76
  56. package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +0 -133
  57. package/src/definition/model/properties/property-transformer/property-transformer.d.ts +0 -27
  58. package/src/definition/model/properties/property-transformer/property-transformer.js +0 -1
  59. package/src/definition/model/properties/property-validator/builtin/index.d.ts +0 -3
  60. package/src/definition/model/properties/property-validator/builtin/index.js +0 -3
  61. package/src/definition/model/properties/property-validator/builtin/max-length-validator.d.ts +0 -6
  62. package/src/definition/model/properties/property-validator/builtin/max-length-validator.js +0 -28
  63. package/src/definition/model/properties/property-validator/builtin/max-length-validator.spec.js +0 -100
  64. package/src/definition/model/properties/property-validator/builtin/min-length-validator.d.ts +0 -6
  65. package/src/definition/model/properties/property-validator/builtin/min-length-validator.js +0 -28
  66. package/src/definition/model/properties/property-validator/builtin/min-length-validator.spec.js +0 -100
  67. package/src/definition/model/properties/property-validator/builtin/regexp-validator.d.ts +0 -6
  68. package/src/definition/model/properties/property-validator/builtin/regexp-validator.js +0 -30
  69. package/src/definition/model/properties/property-validator/builtin/regexp-validator.spec.js +0 -102
  70. package/src/definition/model/properties/property-validator/index.d.ts +0 -2
  71. package/src/definition/model/properties/property-validator/index.js +0 -2
  72. package/src/definition/model/properties/property-validator/property-validator-registry.d.ts +0 -29
  73. package/src/definition/model/properties/property-validator/property-validator-registry.js +0 -76
  74. package/src/definition/model/properties/property-validator/property-validator-registry.spec.js +0 -132
  75. package/src/definition/model/properties/property-validator/property-validator.d.ts +0 -25
  76. package/src/definition/model/properties/property-validator/property-validator.js +0 -1
  77. package/src/utils/get-ctor-name.d.ts +0 -6
  78. package/src/utils/get-ctor-name.js +0 -11
  79. package/src/utils/get-ctor-name.spec.js +0 -17
  80. package/src/utils/get-decorator-target-type.d.ts +0 -27
  81. package/src/utils/get-decorator-target-type.js +0 -63
  82. package/src/utils/get-decorator-target-type.spec.js +0 -80
  83. package/src/utils/is-ctor.d.ts +0 -8
  84. package/src/utils/is-ctor.js +0 -11
  85. package/src/utils/is-ctor.spec.js +0 -26
  86. package/src/utils/is-pure-object.d.ts +0 -6
  87. package/src/utils/is-pure-object.spec.js +0 -25
  88. package/src/utils/transform-promise.d.ts +0 -13
  89. package/src/utils/transform-promise.js +0 -15
  90. package/src/utils/transform-promise.spec.js +0 -19
package/README.md CHANGED
@@ -15,14 +15,6 @@
15
15
  - [Источник данных](#источник-данных)
16
16
  - [Модель](#модель)
17
17
  - [Свойства](#свойства)
18
- - [Валидаторы](#валидаторы)
19
- - [Глобальные валидаторы](#глобальные-валидаторы)
20
- - [Регистрация глобальных валидаторов](#регистрация-глобальных-валидаторов)
21
- - [Локальные валидаторы](#локальные-валидаторы)
22
- - [Трансформеры](#трансформеры)
23
- - [Глобальные трансформеры](#глобальные-трансформеры)
24
- - [Регистрация глобальных трансформеров](#регистрация-глобальных-трансформеров)
25
- - [Локальные трансформеры](#локальные-трансформеры)
26
18
  - [Пустые значения](#пустые-значения)
27
19
  - [Переопределение пустых значений](#переопределение-пустых-значений)
28
20
  - [Репозиторий](#репозиторий)
@@ -86,10 +78,9 @@ const {DatabaseSchema} = require('@e22m4u/js-repository');
86
78
  Модуль позволяет абстрагироваться от различных интерфейсов баз данных,
87
79
  представляя их как именованные *источники данных*, подключаемые к *моделям*.
88
80
  *Модель* же описывает таблицу базы, колонки которой являются свойствами
89
- модели. Свойства модели могут иметь определенный *тип* допустимого значения,
90
- набор *валидаторов* и *трансформеров*, через которые проходят данные перед
91
- записью в базу. Кроме того, *модель* может определять классические связи
92
- «один к одному», «один ко многим» и другие типы отношений между моделями.
81
+ модели. Свойства модели могут иметь определенный *тип* допустимого значения.
82
+ Кроме того, *модель* может определять классические связи «один к одному»,
83
+ «один ко многим» и другие типы отношений между моделями.
93
84
 
94
85
  Непосредственно чтение и запись данных производится с помощью *репозитория*,
95
86
  который есть у каждой модели с объявленным *источником данных*. Репозиторий
@@ -401,7 +392,6 @@ dbs.defineModel({
401
392
  - `columnType: string` тип колонки (определяется адаптером)
402
393
  - `required: boolean` объявить свойство обязательным
403
394
  - `default: any` значение по умолчанию
404
- - `validate: string | Function | array | object` см. [Валидаторы](#Валидаторы)
405
395
  - `unique: boolean | string` проверять значение на уникальность
406
396
 
407
397
  **Параметр `unique`**
@@ -483,522 +473,6 @@ dbs.defineModel({
483
473
  });
484
474
  ```
485
475
 
486
- ## Валидаторы
487
-
488
- Валидаторы используются для проверки значения свойства перед записью в базу.
489
- Проверка значения валидатором выполняется сразу после проверки типа, указанного
490
- в определении свойства модели. [Пустые значения](#пустые-значения) пропускают
491
- проверку валидаторами, так как не имеют полезной нагрузки.
492
-
493
- ### Глобальные валидаторы
494
-
495
- Модуль поставляется с набором глобальных валидаторов:
496
-
497
- - `regexp` проверка по регулярному выражению,
498
- *параметр: `string | RegExp` - регулярное выражение;*
499
-
500
- - `maxLength` максимальная длина строки или массива,
501
- *параметр: `number` - максимальная длина;*
502
-
503
- - `minLength` минимальная длина строки или массива,
504
- *параметр: `number` - минимальная длина;*
505
-
506
- Валидаторы указанные ниже находятся в разработке:
507
-
508
- - `isLowerCase` проверка регистра (только строчные буквы);
509
- - `isUpperCase` проверка регистра (только прописные буквы);
510
- - `isEmail` проверка формата электронного адреса;
511
-
512
- **Примеры**
513
-
514
- Использование глобального валидатора.
515
-
516
- ```js
517
- dbs.defineModel({
518
- name: 'user',
519
- properties: {
520
- email: {
521
- type: DataType.STRING,
522
- validate: 'isEmail',
523
- },
524
- },
525
- });
526
- ```
527
-
528
- Использование глобальных валидаторов в виде массива.
529
-
530
- ```js
531
- dbs.defineModel({
532
- name: 'user',
533
- properties: {
534
- email: {
535
- type: DataType.STRING,
536
- validate: [
537
- 'isEmail',
538
- 'isLowerCase',
539
- ],
540
- },
541
- },
542
- });
543
- ```
544
-
545
- Использование глобальных валидаторов с передачей аргументов.
546
-
547
- ```js
548
- dbs.defineModel({
549
- name: 'user',
550
- properties: {
551
- name: {
552
- type: DataType.STRING,
553
- validate: {
554
- minLength: 2,
555
- maxLength: 24,
556
- regexp: /^[a-zA-Z-']+$/,
557
- },
558
- },
559
- },
560
- });
561
- ```
562
-
563
- Глобальные валидаторы без параметров могут принимать любые аргументы.
564
-
565
- ```js
566
- dbs.defineModel({
567
- name: 'user',
568
- properties: {
569
- email: {
570
- type: DataType.STRING,
571
- validate: {
572
- maxLength: 100,
573
- // так как валидатор "isEmail" не имеет параметров,
574
- // его определение допускает передачу любого значения
575
- // в качестве аргумента
576
- isEmail: true,
577
- },
578
- },
579
- },
580
- });
581
- ```
582
-
583
- ### Регистрация глобальных валидаторов
584
-
585
- Валидатором является функция, в которую передается значение соответствующего
586
- поля перед записью в базу. Если во время проверки функция возвращает `false`,
587
- то выбрасывается стандартная ошибка. Подмена стандартной ошибки возможна
588
- с помощью выброса пользовательской ошибки непосредственно внутри проверяющей
589
- функции.
590
-
591
- Регистрация глобального валидатора выполняется методом `addValidator` сервиса
592
- `PropertyValidatorRegistry`, который принимает название валидатора и функцию
593
- для проверки значения.
594
-
595
- **Примеры**
596
-
597
- Регистрация глобального валидатора для проверки формата UUID.
598
-
599
- ```js
600
- import {createError} from 'http-errors';
601
- import {format} from '@e22m4u/js-format';
602
- import {Errorf} from '@e22m4u/js-format';
603
- import {PropertyValidatorRegistry} from '@e22m4u/js-repository';
604
-
605
- // получение экземпляра сервиса
606
- const pvr = dbs.getService(PropertyValidatorRegistry);
607
-
608
- // регулярные выражения для разных версий UUID
609
- const uuidRegex = {
610
- any: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
611
- v4: /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
612
- };
613
-
614
- // регистрация глобального валидатора "isUuid",
615
- // принимающего объект настроек со свойством "version"
616
- pvr.addValidator('isUuid', (value, options, context) => {
617
- // value - проверяемое значение;
618
- // options - параметры валидатора;
619
- // context - информация о проверяемом свойстве;
620
- console.log(options);
621
- // {
622
- // version: 'v4'
623
- // }
624
- console.log(context);
625
- // {
626
- // validatorName: 'isUuid',
627
- // modelName: 'device',
628
- // propName: 'deviceId'
629
- // }
630
-
631
- // пустые значения не передаются в валидаторы
632
- // (условие ниже никогда не сработает)
633
- if (typeof value !== 'string') return false;
634
- // поиск регулярного выражения для указанной
635
- // версии UUID (из параметров валидатора)
636
- const version = options?.version || 'any';
637
- const regex = uuidRegex[version];
638
- // если регулярное выражение не найдено,
639
- // то выбрасывается внутренняя ошибка
640
- if (!regex)
641
- throw new Errorf(
642
- 'Invalid UUID version %v specified for validator.',
643
- version,
644
- );
645
- // при неудачной проверке выбрасывается
646
- // ошибка 400 BadRequest
647
- if (!regex.test(value)) {
648
- const versionString = version !== 'any' ? ` (version ${version})` : '';
649
- throw createError(400, format(
650
- 'The property %v of the model %v must be a valid UUID%s.',
651
- context.propName,
652
- context.modelName,
653
- versionString,
654
- ));
655
- }
656
- // при успешной проверке возвращается true,
657
- // в противном случае выбрасывается стандартная
658
- // ошибка проверки
659
- return true;
660
- });
661
- ```
662
-
663
- Использование глобального валидатора в определении свойства.
664
-
665
- ```js
666
- // определение модели "device"
667
- dbs.defineModel({
668
- name: 'device',
669
- properties: {
670
- deviceId: {
671
- type: DataType.STRING,
672
- required: true,
673
- validate: {
674
- // значение {version: 'v4'} будет передаваться
675
- // вторым аргументом в функцию-валидатор
676
- isUuid: {version: 'v4'},
677
- },
678
- },
679
- },
680
- });
681
- ```
682
-
683
- ### Локальные валидаторы
684
-
685
- Функция-валидатор может быть передана непосредственно в определении свойства
686
- без предварительной регистрации. Для этого достаточно передать функцию
687
- в параметр `validate` в качестве значения или элемента массива наряду
688
- с другими валидаторами.
689
-
690
- **Примеры**
691
-
692
- Использование локального валидатора для проверки сложности пароля.
693
-
694
- ```js
695
- // валидатор `passwordStrength` проверяет сложность пароля
696
- function passwordStrength(value, options, context) {
697
- // value - проверяемое значение;
698
- // options - не используется;
699
- // context - информация о свойстве;
700
- console.log(context);
701
- // {
702
- // validatorName: 'passwordStrength',
703
- // modelName: 'user',
704
- // propName: 'password'
705
- // }
706
- const errors = [];
707
- if (value.length < 8)
708
- errors.push('must be at least 8 characters long');
709
- if (!/\d/.test(value))
710
- errors.push('must contain at least one number');
711
- if (!/[a-zA-Z]/.test(value))
712
- errors.push('must contain at least one letter');
713
- // если одно из условий сработало,
714
- // то выбрасывается ошибка
715
- if (errors.length > 0)
716
- throw createError(400, format(
717
- 'Value of the property %v of the model %v %s.',
718
- context.propName,
719
- context.modelName,
720
- errors.join(', '),
721
- ));
722
- // при успешной проверке возвращается true,
723
- // в противном случае выбрасывается стандартная
724
- // ошибка проверки
725
- return true;
726
- }
727
-
728
- // определение модели "user"
729
- dbs.defineModel({
730
- name: 'user',
731
- properties: {
732
- password: {
733
- type: DataType.STRING,
734
- required: true,
735
- validate: passwordStrength, // <=
736
- // или
737
- // validate: [passwordStrength, ...]
738
- },
739
- },
740
- });
741
- ```
742
-
743
- Использование анонимной функции-валидатора для проверки слага.
744
-
745
- ```js
746
- // определение модели "article"
747
- dbs.defineModel({
748
- name: 'article',
749
- properties: {
750
- slug: {
751
- type: DataType.STRING,
752
- validate: (value) => {
753
- const re = /^[a-z0-9]+(-[a-z0-9]+)*$/;
754
- return re.test(value);
755
- },
756
- },
757
- },
758
- });
759
- ```
760
-
761
- ## Трансформеры
762
-
763
- Трансформеры используются для модификации значения свойства перед проверкой
764
- типа и передачей данных в базу. Трансформеры позволяют автоматически очищать
765
- или приводить данные к нужному формату. [Пустые значения](#Пустые-значения)
766
- не передаются в трансформеры, так как не имеют полезной нагрузки.
767
-
768
- ### Глобальные трансформеры
769
-
770
- Модуль поставляется с набором глобальных трансформеров:
771
-
772
- - `trim` удаление пробельных символов с начала и конца строки;
773
- - `toUpperCase` перевод строки в верхний регистр;
774
- - `toLowerCase` перевод строки в нижний регистр;
775
-
776
- Трансформеры указанные ниже находятся в разработке:
777
-
778
- - `cut` усечение строки или массива до указанной длины,
779
- *параметр: `number` - максимальная длина;*
780
-
781
- - `truncate` усечение строки с добавлением троеточия,
782
- *параметр: `number` - максимальная длина;*
783
-
784
- - `capitalize` перевод первой буквы каждого слова в верхний регистр,
785
- *параметр: `{firstWordOnly?: boolean}`;*
786
-
787
- **Примеры**
788
-
789
- Использование глобального трансформера.
790
-
791
- ```js
792
- dbs.defineModel({
793
- name: 'user',
794
- properties: {
795
- username: {
796
- type: DataType.STRING,
797
- transform: 'toLowerCase',
798
- },
799
- },
800
- });
801
- ```
802
-
803
- Использование глобальных трансформеров в виде массива.
804
-
805
- ```js
806
- dbs.defineModel({
807
- name: 'user',
808
- properties: {
809
- firstName: {
810
- type: DataType.STRING,
811
- transform: [
812
- 'trim',
813
- 'capitalize',
814
- ],
815
- },
816
- },
817
- });
818
- ```
819
-
820
- Использование глобальных трансформеров с передачей аргументов.
821
-
822
- ```js
823
- dbs.defineModel({
824
- name: 'article',
825
- properties: {
826
- annotation: {
827
- type: DataType.STRING,
828
- transform: {
829
- truncate: 200,
830
- capitalize: {firstWordOnly: true},
831
- },
832
- },
833
- },
834
- });
835
- ```
836
-
837
- Глобальные трансформеры без параметров могут принимать любые аргументы.
838
-
839
- ```js
840
- dbs.defineModel({
841
- name: 'user',
842
- properties: {
843
- firstName: {
844
- type: DataType.STRING,
845
- transform: {
846
- cut: 60,
847
- // так как трансформер "trim" не имеет параметров,
848
- // его определение допускает передачу любого значения
849
- // в качестве аргумента
850
- trim: true,
851
- },
852
- },
853
- },
854
- });
855
- ```
856
-
857
- ### Регистрация глобальных трансформеров
858
-
859
- Трансформером является функция, которая принимает значение свойства и возвращает
860
- новое значение. Функция может быть как синхронной, так и асинхронной (возвращать
861
- `Promise`).
862
-
863
- Регистрация глобального трансформера выполняется методом `addTransformer`
864
- сервиса `PropertyTransformerRegistry`, который принимает название трансформера
865
- и саму функцию.
866
-
867
- **Примеры**
868
-
869
- Регистрация глобального трансформера для удаления HTML-тегов.
870
-
871
- ```js
872
- import {PropertyTransformerRegistry} from '@e22m4u/js-repository';
873
-
874
- // получение экземпляра сервиса
875
- const ptr = dbs.getService(PropertyTransformerRegistry);
876
-
877
- // регистрация глобального трансформера "stripTags"
878
- ptr.addTransformer('stripTags', (value, options, context) => {
879
- // value - трансформируемое значение;
880
- // options - настройки трансформера (если переданы);
881
- // context - информация о свойстве;
882
- console.log(context);
883
- // {
884
- // transformerName: 'stripTags',
885
- // modelName: 'comment',
886
- // propName: 'text'
887
- // }
888
-
889
- if (typeof value !== 'string')
890
- return value; // возвращаем как есть, если не строка
891
-
892
- return value.replace(/<[^>]*>?/gm, '');
893
- });
894
- ```
895
-
896
- Использование глобального трансформера в определении модели.
897
-
898
- ```js
899
- dbs.defineModel({
900
- name: 'comment',
901
- properties: {
902
- text: {
903
- type: DataType.STRING,
904
- transform: 'stripTags',
905
- },
906
- },
907
- });
908
- ```
909
-
910
- ### Локальные трансформеры
911
-
912
- Функция-трансформер может быть передана непосредственно в определении свойства без предварительной регистрации. Для этого достаточно передать функцию в параметр `transform` в качестве значения или элемента массива.
913
-
914
- **Примеры**
915
-
916
- Использование локального трансформера для нормализации имен.
917
-
918
- ```js
919
- // функция для нормализации имени
920
- function normalizeName(value, options, context) {
921
- // value - трансформируемое значение
922
- // options - не используется
923
- // context - информация о свойстве
924
- if (!value || typeof value !== 'string') return value;
925
- return value
926
- .trim() // удаление пробелов в начале и конце
927
- .toLowerCase() // перевод к нижнему регистру
928
- .split(' ') // разделение на слова
929
- // перевод к верхнему регистру первой буквы каждого слова
930
- .map(word => word.charAt(0).toUpperCase() + word.slice(1))
931
- .join(' '); // сборка массива в строку
932
- }
933
-
934
- // определение модели "user"
935
- dbs.defineModel({
936
- name: 'user',
937
- properties: {
938
- firstName: {
939
- type: DataType.STRING,
940
- transform: normalizeName, // <=
941
- },
942
- lastName: {
943
- type: DataType.STRING,
944
- transform: normalizeName, // <=
945
- },
946
- },
947
- });
948
- ```
949
-
950
- Использование локального асинхронного трансформера для хэширования пароля.
951
-
952
- ```js
953
- import * as bcrypt from 'bcrypt';
954
-
955
- // асинхронная функция для хеширования значения
956
- async function hash(value, options, context) {
957
- // value - трансформируемое значение
958
- // options - не используется
959
- // context - информация о свойстве
960
- console.log(context);
961
- // {
962
- // transformerName: 'hash',
963
- // modelName: 'user',
964
- // propName: 'password'
965
- // }
966
- const saltRounds = 10;
967
- return bcrypt.hash(value, saltRounds);
968
- }
969
-
970
- // определение модели "user"
971
- dbs.defineModel({
972
- name: 'user',
973
- properties: {
974
- password: {
975
- type: DataType.STRING,
976
- transform: hash, // <=
977
- // или
978
- // transform: [hash, ...]
979
- },
980
- },
981
- });
982
- ```
983
-
984
- Использование анонимной функции-трансформера для коррекции слага.
985
-
986
- ```js
987
- dbs.defineModel({
988
- name: 'article',
989
- properties: {
990
- slug: {
991
- type: DataType.STRING,
992
- transform: (value) => {
993
- if (typeof value !== 'string') return value;
994
- return value.toLowerCase().replace(/\s+/g, '-');
995
- },
996
- },
997
- },
998
- });
999
- ```
1000
-
1001
-
1002
476
  ## Пустые значения
1003
477
 
1004
478
  Разные типы свойств имеют свои наборы пустых значений. Эти наборы используются
@@ -1071,8 +545,8 @@ emptyValuesService.setEmptyValuesOf(DataType.NUMBER, [undefined, null]);
1071
545
  ```
1072
546
 
1073
547
  После этого, значение `0` для свойств типа `DataType.NUMBER` больше не будет
1074
- считаться пустым и будет проходить проверки валидаторами, а также не будет
1075
- заменяться значением по умолчанию.
548
+ считаться пустым и будет проходить проверку с опцией `required`, а также
549
+ не будет заменяться значением по умолчанию.
1076
550
 
1077
551
  ## Репозиторий
1078
552
 
@@ -1571,7 +1045,7 @@ const totalCount = await productRep.count();
1571
1045
 
1572
1046
  ## Фильтрация
1573
1047
 
1574
- Некоторые методы репозитория принимают объект настроек влияющий
1048
+ Некоторые методы репозитория принимают объект настроек, влияющий
1575
1049
  на возвращаемый результат. Максимально широкий набор таких настроек
1576
1050
  имеет первый параметр метода `find`, где ожидается объект содержащий
1577
1051
  набор опций указанных ниже.