@e22m4u/js-repository 0.2.6 → 0.3.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.
- package/README.md +79 -80
- package/dist/cjs/index.cjs +2023 -2093
- package/eslint.config.js +1 -1
- package/package.json +15 -12
- 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.js +3 -3
- package/src/definition/model/model-data-transformer.spec.js +93 -93
- package/src/definition/model/model-data-validator.js +2 -2
- package/src/definition/model/model-data-validator.spec.js +517 -531
- package/src/definition/model/model-definition-utils.js +3 -3
- package/src/definition/model/model-definition-utils.spec.js +345 -343
- package/src/definition/model/properties/index.d.ts +0 -1
- package/src/definition/model/properties/index.js +0 -1
- package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +36 -36
- package/src/definition/model/properties/property-uniqueness-validator.js +3 -3
- package/src/definition/model/properties/property-uniqueness-validator.spec.js +417 -384
- 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/definition/model/properties/empty-values-definer.d.ts +0 -23
- package/src/definition/model/properties/empty-values-definer.js +0 -66
- package/src/definition/model/properties/empty-values-definer.spec.js +0 -96
- 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,9 @@ console.log(country);
|
|
|
147
147
|
// }
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
-
## Схема
|
|
150
|
+
## Схема баз данных
|
|
151
151
|
|
|
152
|
-
Экземпляр класса `
|
|
152
|
+
Экземпляр класса `DatabaseSchema` хранит определения источников данных и моделей.
|
|
153
153
|
|
|
154
154
|
**Методы**
|
|
155
155
|
|
|
@@ -162,15 +162,15 @@ console.log(country);
|
|
|
162
162
|
Импорт класса и создание экземпляра схемы.
|
|
163
163
|
|
|
164
164
|
```js
|
|
165
|
-
import {
|
|
165
|
+
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
166
166
|
|
|
167
|
-
const
|
|
167
|
+
const dbs = new DatabaseSchema();
|
|
168
168
|
```
|
|
169
169
|
|
|
170
170
|
Определение нового источника.
|
|
171
171
|
|
|
172
172
|
```js
|
|
173
|
-
|
|
173
|
+
dbs.defineDatasource({
|
|
174
174
|
name: 'myMemory', // название нового источника
|
|
175
175
|
adapter: 'memory', // выбранный адаптер
|
|
176
176
|
});
|
|
@@ -179,7 +179,7 @@ schema.defineDatasource({
|
|
|
179
179
|
Определение новой модели.
|
|
180
180
|
|
|
181
181
|
```js
|
|
182
|
-
|
|
182
|
+
dbs.defineModel({
|
|
183
183
|
name: 'product', // название новой модели
|
|
184
184
|
datasource: 'myMemory', // выбранный источник
|
|
185
185
|
properties: { // свойства модели
|
|
@@ -192,13 +192,14 @@ schema.defineModel({
|
|
|
192
192
|
Получение репозитория по названию модели.
|
|
193
193
|
|
|
194
194
|
```js
|
|
195
|
-
const productRep =
|
|
195
|
+
const productRep = dbs.getRepository('product');
|
|
196
196
|
```
|
|
197
197
|
|
|
198
198
|
## Источник данных
|
|
199
199
|
|
|
200
200
|
Источник хранит название выбранного адаптера и его настройки. Определение
|
|
201
|
-
нового источника выполняется методом `defineDatasource` экземпляра
|
|
201
|
+
нового источника выполняется методом `defineDatasource` экземпляра
|
|
202
|
+
`DatabaseSchema`.
|
|
202
203
|
|
|
203
204
|
**Параметры**
|
|
204
205
|
|
|
@@ -211,7 +212,7 @@ const productRep = schema.getRepository('product');
|
|
|
211
212
|
Определение нового источника.
|
|
212
213
|
|
|
213
214
|
```js
|
|
214
|
-
|
|
215
|
+
dbs.defineDatasource({
|
|
215
216
|
name: 'myMemory', // название нового источника
|
|
216
217
|
adapter: 'memory', // выбранный адаптер
|
|
217
218
|
});
|
|
@@ -220,7 +221,7 @@ schema.defineDatasource({
|
|
|
220
221
|
Передача дополнительных параметров адаптера.
|
|
221
222
|
|
|
222
223
|
```js
|
|
223
|
-
|
|
224
|
+
dbs.defineDatasource({
|
|
224
225
|
name: 'myMongodb',
|
|
225
226
|
adapter: 'mongodb',
|
|
226
227
|
// параметры адаптера "mongodb"
|
|
@@ -233,7 +234,7 @@ schema.defineDatasource({
|
|
|
233
234
|
## Модель
|
|
234
235
|
|
|
235
236
|
Описывает структуру документа коллекции и связи к другим моделям. Определение
|
|
236
|
-
новой модели выполняется методом `defineModel` экземпляра
|
|
237
|
+
новой модели выполняется методом `defineModel` экземпляра `DatabaseSchema`.
|
|
237
238
|
|
|
238
239
|
**Параметры**
|
|
239
240
|
|
|
@@ -249,7 +250,7 @@ schema.defineDatasource({
|
|
|
249
250
|
Определение модели со свойствами указанного типа.
|
|
250
251
|
|
|
251
252
|
```js
|
|
252
|
-
|
|
253
|
+
dbs.defineModel({
|
|
253
254
|
name: 'user', // название новой модели
|
|
254
255
|
properties: { // свойства модели
|
|
255
256
|
name: DataType.STRING,
|
|
@@ -314,7 +315,7 @@ schema.defineModel({
|
|
|
314
315
|
Краткое определение свойств модели.
|
|
315
316
|
|
|
316
317
|
```js
|
|
317
|
-
|
|
318
|
+
dbs.defineModel({
|
|
318
319
|
name: 'city',
|
|
319
320
|
properties: { // свойства модели
|
|
320
321
|
name: DataType.STRING, // тип свойства "string"
|
|
@@ -326,7 +327,7 @@ schema.defineModel({
|
|
|
326
327
|
Расширенное определение свойств модели.
|
|
327
328
|
|
|
328
329
|
```js
|
|
329
|
-
|
|
330
|
+
dbs.defineModel({
|
|
330
331
|
name: 'city',
|
|
331
332
|
properties: { // свойства модели
|
|
332
333
|
name: {
|
|
@@ -349,7 +350,7 @@ schema.defineModel({
|
|
|
349
350
|
определено в момент записи документа.
|
|
350
351
|
|
|
351
352
|
```js
|
|
352
|
-
|
|
353
|
+
dbs.defineModel({
|
|
353
354
|
name: 'article',
|
|
354
355
|
properties: { // свойства модели
|
|
355
356
|
tags: {
|
|
@@ -382,7 +383,7 @@ schema.defineModel({
|
|
|
382
383
|
`validate`, который принимает объект с их названиями и настройками.
|
|
383
384
|
|
|
384
385
|
```js
|
|
385
|
-
|
|
386
|
+
dbs.defineModel({
|
|
386
387
|
name: 'user',
|
|
387
388
|
properties: {
|
|
388
389
|
name: {
|
|
@@ -417,13 +418,11 @@ const numericValidator = (input) => {
|
|
|
417
418
|
}
|
|
418
419
|
|
|
419
420
|
// регистрация валидатора "numeric"
|
|
420
|
-
|
|
421
|
-
.get(PropertyValidatorRegistry)
|
|
422
|
-
.addValidator('numeric', numericValidator);
|
|
421
|
+
dbs.get(PropertyValidatorRegistry).addValidator('numeric', numericValidator);
|
|
423
422
|
|
|
424
423
|
// использование валидатора в определении
|
|
425
424
|
// свойства "code" для новой модели
|
|
426
|
-
|
|
425
|
+
dbs.defineModel({
|
|
427
426
|
name: 'document',
|
|
428
427
|
properties: {
|
|
429
428
|
code: {
|
|
@@ -455,7 +454,7 @@ schema.defineModel({
|
|
|
455
454
|
трансформера, а значением его параметры.
|
|
456
455
|
|
|
457
456
|
```js
|
|
458
|
-
|
|
457
|
+
dbs.defineModel({
|
|
459
458
|
name: 'user',
|
|
460
459
|
properties: {
|
|
461
460
|
name: {
|
|
@@ -491,7 +490,7 @@ schema.defineModel({
|
|
|
491
490
|
## Репозиторий
|
|
492
491
|
|
|
493
492
|
Выполняет операции чтения и записи документов определенной модели.
|
|
494
|
-
Получить репозиторий можно методом `getRepository` экземпляра
|
|
493
|
+
Получить репозиторий можно методом `getRepository` экземпляра `DatabaseSchema`.
|
|
495
494
|
|
|
496
495
|
**Методы**
|
|
497
496
|
|
|
@@ -520,7 +519,7 @@ schema.defineModel({
|
|
|
520
519
|
Получение репозитория по названию модели.
|
|
521
520
|
|
|
522
521
|
```js
|
|
523
|
-
const countryRep =
|
|
522
|
+
const countryRep = dbs.getRepository('country');
|
|
524
523
|
```
|
|
525
524
|
|
|
526
525
|
Добавление нового документа в коллекцию.
|
|
@@ -745,7 +744,7 @@ const res = await rep.find({
|
|
|
745
744
|
Объявление связи `belongsTo`
|
|
746
745
|
|
|
747
746
|
```js
|
|
748
|
-
|
|
747
|
+
dbs.defineModel({
|
|
749
748
|
name: 'user',
|
|
750
749
|
relations: {
|
|
751
750
|
role: { // название связи
|
|
@@ -763,7 +762,7 @@ schema.defineModel({
|
|
|
763
762
|
Объявление связи `hasMany`
|
|
764
763
|
|
|
765
764
|
```js
|
|
766
|
-
|
|
765
|
+
dbs.defineModel({
|
|
767
766
|
name: 'role',
|
|
768
767
|
relations: {
|
|
769
768
|
users: { // название связи
|
|
@@ -778,7 +777,7 @@ schema.defineModel({
|
|
|
778
777
|
Объявление связи `referencesMany`
|
|
779
778
|
|
|
780
779
|
```js
|
|
781
|
-
|
|
780
|
+
dbs.defineModel({
|
|
782
781
|
name: 'article',
|
|
783
782
|
relations: {
|
|
784
783
|
categories: { // название связи
|
|
@@ -796,7 +795,7 @@ schema.defineModel({
|
|
|
796
795
|
Полиморфная версия `belongsTo`
|
|
797
796
|
|
|
798
797
|
```js
|
|
799
|
-
|
|
798
|
+
dbs.defineModel({
|
|
800
799
|
name: 'file',
|
|
801
800
|
relations: {
|
|
802
801
|
reference: { // название связи
|
|
@@ -815,7 +814,7 @@ schema.defineModel({
|
|
|
815
814
|
Полиморфная версия `belongsTo` с указанием свойств.
|
|
816
815
|
|
|
817
816
|
```js
|
|
818
|
-
|
|
817
|
+
dbs.defineModel({
|
|
819
818
|
name: 'file',
|
|
820
819
|
relations: {
|
|
821
820
|
reference: { // название связи
|
|
@@ -831,7 +830,7 @@ schema.defineModel({
|
|
|
831
830
|
Полиморфная версия `hasMany` с указанием названия связи целевой модели.
|
|
832
831
|
|
|
833
832
|
```js
|
|
834
|
-
|
|
833
|
+
dbs.defineModel({
|
|
835
834
|
name: 'letter',
|
|
836
835
|
relations: {
|
|
837
836
|
attachments: { // название связи
|
|
@@ -846,7 +845,7 @@ schema.defineModel({
|
|
|
846
845
|
Полиморфная версия `hasMany` с указанием свойств целевой модели.
|
|
847
846
|
|
|
848
847
|
```js
|
|
849
|
-
|
|
848
|
+
dbs.defineModel({
|
|
850
849
|
name: 'letter',
|
|
851
850
|
relations: {
|
|
852
851
|
attachments: { // название связи
|
|
@@ -862,44 +861,44 @@ schema.defineModel({
|
|
|
862
861
|
|
|
863
862
|
## Расширение
|
|
864
863
|
|
|
865
|
-
Метод `getRepository` экземпляра
|
|
866
|
-
репозитория для указанной модели и возвращает его.
|
|
867
|
-
создается новый экземпляр, который будет сохранен
|
|
868
|
-
обращений к методу.
|
|
864
|
+
Метод `getRepository` экземпляра `DatabaseSchema` проверяет наличие
|
|
865
|
+
существующего репозитория для указанной модели и возвращает его.
|
|
866
|
+
В противном случае создается новый экземпляр, который будет сохранен
|
|
867
|
+
для последующих обращений к методу.
|
|
869
868
|
|
|
870
869
|
```js
|
|
871
|
-
import {Schema} from '@e22m4u/js-repository';
|
|
872
870
|
import {Repository} from '@e22m4u/js-repository';
|
|
871
|
+
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
873
872
|
|
|
874
|
-
// const
|
|
875
|
-
//
|
|
876
|
-
//
|
|
873
|
+
// const dbs = new DatabaseSchema();
|
|
874
|
+
// dbs.defineDatasource ...
|
|
875
|
+
// dbs.defineModel ...
|
|
877
876
|
|
|
878
|
-
const rep1 =
|
|
879
|
-
const rep2 =
|
|
877
|
+
const rep1 = dbs.getRepository('model');
|
|
878
|
+
const rep2 = dbs.getRepository('model');
|
|
880
879
|
console.log(rep1 === rep2); // true
|
|
881
880
|
```
|
|
882
881
|
|
|
883
882
|
Подмена стандартного конструктора репозитория выполняется методом
|
|
884
883
|
`setRepositoryCtor` сервиса `RepositoryRegistry`, который находится
|
|
885
|
-
в
|
|
886
|
-
создаваться указанным конструктором вместо стандартного.
|
|
884
|
+
в сервис-контейнере экземпляра `DatabaseSchema`. После чего все новые
|
|
885
|
+
репозитории будут создаваться указанным конструктором вместо стандартного.
|
|
887
886
|
|
|
888
887
|
```js
|
|
889
|
-
import {Schema} from '@e22m4u/js-repository';
|
|
890
888
|
import {Repository} from '@e22m4u/js-repository';
|
|
889
|
+
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
891
890
|
import {RepositoryRegistry} from '@e22m4u/js-repository';
|
|
892
891
|
|
|
893
892
|
class MyRepository extends Repository {
|
|
894
893
|
/*...*/
|
|
895
894
|
}
|
|
896
895
|
|
|
897
|
-
// const
|
|
898
|
-
//
|
|
899
|
-
//
|
|
896
|
+
// const dbs = new DatabaseSchema();
|
|
897
|
+
// dbs.defineDatasource ...
|
|
898
|
+
// dbs.defineModel ...
|
|
900
899
|
|
|
901
|
-
|
|
902
|
-
const rep =
|
|
900
|
+
dbs.get(RepositoryRegistry).setRepositoryCtor(MyRepository);
|
|
901
|
+
const rep = dbs.getRepository('model');
|
|
903
902
|
console.log(rep instanceof MyRepository); // true
|
|
904
903
|
```
|
|
905
904
|
|
|
@@ -911,16 +910,16 @@ console.log(rep instanceof MyRepository); // true
|
|
|
911
910
|
Получение типизированного репозитория с указанием интерфейса модели.
|
|
912
911
|
|
|
913
912
|
```ts
|
|
914
|
-
import {Schema} from '@e22m4u/js-repository';
|
|
915
913
|
import {DataType} from '@e22m4u/js-repository';
|
|
916
914
|
import {RelationType} from '@e22m4u/js-repository';
|
|
915
|
+
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
917
916
|
|
|
918
|
-
// const
|
|
919
|
-
//
|
|
920
|
-
//
|
|
917
|
+
// const dbs = new DatabaseSchema();
|
|
918
|
+
// dbs.defineDatasource ...
|
|
919
|
+
// dbs.defineModel ...
|
|
921
920
|
|
|
922
921
|
// определение модели "city"
|
|
923
|
-
|
|
922
|
+
dbs.defineModel({
|
|
924
923
|
name: 'city',
|
|
925
924
|
datasource: 'myDatasource',
|
|
926
925
|
properties: {
|
|
@@ -946,7 +945,7 @@ interface City {
|
|
|
946
945
|
|
|
947
946
|
// получаем репозиторий по названию модели
|
|
948
947
|
// указывая ее тип и тип идентификатора
|
|
949
|
-
const cityRep =
|
|
948
|
+
const cityRep = dbs.getRepository<City, number>('city');
|
|
950
949
|
```
|
|
951
950
|
|
|
952
951
|
## Тесты
|