e22m4u 3 дней назад
Родитель
Сommit
1d40f26ef6

+ 8 - 3
README.md

@@ -406,8 +406,8 @@ console.log(result);
 ## Функция `projectData`
 
 Функция создает проекцию данных на основе переданного объекта схемы.
-Принимает исходные данные и дополнительные опции для управления режимом
-строгости и областью видимости.
+Принимает исходные данные и дополнительные настройки для управления
+режимом строгости и областью видимости.
 
 **Сигнатура вызова:**
 
@@ -492,7 +492,12 @@ defineSchema(schemaDef)
 
 ### Метод `project`
 
-Выполняет проекцию данных, используя возможности внутреннего реестра схем. Метод работает аналогично функции `projectData`, но автоматически предоставляет механизм разрешения имен (resolver), связанный с добавленными ранее схемами. Это позволяет передавать в качестве первого аргумента строковое имя зарегистрированной схемы без необходимости указывать функцию `resolver` в опциях вручную.
+Выполняет проекцию данных, используя возможности внутреннего реестра
+схем. Метод работает аналогично функции `projectData`, но автоматически
+предоставляет функционал разрешения имен, связанный с добавленными ранее
+схемами. Метод позволяет передавать в качестве первого аргумента строковое
+имя зарегистрированной схемы без необходимости указывать функцию `resolver`
+в настройках проекции.
 
 **Сигнатура вызова:**
 

+ 18 - 18
dist/cjs/index.cjs

@@ -48,14 +48,14 @@ function validateProjectionSchema(schema, shallowMode = false) {
       shallowMode
     );
   }
