@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.
Files changed (35) hide show
  1. package/README.md +80 -80
  2. package/dist/cjs/index.cjs +2472 -2472
  3. package/eslint.config.js +1 -1
  4. package/package.json +14 -14
  5. package/src/adapter/adapter-registry.spec.js +7 -7
  6. package/src/adapter/adapter.spec.js +11 -11
  7. package/src/adapter/builtin/memory-adapter.spec.js +537 -537
  8. package/src/adapter/decorator/data-sanitizing-decorator.spec.js +5 -5
  9. package/src/adapter/decorator/data-transformation-decorator.spec.js +5 -5
  10. package/src/adapter/decorator/data-validation-decorator.spec.js +5 -5
  11. package/src/adapter/decorator/default-values-decorator.spec.js +5 -5
  12. package/src/adapter/decorator/fields-filtering-decorator.spec.js +5 -5
  13. package/src/adapter/decorator/inclusion-decorator.spec.js +5 -5
  14. package/src/adapter/decorator/property-uniqueness-decorator.spec.js +5 -5
  15. package/src/{schema.d.ts → database-schema.d.ts} +2 -2
  16. package/src/{schema.js → database-schema.js} +2 -2
  17. package/src/database-schema.spec.ts +86 -0
  18. package/src/definition/model/model-data-transformer.spec.js +93 -93
  19. package/src/definition/model/model-data-validator.spec.js +514 -528
  20. package/src/definition/model/model-definition-utils.spec.js +343 -341
  21. package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +36 -36
  22. package/src/definition/model/properties/property-uniqueness-validator.spec.js +410 -377
  23. package/src/definition/model/properties/property-validator/property-validator-registry.spec.js +36 -36
  24. package/src/filter/fields-clause-tool.spec.js +4 -4
  25. package/src/index.d.ts +1 -1
  26. package/src/index.js +1 -1
  27. package/src/relations/belongs-to-resolver.spec.js +166 -166
  28. package/src/relations/has-many-resolver.spec.js +281 -281
  29. package/src/relations/has-one-resolver.spec.js +281 -281
  30. package/src/relations/references-many-resolver.spec.js +92 -92
  31. package/src/repository/repository-registry.spec.js +10 -10
  32. package/src/repository/repository.spec.js +73 -73
  33. package/src/utils/is-promise.spec.js +1 -2
  34. package/src/utils/transform-promise.spec.js +0 -1
  35. 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](#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 {Schema} from '@e22m4u/js-repository';
44
+ import {DatabaseSchema} from '@e22m4u/js-repository';
45
45
  ```
46
46
 
47
47
  *CommonJS*
48
48
 
49
49
  ```js
50
- const {Schema} = require('@e22m4u/js-repository');
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
- // создание экземпляра Schema
114
- const schema = new Schema();
113
+ // создание экземпляра DatabaseSchema
114
+ const dbs = new DatabaseSchema();
115
115
 
116
116
  // объявление источника "myMemory"
117
- schema.defineDatasource({
117
+ dbs.defineDatasource({
118
118
  name: 'myMemory', // название нового источника
119
119
  adapter: 'memory', // выбранный адаптер
120
120
  });
121
121
 
122
122
  // объявление модели "country"
123
- schema.defineModel({
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 = schema.getRepository('country');
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
- Экземпляр класса `Schema` хранит определения источников данных и моделей.
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 {Schema} from '@e22m4u/js-repository';
166
+ import {DatabaseSchema} from '@e22m4u/js-repository';
166
167
 
167
- const schema = new Schema();
168
+ const dbs = new DatabaseSchema();
168
169
  ```
169
170
 
170
171
  Определение нового источника.
171
172
 
172
173
  ```js
173
- schema.defineDatasource({
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
- schema.defineModel({
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 = schema.getRepository('product');
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
- schema.defineDatasource({
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
- schema.defineDatasource({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema
421
- .get(PropertyValidatorRegistry)
422
- .addValidator('numeric', numericValidator);
422
+ dbs.get(PropertyValidatorRegistry).addValidator('numeric', numericValidator);
423
423
 
424
424
  // использование валидатора в определении
425
425
  // свойства "code" для новой модели
426
- schema.defineModel({
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
- schema.defineModel({
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 = schema.getRepository('country');
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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 schema = new Schema();
875
- // schema.defineDatasource ...
876
- // schema.defineModel ...
874
+ // const dbs = new DatabaseSchema();
875
+ // dbs.defineDatasource ...
876
+ // dbs.defineModel ...
877
877
 
878
- const rep1 = schema.getRepository('model');
879
- const rep2 = schema.getRepository('model');
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 schema = new Schema();
898
- // schema.defineDatasource ...
899
- // schema.defineModel ...
897
+ // const dbs = new DatabaseSchema();
898
+ // dbs.defineDatasource ...
899
+ // dbs.defineModel ...
900
900
 
901
- schema.get(RepositoryRegistry).setRepositoryCtor(MyRepository);
902
- const rep = schema.getRepository('model');
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 schema = new Schema();
919
- // schema.defineDatasource ...
920
- // schema.defineModel ...
918
+ // const dbs = new DatabaseSchema();
919
+ // dbs.defineDatasource ...
920
+ // dbs.defineModel ...
921
921
 
922
922
  // определение модели "city"
923
- schema.defineModel({
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 = schema.getRepository<City, number>('city');
949
+ const cityRep = dbs.getRepository<City, number>('city');
950
950
  ```
951
951
 
952
952
  ## Тесты