@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.
Files changed (44) hide show
  1. package/README.md +79 -80
  2. package/dist/cjs/index.cjs +2023 -2093
  3. package/eslint.config.js +1 -1
  4. package/package.json +15 -12
  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.js +3 -3
  19. package/src/definition/model/model-data-transformer.spec.js +93 -93
  20. package/src/definition/model/model-data-validator.js +2 -2
  21. package/src/definition/model/model-data-validator.spec.js +517 -531
  22. package/src/definition/model/model-definition-utils.js +3 -3
  23. package/src/definition/model/model-definition-utils.spec.js +345 -343
  24. package/src/definition/model/properties/index.d.ts +0 -1
  25. package/src/definition/model/properties/index.js +0 -1
  26. package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +36 -36
  27. package/src/definition/model/properties/property-uniqueness-validator.js +3 -3
  28. package/src/definition/model/properties/property-uniqueness-validator.spec.js +417 -384
  29. package/src/definition/model/properties/property-validator/property-validator-registry.spec.js +36 -36
  30. package/src/filter/fields-clause-tool.spec.js +4 -4
  31. package/src/index.d.ts +1 -1
  32. package/src/index.js +1 -1
  33. package/src/relations/belongs-to-resolver.spec.js +166 -166
  34. package/src/relations/has-many-resolver.spec.js +281 -281
  35. package/src/relations/has-one-resolver.spec.js +281 -281
  36. package/src/relations/references-many-resolver.spec.js +92 -92
  37. package/src/repository/repository-registry.spec.js +10 -10
  38. package/src/repository/repository.spec.js +73 -73
  39. package/src/utils/is-promise.spec.js +1 -2
  40. package/src/utils/transform-promise.spec.js +0 -1
  41. package/src/definition/model/properties/empty-values-definer.d.ts +0 -23
  42. package/src/definition/model/properties/empty-values-definer.js +0 -66
  43. package/src/definition/model/properties/empty-values-definer.spec.js +0 -96
  44. 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,9 @@ console.log(country);
147
147
  // }
148
148
  ```
149
149
 
150
- ## Схема
150
+ ## Схема баз данных
151
151
 
152
- Экземпляр класса `Schema` хранит определения источников данных и моделей.
152
+ Экземпляр класса `DatabaseSchema` хранит определения источников данных и моделей.
153
153
 
154
154
  **Методы**
155
155
 
@@ -162,15 +162,15 @@ console.log(country);
162
162
  Импорт класса и создание экземпляра схемы.
163
163
 
164
164
  ```js
165
- import {Schema} from '@e22m4u/js-repository';
165
+ import {DatabaseSchema} from '@e22m4u/js-repository';
166
166
 
167
- const schema = new Schema();
167
+ const dbs = new DatabaseSchema();
168
168
  ```
169
169
 
170
170
  Определение нового источника.
171
171
 
172
172
  ```js
173
- schema.defineDatasource({
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
- schema.defineModel({
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 = schema.getRepository('product');
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
- schema.defineDatasource({
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
- schema.defineDatasource({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema
421
- .get(PropertyValidatorRegistry)
422
- .addValidator('numeric', numericValidator);
421
+ dbs.get(PropertyValidatorRegistry).addValidator('numeric', numericValidator);
423
422
 
424
423
  // использование валидатора в определении
425
424
  // свойства "code" для новой модели
426
- schema.defineModel({
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
- schema.defineModel({
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 = schema.getRepository('country');
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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
- schema.defineModel({
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 schema = new Schema();
875
- // schema.defineDatasource ...
876
- // schema.defineModel ...
873
+ // const dbs = new DatabaseSchema();
874
+ // dbs.defineDatasource ...
875
+ // dbs.defineModel ...
877
876
 
878
- const rep1 = schema.getRepository('model');
879
- const rep2 = schema.getRepository('model');
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 schema = new Schema();
898
- // schema.defineDatasource ...
899
- // schema.defineModel ...
896
+ // const dbs = new DatabaseSchema();
897
+ // dbs.defineDatasource ...
898
+ // dbs.defineModel ...
900
899
 
901
- schema.get(RepositoryRegistry).setRepositoryCtor(MyRepository);
902
- const rep = schema.getRepository('model');
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 schema = new Schema();
919
- // schema.defineDatasource ...
920
- // schema.defineModel ...
917
+ // const dbs = new DatabaseSchema();
918
+ // dbs.defineDatasource ...
919
+ // dbs.defineModel ...
921
920
 
922
921
  // определение модели "city"
923
- schema.defineModel({
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 = schema.getRepository<City, number>('city');
948
+ const cityRep = dbs.getRepository<City, number>('city');
950
949
  ```
951
950
 
952
951
  ## Тесты