-  Object.keys(schema).forEach((propName) => {
-    const options = schema[propName];
+  Object.keys(schema).forEach((fieldName) => {
+    const options = schema[fieldName];
     if (options === void 0) {
       return;
     }
     if (options === null || typeof options !== "boolean" && typeof options !== "object" || Array.isArray(options)) {
       throw new import_js_format.InvalidArgumentError(
-        "Property options must be a Boolean or an Object, but %v was given.",
+        "Field options must be a Boolean or an Object, but %v was given.",
         options
       );
     }
@@ -64,7 +64,7 @@ function validateProjectionSchema(schema, shallowMode = false) {
     }
     if (options.select !== void 0 && typeof options.select !== "boolean") {
       throw new import_js_format.InvalidArgumentError(
-        'Property option "select" must be a Boolean, but %v was given.',
+        'Field option "select" must be a Boolean, but %v was given.',
         options.select
       );
     }
@@ -82,7 +82,7 @@ function validateProjectionSchema(schema, shallowMode = false) {
     if (options.scopes !== void 0) {
       if (!options.scopes || typeof options.scopes !== "object" || Array.isArray(options.scopes)) {
         throw new import_js_format.InvalidArgumentError(
-          'Property option "scopes" must be an Object, but %v was given.',
+          'Field option "scopes" must be an Object, but %v was given.',
           options.scopes
         );
       }
@@ -192,12 +192,12 @@ function projectData(schemaOrFactory, data, options) {
     if (!Object.prototype.hasOwnProperty.call(data, field)) {
       continue;
     }
-    const propOptionsOrBoolean = schema[field];
-    if (_shouldSelect(propOptionsOrBoolean, strict, scope)) {
+    const fieldOptionsOrBoolean = schema[field];
+    if (_shouldSelect(fieldOptionsOrBoolean, strict, scope)) {
       const value = data[field];
-      if (propOptionsOrBoolean && typeof propOptionsOrBoolean === "object" && propOptionsOrBoolean.schema) {
+      if (fieldOptionsOrBoolean && typeof fieldOptionsOrBoolean === "object" && fieldOptionsOrBoolean.schema) {
         result[field] = projectData(
-          propOptionsOrBoolean.schema,
+          fieldOptionsOrBoolean.schema,
           value,
           options
         );
@@ -209,14 +209,14 @@ function projectData(schemaOrFactory, data, options) {
   return result;
 }
 __name(projectData, "projectData");
-function _shouldSelect(propOptionsOrBoolean, strict, scope) {
-  if (typeof propOptionsOrBoolean === "boolean") {
-    return propOptionsOrBoolean;
+function _shouldSelect(fieldOptionsOrBoolean, strict, scope) {
+  if (typeof fieldOptionsOrBoolean === "boolean") {
+    return fieldOptionsOrBoolean;
   }
-  if (typeof propOptionsOrBoolean === "object") {
-    const propOptions = propOptionsOrBoolean;
-    if (scope && propOptions.scopes && typeof propOptions.scopes === "object" && propOptions.scopes[scope] != null) {
-      const scopeOptionsOrBoolean = propOptions.scopes[scope];
+  if (typeof fieldOptionsOrBoolean === "object") {
+    const fieldOptions = fieldOptionsOrBoolean;
+    if (scope && fieldOptions.scopes && typeof fieldOptions.scopes === "object" && fieldOptions.scopes[scope] != null) {
+      const scopeOptionsOrBoolean = fieldOptions.scopes[scope];
       if (typeof scopeOptionsOrBoolean === "boolean") {
         return scopeOptionsOrBoolean;
       }
@@ -224,8 +224,8 @@ function _shouldSelect(propOptionsOrBoolean, strict, scope) {
         return scopeOptionsOrBoolean.select;
       }
     }
-    if (typeof propOptionsOrBoolean.select === "boolean") {
-      return propOptionsOrBoolean.select;
+    if (typeof fieldOptionsOrBoolean.select === "boolean") {
+      return fieldOptionsOrBoolean.select;
     }
   }
   return !strict;

+ 1 - 1
src/definitions/validate-projection-schema-definition.spec.js

@@ -59,7 +59,7 @@ describe('validateProjectionSchemaDefinition', function () {
     const throwable = () =>
       validateProjectionSchemaDefinition({name: 'mySchema', schema: {foo: 10}});
     expect(throwable).to.throw(
-      'Property options must be a Boolean or an Object, but 10 was given.',
+      'Field options must be a Boolean or an Object, but 10 was given.',
     );
   });
 });

+ 29 - 29
src/project-data.js

@@ -125,36 +125,36 @@ export function projectData(schemaOrFactory, data, options) {
   // (исключая ключи прототипа Object.keys(x))
   const fields = Object.keys(strict ? schema : data);
   for (const field of fields) {
-    // если свойство отсутствует в исходных
-    // данных, то свойство игнорируется
+    // если поле отсутствует в исходных
+    // данных, то поле игнорируется
     if (!(field in data)) {
       continue;
     }
-    // если свойство принадлежит прототипу,
-    // то свойство игнорируется
+    // если поле принадлежит прототипу,
+    // то поле игнорируется
     if (!Object.prototype.hasOwnProperty.call(data, field)) {
       continue;
     }
-    const propOptionsOrBoolean = schema[field];
-    // проверка доступности свойства для данной
+    const fieldOptionsOrBoolean = schema[field];
+    // проверка доступности поля для данной
     // области проекции (если определена)
-    if (_shouldSelect(propOptionsOrBoolean, strict, scope)) {
+    if (_shouldSelect(fieldOptionsOrBoolean, strict, scope)) {
       const value = data[field];
       // если определена вложенная схема,
       // то проекция применяется рекурсивно
       if (
-        propOptionsOrBoolean &&
-        typeof propOptionsOrBoolean === 'object' &&
-        propOptionsOrBoolean.schema
+        fieldOptionsOrBoolean &&
+        typeof fieldOptionsOrBoolean === 'object' &&
+        fieldOptionsOrBoolean.schema
       ) {
         result[field] = projectData(
-          propOptionsOrBoolean.schema,
+          fieldOptionsOrBoolean.schema,
           value,
           options,
         );
       }
       // иначе значение присваивается
-      // свойству без изменений
+      // полю без изменений
       else {
         result[field] = value;
       }
@@ -166,33 +166,33 @@ export function projectData(schemaOrFactory, data, options) {
 /**
  * Should select (internal).
  *
- * Определяет, следует ли включать свойство в результат.
+ * Определяет, следует ли включать поле в результат.
  * Приоритет: правило для области -> общее правило -> по умолчанию true.
  *
- * @param {object|boolean|undefined} propOptionsOrBoolean
+ * @param {object|boolean|undefined} fieldOptionsOrBoolean
  * @param {boolean|undefined} strict
  * @param {string|undefined} scope
  * @returns {boolean}
  */
-function _shouldSelect(propOptionsOrBoolean, strict, scope) {
-  // если настройки свойства являются логическим значением,
+function _shouldSelect(fieldOptionsOrBoolean, strict, scope) {
+  // если настройки поля являются логическим значением,
   // то значение используется как индикатор видимости
-  if (typeof propOptionsOrBoolean === 'boolean') {
-    return propOptionsOrBoolean;
+  if (typeof fieldOptionsOrBoolean === 'boolean') {
+    return fieldOptionsOrBoolean;
   }
-  // если настройки свойства являются объектом,
+  // если настройки поля являются объектом,
   // то проверяется правило области и общее правило
-  if (typeof propOptionsOrBoolean === 'object') {
-    const propOptions = propOptionsOrBoolean;
+  if (typeof fieldOptionsOrBoolean === 'object') {
+    const fieldOptions = fieldOptionsOrBoolean;
     // если определена область проекции,
     // то выполняется проверка правила области
     if (
       scope &&
-      propOptions.scopes &&
-      typeof propOptions.scopes === 'object' &&
-      propOptions.scopes[scope] != null
+      fieldOptions.scopes &&
+      typeof fieldOptions.scopes === 'object' &&
+      fieldOptions.scopes[scope] != null
     ) {
-      const scopeOptionsOrBoolean = propOptions.scopes[scope];
+      const scopeOptionsOrBoolean = fieldOptions.scopes[scope];
       // если настройки области являются логическим значением,
       // то значение используется как индикатор видимости
       if (typeof scopeOptionsOrBoolean === 'boolean') {
@@ -210,11 +210,11 @@ function _shouldSelect(propOptionsOrBoolean, strict, scope) {
     }
     // если область проекции не указана,
     // то проверяется общее правило
-    if (typeof propOptionsOrBoolean.select === 'boolean') {
-      return propOptionsOrBoolean.select;
+    if (typeof fieldOptionsOrBoolean.select === 'boolean') {
+      return fieldOptionsOrBoolean.select;
     }
   }
-  // если для свойства нет правил, то свойство
-  // по умолчанию доступно (недоступно в режиме strict)
+  // если для поля нет правил, то поле доступно
+  // по умолчанию (недоступно в режиме strict)
   return !strict;
 }

+ 1 - 1
src/project-data.spec.js

@@ -302,7 +302,7 @@ describe('projectData', function () {
       expect(res).to.be.eql({bar: {baz: 20}});
     });
 
-    it('should ignore prototype properties', function () {
+    it('should ignore inherited fields', function () {
       const res = projectData(
         {bar: true, toString: true},
         {bar: 10},

+ 3 - 3
src/projection-schema.d.ts

@@ -3,7 +3,7 @@
  * Projection schema.
  */
 export type ProjectionSchema = {
-  [property: string]: boolean | ProjectionSchemaPropertyOptions | undefined;
+  [field: string]: boolean | ProjectionSchemaFieldOptions | undefined;
 };
 
 /**
@@ -19,9 +19,9 @@ export type ProjectionSchemaFactory = () =>
   | ProjectionSchemaName;
 
 /**
- * Projection schema property options.
+ * Projection schema field options.
  */
-export type ProjectionSchemaPropertyOptions = {
+export type ProjectionSchemaFieldOptions = {
   select?: boolean;
   scopes?: ProjectionSchemaScopes;
   schema?: ProjectionSchema | ProjectionSchemaFactory | ProjectionSchemaName;

+ 5 - 5
src/validate-projection-schema.js

@@ -22,9 +22,9 @@ export function validateProjectionSchema(schema, shallowMode = false) {
       shallowMode,
     );
   }
-  Object.keys(schema).forEach(propName => {
+  Object.keys(schema).forEach(fieldName => {
     // schema[k]
-    const options = schema[propName];
+    const options = schema[fieldName];
     if (options === undefined) {
       return;
     }
@@ -34,7 +34,7 @@ export function validateProjectionSchema(schema, shallowMode = false) {
       Array.isArray(options)
     ) {
       throw new InvalidArgumentError(
-        'Property options must be a Boolean or an Object, but %v was given.',
+        'Field options must be a Boolean or an Object, but %v was given.',
         options,
       );
     }
@@ -44,7 +44,7 @@ export function validateProjectionSchema(schema, shallowMode = false) {
     // schema[k].select
     if (options.select !== undefined && typeof options.select !== 'boolean') {
       throw new InvalidArgumentError(
-        'Property option "select" must be a Boolean, but %v was given.',
+        'Field option "select" must be a Boolean, but %v was given.',
         options.select,
       );
     }
@@ -75,7 +75,7 @@ export function validateProjectionSchema(schema, shallowMode = false) {
         Array.isArray(options.scopes)
       ) {
         throw new InvalidArgumentError(
-          'Property option "scopes" must be an Object, but %v was given.',
+          'Field option "scopes" must be an Object, but %v was given.',
           options.scopes,
         );
       }

+ 9 - 15
src/validate-projection-schema.spec.js

@@ -35,11 +35,11 @@ describe('validateProjectionSchema', function () {
     throwable(undefined)();
   });
 
-  it('should require schema properties to be a boolean or an object', function () {
+  it('should require the field options to be a boolean or an object', function () {
     const throwable = v => () => validateProjectionSchema({foo: v});
     const error = s =>
       format(
-        'Property options must be a Boolean or an Object, but %s was given.',
+        'Field options must be a Boolean or an Object, but %s was given.',
         s,
       );
     expect(throwable('str')).to.throw(error('"str"'));
@@ -54,13 +54,10 @@ describe('validateProjectionSchema', function () {
     throwable(undefined)();
   });
 
-  it('should require the property option "select" to be a boolean', function () {
+  it('should require the field option "select" to be a boolean', function () {
     const throwable = v => () => validateProjectionSchema({foo: {select: v}});
     const error = s =>
-      format(
-        'Property option "select" must be a Boolean, but %s was given.',
-        s,
-      );
+      format('Field option "select" must be a Boolean, but %s was given.', s);
     expect(throwable('str')).to.throw(error('"str"'));
     expect(throwable('')).to.throw(error('""'));
     expect(throwable(10)).to.throw(error('10'));
@@ -73,7 +70,7 @@ describe('validateProjectionSchema', function () {
     throwable(undefined)();
   });
 
-  it('should require the property option "schema" to be a valid value', function () {
+  it('should require the field option "schema" to be a valid value', function () {
     const throwable = v => () => validateProjectionSchema({foo: {schema: v}});
     const error = s =>
       format(
@@ -94,13 +91,10 @@ describe('validateProjectionSchema', function () {
     throwable(undefined)();
   });
 
-  it('should require the property option "scopes" to be an object', function () {
+  it('should require the field option "scopes" to be an object', function () {
     const throwable = v => () => validateProjectionSchema({foo: {scopes: v}});
     const error = s =>
-      format(
-        'Property option "scopes" must be an Object, but %s was given.',
-        s,
-      );
+      format('Field option "scopes" must be an Object, but %s was given.', s);
     expect(throwable('str')).to.throw(error('"str"'));
     expect(throwable('')).to.throw(error('""'));
     expect(throwable(10)).to.throw(error('10'));
@@ -174,11 +168,11 @@ describe('validateProjectionSchema', function () {
   it('should validate root schema in shallow mode', function () {
     const throwable = () => validateProjectionSchema({foo: 10}, true);
     expect(throwable).to.throw(
-      'Property options must be a Boolean or an Object, but 10 was given.',
+      'Field options must be a Boolean or an Object, but 10 was given.',
     );
   });
 
   it('should skip nested schema checking in shallow mode', function () {
-    validateProjectionSchema({foo: {schema: {prop: 10}}}, true);
+    validateProjectionSchema({foo: {schema: {bar: 10}}}, true);
   });
 });