@e22m4u/js-repository 0.2.7 → 0.3.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 +80 -80
- package/dist/cjs/index.cjs +2472 -2472
- package/eslint.config.js +1 -1
- package/package.json +14 -14
- package/src/adapter/adapter-registry.spec.js +7 -7
- package/src/adapter/adapter.spec.js +11 -11
- package/src/adapter/builtin/memory-adapter.spec.js +537 -537
- package/src/adapter/decorator/data-sanitizing-decorator.spec.js +5 -5
- package/src/adapter/decorator/data-transformation-decorator.spec.js +5 -5
- package/src/adapter/decorator/data-validation-decorator.spec.js +5 -5
- package/src/adapter/decorator/default-values-decorator.spec.js +5 -5
- package/src/adapter/decorator/fields-filtering-decorator.spec.js +5 -5
- package/src/adapter/decorator/inclusion-decorator.spec.js +5 -5
- package/src/adapter/decorator/property-uniqueness-decorator.spec.js +5 -5
- package/src/{schema.d.ts → database-schema.d.ts} +2 -2
- package/src/{schema.js → database-schema.js} +2 -2
- package/src/database-schema.spec.ts +86 -0
- package/src/definition/model/model-data-transformer.spec.js +93 -93
- package/src/definition/model/model-data-validator.spec.js +514 -528
- package/src/definition/model/model-definition-utils.spec.js +343 -341
- package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +36 -36
- package/src/definition/model/properties/property-uniqueness-validator.spec.js +410 -377
- package/src/definition/model/properties/property-validator/property-validator-registry.spec.js +36 -36
- package/src/filter/fields-clause-tool.spec.js +4 -4
- package/src/index.d.ts +1 -1
- package/src/index.js +1 -1
- package/src/relations/belongs-to-resolver.spec.js +166 -166
- package/src/relations/has-many-resolver.spec.js +281 -281
- package/src/relations/has-one-resolver.spec.js +281 -281
- package/src/relations/references-many-resolver.spec.js +92 -92
- package/src/repository/repository-registry.spec.js +10 -10
- package/src/repository/repository.spec.js +73 -73
- package/src/utils/is-promise.spec.js +1 -2
- package/src/utils/transform-promise.spec.js +0 -1
- package/src/schema.spec.ts +0 -86
package/README.md
CHANGED
|
@@ -2,24 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
Реализация паттерна «Репозиторий» для работы с базами данных в Node.js
|
|
4
4
|
|
|
5
|
-
- [Установка](
|
|
6
|
-
- [Импорт](
|
|
7
|
-
- [Описание](
|
|
8
|
-
- [Пример](
|
|
9
|
-
- [Схема](
|
|
10
|
-
- [Источник данных](
|
|
11
|
-
- [Модель](
|
|
12
|
-
- [Свойства](
|
|
13
|
-
- [Валидаторы](
|
|
14
|
-
- [Трансформеры](
|
|
15
|
-
- [Пустые значения](
|
|
16
|
-
- [Репозиторий](
|
|
17
|
-
- [Фильтрация](
|
|
18
|
-
- [Связи](
|
|
19
|
-
- [Расширение](
|
|
20
|
-
- [TypeScript](#
|
|
21
|
-
- [Тесты](
|
|
22
|
-
- [Лицензия](
|
|
5
|
+
- [Установка](#установка)
|
|
6
|
+
- [Импорт](#импорт)
|
|
7
|
+
- [Описание](#описание)
|
|
8
|
+
- [Пример](#пример)
|
|
9
|
+
- [Схема базы данных](#схема-базы-данных)
|
|
10
|
+
- [Источник данных](#источник-данных)
|
|
11
|
+
- [Модель](#модель)
|
|
12
|
+
- [Свойства](#свойства)
|
|
13
|
+
- [Валидаторы](#валидаторы)
|
|
14
|
+
- [Трансформеры](#трансформеры)
|
|
15
|
+
- [Пустые значения](#пустые-значения)
|
|
16
|
+
- [Репозиторий](#репозиторий)
|
|
17
|
+
- [Фильтрация](#фильтрация)
|
|
18
|
+
- [Связи](#связи)
|
|
19
|
+
- [Расширение](#расширение)
|
|
20
|
+
- [TypeScript](#typescript)
|
|
21
|
+
- [Тесты](#тесты)
|
|
22
|
+
- [Лицензия](#лицензия)
|
|
23
23
|
|
|
24
24
|
## Установка
|
|
25
25
|
|
|
@@ -41,13 +41,13 @@ npm install @e22m4u/js-repository
|
|
|
41
41
|
*ESM*
|
|
42
42
|
|
|
43
43
|
```js
|
|
44
|
-
import {
|
|
44
|
+
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
*CommonJS*
|
|
48
48
|
|
|
49
49
|
```js
|
|
50
|
-
const {
|
|
50
|
+
const {DatabaseSchema} = require('@e22m4u/js-repository');
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
## Описание
|
|
@@ -107,20 +107,20 @@ flowchart TD
|
|
|
107
107
|
Объявление источника данных, модели и добавление нового документа в коллекцию.
|
|
108
108
|
|
|
109
109
|
```js
|
|
110
|
-
import {Schema} from '@e22m4u/js-repository';
|
|
111
110
|
import {DataType} from '@e22m4u/js-repository';
|
|
111
|
+
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
112
112
|
|
|
113
|
-
// создание экземпляра
|
|
114
|
-
const
|
|
113
|
+
// создание экземпляра DatabaseSchema
|
|
114
|
+
const dbs = new DatabaseSchema();
|
|
115
115
|
|
|
116
116
|
// объявление источника "myMemory"
|
|
117
|
-
|
|
117
|
+
dbs.defineDatasource({
|
|
118
118
|
name: 'myMemory', // название нового источника
|
|
119
119
|
adapter: 'memory', // выбранный адаптер
|
|
120
120
|
});
|
|
121
121
|
|
|
122
122
|
// объявление модели "country"
|
|
123
|
-
|
|
123
|
+
dbs.defineModel({
|
|
124
124
|
name: 'country', // название новой модели
|
|
125
125
|
datasource: 'myMemory', // выбранный источник
|
|
126
126
|
properties: { // свойства модели
|
|
@@ -130,7 +130,7 @@ schema.defineModel({
|
|
|
130
130
|
})
|
|
131
131
|
|
|
132
132
|
// получение репозитория модели "country"
|
|
133
|
-
const countryRep =
|
|
133
|
+
const countryRep = dbs.getRepository('country');
|
|
134
134
|
|
|
135
135
|
// добавление нового документа в коллекцию "country"
|
|
136
136
|
const country = await countryRep.create({
|
|
@@ -147,9 +147,10 @@ console.log(country);
|
|
|
147
147
|
// }
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
-
## Схема
|
|
150
|
+
## Схема базы данных
|
|
151
151
|
|
|
152
|
-
Экземпляр класса `
|
|
152
|
+
Экземпляр класса `DatabaseSchema` хранит определения источников и моделей
|
|
153
|
+
данных.
|
|
153
154
|
|
|
154
155
|
**Методы**
|
|
155
156
|
|
|
@@ -162,15 +163,15 @@ console.log(country);
|
|
|
162
163
|
Импорт класса и создание экземпляра схемы.
|
|
163
164
|
|
|
164
165
|
```js
|
|
165
|
-
import {
|
|
166
|
+
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
166
167
|
|
|
167
|
-
const
|
|
168
|
+
const dbs = new DatabaseSchema();
|
|
168
169
|
```
|
|
169
170
|
|
|
170
171
|
Определение нового источника.
|
|
171
172
|
|
|
172
173
|
```js
|
|
173
|
-
|
|
174
|
+
dbs.defineDatasource({
|
|
174
175
|
name: 'myMemory', // название нового источника
|
|
175
176
|
adapter: 'memory', // выбранный адаптер
|
|
176
177
|
});
|
|
@@ -179,7 +180,7 @@ schema.defineDatasource({
|
|
|
179
180
|
Определение новой модели.
|
|
180
181
|
|
|
181
182
|
```js
|
|
182
|
-
|
|
183
|
+
dbs.defineModel({
|
|
183
184
|
name: 'product', // название новой модели
|
|
184
185
|
datasource: 'myMemory', // выбранный источник
|
|
185
186
|
properties: { // свойства модели
|
|
@@ -192,13 +193,14 @@ schema.defineModel({
|
|
|
192
193
|
Получение репозитория по названию модели.
|
|
193
194
|
|
|
194
195
|
```js
|
|
195
|
-
const productRep =
|
|
196
|
+
const productRep = dbs.getRepository('product');
|
|
196
197
|
```
|
|
197
198
|
|
|
198
199
|
## Источник данных
|
|
199
200
|
|
|
200
201
|
Источник хранит название выбранного адаптера и его настройки. Определение
|
|
201
|
-
нового источника выполняется методом `defineDatasource` экземпляра
|
|
202
|
+
нового источника выполняется методом `defineDatasource` экземпляра
|
|
203
|
+
`DatabaseSchema`.
|
|
202
204
|
|
|
203
205
|
**Параметры**
|
|
204
206
|
|
|
@@ -211,7 +213,7 @@ const productRep = schema.getRepository('product');
|
|
|
211
213
|
Определение нового источника.
|
|
212
214
|
|
|
213
215
|
```js
|
|
214
|
-
|
|
216
|
+
dbs.defineDatasource({
|
|
215
217
|
name: 'myMemory', // название нового источника
|
|
216
218
|
adapter: 'memory', // выбранный адаптер
|
|
217
219
|
});
|
|
@@ -220,7 +222,7 @@ schema.defineDatasource({
|
|
|
220
222
|
Передача дополнительных параметров адаптера.
|
|
221
223
|
|
|
222
224
|
```js
|
|
223
|
-
|
|
225
|
+
dbs.defineDatasource({
|
|
224
226
|
name: 'myMongodb',
|
|
225
227
|
adapter: 'mongodb',
|
|
226
228
|
// параметры адаптера "mongodb"
|
|
@@ -233,7 +235,7 @@ schema.defineDatasource({
|
|
|
233
235
|
## Модель
|
|
234
236
|
|
|
235
237
|
Описывает структуру документа коллекции и связи к другим моделям. Определение
|
|
236
|
-
новой модели выполняется методом `defineModel` экземпляра
|
|
238
|
+
новой модели выполняется методом `defineModel` экземпляра `DatabaseSchema`.
|
|
237
239
|
|
|
238
240
|
**Параметры**
|
|
239
241
|
|
|
@@ -249,7 +251,7 @@ schema.defineDatasource({
|
|
|
249
251
|
Определение модели со свойствами указанного типа.
|
|
250
252
|
|
|
251
253
|
```js
|
|
252
|
-
|
|
254
|
+
dbs.defineModel({
|
|
253
255
|
name: 'user', // название новой модели
|
|
254
256
|
properties: { // свойства модели
|
|
255
257
|
name: DataType.STRING,
|
|
@@ -314,7 +316,7 @@ schema.defineModel({
|
|
|
314
316
|
Краткое определение свойств модели.
|
|
315
317
|
|
|
316
318
|
```js
|
|
317
|
-
|
|
319
|
+
dbs.defineModel({
|
|
318
320
|
name: 'city',
|
|
319
321
|
properties: { // свойства модели
|
|
320
322
|
name: DataType.STRING, // тип свойства "string"
|
|
@@ -326,7 +328,7 @@ schema.defineModel({
|
|
|
326
328
|
Расширенное определение свойств модели.
|
|
327
329
|
|
|
328
330
|
```js
|
|
329
|
-
|
|
331
|
+
dbs.defineModel({
|
|
330
332
|
name: 'city',
|
|
331
333
|
properties: { // свойства модели
|
|
332
334
|
name: {
|
|
@@ -349,7 +351,7 @@ schema.defineModel({
|
|
|
349
351
|
определено в момент записи документа.
|
|
350
352
|
|
|
351
353
|
```js
|
|
352
|
-
|
|
354
|
+
dbs.defineModel({
|
|
353
355
|
name: 'article',
|
|
354
356
|
properties: { // свойства модели
|
|
355
357
|
tags: {
|
|
@@ -382,7 +384,7 @@ schema.defineModel({
|
|
|
382
384
|
`validate`, который принимает объект с их названиями и настройками.
|
|
383
385
|
|
|
384
386
|
```js
|
|
385
|
-
|
|
387
|
+
dbs.defineModel({
|
|
386
388
|
name: 'user',
|
|
387
389
|
properties: {
|
|
388
390
|
name: {
|
|
@@ -417,13 +419,11 @@ const numericValidator = (input) => {
|
|
|
417
419
|
}
|
|
418
420
|
|
|
419
421
|
// регистрация валидатора "numeric"
|
|
420
|
-
|
|
421
|
-
.get(PropertyValidatorRegistry)
|
|
422
|
-
.addValidator('numeric', numericValidator);
|
|
422
|
+
dbs.get(PropertyValidatorRegistry).addValidator('numeric', numericValidator);
|
|
423
423
|
|
|
424
424
|
// использование валидатора в определении
|
|
425
425
|
// свойства "code" для новой модели
|
|
426
|
-
|
|
426
|
+
dbs.defineModel({
|
|
427
427
|
name: 'document',
|
|
428
428
|
properties: {
|
|
429
429
|
code: {
|
|
@@ -455,7 +455,7 @@ schema.defineModel({
|
|
|
455
455
|
трансформера, а значением его параметры.
|
|
456
456
|
|
|
457
457
|
```js
|
|
458
|
-
|
|
458
|
+
dbs.defineModel({
|
|
459
459
|
name: 'user',
|
|
460
460
|
properties: {
|
|
461
461
|
name: {
|
|
@@ -491,7 +491,7 @@ schema.defineModel({
|
|
|
491
491
|
## Репозиторий
|
|
492
492
|
|
|
493
493
|
Выполняет операции чтения и записи документов определенной модели.
|
|
494
|
-
Получить репозиторий можно методом `getRepository` экземпляра
|
|
494
|
+
Получить репозиторий можно методом `getRepository` экземпляра `DatabaseSchema`.
|
|
495
495
|
|
|
496
496
|
**Методы**
|
|
497
497
|
|
|
@@ -520,7 +520,7 @@ schema.defineModel({
|
|
|
520
520
|
Получение репозитория по названию модели.
|
|
521
521
|
|
|
522
522
|
```js
|
|
523
|
-
const countryRep =
|
|
523
|
+
const countryRep = dbs.getRepository('country');
|
|
524
524
|
```
|
|
525
525
|
|
|
526
526
|
Добавление нового документа в коллекцию.
|
|
@@ -745,7 +745,7 @@ const res = await rep.find({
|
|
|
745
745
|
Объявление связи `belongsTo`
|
|
746
746
|
|
|
747
747
|
```js
|
|
748
|
-
|
|
748
|
+
dbs.defineModel({
|
|
749
749
|
name: 'user',
|
|
750
750
|
relations: {
|
|
751
751
|
role: { // название связи
|
|
@@ -763,7 +763,7 @@ schema.defineModel({
|
|
|
763
763
|
Объявление связи `hasMany`
|
|
764
764
|
|
|
765
765
|
```js
|
|
766
|
-
|
|
766
|
+
dbs.defineModel({
|
|
767
767
|
name: 'role',
|
|
768
768
|
relations: {
|
|
769
769
|
users: { // название связи
|
|
@@ -778,7 +778,7 @@ schema.defineModel({
|
|
|
778
778
|
Объявление связи `referencesMany`
|
|
779
779
|
|
|
780
780
|
```js
|
|
781
|
-
|
|
781
|
+
dbs.defineModel({
|
|
782
782
|
name: 'article',
|
|
783
783
|
relations: {
|
|
784
784
|
categories: { // название связи
|
|
@@ -796,7 +796,7 @@ schema.defineModel({
|
|
|
796
796
|
Полиморфная версия `belongsTo`
|
|
797
797
|
|
|
798
798
|
```js
|
|
799
|
-
|
|
799
|
+
dbs.defineModel({
|
|
800
800
|
name: 'file',
|
|
801
801
|
relations: {
|
|
802
802
|
reference: { // название связи
|
|
@@ -815,7 +815,7 @@ schema.defineModel({
|
|
|
815
815
|
Полиморфная версия `belongsTo` с указанием свойств.
|
|
816
816
|
|
|
817
817
|
```js
|
|
818
|
-
|
|
818
|
+
dbs.defineModel({
|
|
819
819
|
name: 'file',
|
|
820
820
|
relations: {
|
|
821
821
|
reference: { // название связи
|
|
@@ -831,7 +831,7 @@ schema.defineModel({
|
|
|
831
831
|
Полиморфная версия `hasMany` с указанием названия связи целевой модели.
|
|
832
832
|
|
|
833
833
|
```js
|
|
834
|
-
|
|
834
|
+
dbs.defineModel({
|
|
835
835
|
name: 'letter',
|
|
836
836
|
relations: {
|
|
837
837
|
attachments: { // название связи
|
|
@@ -846,7 +846,7 @@ schema.defineModel({
|
|
|
846
846
|
Полиморфная версия `hasMany` с указанием свойств целевой модели.
|
|
847
847
|
|
|
848
848
|
```js
|
|
849
|
-
|
|
849
|
+
dbs.defineModel({
|
|
850
850
|
name: 'letter',
|
|
851
851
|
relations: {
|
|
852
852
|
attachments: { // название связи
|
|
@@ -862,44 +862,44 @@ schema.defineModel({
|
|
|
862
862
|
|
|
863
863
|
## Расширение
|
|
864
864
|
|
|
865
|
-
Метод `getRepository` экземпляра
|
|
866
|
-
репозитория для указанной модели и возвращает его.
|
|
867
|
-
создается новый экземпляр, который будет сохранен
|
|
868
|
-
обращений к методу.
|
|
865
|
+
Метод `getRepository` экземпляра `DatabaseSchema` проверяет наличие
|
|
866
|
+
существующего репозитория для указанной модели и возвращает его.
|
|
867
|
+
В противном случае создается новый экземпляр, который будет сохранен
|
|
868
|
+
для последующих обращений к методу.
|
|
869
869
|
|
|
870
870
|
```js
|
|
871
|
-
import {Schema} from '@e22m4u/js-repository';
|
|
872
871
|
import {Repository} from '@e22m4u/js-repository';
|
|
872
|
+
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
873
873
|
|
|
874
|
-
// const
|
|
875
|
-
//
|
|
876
|
-
//
|
|
874
|
+
// const dbs = new DatabaseSchema();
|
|
875
|
+
// dbs.defineDatasource ...
|
|
876
|
+
// dbs.defineModel ...
|
|
877
877
|
|
|
878
|
-
const rep1 =
|
|
879
|
-
const rep2 =
|
|
878
|
+
const rep1 = dbs.getRepository('model');
|
|
879
|
+
const rep2 = dbs.getRepository('model');
|
|
880
880
|
console.log(rep1 === rep2); // true
|
|
881
881
|
```
|
|
882
882
|
|
|
883
883
|
Подмена стандартного конструктора репозитория выполняется методом
|
|
884
884
|
`setRepositoryCtor` сервиса `RepositoryRegistry`, который находится
|
|
885
|
-
в
|
|
886
|
-
создаваться указанным конструктором вместо стандартного.
|
|
885
|
+
в сервис-контейнере экземпляра `DatabaseSchema`. После чего все новые
|
|
886
|
+
репозитории будут создаваться указанным конструктором вместо стандартного.
|
|
887
887
|
|
|
888
888
|
```js
|
|
889
|
-
import {Schema} from '@e22m4u/js-repository';
|
|
890
889
|
import {Repository} from '@e22m4u/js-repository';
|
|
890
|
+
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
891
891
|
import {RepositoryRegistry} from '@e22m4u/js-repository';
|
|
892
892
|
|
|
893
893
|
class MyRepository extends Repository {
|
|
894
894
|
/*...*/
|
|
895
895
|
}
|
|
896
896
|
|
|
897
|
-
// const
|
|
898
|
-
//
|
|
899
|
-
//
|
|
897
|
+
// const dbs = new DatabaseSchema();
|
|
898
|
+
// dbs.defineDatasource ...
|
|
899
|
+
// dbs.defineModel ...
|
|
900
900
|
|
|
901
|
-
|
|
902
|
-
const rep =
|
|
901
|
+
dbs.get(RepositoryRegistry).setRepositoryCtor(MyRepository);
|
|
902
|
+
const rep = dbs.getRepository('model');
|
|
903
903
|
console.log(rep instanceof MyRepository); // true
|
|
904
904
|
```
|
|
905
905
|
|
|
@@ -911,16 +911,16 @@ console.log(rep instanceof MyRepository); // true
|
|
|
911
911
|
Получение типизированного репозитория с указанием интерфейса модели.
|
|
912
912
|
|
|
913
913
|
```ts
|
|
914
|
-
import {Schema} from '@e22m4u/js-repository';
|
|
915
914
|
import {DataType} from '@e22m4u/js-repository';
|
|
916
915
|
import {RelationType} from '@e22m4u/js-repository';
|
|
916
|
+
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
917
917
|
|
|
918
|
-
// const
|
|
919
|
-
//
|
|
920
|
-
//
|
|
918
|
+
// const dbs = new DatabaseSchema();
|
|
919
|
+
// dbs.defineDatasource ...
|
|
920
|
+
// dbs.defineModel ...
|
|
921
921
|
|
|
922
922
|
// определение модели "city"
|
|
923
|
-
|
|
923
|
+
dbs.defineModel({
|
|
924
924
|
name: 'city',
|
|
925
925
|
datasource: 'myDatasource',
|
|
926
926
|
properties: {
|
|
@@ -946,7 +946,7 @@ interface City {
|
|
|
946
946
|
|
|
947
947
|
// получаем репозиторий по названию модели
|
|
948
948
|
// указывая ее тип и тип идентификатора
|
|
949
|
-
const cityRep =
|
|
949
|
+
const cityRep = dbs.getRepository<City, number>('city');
|
|
950
950
|
```
|
|
951
951
|
|
|
952
952
|
## Тесты
|