@e22m4u/js-repository 0.8.0 → 0.8.1

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 (83) hide show
  1. package/README.md +164 -123
  2. package/dist/cjs/index.cjs +86 -1
  3. package/eslint.config.js +2 -1
  4. package/package.json +15 -8
  5. package/src/adapter/adapter-loader.d.ts +16 -0
  6. package/src/adapter/adapter-registry.d.ts +14 -0
  7. package/src/adapter/adapter.d.ts +153 -0
  8. package/src/adapter/builtin/memory-adapter.d.ts +148 -0
  9. package/src/adapter/builtin/memory-adapter.js +1 -1
  10. package/src/adapter/decorator/data-sanitizing-decorator.d.ts +14 -0
  11. package/src/adapter/decorator/default-values-decorator.d.ts +14 -0
  12. package/src/adapter/decorator/fields-filtering-decorator.d.ts +14 -0
  13. package/src/adapter/decorator/inclusion-decorator.d.ts +14 -0
  14. package/src/adapter/decorator/index.d.ts +5 -0
  15. package/src/adapter/decorator/property-uniqueness-decorator.d.ts +14 -0
  16. package/src/adapter/index.d.ts +3 -0
  17. package/src/database-schema.d.ts +37 -0
  18. package/src/definition/datasource/datasource-definition-validator.d.ts +14 -0
  19. package/src/definition/datasource/datasource-definition.d.ts +8 -0
  20. package/src/definition/datasource/index.d.ts +2 -0
  21. package/src/definition/definition-registry.d.ts +50 -0
  22. package/src/definition/index.d.ts +3 -0
  23. package/src/definition/model/index.d.ts +6 -0
  24. package/src/definition/model/index.js +1 -0
  25. package/src/definition/model/model-data-sanitizer.d.ts +15 -0
  26. package/src/definition/model/model-definition-utils.d.ts +180 -0
  27. package/src/definition/model/model-definition-validator.d.ts +14 -0
  28. package/src/definition/model/model-definition.d.ts +28 -0
  29. package/src/definition/model/model-definition.js +1 -0
  30. package/src/definition/model/properties/data-type.d.ts +16 -0
  31. package/src/definition/model/properties/index.d.ts +6 -0
  32. package/src/definition/model/properties/index.js +1 -0
  33. package/src/definition/model/properties/primary-keys-definition-validator.d.ts +15 -0
  34. package/src/definition/model/properties/properties-definition-validator.d.ts +15 -0
  35. package/src/definition/model/properties/property-definition.d.ts +23 -0
  36. package/src/definition/model/properties/property-definition.js +1 -0
  37. package/src/definition/model/properties/property-uniqueness-validator.d.ts +31 -0
  38. package/src/definition/model/properties/property-uniqueness.d.ts +14 -0
  39. package/src/definition/model/relations/index.d.ts +3 -0
  40. package/src/definition/model/relations/index.js +1 -0
  41. package/src/definition/model/relations/relation-definition.d.ts +236 -0
  42. package/src/definition/model/relations/relation-definition.js +1 -0
  43. package/src/definition/model/relations/relation-type.d.ts +14 -0
  44. package/src/definition/model/relations/relations-definition-validator.d.ts +15 -0
  45. package/src/errors/index.d.ts +3 -0
  46. package/src/errors/invalid-argument-error.d.ts +6 -0
  47. package/src/errors/invalid-operator-value-error.d.ts +13 -0
  48. package/src/errors/not-implemented-error.d.ts +6 -0
  49. package/src/filter/fields-clause-tool.d.ts +38 -0
  50. package/src/filter/filter-clause.d.ts +348 -0
  51. package/src/filter/include-clause-tool.d.ts +55 -0
  52. package/src/filter/index.d.ts +7 -0
  53. package/src/filter/operator-clause-tool.d.ts +224 -0
  54. package/src/filter/order-clause-tool.d.ts +32 -0
  55. package/src/filter/slice-clause-tool.d.ts +30 -0
  56. package/src/filter/where-clause-tool.d.ts +23 -0
  57. package/src/index.d.ts +9 -0
  58. package/src/index.js +1 -0
  59. package/src/relations/belongs-to-resolver.d.ts +46 -0
  60. package/src/relations/has-many-resolver.d.ts +67 -0
  61. package/src/relations/has-one-resolver.d.ts +67 -0
  62. package/src/relations/index.d.ts +4 -0
  63. package/src/relations/references-many-resolver.d.ts +27 -0
  64. package/src/repository/index.d.ts +2 -0
  65. package/src/repository/repository-registry.d.ts +29 -0
  66. package/src/repository/repository.d.ts +183 -0
  67. package/src/types.d.ts +43 -0
  68. package/src/types.js +1 -0
  69. package/src/utils/capitalize.d.ts +6 -0
  70. package/src/utils/clone-deep.d.ts +6 -0
  71. package/src/utils/exclude-object-keys.d.ts +10 -0
  72. package/src/utils/get-value-by-path.d.ts +12 -0
  73. package/src/utils/index.d.ts +12 -0
  74. package/src/utils/is-deep-equal.d.ts +10 -0
  75. package/src/utils/is-plain-object.d.ts +6 -0
  76. package/src/utils/is-promise.d.ts +10 -0
  77. package/src/utils/like-to-regexp.d.ts +14 -0
  78. package/src/utils/model-name-to-model-key.d.ts +6 -0
  79. package/src/utils/select-object-keys.d.ts +10 -0
  80. package/src/utils/singularize.d.ts +6 -0
  81. package/src/utils/string-to-regexp.d.ts +10 -0
  82. package/tsconfig.json +14 -0
  83. package/jsconfig.json +0 -7
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'` исключить из проверки [пустые значения](#Пустые-значения)
@@ -522,15 +503,26 @@ 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
 
