@e22m4u/js-repository 0.8.0 → 0.8.2

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 (96) hide show
  1. package/.mocharc.json +2 -1
  2. package/README.md +175 -135
  3. package/dist/cjs/index.cjs +86 -1
  4. package/eslint.config.js +2 -1
  5. package/mocha.setup.js +6 -0
  6. package/package.json +21 -15
  7. package/src/adapter/adapter-loader.d.ts +16 -0
  8. package/src/adapter/adapter-registry.d.ts +14 -0
  9. package/src/adapter/adapter.d.ts +153 -0
  10. package/src/adapter/adapter.spec.js +2 -2
  11. package/src/adapter/builtin/memory-adapter.d.ts +148 -0
  12. package/src/adapter/builtin/memory-adapter.js +1 -1
  13. package/src/adapter/decorator/data-sanitizing-decorator.d.ts +14 -0
  14. package/src/adapter/decorator/data-sanitizing-decorator.spec.js +7 -7
  15. package/src/adapter/decorator/default-values-decorator.d.ts +14 -0
  16. package/src/adapter/decorator/default-values-decorator.spec.js +2 -2
  17. package/src/adapter/decorator/fields-filtering-decorator.d.ts +14 -0
  18. package/src/adapter/decorator/fields-filtering-decorator.spec.js +7 -27
  19. package/src/adapter/decorator/inclusion-decorator.d.ts +14 -0
  20. package/src/adapter/decorator/inclusion-decorator.spec.js +2 -2
  21. package/src/adapter/decorator/index.d.ts +5 -0
  22. package/src/adapter/decorator/property-uniqueness-decorator.d.ts +14 -0
  23. package/src/adapter/decorator/property-uniqueness-decorator.spec.js +2 -2
  24. package/src/adapter/index.d.ts +3 -0
  25. package/src/database-schema.d.ts +37 -0
  26. package/src/definition/datasource/datasource-definition-validator.d.ts +14 -0
  27. package/src/definition/datasource/datasource-definition.d.ts +8 -0
  28. package/src/definition/datasource/index.d.ts +2 -0
  29. package/src/definition/definition-registry.d.ts +50 -0
  30. package/src/definition/definition-registry.spec.js +4 -4
  31. package/src/definition/index.d.ts +3 -0
  32. package/src/definition/model/index.d.ts +6 -0
  33. package/src/definition/model/index.js +1 -0
  34. package/src/definition/model/model-data-sanitizer.d.ts +15 -0
  35. package/src/definition/model/model-definition-utils.d.ts +180 -0
  36. package/src/definition/model/model-definition-utils.spec.js +2 -2
  37. package/src/definition/model/model-definition-validator.d.ts +14 -0
  38. package/src/definition/model/model-definition-validator.spec.js +4 -4
  39. package/src/definition/model/model-definition.d.ts +28 -0
  40. package/src/definition/model/model-definition.js +1 -0
  41. package/src/definition/model/properties/data-type.d.ts +16 -0
  42. package/src/definition/model/properties/index.d.ts +6 -0
  43. package/src/definition/model/properties/index.js +1 -0
  44. package/src/definition/model/properties/primary-keys-definition-validator.d.ts +15 -0
  45. package/src/definition/model/properties/properties-definition-validator.d.ts +15 -0
  46. package/src/definition/model/properties/properties-definition-validator.spec.js +3 -3
  47. package/src/definition/model/properties/property-definition.d.ts +23 -0
  48. package/src/definition/model/properties/property-definition.js +1 -0
  49. package/src/definition/model/properties/property-uniqueness-validator.d.ts +31 -0
  50. package/src/definition/model/properties/property-uniqueness.d.ts +14 -0
  51. package/src/definition/model/relations/index.d.ts +3 -0
  52. package/src/definition/model/relations/index.js +1 -0
  53. package/src/definition/model/relations/relation-definition.d.ts +236 -0
  54. package/src/definition/model/relations/relation-definition.js +1 -0
  55. package/src/definition/model/relations/relation-type.d.ts +14 -0
  56. package/src/definition/model/relations/relations-definition-validator.d.ts +15 -0
  57. package/src/errors/index.d.ts +3 -0
  58. package/src/errors/invalid-argument-error.d.ts +6 -0
  59. package/src/errors/invalid-operator-value-error.d.ts +13 -0
  60. package/src/errors/not-implemented-error.d.ts +6 -0
  61. package/src/filter/fields-clause-tool.d.ts +38 -0
  62. package/src/filter/filter-clause.d.ts +348 -0
  63. package/src/filter/include-clause-tool.d.ts +55 -0
  64. package/src/filter/index.d.ts +7 -0
  65. package/src/filter/operator-clause-tool.d.ts +224 -0
  66. package/src/filter/order-clause-tool.d.ts +32 -0
  67. package/src/filter/slice-clause-tool.d.ts +30 -0
  68. package/src/filter/where-clause-tool.d.ts +23 -0
  69. package/src/index.d.ts +9 -0
  70. package/src/index.js +1 -0
  71. package/src/relations/belongs-to-resolver.d.ts +46 -0
  72. package/src/relations/has-many-resolver.d.ts +67 -0
  73. package/src/relations/has-one-resolver.d.ts +67 -0
  74. package/src/relations/index.d.ts +4 -0
  75. package/src/relations/references-many-resolver.d.ts +27 -0
  76. package/src/repository/index.d.ts +2 -0
  77. package/src/repository/repository-registry.d.ts +29 -0
  78. package/src/repository/repository.d.ts +183 -0
  79. package/src/types.d.ts +43 -0
  80. package/src/types.js +1 -0
  81. package/src/utils/capitalize.d.ts +6 -0
  82. package/src/utils/clone-deep.d.ts +6 -0
  83. package/src/utils/exclude-object-keys.d.ts +10 -0
  84. package/src/utils/get-value-by-path.d.ts +12 -0
  85. package/src/utils/index.d.ts +12 -0
  86. package/src/utils/is-deep-equal.d.ts +10 -0
  87. package/src/utils/is-plain-object.d.ts +6 -0
  88. package/src/utils/is-promise.d.ts +10 -0
  89. package/src/utils/like-to-regexp.d.ts +14 -0
  90. package/src/utils/model-name-to-model-key.d.ts +6 -0
  91. package/src/utils/select-object-keys.d.ts +10 -0
  92. package/src/utils/singularize.d.ts +6 -0
  93. package/src/utils/string-to-regexp.d.ts +10 -0
  94. package/tsconfig.json +14 -0
  95. package/jsconfig.json +0 -7
  96. package/src/chai.js +0 -9
