@e22m4u/js-repository 0.8.3 → 0.8.4
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 +72 -136
- package/dist/cjs/index.cjs +212 -76
- package/package.json +4 -4
- package/src/adapter/adapter.js +2 -0
- package/src/adapter/adapter.spec.js +39 -41
- package/src/adapter/decorator/index.d.ts +1 -0
- package/src/adapter/decorator/index.js +1 -0
- package/src/adapter/decorator/required-property-decorator.d.ts +14 -0
- package/src/adapter/decorator/required-property-decorator.js +54 -0
- package/src/adapter/decorator/required-property-decorator.spec.js +105 -0
- package/src/definition/model/model-definition-utils.js +4 -4
- package/src/definition/model/model-definition-utils.spec.js +5 -5
- package/src/definition/model/properties/index.d.ts +1 -0
- package/src/definition/model/properties/index.js +1 -0
- package/src/definition/model/properties/property-uniqueness-validator.js +4 -4
- package/src/definition/model/properties/property-uniqueness-validator.spec.js +19 -19
- package/src/definition/model/properties/required-property-validator.d.ts +15 -0
- package/src/definition/model/properties/required-property-validator.js +95 -0
- package/src/definition/model/properties/required-property-validator.spec.js +583 -0
package/README.md
CHANGED
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
- [Модель](#модель)
|
|
17
17
|
- [Свойства](#свойства)
|
|
18
18
|
- [Пустые значения](#пустые-значения)
|
|
19
|
-
- [Переопределение пустых значений](#переопределение-пустых-значений)
|
|
20
19
|
- [Репозиторий](#репозиторий)
|
|
21
20
|
- [create](#repositorycreate)
|
|
22
21
|
- [replaceById](#repositoryreplacebyid)
|
|
@@ -88,9 +87,9 @@ const {DatabaseSchema} = require('@e22m4u/js-repository');
|
|
|
88
87
|
согласно определению модели, и встраивать связанные данные в результат
|
|
89
88
|
выборки.
|
|
90
89
|
|
|
91
|
-
- *Источник данных* - определяет способ подключения к
|
|
92
|
-
- *Модель* - описывает структуру документа и связи к другим
|
|
93
|
-
- *Репозиторий* - выполняет операции чтения и записи документов
|
|
90
|
+
- *Источник данных* - определяет способ подключения к базе;
|
|
91
|
+
- *Модель* - описывает структуру документа и связи к другим моделям;
|
|
92
|
+
- *Репозиторий* - выполняет операции чтения и записи документов модели;
|
|
94
93
|
|
|
95
94
|
```mermaid
|
|
96
95
|
flowchart TD
|
|
@@ -261,9 +260,9 @@ console.log(cityWithCountry);
|
|
|
261
260
|
|
|
262
261
|
**Методы**
|
|
263
262
|
|
|
264
|
-
- `defineDatasource(datasourceDef: object): this` - добавить
|
|
265
|
-
- `defineModel(modelDef: object): this` - добавить
|
|
266
|
-
- `getRepository(modelName: string): Repository` - получить
|
|
263
|
+
- `defineDatasource(datasourceDef: object): this` - добавить источник;
|
|
264
|
+
- `defineModel(modelDef: object): this` - добавить модель;
|
|
265
|
+
- `getRepository(modelName: string): Repository` - получить репозиторий;
|
|
267
266
|
|
|
268
267
|
**Примеры**
|
|
269
268
|
|
|
@@ -311,9 +310,9 @@ const productRep = dbs.getRepository('product');
|
|
|
311
310
|
|
|
312
311
|
**Параметры**
|
|
313
312
|
|
|
314
|
-
- `name: string` уникальное
|
|
315
|
-
- `adapter: string` выбранный
|
|
316
|
-
- параметры адаптера (если имеются)
|
|
313
|
+
- `name: string` уникальное название;
|
|
314
|
+
- `adapter: string` выбранный адаптер;
|
|
315
|
+
- параметры адаптера (если имеются);
|
|
317
316
|
|
|
318
317
|
**Примеры**
|
|
319
318
|
|
|
@@ -346,12 +345,12 @@ dbs.defineDatasource({
|
|
|
346
345
|
|
|
347
346
|
**Параметры**
|
|
348
347
|
|
|
349
|
-
- `name: string` название модели (обязательно)
|
|
350
|
-
- `base: string` название наследуемой
|
|
351
|
-
- `tableName: string` название коллекции в
|
|
352
|
-
- `datasource: string` выбранный источник
|
|
353
|
-
- `properties: object` определения свойств (см. [Свойства](#Свойства))
|
|
354
|
-
- `relations: object` определения связей (см. [Связи](#Связи))
|
|
348
|
+
- `name: string` название модели (обязательно);
|
|
349
|
+
- `base: string` название наследуемой модели;
|
|
350
|
+
- `tableName: string` название коллекции в базе;
|
|
351
|
+
- `datasource: string` выбранный источник данных;
|
|
352
|
+
- `properties: object` определения свойств (см. [Свойства](#Свойства));
|
|
353
|
+
- `relations: object` определения связей (см. [Связи](#Связи));
|
|
355
354
|
|
|
356
355
|
**Примеры**
|
|
357
356
|
|
|
@@ -375,47 +374,46 @@ dbs.defineModel({
|
|
|
375
374
|
|
|
376
375
|
**Тип данных**
|
|
377
376
|
|
|
378
|
-
- `DataType.ANY` разрешено любое
|
|
379
|
-
- `DataType.STRING` только значение типа `string
|
|
380
|
-
- `DataType.NUMBER` только значение типа `number
|
|
381
|
-
- `DataType.BOOLEAN` только значение типа `boolean
|
|
382
|
-
- `DataType.ARRAY` только значение типа `array
|
|
383
|
-
- `DataType.OBJECT` только значение типа `object
|
|
377
|
+
- `DataType.ANY` разрешено любое значение;
|
|
378
|
+
- `DataType.STRING` только значение типа `string`;
|
|
379
|
+
- `DataType.NUMBER` только значение типа `number`;
|
|
380
|
+
- `DataType.BOOLEAN` только значение типа `boolean`;
|
|
381
|
+
- `DataType.ARRAY` только значение типа `array`;
|
|
382
|
+
- `DataType.OBJECT` только значение типа `object`;
|
|
384
383
|
|
|
385
384
|
**Параметры**
|
|
386
385
|
|
|
387
|
-
- `type: string` тип допустимого значения (обязательно)
|
|
388
|
-
- `itemType: string` тип элемента массива (для `type: 'array'`)
|
|
389
|
-
- `model: string` модель объекта (для `type: 'object'`)
|
|
390
|
-
- `primaryKey: boolean` объявить свойство первичным
|
|
391
|
-
- `columnName: string` переопределение названия
|
|
392
|
-
- `columnType: string` тип колонки (определяется адаптером)
|
|
393
|
-
- `required: boolean` объявить свойство
|
|
394
|
-
- `default: any` значение по
|
|
395
|
-
- `unique: boolean | string` проверять значение на
|
|
386
|
+
- `type: string` тип допустимого значения (обязательно);
|
|
387
|
+
- `itemType: string` тип элемента массива (для `type: 'array'`);
|
|
388
|
+
- `model: string` модель объекта (для `type: 'object'`);
|
|
389
|
+
- `primaryKey: boolean` объявить свойство первичным ключом;
|
|
390
|
+
- `columnName: string` переопределение названия колонки;
|
|
391
|
+
- `columnType: string` тип колонки (определяется адаптером);
|
|
392
|
+
- `required: boolean` объявить свойство обязательным;
|
|
393
|
+
- `default: any` значение по умолчанию;
|
|
394
|
+
- `unique: boolean | string` проверять значение на уникальность;
|
|
396
395
|
|
|
397
396
|
**Параметр `unique`**
|
|
398
397
|
|
|
399
|
-
Если значением параметра `unique` является `true` или `
|
|
400
|
-
строгая проверка на уникальность. В этом режиме
|
|
401
|
-
|
|
402
|
-
которые должны быть уникальными.
|
|
398
|
+
Если значением параметра `unique` является `true` или `"strict"`, то выполняется
|
|
399
|
+
строгая проверка на уникальность. В этом режиме любое значение данного свойства
|
|
400
|
+
не может быть представлено более одного раза.
|
|
403
401
|
|
|
404
|
-
Режим `
|
|
405
|
-
[пустые значения](
|
|
406
|
-
от типа свойства. Например, для типа `string` пустым значением будет
|
|
407
|
-
`null` и `
|
|
402
|
+
Режим `"sparse"` проверяет только значения с полезной нагрузкой, исключая
|
|
403
|
+
[пустые значения](#пустые-значения), список которых отличается в зависимости
|
|
404
|
+
от типа свойства. Например, для типа `string` пустым значением будет
|
|
405
|
+
`undefined`, `null` и `""` (пустая строка).
|
|
408
406
|
|
|
409
|
-
- `unique: true | 'strict'` строгая проверка на
|
|
410
|
-
- `unique: 'sparse'` исключить из проверки [пустые значения](
|
|
411
|
-
- `unique: false | 'nonUnique'` не проверять на уникальность (по умолчанию)
|
|
407
|
+
- `unique: true | 'strict'` строгая проверка на уникальность;
|
|
408
|
+
- `unique: 'sparse'` исключить из проверки [пустые значения](#пустые-значения);
|
|
409
|
+
- `unique: false | 'nonUnique'` не проверять на уникальность (по умолчанию);
|
|
412
410
|
|
|
413
411
|
В качестве значений параметра `unique` можно использовать предопределенные
|
|
414
412
|
константы как эквивалент строковых значений `strict`, `sparse` и `nonUnique`.
|
|
415
413
|
|
|
416
|
-
- `PropertyUniqueness.STRICT
|
|
417
|
-
- `PropertyUniqueness.SPARSE
|
|
418
|
-
- `PropertyUniqueness.NON_UNIQUE
|
|
414
|
+
- `PropertyUniqueness.STRICT`;
|
|
415
|
+
- `PropertyUniqueness.SPARSE`;
|
|
416
|
+
- `PropertyUniqueness.NON_UNIQUE`;
|
|
419
417
|
|
|
420
418
|
**Примеры**
|
|
421
419
|
|
|
@@ -483,70 +481,14 @@ dbs.defineModel({
|
|
|
483
481
|
наоборот допускает дублирование пустых значений уникального свойства,
|
|
484
482
|
поскольку они не участвуют в проверке.
|
|
485
483
|
|
|
486
|
-
|
|
|
487
|
-
|
|
488
|
-
| `DataType.ANY` |
|
|
489
|
-
| `DataType.STRING` | `
|
|
490
|
-
| `DataType.NUMBER` | `
|
|
491
|
-
| `DataType.BOOLEAN` | `
|
|
492
|
-
| `DataType.ARRAY` | `
|
|
493
|
-
| `DataType.OBJECT` | `
|
|
494
|
-
|
|
495
|
-
### Переопределение пустых значений
|
|
496
|
-
|
|
497
|
-
Набор пустых значений для любого типа данных можно переопределить. Управление
|
|
498
|
-
этими наборами осуществляется через специальный сервис, который предоставляет
|
|
499
|
-
модуль
|
|
500
|
-
[@e22m4u/js-empty-values](https://www.npmjs.com/package/@e22m4u/js-empty-values)
|
|
501
|
-
(не требует установки).
|
|
502
|
-
|
|
503
|
-
**EmptyValuesService**
|
|
504
|
-
|
|
505
|
-
Для переопределения пустых значений необходимо получить экземпляр класса
|
|
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
|
-
```
|
|
526
|
-
|
|
527
|
-
**Пример**
|
|
528
|
-
|
|
529
|
-
Если свойство с типом `string` является обязательным, то попытка записи пустой
|
|
530
|
-
строки приведет к ошибке. Следующий пример демонстрирует, как изменить данное
|
|
531
|
-
поведение, оставив в качестве пустых значений только `undefined` и `null`.
|
|
532
|
-
|
|
533
|
-
```js
|
|
534
|
-
import {DataType} from '@e22m4u/js-repository';
|
|
535
|
-
import {DatabaseSchema} from '@e22m4u/js-repository';
|
|
536
|
-
import {EmptyValuesService} from '@e22m4u/js-empty-values';
|
|
537
|
-
|
|
538
|
-
const dbs = new DatabaseSchema();
|
|
539
|
-
|
|
540
|
-
// получение сервиса для работы с пустыми значениями
|
|
541
|
-
const emptyValuesService = dbs.getService(EmptyValuesService);
|
|
542
|
-
|
|
543
|
-
// переопределение пустых значений для типа DataType.STRING
|
|
544
|
-
emptyValuesService.setEmptyValuesOf(DataType.STRING, [undefined, null]);
|
|
545
|
-
```
|
|
546
|
-
|
|
547
|
-
Теперь пустая строка будет успешно проходить проверку для обязательных свойств
|
|
548
|
-
с типом `string`, а также не будет заменяться на значение по умолчанию
|
|
549
|
-
для необязательных свойств модели.
|
|
484
|
+
| тип свойства | пустые значения |
|
|
485
|
+
|--------------------|----------------------------|
|
|
486
|
+
| `DataType.ANY` | *значения остальных типов* |
|
|
487
|
+
| `DataType.STRING` | `undefined`, `null`, `""` |
|
|
488
|
+
| `DataType.NUMBER` | `undefined`, `null` |
|
|
489
|
+
| `DataType.BOOLEAN` | `undefined`, `null` |
|
|
490
|
+
| `DataType.ARRAY` | `undefined`, `null` |
|
|
491
|
+
| `DataType.OBJECT` | `undefined`, `null` |
|
|
550
492
|
|
|
551
493
|
## Репозиторий
|
|
552
494
|
|
|
@@ -570,10 +512,10 @@ emptyValuesService.setEmptyValuesOf(DataType.STRING, [undefined, null]);
|
|
|
570
512
|
|
|
571
513
|
**Аргументы**
|
|
572
514
|
|
|
573
|
-
- `id: number|string` идентификатор (первичный ключ)
|
|
574
|
-
- `data: object` данные документа (используется при записи)
|
|
575
|
-
- `where: object` условия фильтрации (см. [Фильтрация](#Фильтрация))
|
|
576
|
-
- `filter: object` параметры выборки (см. [Фильтрация](#Фильтрация))
|
|
515
|
+
- `id: number|string` идентификатор (первичный ключ);
|
|
516
|
+
- `data: object` данные документа (используется при записи);
|
|
517
|
+
- `where: object` условия фильтрации (см. [Фильтрация](#Фильтрация));
|
|
518
|
+
- `filter: object` параметры выборки (см. [Фильтрация](#Фильтрация));
|
|
577
519
|
|
|
578
520
|
**Получение репозитория**
|
|
579
521
|
|
|
@@ -1083,26 +1025,26 @@ const news = await newsRepository.find({
|
|
|
1083
1025
|
операторов сравнения.
|
|
1084
1026
|
|
|
1085
1027
|
- [Поиск по значению](#поиск-по-значению-сокращенная-форма)
|
|
1086
|
-
- [`eq`](#eq-строгое-равенство)
|
|
1087
|
-
- [`neq`](#neq-неравенство)
|
|
1088
|
-
- [`gt`](#gt-больше-чем)
|
|
1089
|
-
- [`lt`](#lt-меньше-чем)
|
|
1090
|
-
- [`gte`](#gte-больше-или-равно)
|
|
1091
|
-
- [`lte`](#lte-меньше-или-равно)
|
|
1092
|
-
- [`inq`](#inq-в-списке)
|
|
1093
|
-
- [`nin`](#nin-не-в-списке)
|
|
1094
|
-
- [`between`](#between-диапазон)
|
|
1095
|
-
- [`exists`](#exists-наличие-свойства)
|
|
1096
|
-
- [`like`](#like-шаблон)
|
|
1097
|
-
- [`nlike`](#nlike-исключающий-шаблон)
|
|
1098
|
-
- [`ilike`](#ilike-регистронезависимый-шаблон)
|
|
1099
|
-
- [`nilike`](#nilike-регистронезависимый-шаблон-исключения)
|
|
1100
|
-
- [`regexp`](#regexp-регулярное-выражение)
|
|
1028
|
+
- [`eq`](#eq-строгое-равенство) строгое равенство;
|
|
1029
|
+
- [`neq`](#neq-неравенство) неравенство;
|
|
1030
|
+
- [`gt`](#gt-больше-чем) больше чем;
|
|
1031
|
+
- [`lt`](#lt-меньше-чем) меньше чем;
|
|
1032
|
+
- [`gte`](#gte-больше-или-равно) больше или равно;
|
|
1033
|
+
- [`lte`](#lte-меньше-или-равно) меньше или равно;
|
|
1034
|
+
- [`inq`](#inq-в-списке) в списке;
|
|
1035
|
+
- [`nin`](#nin-не-в-списке) не в списке;
|
|
1036
|
+
- [`between`](#between-диапазон) диапазон;
|
|
1037
|
+
- [`exists`](#exists-наличие-свойства) наличие свойства;
|
|
1038
|
+
- [`like`](#like-шаблон) *SQL*-подобный шаблон;
|
|
1039
|
+
- [`nlike`](#nlike-исключающий-шаблон) исключающий шаблон;
|
|
1040
|
+
- [`ilike`](#ilike-регистронезависимый-шаблон) регистронезависимый шаблон;
|
|
1041
|
+
- [`nilike`](#nilike-регистронезависимый-шаблон-исключения) регистронезависимый шаблон исключения;
|
|
1042
|
+
- [`regexp`](#regexp-регулярное-выражение) регулярное выражение;
|
|
1101
1043
|
|
|
1102
1044
|
Условия можно объединять логическими операторами:
|
|
1103
1045
|
|
|
1104
|
-
- [`and`](#and-логическое-и)
|
|
1105
|
-
- [`or`](#or-логическое-или)
|
|
1046
|
+
- [`and`](#and-логическое-и) логическое *И*;
|
|
1047
|
+
- [`or`](#or-логическое-или) логическое *ИЛИ*;
|
|
1106
1048
|
|
|
1107
1049
|
#### Поиск по значению (сокращенная форма)
|
|
1108
1050
|
|
|
@@ -2141,12 +2083,6 @@ const city: City = await cityRep.create({
|
|
|
2141
2083
|
});
|
|
2142
2084
|
```
|
|
2143
2085
|
|
|
2144
|
-
Для определения моделей с помощью TypeScript классов,
|
|
2145
|
-
рекомендуется использовать специальную версию данного модуля
|
|
2146
|
-
[@e22m4u/ts-repository](https://www.npmjs.com/package/@e22m4u/ts-repository),
|
|
2147
|
-
поставляемую с набором TypeScript декораторов и дополнительных
|
|
2148
|
-
инструментов для работы в TypeScript окружении.
|
|
2149
|
-
|
|
2150
2086
|
## Тесты
|
|
2151
2087
|
|
|
2152
2088
|
```bash
|