@@ -563,24 +555,24 @@ emptyValuesService.setEmptyValuesOf(DataType.NUMBER, [undefined, null]);
563
555
 
564
556
  **Методы**
565
557
 
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) удалить все документы или по условию;
558
+ - [`create(data, filter = undefined)`](#repositorycreate) создать новый документ;
559
+ - [`replaceById(id, data, filter = undefined)`](#repositoryreplacebyid) заменить документ полностью;
560
+ - [`replaceOrCreate(data, filter = undefined)`](#repositoryreplaceorcreate) заменить или создать новый;
561
+ - [`patchById(id, data, filter = undefined)`](#repositorypatchbyid) обновить документ частично;
562
+ - [`patch(data, where = undefined)`](#repositorypatch) обновить все документы или по условию;
563
+ - [`find(filter = undefined)`](#repositoryfind) найти все документы или по условию;
564
+ - [`findOne(filter = undefined)`](#repositoryfindone) найти первый документ или по условию;
565
+ - [`findById(id, filter = undefined)`](#repositoryfindbyid) найти документ по идентификатору;
566
+ - [`delete(where = undefined)`](#repositorydelete) удалить все документы или по условию;
575
567
  - [`deleteById(id)`](#repositorydeletebyid) удалить документ по идентификатору;
576
568
  - [`exists(id)`](#repositoryexists) проверить существование по идентификатору;
577
- - [`count([where])`](#repositorycount) подсчет всех документов или по условию;
569
+ - [`count(where = undefined)`](#repositorycount) подсчет всех документов или по условию;
578
570
 
579
571
  **Аргументы**
580
572
 
581
573
  - `id: number|string` идентификатор (первичный ключ)
582
574
  - `data: object` данные документа (используется при записи)
583
- - `where: object` условия выборки (см. [`where`](#where))
575
+ - `where: object` условия фильтрации (см. [Фильтрация](#Фильтрация))
584
576
  - `filter: object` параметры выборки (см. [Фильтрация](#Фильтрация))
585
577
 
586
578
  **Получение репозитория**
@@ -620,10 +612,12 @@ const modelRep = dbs.getRepository('myModel');
620
612
 
621
613
  Сигнатура:
622
614
 
623
- - `create(data, [filter])`
624
- - `data: object`: данные нового документа;
625
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
626
- - результат: `Promise<object>`;
615
+ ```ts
616
+ create(
617
+ data: WithOptionalId<FlatData, IdName>,
618
+ filter?: ItemFilterClause<FlatData>,
619
+ ): Promise<FlatData>;
620
+ ```
627
621
 
628
622
  **Примеры**
629
623
 
@@ -684,11 +678,13 @@ console.log(product);
684
678
 
685
679
  Сигнатура:
686
680
 
687
- - `replaceById(id, data, [filter])`
688
- - `id: number|string`: идентификатор документа;
689
- - `data: object`: новые данные;
690
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
691
- - результат: `Promise<object>`;
681
+ ```ts
682
+ replaceById(
683
+ id: IdType,
684
+ data: WithoutId<FlatData, IdName>,
685
+ filter?: ItemFilterClause<FlatData>,
686
+ ): Promise<FlatData>;
687
+ ```
692
688
 
693
689
  **Примеры**
694
690
 
@@ -724,10 +720,12 @@ console.log(updatedProduct);
724
720
 
725
721
  Сигнатура:
726
722
 
727
- - `replaceOrCreate(data, [filter])`
728
- - `data: object`: данные документа;
729
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
730
- - результат: `Promise<object>`;
723
+ ```ts
724
+ replaceOrCreate(
725
+ data: WithOptionalId<FlatData, IdName>,
726
+ filter?: ItemFilterClause<FlatData>,
727
+ ): Promise<FlatData>;
728
+ ```
731
729
 
732
730
  **Примеры**
733
731
 
@@ -770,11 +768,13 @@ console.log(updatedProduct);
770
768
 
771
769
  Сигнатура:
772
770
 
773
- - `patchById(id, data, [filter])`
774
- - `id: number|string`: идентификатор обновляемого документа;
775
- - `data: object`: новые данные;
776
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
777
- - результат: `Promise<object>`;
771
+ ```ts
772
+ patchById(
773
+ id: IdType,
774
+ data: PartialWithoutId<FlatData, IdName>,
775
+ filter?: ItemFilterClause<FlatData>,
776
+ ): Promise<FlatData>;
777
+ ```
778
778
 
779
779
  **Примеры**
780
780
 
@@ -808,10 +808,12 @@ console.log(updatedProduct);
808
808
 
809
809
  Сигнатура:
810
810
 
811
- - `patch(data, [where])`
812
- - `data: object`: новые данные;
813
- - `where?: object`: условия выборки (см. [`where`](#where));
814
- - результат: `Promise<number>`;
811
+ ```ts
812
+ patch(
813
+ data: PartialWithoutId<FlatData, IdName>,
814
+ where?: WhereClause<FlatData>,
815
+ ): Promise<number>;
816
+ ```
815
817
 
816
818
  **Примеры**
817
819
 
@@ -841,9 +843,9 @@ const totalCount = await productRep.patch({
841
843
 
842
844
  Сигнатура:
843
845
 
844
- - `find([filter])`
845
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
846
- - результат: `Promise<object[]>`;
846
+ ```ts
847
+ find(filter?: FilterClause<FlatData>): Promise<FlatData[]>;
848
+ ```
847
849
 
848
850
  **Примеры**
849
851
 
@@ -877,9 +879,11 @@ const latestProducts = await productRep.find({
877
879
 
878
880
  Сигнатура:
879
881
 
880
- - `findOne([filter])`
881
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
882
- - результат: `Promise<object|undefined>`;
882
+ ```ts
883
+ findOne(
884
+ filter?: FilterClause<FlatData>,
885
+ ): Promise<FlatData | undefined>;
886
+ ```
883
887
 
884
888
  **Примеры**
885
889
 
@@ -910,10 +914,12 @@ if (!product) {
910
914
 
911
915
  Сигнатура:
912
916
 
913
- - `findById(id, [filter])`
914
- - `id: number|string`: идентификатор документа;
915
- - `filter?: object`: настройки выборки (см. [Фильтрация](#фильтрация));
916
- - результат: `Promise<object|undefined>`;
917
+ ```ts
918
+ findById(
919
+ id: IdType,
920
+ filter?: ItemFilterClause<FlatData>,
921
+ ): Promise<FlatData>;
922
+ ```
917
923
 
918
924
  **Примеры**
919
925
 
@@ -944,9 +950,9 @@ const product = await productRep.findById(1, {
944
950
 
945
951
  Сигнатура:
946
952
 
947
- - `delete([where])`
948
- - `where?: object`: условия выборки (см. [`where`](#where));
949
- - результат: `Promise<number>`;
953
+ ```ts
954
+ delete(where?: WhereClause<FlatData>): Promise<number>;
955
+ ```
950
956
 
951
957
  **Примеры**
952
958
 
@@ -971,15 +977,9 @@ const totalCount = await productRep.delete();
971
977
 
972
978
  Сигнатура:
973
979
 
974
- - `deleteById(id)`
975
- - `id: number|string`: идентификатор документа;
976
- - результат: `Promise<boolean>`;
977
-
978
- Результат:
979
-
980
- - `Promise<boolean>`: логическое значение;
981
- - `true`: документ был найден и удален;
982
- - `false`: документ не найден;
980
+ ```ts
981
+ deleteById(id: IdType): Promise<boolean>;
982
+ ```
983
983
 
984
984
  **Примеры**
985
985
 
@@ -1001,15 +1001,9 @@ if (wasDeleted) {
1001
1001
 
1002
1002
  Сигнатура:
1003
1003
 
1004
- - `exists(id)`
1005
- - `id: number|string`: идентификатор документа;
1006
- - результат: `Promise<boolean>`;
1007
-
1008
- Результат:
1009
-
1010
- - `Promise<boolean>`: логическое значение;
1011
- - `true`: документ с таким идентификатором найден;
1012
- - `false`: идентификатор не найден;
1004
+ ```ts
1005
+ exists(id: IdType): Promise<boolean>;
1006
+ ```
1013
1007
 
1014
1008
  **Примеры**
1015
1009
 
@@ -1029,9 +1023,9 @@ if (productExists) {
1029
1023
 
1030
1024
  Сигнатура:
1031
1025
 
1032
- - `count([where])`
1033
- - `where?: object`: условия выборки (см. [`where`](#where));
1034
- - результат: `Promise<number>`;
1026
+ ```ts
1027
+ count(where?: WhereClause<FlatData>): Promise<number>;
1028
+ ```
1035
1029
 
1036
1030
  **Примеры**
1037
1031
 
@@ -1051,10 +1045,10 @@ const totalCount = await productRep.count();
1051
1045
 
1052
1046
  ## Фильтрация
1053
1047
 
1054
- Некоторые методы репозитория принимают объект настроек возвращаемого
1055
- результата. Максимально широкий набор таких настроек имеет первый
1056
- параметр метода `find`, где ожидается объект, содержащий набор
1057
- опций указанных ниже.
1048
+ Некоторые методы репозитория принимают объект настроек, влияющий
1049
+ на возвращаемый результат. Максимально широкий набор таких настроек
1050
+ имеет первый параметр метода `find`, где ожидается объект содержащий
1051
+ набор опций указанных ниже.
1058
1052
 
1059
1053
  - `where: object` условия фильтрации по свойствам документа;
1060
1054
  - `order: string|string[]` сортировка по указанным свойствам;
@@ -1923,7 +1917,7 @@ dbs.defineModel({
1923
1917
 
1924
1918
  #### Has One (полиморфная версия)
1925
1919
 
1926
- Обратная сторона полиморфной связи `belongsTo` по принципу *"один к одному"*.
1920
+ Обратная сторона полиморфная связи `belongsTo` по принципу *"один к одному"*.
1927
1921
 
1928
1922
  ```
1929
1923
  Текущая (company) <───────┐ Целевая (license)
@@ -1990,7 +1984,7 @@ dbs.defineModel({
1990
1984
 
1991
1985
  #### Has Many (полиморфная версия)
1992
1986
 
1993
- Обратная сторона полиморфной связи `belongsTo` по принципу *"один ко многим"*.
1987
+ Обратная сторона полиморфная связи `belongsTo` по принципу *"один ко многим"*.
1994
1988
 
1995
1989
  ```
1996
1990
  Текущая (letter) <─────────┐ Целевая (file)
@@ -2103,9 +2097,56 @@ const rep = dbs.getRepository('model');
2103
2097
  console.log(rep instanceof MyRepository); // true
2104
2098
  ```
2105
2099
 
2106
- *i. Так как экземпляры репозитория кэшируются, то замену конструктора
2100
+ *i. Так как экземпляры репозитория кэшируется, то замену конструктора
2107
2101
  следует выполнять до обращения к методу `getRepository`.*
2108
2102
 
2103
+ ## TypeScript
2104
+
2105
+ Получение типизированного репозитория с указанием интерфейса модели.
2106
+
2107
+ ```ts
2108
+ import {DataType} from '@e22m4u/js-repository';
2109
+ import {RelationType} from '@e22m4u/js-repository';
2110
+ import {DatabaseSchema} from '@e22m4u/js-repository';
2111
+
2112
+ // const dbs = new DatabaseSchema();
2113
+ // dbs.defineDatasource ...
2114
+
2115
+ // определение модели "city"
2116
+ dbs.defineModel({
2117
+ name: 'city',
2118
+ datasource: 'myDatasource',
2119
+ properties: {
2120
+ name: DataType.STRING,
2121
+ timeZone: DataType.STRING,
2122
+ },
2123
+ });
2124
+
2125
+ // определение интерфейса "city"
2126
+ interface City {
2127
+ id: number;
2128
+ name?: string;
2129
+ timeZone?: string;
2130
+ }
2131
+
2132
+ // при получении репозитория нужной модели
2133
+ // можно указать тип документов
2134
+ const cityRep = dbs.getRepository<City>('city');
2135
+
2136
+ // теперь, методы репозитория возвращают
2137
+ // тип City вместо Record<string, unknown>
2138
+ const city: City = await cityRep.create({
2139
+ name: 'Moscow',
2140
+ timeZone: 'Europe/Moscow',
2141
+ });
2142
+ ```
2143
+
2144
+ Для определения моделей с помощью TypeScript классов,
2145
+ рекомендуется использовать специальную версию данного модуля
2146
+ [@e22m4u/ts-repository](https://www.npmjs.com/package/@e22m4u/ts-repository),
2147
+ поставляемую с набором TypeScript декораторов и дополнительных
2148
+ инструментов для работы в TypeScript окружении.
2149
+
2109
2150
  ## Тесты
2110
2151
 
2111
2152
  ```bash