@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.
- package/README.md +164 -123
- package/dist/cjs/index.cjs +86 -1
- package/eslint.config.js +2 -1
- package/package.json +15 -8
- package/src/adapter/adapter-loader.d.ts +16 -0
- package/src/adapter/adapter-registry.d.ts +14 -0
- package/src/adapter/adapter.d.ts +153 -0
- package/src/adapter/builtin/memory-adapter.d.ts +148 -0
- package/src/adapter/builtin/memory-adapter.js +1 -1
- package/src/adapter/decorator/data-sanitizing-decorator.d.ts +14 -0
- package/src/adapter/decorator/default-values-decorator.d.ts +14 -0
- package/src/adapter/decorator/fields-filtering-decorator.d.ts +14 -0
- package/src/adapter/decorator/inclusion-decorator.d.ts +14 -0
- package/src/adapter/decorator/index.d.ts +5 -0
- package/src/adapter/decorator/property-uniqueness-decorator.d.ts +14 -0
- package/src/adapter/index.d.ts +3 -0
- package/src/database-schema.d.ts +37 -0
- package/src/definition/datasource/datasource-definition-validator.d.ts +14 -0
- package/src/definition/datasource/datasource-definition.d.ts +8 -0
- package/src/definition/datasource/index.d.ts +2 -0
- package/src/definition/definition-registry.d.ts +50 -0
- package/src/definition/index.d.ts +3 -0
- package/src/definition/model/index.d.ts +6 -0
- package/src/definition/model/index.js +1 -0
- package/src/definition/model/model-data-sanitizer.d.ts +15 -0
- package/src/definition/model/model-definition-utils.d.ts +180 -0
- package/src/definition/model/model-definition-validator.d.ts +14 -0
- package/src/definition/model/model-definition.d.ts +28 -0
- package/src/definition/model/model-definition.js +1 -0
- package/src/definition/model/properties/data-type.d.ts +16 -0
- package/src/definition/model/properties/index.d.ts +6 -0
- package/src/definition/model/properties/index.js +1 -0
- package/src/definition/model/properties/primary-keys-definition-validator.d.ts +15 -0
- package/src/definition/model/properties/properties-definition-validator.d.ts +15 -0
- package/src/definition/model/properties/property-definition.d.ts +23 -0
- package/src/definition/model/properties/property-definition.js +1 -0
- package/src/definition/model/properties/property-uniqueness-validator.d.ts +31 -0
- package/src/definition/model/properties/property-uniqueness.d.ts +14 -0
- package/src/definition/model/relations/index.d.ts +3 -0
- package/src/definition/model/relations/index.js +1 -0
- package/src/definition/model/relations/relation-definition.d.ts +236 -0
- package/src/definition/model/relations/relation-definition.js +1 -0
- package/src/definition/model/relations/relation-type.d.ts +14 -0
- package/src/definition/model/relations/relations-definition-validator.d.ts +15 -0
- package/src/errors/index.d.ts +3 -0
- package/src/errors/invalid-argument-error.d.ts +6 -0
- package/src/errors/invalid-operator-value-error.d.ts +13 -0
- package/src/errors/not-implemented-error.d.ts +6 -0
- package/src/filter/fields-clause-tool.d.ts +38 -0
- package/src/filter/filter-clause.d.ts +348 -0
- package/src/filter/include-clause-tool.d.ts +55 -0
- package/src/filter/index.d.ts +7 -0
- package/src/filter/operator-clause-tool.d.ts +224 -0
- package/src/filter/order-clause-tool.d.ts +32 -0
- package/src/filter/slice-clause-tool.d.ts +30 -0
- package/src/filter/where-clause-tool.d.ts +23 -0
- package/src/index.d.ts +9 -0
- package/src/index.js +1 -0
- package/src/relations/belongs-to-resolver.d.ts +46 -0
- package/src/relations/has-many-resolver.d.ts +67 -0
- package/src/relations/has-one-resolver.d.ts +67 -0
- package/src/relations/index.d.ts +4 -0
- package/src/relations/references-many-resolver.d.ts +27 -0
- package/src/repository/index.d.ts +2 -0
- package/src/repository/repository-registry.d.ts +29 -0
- package/src/repository/repository.d.ts +183 -0
- package/src/types.d.ts +43 -0
- package/src/types.js +1 -0
- package/src/utils/capitalize.d.ts +6 -0
- package/src/utils/clone-deep.d.ts +6 -0
- package/src/utils/exclude-object-keys.d.ts +10 -0
- package/src/utils/get-value-by-path.d.ts +12 -0
- package/src/utils/index.d.ts +12 -0
- package/src/utils/is-deep-equal.d.ts +10 -0
- package/src/utils/is-plain-object.d.ts +6 -0
- package/src/utils/is-promise.d.ts +10 -0
- package/src/utils/like-to-regexp.d.ts +14 -0
- package/src/utils/model-name-to-model-key.d.ts +6 -0
- package/src/utils/select-object-keys.d.ts +10 -0
- package/src/utils/singularize.d.ts +6 -0
- package/src/utils/string-to-regexp.d.ts +10 -0
- package/tsconfig.json +14 -0
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
278
|
+
Определение нового источника.
|
|
297
279
|
|
|
298
280
|
```js
|
|
299
281
|
dbs.defineDatasource({
|
|
@@ -302,7 +284,7 @@ dbs.defineDatasource({
|
|
|
302
284
|
});
|
|
303
285
|
```
|
|
304
286
|
|
|
305
|
-
|
|
287
|
+
Определение новой модели.
|
|
306
288
|
|
|
307
289
|
```js
|
|
308
290
|
dbs.defineModel({
|
|
@@ -315,7 +297,7 @@ dbs.defineModel({
|
|
|
315
297
|
});
|
|
316
298
|
```
|
|
317
299
|
|
|
318
|
-
|
|
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
|
-
|
|
421
|
-
должны быть уникальными.
|
|
399
|
+
Если значением параметра `unique` является `true` или `'strict'`, то выполняется
|
|
400
|
+
строгая проверка на уникальность. В этом режиме [пустые значения](#Пустые-значения)
|
|
401
|
+
так же подлежат проверке, где `null` и `undefined` также считаются значениями,
|
|
402
|
+
которые должны быть уникальными.
|
|
422
403
|
|
|
423
|
-
Режим `'sparse'` проверяет только значения с полезной нагрузкой,
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
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` из контейнера схемы и вызвать
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
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,
|
|
567
|
-
- [`replaceById(id, data,
|
|
568
|
-
- [`replaceOrCreate(data,
|
|
569
|
-
- [`patchById(id, data,
|
|
570
|
-
- [`patch(data,
|
|
571
|
-
- [`find(
|
|
572
|
-
- [`findOne(
|
|
573
|
-
- [`findById(id,
|
|
574
|
-
- [`delete(
|
|
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(
|
|
569
|
+
- [`count(where = undefined)`](#repositorycount) подсчет всех документов или по условию;
|
|
578
570
|
|
|
579
571
|
**Аргументы**
|
|
580
572
|
|
|
581
573
|
- `id: number|string` идентификатор (первичный ключ)
|
|
582
574
|
- `data: object` данные документа (используется при записи)
|
|
583
|
-
- `where: object` условия
|
|
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
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
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
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
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
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
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
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
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
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
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
|
-
|
|
845
|
-
|
|
846
|
-
|
|
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
|
-
|
|
881
|
-
|
|
882
|
-
|
|
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
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
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
|
-
|
|
948
|
-
|
|
949
|
-
|
|
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
|
-
|
|
975
|
-
|
|
976
|
-
|
|
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
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
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
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
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
|
-
Обратная сторона
|
|
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
|
-
Обратная сторона
|
|
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
|