Browse Source

chore: updates dependencies

e22m4u 1 week ago
parent
commit
a2c718b2ca

+ 23 - 32
README.md

@@ -3,10 +3,15 @@
 Парсинг, валидация и проекция данных для
 [@e22m4u/js-trie-router](https://www.npmjs.com/package/@e22m4u/js-trie-router).
 
-Модуль позволяет определить разметку данных для маршрутизатора. На основе
-разметки выполняется автоматическое извлечение, парсинг, валидация и проекция
-данных HTTP-запроса и ответа сервера. Сформированные данные помещаются
-в контекст запроса или определяют структуру возвращаемого результата.
+Модуль позволяет определить схему данных маршрута. На основе схемы выполняется
+автоматический парсинг, валидация и проекция данных HTTP-запроса и ответа
+сервера. Сформированные данные помещаются в контекст запроса или определяют
+структуру возвращаемого ответа.
+
+Модуль использует синтаксис указанных ниже схем (не требуют установки).
+
+- Схема данных [@e22m4u/js-data-schema](https://www.npmjs.com/package/@e22m4u/js-data-schema)
+- Схема проекции [@e22m4u/js-data-projector](https://www.npmjs.com/package/@e22m4u/js-data-projector)
 
 ## Установка
 
@@ -43,20 +48,23 @@ router.useService(TrieRouterDataMapper);
 Пример парсинга Query-параметра.
 
 ```js
+import {HttpMethod} from '@e22m4u/js-trie-router';
+import {HttpData, DataType} from '@e22m4u/js-trie-router-data-mapper';
+
 router.defineRoute({
   method: HttpMethod.GET,
   path: '/parseQuery',
   meta: {
-    // в объекте "dataMap" определяется набор свойств, которые
+    // в объекте "dataMapper" определяется набор свойств, которые
     // будут переданы в состояние текущего запроса "ctx.state",
     // свойства будут содержать данные согласно указанной схеме
-    dataMap: {
+    dataMapper: {
       filter: { // свойство "filter" будет добавлено в "ctx.state"
         source: HttpData.REQUEST_QUERY, // источник данных
         property: 'filter',       // извлечь свойство (опционально)
         schema: {                 // схема для парсинга и валидации
           type: DataType.OBJECT,  // разобрать значение как объект
-          required: true,         // в противном случае выбросить ошибку
+          required: true,         // значение является обязательным
         },
         // подробнее о схеме данных (параметр "schema")
         // см. модуль @e22m4u/js-data-schema
@@ -69,7 +77,7 @@ router.defineRoute({
     console.log(typeof filter); // "object"
     console.log(filter);        // {foo: 'bar'}
     // если значение разобрать не удалось,
-    // то будет выброшена ошибка 
+    // то будет выброшена ошибка
     return filter;
   },
 });
@@ -88,7 +96,7 @@ export const HttpData = {
 };
 ```
 
-Описание параметров `dataMap` (метаданные маршрута).
+Описание параметров `dataMapper` (метаданные маршрута).
 
 - `source: HttpData` источник данных;
 - `property?: string` извлечение указанного свойства;
@@ -98,15 +106,18 @@ export const HttpData = {
 Пример проекции ответа.
 
 ```js
+import {HttpMethod} from '@e22m4u/js-trie-router';
+import {HttpData} from '@e22m4u/js-trie-router-data-mapper';
+
 router.defineRoute({
   method: HttpMethod.GET,
   path: '/responseProjection',
   meta: {
-    dataMap: {
+    dataMapper: {
       response: {
         // свойство "response" не будет добавлено в "ctx.state",
-        // так как в данном случае источником выступает ответ
-        // сервера, а не входящие данные
+        // так как в данном случае источником выступает возвращаемое
+        // значение обработчика маршрута, а не входящие данные
         source: HttpData.RESPONSE_BODY, // источник данных
         projection: {foo: true, bar: false}, // схема проекции
         // подробнее о схеме проекции (параметр "projection")
@@ -126,26 +137,6 @@ router.defineRoute({
 // ответ будет {"foo":10}
 ```
 
-Структура схемы данных и схемы проекции.
-
-- Схема данных см. описание [@e22m4u/js-data-schema](https://www.npmjs.com/package/@e22m4u/js-data-schema)
-- Схема проекции см. описание [@e22m4u/js-data-projector](https://www.npmjs.com/package/@e22m4u/js-data-projector)
-
-Определение объекта настроек при подключении модуля.
-
-```js
-import {TrieRouter} from '@e22m4u/js-trie-router';
-import {TrieRouterDataMapper} from '@e22m4u/js-trie-router-data-mapper';
-
-const router = new TrieRouter();
-
-router.useService(TrieRouterDataMapper, {
-  // игнорировать опцию "schema"
-  // для источника HttpData.RESPONSE_BODY
-  ignoreResponseDataSchema: true,
-});
-```
-
 ## Тесты
 
 ```bash

+ 9 - 28
dist/cjs/index.cjs

@@ -94,19 +94,12 @@ var HTTP_DATA_TO_CONTEXT_PROPERTY_MAP = {
   [HttpData.REQUEST_BODY]: "body"
 };
 var _TrieRouterDataMapper = class _TrieRouterDataMapper extends import_js_service.Service {
-  /**
-   * Options.
-   *
-   * @type {TrieRouterDataMapperOptions}
-   */
-  _options;
   /**
    * Constructor.
    *
    * @param {import('@e22m4u/js-service').ServiceContainer} container
-   * @param {TrieRouterDataMapperOptions} [options]
    */
-  constructor(container, options = {}) {
+  constructor(container) {
     super(container);
     const router = this.getService(import_js_trie_router.TrieRouter);
     if (!router.hasPreHandler(dataMappingPreHandler)) {
@@ -115,19 +108,6 @@ var _TrieRouterDataMapper = class _TrieRouterDataMapper extends import_js_servic
     if (!router.hasPostHandler(dataMappingPostHandler)) {
       router.addPostHandler(dataMappingPostHandler);
     }
-    if (!options || typeof options !== "object" || Array.isArray(options)) {
-      throw new import_js_format2.InvalidArgumentError(
-        'Parameter "options" must be an Object, but %v was given.',
-        options
-      );
-    }
-    if (options.ignoreResponseDataSchema !== void 0 && typeof options.ignoreResponseDataSchema !== "boolean") {
-      throw new import_js_format2.InvalidArgumentError(
-        'Option "ignoreResponseDataSchema" must be a Boolean, but %v was given.',
-        options.ignoreResponseDataSchema
-      );
-    }
-    this.options = options;
   }
   /**
    * Create state by mapping schema.
@@ -179,7 +159,7 @@ var _TrieRouterDataMapper = class _TrieRouterDataMapper extends import_js_servic
         }
       }
       if (propOptions.projection !== void 0) {
-        value = dataProjector.projectInput(value, propOptions.projection);
+        value = dataProjector.project(value, propOptions.projection);
       }
       res[propName] = value;
     });
@@ -211,17 +191,18 @@ var _TrieRouterDataMapper = class _TrieRouterDataMapper extends import_js_servic
           propOptions.property
         );
       }
-      if (!this.options.ignoreResponseDataSchema && propOptions.schema !== void 0) {
+      if (propOptions.schema !== void 0) {
         const sourcePath = "response.body";
+        const parsingOptions = { sourcePath, noParsingErrors: true };
         if (import_js_data_schema.DATA_TYPE_LIST.includes(propOptions.schema)) {
           const dataSchema = { type: propOptions.schema };
-          res = dataParser.parse(res, dataSchema, { sourcePath });
+          res = dataParser.parse(res, dataSchema, parsingOptions);
         } else {
-          res = dataParser.parse(res, propOptions.schema, { sourcePath });
+          res = dataParser.parse(res, propOptions.schema, parsingOptions);
         }
       }
       if (propOptions.projection !== void 0) {
-        res = dataProjector.projectOutput(res, propOptions.projection);
+        res = dataProjector.project(res, propOptions.projection);
       }
     });
     return res;
@@ -230,7 +211,7 @@ var _TrieRouterDataMapper = class _TrieRouterDataMapper extends import_js_servic
 __name(_TrieRouterDataMapper, "TrieRouterDataMapper");
 var TrieRouterDataMapper = _TrieRouterDataMapper;
 function dataMappingPreHandler(ctx) {
-  const schema = (ctx.meta || {}).dataMap;
+  const schema = (ctx.meta || {}).dataMapper;
   if (schema === void 0) {
     return;
   }
@@ -240,7 +221,7 @@ function dataMappingPreHandler(ctx) {
 }
 __name(dataMappingPreHandler, "dataMappingPreHandler");
 function dataMappingPostHandler(ctx, data) {
-  const schema = (ctx.meta || {}).dataMap;
+  const schema = (ctx.meta || {}).dataMapper;
   if (schema === void 0) {
     return;
   }

+ 1 - 0
eslint.config.js

@@ -27,6 +27,7 @@ export default [{
     ...eslintMochaPlugin.configs.recommended.rules,
     ...eslintChaiExpectPlugin.configs['recommended-flat'].rules,
     ...eslintJsdocPlugin.configs['flat/recommended-error'].rules,
+    "curly": "error",
     'no-duplicate-imports': 'error',
     'import/export': 0,
     'jsdoc/reject-any-type': 0,

+ 1 - 1
examples/query-parsing-example.js

@@ -16,7 +16,7 @@ router.defineRoute({
   method: HttpMethod.GET,
   path: '/parseQuery',
   meta: {
-    dataMap: {
+    dataMapper: {
       filter: {
         source: HttpData.REQUEST_QUERY,
         property: 'filter',

+ 1 - 1
examples/response-projection-example.js

@@ -15,7 +15,7 @@ router.defineRoute({
   method: HttpMethod.GET,
   path: '/responseProjection',
   meta: {
-    dataMap: {
+    dataMapper: {
       response: {
         source: HttpData.RESPONSE_BODY,
         projection: {foo: true, bar: false},

+ 5 - 5
package.json

@@ -38,8 +38,8 @@
     "prepare": "husky"
   },
   "dependencies": {
-    "@e22m4u/js-data-projector": "~0.1.3",
-    "@e22m4u/js-data-schema": "~0.0.4",
+    "@e22m4u/js-data-projector": "~0.2.0",
+    "@e22m4u/js-data-schema": "~0.0.7",
     "@e22m4u/js-format": "~0.3.2",
     "@e22m4u/js-service": "~0.5.1"
   },
@@ -47,8 +47,8 @@
     "@e22m4u/js-trie-router": "~0.5.12"
   },
   "devDependencies": {
-    "@commitlint/cli": "~20.3.0",
-    "@commitlint/config-conventional": "~20.3.0",
+    "@commitlint/cli": "~20.3.1",
+    "@commitlint/config-conventional": "~20.3.1",
     "@eslint/js": "~9.39.2",
     "@types/chai": "~5.2.3",
     "@types/mocha": "~10.0.10",
@@ -59,7 +59,7 @@
     "eslint-config-prettier": "~10.1.8",
     "eslint-plugin-chai-expect": "~3.1.0",
     "eslint-plugin-import": "~2.32.0",
-    "eslint-plugin-jsdoc": "~61.5.0",
+    "eslint-plugin-jsdoc": "~62.0.0",
     "eslint-plugin-mocha": "~11.2.0",
     "globals": "~17.0.0",
     "husky": "~9.1.7",

+ 1 - 1
src/route-meta.d.ts

@@ -3,6 +3,6 @@ import {DataMappingSchema} from './data-mapping-schema.js';
 
 declare module '@e22m4u/js-trie-router' {
   export interface RouteMeta {
-    dataMap?: DataMappingSchema,
+    dataMapper?: DataMappingSchema,
   }
 }

+ 1 - 12
src/trie-router-data-mapper.d.ts

@@ -2,13 +2,6 @@ import {RequestContext} from '@e22m4u/js-trie-router';
 import {DataMappingSchema} from './data-mapping-schema.js';
 import {Service, ServiceContainer} from '@e22m4u/js-service';
 
-/**
- * Trie router data mapper options.
- */
-export type TrieRouterDataMapperOptions = {
-  ignoreResponseDataSchema?: boolean;
-};
-
 /**
  * Trie router data mapper.
  */
@@ -17,12 +10,8 @@ export declare class TrieRouterDataMapper extends Service {
    * Constructor.
    *
    * @param container
-   * @param options
    */
-  constructor(
-    container?: ServiceContainer,
-    options?: TrieRouterDataMapperOptions,
-  );
+  constructor(container?: ServiceContainer);
 
   /**
    * Create state by mapping schema.

+ 13 - 45
src/trie-router-data-mapper.js

@@ -6,11 +6,6 @@ import {RequestContext, TrieRouter} from '@e22m4u/js-trie-router';
 import {DATA_TYPE_LIST, DataParser} from '@e22m4u/js-data-schema';
 import {validateDataMappingSchema} from './validate-data-mapping-schema.js';
 
-/**
- * @typedef {object} TrieRouterDataMapperOptions
- * @property {boolean} [ignoreResponseDataSchema]
- */
-
 /**
  * Константа HttpData определяет какое свойство контекста
  * запроса будет использовано для формирования данных.
@@ -29,20 +24,12 @@ const HTTP_DATA_TO_CONTEXT_PROPERTY_MAP = {
  * Trie router data mapper.
  */
 export class TrieRouterDataMapper extends Service {
-  /**
-   * Options.
-   *
-   * @type {TrieRouterDataMapperOptions}
-   */
-  _options;
-
   /**
    * Constructor.
    *
    * @param {import('@e22m4u/js-service').ServiceContainer} container
-   * @param {TrieRouterDataMapperOptions} [options]
    */
-  constructor(container, options = {}) {
+  constructor(container) {
     super(container);
     const router = this.getService(TrieRouter);
     if (!router.hasPreHandler(dataMappingPreHandler)) {
@@ -51,23 +38,6 @@ export class TrieRouterDataMapper extends Service {
     if (!router.hasPostHandler(dataMappingPostHandler)) {
       router.addPostHandler(dataMappingPostHandler);
     }
-    if (!options || typeof options !== 'object' || Array.isArray(options)) {
-      throw new InvalidArgumentError(
-        'Parameter "options" must be an Object, but %v was given.',
-        options,
-      );
-    }
-    if (
-      options.ignoreResponseDataSchema !== undefined &&
-      typeof options.ignoreResponseDataSchema !== 'boolean'
-    ) {
-      throw new InvalidArgumentError(
-        'Option "ignoreResponseDataSchema" must be a Boolean, ' +
-          'but %v was given.',
-        options.ignoreResponseDataSchema,
-      );
-    }
-    this.options = options;
   }
 
   /**
@@ -112,8 +82,8 @@ export class TrieRouterDataMapper extends Service {
         if (value && typeof value === 'object' && !Array.isArray(value)) {
           value = value[propOptions.property];
         }
-        // если свойство контекста не является
-        // объектом, то выбрасывается ошибка
+        // если свойство контекста не содержит
+        // объект, то выбрасывается ошибка
         else {
           throw new InvalidArgumentError(
             'Property %v does not exist in %v value ' +
@@ -140,7 +110,7 @@ export class TrieRouterDataMapper extends Service {
       // если определена схема проекции,
       // то выполняется создание проекции
       if (propOptions.projection !== undefined) {
-        value = dataProjector.projectInput(value, propOptions.projection);
+        value = dataProjector.project(value, propOptions.projection);
       }
       // значение присваивается
       // результирующему объекту
@@ -184,24 +154,22 @@ export class TrieRouterDataMapper extends Service {
           propOptions.property,
         );
       }
-      // если определена схема данных,
-      // то выполняется разбор значения
-      if (
-        !this.options.ignoreResponseDataSchema &&
-        propOptions.schema !== undefined
-      ) {
+      // если определена схема данных, то выполняется
+      // разбор значения без валидации данных
+      if (propOptions.schema !== undefined) {
         const sourcePath = 'response.body';
+        const parsingOptions = {sourcePath, noParsingErrors: true};
         if (DATA_TYPE_LIST.includes(propOptions.schema)) {
           const dataSchema = {type: propOptions.schema};
-          res = dataParser.parse(res, dataSchema, {sourcePath});
+          res = dataParser.parse(res, dataSchema, parsingOptions);
         } else {
-          res = dataParser.parse(res, propOptions.schema, {sourcePath});
+          res = dataParser.parse(res, propOptions.schema, parsingOptions);
         }
       }
       // если определена схема проекции,
       // то выполняется создание проекции
       if (propOptions.projection !== undefined) {
-        res = dataProjector.projectOutput(res, propOptions.projection);
+        res = dataProjector.project(res, propOptions.projection);
       }
     });
     return res;
@@ -214,7 +182,7 @@ export class TrieRouterDataMapper extends Service {
  * @type {import('@e22m4u/js-trie-router').PreHandlerHook}
  */
 function dataMappingPreHandler(ctx) {
-  const schema = (ctx.meta || {}).dataMap;
+  const schema = (ctx.meta || {}).dataMapper;
   if (schema === undefined) {
     return;
   }
@@ -229,7 +197,7 @@ function dataMappingPreHandler(ctx) {
  * @type {import('@e22m4u/js-trie-router').PostHandlerHook}
  */
 function dataMappingPostHandler(ctx, data) {
-  const schema = (ctx.meta || {}).dataMap;
+  const schema = (ctx.meta || {}).dataMapper;
   if (schema === undefined) {
     return;
   }

+ 1 - 1
src/validate-data-mapping-schema.d.ts

@@ -1,4 +1,4 @@
-import {DataMappingSchema} from './data-mapping-schema.ts';
+import {DataMappingSchema} from './data-mapping-schema.js';
 
 /**
  * Validate data mapping schema.