Просмотр исходного кода

refactor: replaces EmptyValuesService with BlankValuesService

e22m4u 2 недель назад
Родитель
Сommit
d076ce55aa

+ 10 - 42
README.md

@@ -15,7 +15,7 @@
 - [Источник данных](#источник-данных)
 - [Источник данных](#источник-данных)
 - [Модель](#модель)
 - [Модель](#модель)
 - [Свойства](#свойства)
 - [Свойства](#свойства)
-- [Пустые и незаполненные значения](#пустые-и-незаполненные-значения)
+- [Пустые значения](#пустые-значения)
 - [Репозиторий](#репозиторий)
 - [Репозиторий](#репозиторий)
   - [create](#repositorycreate)
   - [create](#repositorycreate)
   - [replaceById](#repositoryreplacebyid)
   - [replaceById](#repositoryreplacebyid)
@@ -471,44 +471,17 @@ dbs.defineModel({
 });
 });
 ```
 ```
 
 
-## Пустые и незаполненные значения
+## Пустые значения
 
 
-Библиотека использует внешний модуль
-[@e22m4u/js-empty-values](https://www.npmjs.com/package/@e22m4u/js-empty-values)
-централизованного управления категориями значений, не имеющих полезной нагрузки.
-Ниже приводится описание этих категорий и их назначение.
+Разные типы свойств имеют свои наборы пустых значений. Эти наборы используются
+для определения наличия полезной нагрузки в значении свойства. Например,
+параметр `default` в определении свойства устанавливает значение по умолчанию,
+только если входящее значение является пустым. Параметр `required` исключает
+пустые значения выбрасывая ошибку. А параметр `unique` в режиме `sparse`
+наоборот допускает дублирование пустых значений уникального свойства,
+поскольку они не участвуют в проверке.
 
 
-- Пустые значения (*Empty Values*)
-  - управляются сервисом `EmptyValuesService`;
-  - используются параметром `unique` в режиме `"sparse"`;
-
-- Незаполненные значения (*Blank Values*)
-  - управляются сервисом `BlankValuesService`;
-  - используются параметром `required` и `default`;
-
-### Пустые значения
-
-Данная категория используется при проверке уникальности значения в режиме
-`sparse`, когда уникальность значений из этой категории игнорируется. Кроме
-пустой строки, сюда входят структурная пустота и ноль.
-
-| тип данных         | пустые значения            |
-|--------------------|----------------------------|
-| `DataType.ANY`     | *значения остальных типов* |
-| `DataType.STRING`  | `undefined`, `null`, `""`  |
-| `DataType.NUMBER`  | `undefined`, `null`, `0`   |
-| `DataType.BOOLEAN` | `undefined`, `null`        |
-| `DataType.ARRAY`   | `undefined`, `null`, `[]`  |
-| `DataType.OBJECT`  | `undefined`, `null`, `{}`  |
-
-### Незаполненные значения
-
-Вторая категория имеет более строгий набор критериев для определения отсутствия
-полезной нагрузки. Значения этой категории вызывают ошибку при записи свойств
-с флагом `required`. Также категория применяется при определении необходимости
-использования значения по умолчанию вместо исходного значения свойства.
-
-| тип данных         | незаполненные значения     |
+| тип свойства       | пустые значения            |
 |--------------------|----------------------------|
 |--------------------|----------------------------|
 | `DataType.ANY`     | *значения остальных типов* |
 | `DataType.ANY`     | *значения остальных типов* |
 | `DataType.STRING`  | `undefined`, `null`, `""`  |
 | `DataType.STRING`  | `undefined`, `null`, `""`  |
@@ -517,11 +490,6 @@ dbs.defineModel({
 | `DataType.ARRAY`   | `undefined`, `null`        |
 | `DataType.ARRAY`   | `undefined`, `null`        |
 | `DataType.OBJECT`  | `undefined`, `null`        |
 | `DataType.OBJECT`  | `undefined`, `null`        |
 
 
-Наборы пустых и незаполненных значений каждого типа можно переопределить
-через соответствующие сервисы модуля
-[@e22m4u/js-empty-values](https://www.npmjs.com/package/@e22m4u/js-empty-values)
-(не требует установки).
-
 ## Репозиторий
 ## Репозиторий
 
 
 Репозиторий выполняет операции чтения и записи данных определенной модели.
 Репозиторий выполняет операции чтения и записи данных определенной модели.

+ 3 - 3
dist/cjs/index.cjs

@@ -2307,7 +2307,7 @@ var init_property_uniqueness_validator = __esm({
           propValue
           propValue
         ), "createError");
         ), "createError");
         let willBeReplaced = void 0;
         let willBeReplaced = void 0;
-        const emptyValuesService = this.getService(import_js_empty_values3.EmptyValuesService);
+        const blankValuesService = this.getService(import_js_empty_values3.BlankValuesService);
         for (const propName of propNames) {
         for (const propName of propNames) {
           const propDef = propDefs[propName];
           const propDef = propDefs[propName];
           if (!propDef || typeof propDef === "string" || !propDef.unique || propDef.unique === PropertyUniqueness.NON_UNIQUE) {
           if (!propDef || typeof propDef === "string" || !propDef.unique || propDef.unique === PropertyUniqueness.NON_UNIQUE) {
@@ -2316,8 +2316,8 @@ var init_property_uniqueness_validator = __esm({
           const propValue = modelData[propName];
           const propValue = modelData[propName];
           if (propDef.unique === PropertyUniqueness.SPARSE) {
           if (propDef.unique === PropertyUniqueness.SPARSE) {
             const propType = propDef.type || DataType.ANY;
             const propType = propDef.type || DataType.ANY;
-            const isEmpty = emptyValuesService.isEmptyOf(propType, propValue);
-            if (isEmpty) continue;
+            const isBlank = blankValuesService.isBlankOf(propType, propValue);
+            if (isBlank) continue;
           }
           }
           if (methodName === "create") {
           if (methodName === "create") {
             const count = await countMethod({ [propName]: propValue });
             const count = await countMethod({ [propName]: propValue });

+ 4 - 4
src/definition/model/properties/property-uniqueness-validator.js

@@ -1,7 +1,7 @@
 import {DataType} from './data-type.js';
 import {DataType} from './data-type.js';
 import {Service} from '@e22m4u/js-service';
 import {Service} from '@e22m4u/js-service';
 import {isPlainObject} from '../../../utils/index.js';
 import {isPlainObject} from '../../../utils/index.js';
-import {EmptyValuesService} from '@e22m4u/js-empty-values';
+import {BlankValuesService} from '@e22m4u/js-empty-values';
 import {PropertyUniqueness} from './property-uniqueness.js';
 import {PropertyUniqueness} from './property-uniqueness.js';
 import {InvalidArgumentError} from '../../../errors/index.js';
 import {InvalidArgumentError} from '../../../errors/index.js';
 import {ModelDefinitionUtils} from '../model-definition-utils.js';
 import {ModelDefinitionUtils} from '../model-definition-utils.js';
@@ -70,7 +70,7 @@ export class PropertyUniquenessValidator extends Service {
         propValue,
         propValue,
       );
       );
     let willBeReplaced = undefined;
     let willBeReplaced = undefined;
-    const emptyValuesService = this.getService(EmptyValuesService);
+    const blankValuesService = this.getService(BlankValuesService);
     for (const propName of propNames) {
     for (const propName of propNames) {
       const propDef = propDefs[propName];
       const propDef = propDefs[propName];
       if (
       if (
@@ -85,8 +85,8 @@ export class PropertyUniquenessValidator extends Service {
       const propValue = modelData[propName];
       const propValue = modelData[propName];
       if (propDef.unique === PropertyUniqueness.SPARSE) {
       if (propDef.unique === PropertyUniqueness.SPARSE) {
         const propType = propDef.type || DataType.ANY;
         const propType = propDef.type || DataType.ANY;
-        const isEmpty = emptyValuesService.isEmptyOf(propType, propValue);
-        if (isEmpty) continue;
+        const isBlank = blankValuesService.isBlankOf(propType, propValue);
+        if (isBlank) continue;
       }
       }
       // create
       // create
       if (methodName === 'create') {
       if (methodName === 'create') {

+ 19 - 19
src/definition/model/properties/property-uniqueness-validator.spec.js

@@ -2,7 +2,7 @@ import {expect} from 'chai';
 import {DataType} from './data-type.js';
 import {DataType} from './data-type.js';
 import {format} from '@e22m4u/js-format';
 import {format} from '@e22m4u/js-format';
 import {DatabaseSchema} from '../../../database-schema.js';
 import {DatabaseSchema} from '../../../database-schema.js';
-import {EmptyValuesService} from '@e22m4u/js-empty-values';
+import {BlankValuesService} from '@e22m4u/js-empty-values';
 import {PropertyUniqueness} from './property-uniqueness.js';
 import {PropertyUniqueness} from './property-uniqueness.js';
 import {PropertyUniquenessValidator} from './property-uniqueness-validator.js';
 import {PropertyUniquenessValidator} from './property-uniqueness-validator.js';
 import {DEFAULT_PRIMARY_KEY_PROPERTY_NAME as DEF_PK} from '../model-definition-utils.js';
 import {DEFAULT_PRIMARY_KEY_PROPERTY_NAME as DEF_PK} from '../model-definition-utils.js';
@@ -1862,7 +1862,7 @@ describe('PropertyUniquenessValidator', function () {
           expect(invoked).to.be.eq(1);
           expect(invoked).to.be.eq(1);
         });
         });
 
 
-        it('skips uniqueness checking for empty values', async function () {
+        it('skips uniqueness checking for blank values', async function () {
           const dbs = new DatabaseSchema();
           const dbs = new DatabaseSchema();
           dbs.defineModel({
           dbs.defineModel({
             name: 'model',
             name: 'model',
@@ -1880,8 +1880,8 @@ describe('PropertyUniquenessValidator', function () {
           const puv = dbs.getService(PropertyUniquenessValidator);
           const puv = dbs.getService(PropertyUniquenessValidator);
           let invoked = 0;
           let invoked = 0;
           dbs
           dbs
-            .getService(EmptyValuesService)
-            .setEmptyValuesOf(DataType.STRING, ['val2']);
+            .getService(BlankValuesService)
+            .setBlankValuesOf(DataType.STRING, ['val2']);
           const modelData = {foo: 'val1', bar: 'val2'};
           const modelData = {foo: 'val1', bar: 'val2'};
           const countMethod = where => {
           const countMethod = where => {
             if (invoked === 0) expect(where).to.be.eql({foo: 'val1'});
             if (invoked === 0) expect(where).to.be.eql({foo: 'val1'});
@@ -1976,7 +1976,7 @@ describe('PropertyUniquenessValidator', function () {
           expect(invoked).to.be.eq(1);
           expect(invoked).to.be.eq(1);
         });
         });
 
 
-        it('skips uniqueness checking for empty values', async function () {
+        it('skips uniqueness checking for blank values', async function () {
           const dbs = new DatabaseSchema();
           const dbs = new DatabaseSchema();
           dbs.defineModel({
           dbs.defineModel({
             name: 'model',
             name: 'model',
@@ -1994,8 +1994,8 @@ describe('PropertyUniquenessValidator', function () {
           const puv = dbs.getService(PropertyUniquenessValidator);
           const puv = dbs.getService(PropertyUniquenessValidator);
           let invoked = 0;
           let invoked = 0;
           dbs
           dbs
-            .getService(EmptyValuesService)
-            .setEmptyValuesOf(DataType.STRING, ['val2']);
+            .getService(BlankValuesService)
+            .setBlankValuesOf(DataType.STRING, ['val2']);
           const idValue = 1;
           const idValue = 1;
           const modelData = {foo: 'val1', bar: 'val2'};
           const modelData = {foo: 'val1', bar: 'val2'};
           const countMethod = where => {
           const countMethod = where => {
@@ -2241,7 +2241,7 @@ describe('PropertyUniquenessValidator', function () {
               expect(invoked).to.be.eq(3);
               expect(invoked).to.be.eq(3);
             });
             });
 
 
-            it('skips uniqueness checking for empty values', async function () {
+            it('skips uniqueness checking for blank values', async function () {
               const dbs = new DatabaseSchema();
               const dbs = new DatabaseSchema();
               dbs.defineModel({
               dbs.defineModel({
                 name: 'model',
                 name: 'model',
@@ -2258,8 +2258,8 @@ describe('PropertyUniquenessValidator', function () {
               });
               });
               const puv = dbs.getService(PropertyUniquenessValidator);
               const puv = dbs.getService(PropertyUniquenessValidator);
               dbs
               dbs
-                .getService(EmptyValuesService)
-                .setEmptyValuesOf(DataType.STRING, ['val2']);
+                .getService(BlankValuesService)
+                .setBlankValuesOf(DataType.STRING, ['val2']);
               let invoked = 0;
               let invoked = 0;
               const idValue = 1;
               const idValue = 1;
               const modelData = {[DEF_PK]: idValue, foo: 'val1', bar: 'val2'};
               const modelData = {[DEF_PK]: idValue, foo: 'val1', bar: 'val2'};
@@ -2420,7 +2420,7 @@ describe('PropertyUniquenessValidator', function () {
               expect(invoked).to.be.eq(3);
               expect(invoked).to.be.eq(3);
             });
             });
 
 
-            it('skips uniqueness checking for empty values', async function () {
+            it('skips uniqueness checking for blank values', async function () {
               const dbs = new DatabaseSchema();
               const dbs = new DatabaseSchema();
               dbs.defineModel({
               dbs.defineModel({
                 name: 'model',
                 name: 'model',
@@ -2437,8 +2437,8 @@ describe('PropertyUniquenessValidator', function () {
               });
               });
               const puv = dbs.getService(PropertyUniquenessValidator);
               const puv = dbs.getService(PropertyUniquenessValidator);
               dbs
               dbs
-                .getService(EmptyValuesService)
-                .setEmptyValuesOf(DataType.STRING, ['val2']);
+                .getService(BlankValuesService)
+                .setBlankValuesOf(DataType.STRING, ['val2']);
               let invoked = 0;
               let invoked = 0;
               const idValue = 1;
               const idValue = 1;
               const modelData = {[DEF_PK]: idValue, foo: 'val1', bar: 'val2'};
               const modelData = {[DEF_PK]: idValue, foo: 'val1', bar: 'val2'};
@@ -2558,7 +2558,7 @@ describe('PropertyUniquenessValidator', function () {
           await expect(promise2).not.to.be.rejected;
           await expect(promise2).not.to.be.rejected;
         });
         });
 
 
-        it('skips uniqueness checking for empty values', async function () {
+        it('skips uniqueness checking for blank values', async function () {
           const dbs = new DatabaseSchema();
           const dbs = new DatabaseSchema();
           dbs.defineModel({
           dbs.defineModel({
             name: 'model',
             name: 'model',
@@ -2575,8 +2575,8 @@ describe('PropertyUniquenessValidator', function () {
           });
           });
           const puv = dbs.getService(PropertyUniquenessValidator);
           const puv = dbs.getService(PropertyUniquenessValidator);
           dbs
           dbs
-            .getService(EmptyValuesService)
-            .setEmptyValuesOf(DataType.STRING, ['val2']);
+            .getService(BlankValuesService)
+            .setBlankValuesOf(DataType.STRING, ['val2']);
           let invoked = 0;
           let invoked = 0;
           const modelData = {foo: 'val1', bar: 'val2'};
           const modelData = {foo: 'val1', bar: 'val2'};
           const countMethod = where => {
           const countMethod = where => {
@@ -2697,7 +2697,7 @@ describe('PropertyUniquenessValidator', function () {
           await expect(promise2).not.to.be.rejected;
           await expect(promise2).not.to.be.rejected;
         });
         });
 
 
-        it('skips uniqueness checking for empty values', async function () {
+        it('skips uniqueness checking for blank values', async function () {
           const dbs = new DatabaseSchema();
           const dbs = new DatabaseSchema();
           dbs.defineModel({
           dbs.defineModel({
             name: 'model',
             name: 'model',
@@ -2715,8 +2715,8 @@ describe('PropertyUniquenessValidator', function () {
           const puv = dbs.getService(PropertyUniquenessValidator);
           const puv = dbs.getService(PropertyUniquenessValidator);
           let invoked = 0;
           let invoked = 0;
           dbs
           dbs
-            .getService(EmptyValuesService)
-            .setEmptyValuesOf(DataType.STRING, ['val2']);
+            .getService(BlankValuesService)
+            .setBlankValuesOf(DataType.STRING, ['val2']);
           const modelData = {foo: 'val1', bar: 'val2'};
           const modelData = {foo: 'val1', bar: 'val2'};
           const countMethod = where => {
           const countMethod = where => {
             if (invoked === 0)
             if (invoked === 0)