package/.mocharc.json CHANGED
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "extension": ["js"],
3
- "spec": "src/**/*.spec.js"
3
+ "spec": "src/**/*.spec.js",
4
+ "require": "mocha.setup.js"
4
5
  }
package/README.md CHANGED
@@ -40,6 +40,7 @@
40
40
  - [Has One (полиморфная)](#has-one-полиморфная-версия)
41
41
  - [Has Many (полиморфная)](#has-many-полиморфная-версия)
42
42
  - [Расширение](#расширение)
43
+ - [TypeScript](#typescript)
43
44
  - [Тесты](#тесты)
44
45
  - [Лицензия](#лицензия)
45
46
 
@@ -81,10 +82,10 @@ const {DatabaseSchema} = require('@e22m4u/js-repository');
81
82
  Кроме того, *модель* может определять классические связи «один к одному»,
82
83
  «один ко многим» и другие типы отношений между моделями.
83
84
 
84
- Непосредственно чтение и запись данных производятся с помощью *репозитория*,
85
+ Непосредственно чтение и запись данных производится с помощью *репозитория*,
85
86
  который есть у каждой модели с объявленным *источником данных*. Репозиторий
86
87
  может фильтровать запрашиваемые документы, выполнять валидацию свойств
87
- согласно определению модели и встраивать связанные данные в результат
88
+ согласно определению модели, и встраивать связанные данные в результат
88
89
  выборки.
89
90
 
90
91
  - *Источник данных* - определяет способ подключения к базе
@@ -256,36 +257,17 @@ console.log(cityWithCountry);
256
257
 
257
258
  ## Схема
258
259
 
259
- Экземпляр класса `DatabaseSchema` хранит определения источников данных
260
- и моделей.
260
+ Экземпляр класса `DatabaseSchema` хранит определения источников данных и моделей.
261
261
 
262
262
  **Методы**
263
263
 
264
- Добавить источник
264
+ - `defineDatasource(datasourceDef: object): this` - добавить источник
265
+ - `defineModel(modelDef: object): this` - добавить модель
266
+ - `getRepository(modelName: string): Repository` - получить репозиторий
265
267
 
266
- - `defineDatasource(datasourceDef)`
267
- - `datasourceDef: object`: определение источника;
268
- - результат: `this`;
269
-
270
- Добавить модель:
271
-
272
- - `defineModel(modelDef)`
273
- - `modelDef: object`: определение модели;
274
- - результат: `this`;
275
-
276
- Получить репозиторий
277
-
278
- - `getRepository(modelName)`
279
- - `modelName: string` имя модели;
280
- - результат: `Repository`;
281
-
282
- **Пример**
283
-
284
- Ниже приводится пошаговый пример настройки модели `product` и получения
285
- экземпляра репозитория, с помощью которого можно управлять данными этой
286
- коллекции.
268
+ **Примеры**
287
269
 
288
- 1\. Импорт класса и создание экземпляра схемы.
270
+ Импорт класса и создание экземпляра схемы.
289
271
 
290
272
  ```js
291
273
  import {DatabaseSchema} from '@e22m4u/js-repository';
@@ -293,7 +275,7 @@ import {DatabaseSchema} from '@e22m4u/js-repository';
293
275
  const dbs = new DatabaseSchema();
294
276
  ```
295
277
 
296
- 2\. Определение нового источника.
278
+ Определение нового источника.
297
279
 
298
280
  ```js
299
281
  dbs.defineDatasource({
@@ -302,7 +284,7 @@ dbs.defineDatasource({
302
284
  });
303
285
  ```
304
286
 
305
- 3\. Определение новой модели.
287
+ Определение новой модели.
306
288
 
307
289
  ```js
308
290
  dbs.defineModel({
@@ -315,7 +297,7 @@ dbs.defineModel({
315
297
  });
316
298
  ```
317
299
 
318
- 4\. Получение репозитория по названию модели.
300
+ Получение репозитория по названию модели.
319
301
 
320
302
  ```js
321
303
  const productRep = dbs.getRepository('product');
@@ -388,7 +370,7 @@ dbs.defineModel({
388
370
  ## Свойства
389
371
 
390
372
  Параметр `properties` находится в определении модели и принимает объект, ключи
391
- которого являются свойствами этой модели, а значениями тип свойства или объект
373
+ которого являются свойствами этой модели, а значением тип свойства или объект
392
374
  с дополнительными параметрами.
393
375
 
394
376
  **Тип данных**
@@ -414,16 +396,15 @@ dbs.defineModel({
414
396
 
415
397
  **Параметр `unique`**
416
398
 
417
- Если значением параметра `unique` является `true` или `'strict'`,
418
- то выполняется строгая проверка на уникальность. В этом режиме
419
- [пустые значения](#Пустые-значения) так же подлежат проверке,
420
- где `null` и `undefined` также считаются значениями, которые
421
- должны быть уникальными.
399
+ Если значением параметра `unique` является `true` или `'strict'`, то выполняется
400
+ строгая проверка на уникальность. В этом режиме [пустые значения](#Пустые-значения)
401
+ так же подлежат проверке, где `null` и `undefined` также считаются значениями,
402
+ которые должны быть уникальными.
422
403
 
423
- Режим `'sparse'` проверяет только значения с полезной нагрузкой,
424
- исключая [пустые значения](#Пустые-значения), список которых отличается
425
- в зависимости от типа свойства. Например, для типа `string` пустыми
426
- значениями будут `undefined`, `null` и `''` (пустая строка).
404
+ Режим `'sparse'` проверяет только значения с полезной нагрузкой, исключая
405
+ [пустые значения](#Пустые-значения), список которых отличается в зависимости
406
+ от типа свойства. Например, для типа `string` пустым значением будет `undefined`,
407
+ `null` и `''` (пустая строка).
427
408
 
428
409
  - `unique: true | 'strict'` строгая проверка на уникальность
429
410
  - `unique: 'sparse'` исключить из проверки [пустые значения](#Пустые-значения)
@@ -504,12 +485,12 @@ dbs.defineModel({
504
485
 
505
486
  | тип | пустые значения |
506
487
  |-------------|---------------------------|
507
- | `'any'` | `undefined`, `null` |
488
+ | `'any'` | `undefined`, `null`, `''` |
508
489
  | `'string'` | `undefined`, `null`, `''` |
509
- | `'number'` | `undefined`, `null`, `0` |
490
+ | `'number'` | `undefined`, `null` |
510
491
  | `'boolean'` | `undefined`, `null` |
511
- | `'array'` | `undefined`, `null`, `[]` |
512
- | `'object'` | `undefined`, `null`, `{}` |
492
+ | `'array'` | `undefined`, `null` |
493
+ | `'object'` | `undefined`, `null` |
513
494
 
514
495
  ### Переопределение пустых значений
515
496
 
@@ -522,21 +503,32 @@ dbs.defineModel({
522
503
  **EmptyValuesService**
523
504
 
524
505
  Для переопределения пустых значений необходимо получить экземпляр класса
525
- `EmptyValuesService` из контейнера схемы и вызвать метод `setEmptyValuesOf`,
526
- который принимает тип данных и массив новых значений.
527
-
528
- Сигнатура:
529
-
530
- - `setEmptyValuesOf(dataType, emptyValues)`
531
- - `dataType: DataType`: строковый литерал типа;
532
- - `emptyValues: *[]`: массив новых значений;
533
- - результат: `this`;
506
+ `EmptyValuesService` из контейнера схемы и вызвать метод, который принимает
507
+ тип данных и массив новых значений.
508
+
509
+ Интерфейс:
510
+
511
+ ```ts
512
+ class EmptyValuesService {
513
+ /**
514
+ * Установить пустые значения
515
+ * для определенного типа данных.
516
+ *
517
+ * @param dataType Тип данных.
518
+ * @param emptyValues Массив новых пустых значений.
519
+ */
520
+ setEmptyValuesOf(
521
+ dataType: DataType,
522
+ emptyValues: unknown[],
523
+ ): this;
524
+ }
525
+ ```
534
526
 
535
527
  **Пример**
536
528
 
537
- По умолчанию, для числовых свойств значение `0` считается пустым. Следующий
538
- пример демонстрирует, как изменить это поведение, оставив в качестве пустых
539
- значений только `undefined` и `null`.
529
+ Если строковое свойство является обязательным, то значение `""` (пустая строка)
530
+ приведет к ошибке. Следующий пример демонстрирует, как изменить данное
531
+ поведение, оставив в качестве пустых значений только `undefined` и `null`.
540
532
 
541
533
  ```js
542
534
  import {DataType} from '@e22m4u/js-repository';
@@ -548,13 +540,12 @@ const dbs = new DatabaseSchema();
548
540
  // получение сервиса для работы с пустыми значениями
549
541
  const emptyValuesService = dbs.getService(EmptyValuesService);
550
542
 
551
- // переопределение пустых значений для типа DataType.NUMBER
552
- emptyValuesService.setEmptyValuesOf(DataType.NUMBER, [undefined, null]);
543
+ // переопределение пустых значений для типа DataType.STRING
544
+ emptyValuesService.setEmptyValuesOf(DataType.STRING, [undefined, null]);
553
545
  ```
554
546
 
555
- После этого, значение `0` для свойств типа `DataType.NUMBER` больше не будет
556
- считаться пустым и будет проходить проверку с опцией `required`, а также
557
- не будет заменяться значением по умолчанию.
547
+ Теперь пустая строка будет успешно проходить проверку для свойств
548
+ с типом `string`, а также не будет заменяться на значение по умолчанию.
558
549
 
559
550
  ## Репозиторий
560
551
 
@@ -563,24 +554,24 @@ emptyValuesService.setEmptyValuesOf(DataType.NUMBER, [undefined, null]);
563
554
 
564
555
  **Методы**
565
556
 
566
- - [`create(data, [filter])`](#repositorycreate) создать новый документ;
567
- - [`replaceById(id, data, [filter])`](#repositoryreplacebyid) заменить документ полностью;
568
- - [`replaceOrCreate(data, [filter])`](#repositoryreplaceorcreate) заменить или создать новый;
569
- - [`patchById(id, data, [filter])`](#repositorypatchbyid) обновить документ частично;
570
- - [`patch(data, [where])`](#repositorypatch) обновить все документы или по условию;
571
- - [`find([filter])`](#repositoryfind) найти все документы или по условию;
572
- - [`findOne([filter])`](#repositoryfindone) найти первый документ или по условию;
573
- - [`findById(id, [filter])`](#repositoryfindbyid) найти документ по идентификатору;
574
- - [`delete([where])`](#repositorydelete) удалить все документы или по условию;
557
+ - [`create(data, filter = undefined)`](#repositorycreate) создать новый документ;
558
+ - [`replaceById(id, data, filter = undefined)`](#repositoryreplacebyid) заменить документ полностью;
559
+ - [`replaceOrCreate(data, filter = undefined)`](#repositoryreplaceorcreate) заменить или создать новый;
560
+ - [`patchById(id, data, filter = undefined)`](#repositorypatchbyid) обновить документ частично;
561
+ - [`patch(data, where = undefined)`](#repositorypatch) обновить все документы или по условию;
562
+ - [`find(filter = undefined)`](#repositoryfind) найти все документы или по условию;
563
+ - [`findOne(filter = undefined)`](#repositoryfindone) найти первый документ или по условию;
564
+ - [`findById(id, filter = undefined)`](#repositoryfindbyid) найти документ по идентификатору;
565
+ - [`delete(where = undefined)`](#repositorydelete) удалить все документы или по условию;
575
566
  - [`deleteById(id)`](#repositorydeletebyid) удалить документ по идентификатору;
576
567
  - [`exists(id)`](#repositoryexists) проверить существование по идентификатору;
577
- - [`count([where])`](#repositorycount) подсчет всех документов или по условию;
568
+ - [`count(where = undefined)`](#repositorycount) подсчет всех документов или по условию;
578
569
 
579
570
  **Аргументы**
580
571
 
581
572
  - `id: number|string` идентификатор (первичный ключ)
582
573
  - `data: object` данные документа (используется при записи)
583
- - `where: object` условия выборки (см. [`where`](#where))
574
+ - `where: object` условия фильтрации (см. [Фильтрация](#Фильтрация))
584
575
  - `filter: object` параметры выборки (см. [Фильтрация](#Фильтрация))
585
576
 
586
577
  **Получение репозитория**
@@ -620,10 +611,12 @@ const modelRep = dbs.getRepository('myModel');
620
611
 
621
612
  Сигнатура:
622
613
 
623
- - `create(data, [filter])`
624
- - `data: object`: данные нового документа;
625
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
626
- - результат: `Promise<object>`;
614
+ ```ts
615
+ create(
616
+ data: WithOptionalId<FlatData, IdName>,
617
+ filter?: ItemFilterClause<FlatData>,
618
+ ): Promise<FlatData>;
619
+ ```
627
620
 
628
621
  **Примеры**
629
622
 
@@ -684,11 +677,13 @@ console.log(product);
684
677
 
685
678
  Сигнатура:
686
679
 
687
- - `replaceById(id, data, [filter])`
688
- - `id: number|string`: идентификатор документа;
689
- - `data: object`: новые данные;
690
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
691
- - результат: `Promise<object>`;
680
+ ```ts
681
+ replaceById(
682
+ id: IdType,
683
+ data: WithoutId<FlatData, IdName>,
684
+ filter?: ItemFilterClause<FlatData>,
685
+ ): Promise<FlatData>;
686
+ ```
692
687
 
693
688
  **Примеры**
694
689
 
@@ -724,10 +719,12 @@ console.log(updatedProduct);
724
719
 
725
720
  Сигнатура:
726
721
 
727
- - `replaceOrCreate(data, [filter])`
728
- - `data: object`: данные документа;
729
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
730
- - результат: `Promise<object>`;
722
+ ```ts
723
+ replaceOrCreate(
724
+ data: WithOptionalId<FlatData, IdName>,
725
+ filter?: ItemFilterClause<FlatData>,
726
+ ): Promise<FlatData>;
727
+ ```
731
728
 
732
729
  **Примеры**
733
730
 
@@ -770,11 +767,13 @@ console.log(updatedProduct);
770
767
 
771
768
  Сигнатура:
772
769
 
773
- - `patchById(id, data, [filter])`
774
- - `id: number|string`: идентификатор обновляемого документа;
775
- - `data: object`: новые данные;
776
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
777
- - результат: `Promise<object>`;
770
+ ```ts
771
+ patchById(
772
+ id: IdType,
773
+ data: PartialWithoutId<FlatData, IdName>,
774
+ filter?: ItemFilterClause<FlatData>,
775
+ ): Promise<FlatData>;
776
+ ```
778
777
 
779
778
  **Примеры**
780
779
 
@@ -808,10 +807,12 @@ console.log(updatedProduct);
808
807
 
809
808
  Сигнатура:
810
809
 
811
- - `patch(data, [where])`
812
- - `data: object`: новые данные;
813
- - `where?: object`: условия выборки (см. [`where`](#where));
814
- - результат: `Promise<number>`;
810
+ ```ts
811
+ patch(
812
+ data: PartialWithoutId<FlatData, IdName>,
813
+ where?: WhereClause<FlatData>,
814
+ ): Promise<number>;
815
+ ```
815
816
 
816
817
  **Примеры**
817
818
 
@@ -841,9 +842,9 @@ const totalCount = await productRep.patch({
841
842
 
842
843
  Сигнатура:
843
844
 
844
- - `find([filter])`
845
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
846
- - результат: `Promise<object[]>`;
845
+ ```ts
846
+ find(filter?: FilterClause<FlatData>): Promise<FlatData[]>;
847
+ ```
847
848
 
848
849
  **Примеры**
849
850
 
@@ -877,9 +878,11 @@ const latestProducts = await productRep.find({
877
878
 
878
879
  Сигнатура:
879
880
 
880
- - `findOne([filter])`
881
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
882
- - результат: `Promise<object|undefined>`;
881
+ ```ts
882
+ findOne(
883
+ filter?: FilterClause<FlatData>,
884
+ ): Promise<FlatData | undefined>;
885
+ ```
883
886
 
884
887
  **Примеры**
885
888
 
@@ -910,10 +913,12 @@ if (!product) {
910
913
 
911
914
  Сигнатура:
912
915
 
913
- - `findById(id, [filter])`
914
- - `id: number|string`: идентификатор документа;
915
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
916
- - результат: `Promise<object|undefined>`;
916
+ ```ts
917
+ findById(
918
+ id: IdType,
919
+ filter?: ItemFilterClause<FlatData>,
920
+ ): Promise<FlatData>;
921
+ ```
917
922
 
918
923
  **Примеры**
919
924
 
@@ -944,9 +949,9 @@ const product = await productRep.findById(1, {
944
949
 
945
950
  Сигнатура:
946
951
 
947
- - `delete([where])`
948
- - `where?: object`: условия выборки (см. [`where`](#where));
949
- - результат: `Promise<number>`;
952
+ ```ts
953
+ delete(where?: WhereClause<FlatData>): Promise<number>;
954
+ ```
950
955
 
951
956
  **Примеры**
952
957
 
@@ -971,15 +976,9 @@ const totalCount = await productRep.delete();
971
976
 
972
977
  Сигнатура:
973
978
 
974
- - `deleteById(id)`
975
- - `id: number|string`: идентификатор документа;
976
- - результат: `Promise<boolean>`;
977
-
978
- Результат:
979
-
980
- - `Promise<boolean>`: логическое значение;
981
- - `true`: документ был найден и удален;
982
- - `false`: документ не найден;
979
+ ```ts
980
+ deleteById(id: IdType): Promise<boolean>;
981
+ ```
983
982
 
984
983
  **Примеры**
985
984
 
@@ -1001,15 +1000,9 @@ if (wasDeleted) {
1001
1000
 
1002
1001
  Сигнатура:
1003
1002
 
1004
- - `exists(id)`
1005
- - `id: number|string`: идентификатор документа;
1006
- - результат: `Promise<boolean>`;
1007
-
1008
- Результат:
1009
-
1010
- - `Promise<boolean>`: логическое значение;
1011
- - `true`: документ с таким идентификатором найден;
1012
- - `false`: идентификатор не найден;
1003
+ ```ts
1004
+ exists(id: IdType): Promise<boolean>;
1005
+ ```
1013
1006
 
1014
1007
  **Примеры**
1015
1008
 
@@ -1029,9 +1022,9 @@ if (productExists) {
1029
1022
 
1030
1023
  Сигнатура:
1031
1024
 
1032
- - `count([where])`
1033
- - `where?: object`: условия выборки (см. [`where`](#where));
1034
- - результат: `Promise<number>`;
1025
+ ```ts
1026
+ count(where?: WhereClause<FlatData>): Promise<number>;
1027
+ ```
1035
1028
 
1036
1029
  **Примеры**
1037
1030
 
@@ -1051,10 +1044,10 @@ const totalCount = await productRep.count();
1051
1044
 
1052
1045
  ## Фильтрация
1053
1046
 
1054
- Некоторые методы репозитория принимают объект настроек возвращаемого
1055
- результата. Максимально широкий набор таких настроек имеет первый
1056
- параметр метода `find`, где ожидается объект, содержащий набор
1057
- опций указанных ниже.
1047
+ Некоторые методы репозитория принимают объект настроек, влияющий
1048
+ на возвращаемый результат. Максимально широкий набор таких настроек
1049
+ имеет первый параметр метода `find`, где ожидается объект содержащий
1050
+ набор опций указанных ниже.
1058
1051
 
1059
1052
  - `where: object` условия фильтрации по свойствам документа;
1060
1053
  - `order: string|string[]` сортировка по указанным свойствам;
@@ -1923,7 +1916,7 @@ dbs.defineModel({
1923
1916
 
1924
1917
  #### Has One (полиморфная версия)
1925
1918
 
1926
- Обратная сторона полиморфной связи `belongsTo` по принципу *"один к одному"*.
1919
+ Обратная сторона полиморфная связи `belongsTo` по принципу *"один к одному"*.
1927
1920
 
1928
1921
  ```
1929
1922
  Текущая (company) <───────┐ Целевая (license)
@@ -1990,7 +1983,7 @@ dbs.defineModel({
1990
1983
 
1991
1984
  #### Has Many (полиморфная версия)
1992
1985
 
1993
- Обратная сторона полиморфной связи `belongsTo` по принципу *"один ко многим"*.
1986
+ Обратная сторона полиморфная связи `belongsTo` по принципу *"один ко многим"*.
1994
1987
 
1995
1988
  ```
1996
1989
  Текущая (letter) <─────────┐ Целевая (file)
@@ -2103,9 +2096,56 @@ const rep = dbs.getRepository('model');
2103
2096
  console.log(rep instanceof MyRepository); // true
2104
2097
  ```
2105
2098
 
2106
- *i. Так как экземпляры репозитория кэшируются, то замену конструктора
2099
+ *i. Так как экземпляры репозитория кэшируется, то замену конструктора
2107
2100
  следует выполнять до обращения к методу `getRepository`.*
2108
2101
 
2102
+ ## TypeScript
2103
+
2104
+ Получение типизированного репозитория с указанием интерфейса модели.
2105
+
2106
+ ```ts
2107
+ import {DataType} from '@e22m4u/js-repository';
2108
+ import {RelationType} from '@e22m4u/js-repository';
2109
+ import {DatabaseSchema} from '@e22m4u/js-repository';
2110
+
2111
+ // const dbs = new DatabaseSchema();
2112
+ // dbs.defineDatasource ...
2113
+
2114
+ // определение модели "city"
2115
+ dbs.defineModel({
2116
+ name: 'city',
2117
+ datasource: 'myDatasource',
2118
+ properties: {
2119
+ name: DataType.STRING,
2120
+ timeZone: DataType.STRING,
2121
+ },
2122
+ });
2123
+
2124
+ // определение интерфейса "city"
2125
+ interface City {
2126
+ id: number;
2127
+ name?: string;
2128
+ timeZone?: string;
2129
+ }
2130
+
2131
+ // при получении репозитория нужной модели
2132
+ // можно указать тип документов
2133
+ const cityRep = dbs.getRepository<City>('city');
2134
+
2135
+ // теперь, методы репозитория возвращают
2136
+ // тип City вместо Record<string, unknown>
2137
+ const city: City = await cityRep.create({
2138
+ name: 'Moscow',
2139
+ timeZone: 'Europe/Moscow',
2140
+ });
2141
+ ```
2142
+
2143
+ Для определения моделей с помощью TypeScript классов,
2144
+ рекомендуется использовать специальную версию данного модуля
2145
+ [@e22m4u/ts-repository](https://www.npmjs.com/package/@e22m4u/ts-repository),
2146
+ поставляемую с набором TypeScript декораторов и дополнительных
2147
+ инструментов для работы в TypeScript окружении.
2148
+
2109
2149
  ## Тесты
2110
2150
 
2111
2151
  ```bash