e22m4u 2 недель назад
Родитель
Сommit
b67a23a1e9
4 измененных файлов с 114 добавлено и 7 удалено
  1. 22 0
      README.md
  2. 29 3
      dist/cjs/index.cjs
  3. 13 1
      src/trie-router-data-mapper.d.ts
  4. 50 3
      src/trie-router-data-mapper.js

+ 22 - 0
README.md

@@ -131,6 +131,28 @@ router.defineRoute({
 - Схема данных см. описание [@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.REQUEST_PARAMS
+  //   HttpData.REQUEST_QUERY
+  //   HttpData.REQUEST_HEADERS
+  //   HttpData.REQUEST_COOKIES
+  //   HttpData.REQUEST_BODY
+  ignoreRequestDataSchema: true,
+  // игнорировать опцию "schema" для следующих источников:
+  //   HttpData.RESPONSE_BODY
+  ignoreResponseDataSchema: true,
+});
+```
+
 ## Тесты
 
 ```bash

+ 29 - 3
dist/cjs/index.cjs

@@ -94,12 +94,19 @@ 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) {
+  constructor(container, options = {}) {
     super(container);
     const router = this.getService(import_js_trie_router.TrieRouter);
     if (!router.hasPreHandler(dataMappingPreHandler)) {
@@ -108,6 +115,25 @@ 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.ignoreRequestDataSchema !== void 0 && typeof options.ignoreRequestDataSchema !== "boolean") {
+      throw new import_js_format2.InvalidArgumentError(
+        'Option "ignoreRequestDataSchema" must be a Boolean, but %v was given.',
+        options.ignoreRequestDataSchema
+      );
+    }
+    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.
@@ -149,7 +175,7 @@ var _TrieRouterDataMapper = class _TrieRouterDataMapper extends import_js_servic
           );
         }
       }
-      if (propOptions.schema !== void 0) {
+      if (!this.options.ignoreRequestDataSchema && propOptions.schema !== void 0) {
         const sourcePath = propOptions.property ? `request.${ctxProp}.${propOptions.property}` : `request.${ctxProp}`;
         if (import_js_data_schema.DATA_TYPE_LIST.includes(propOptions.schema)) {
           const dataSchema = { type: propOptions.schema };
@@ -191,7 +217,7 @@ var _TrieRouterDataMapper = class _TrieRouterDataMapper extends import_js_servic
           propOptions.property
         );
       }
-      if (propOptions.schema !== void 0) {
+      if (!this.options.ignoreResponseDataSchema && propOptions.schema !== void 0) {
         const sourcePath = "response.body";
         if (import_js_data_schema.DATA_TYPE_LIST.includes(propOptions.schema)) {
           const dataSchema = { type: propOptions.schema };

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

@@ -2,6 +2,14 @@ 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 = {
+  ignoreRequestDataSchema?: boolean;
+  ignoreResponseDataSchema?: boolean;
+};
+
 /**
  * Trie router data mapper.
  */
@@ -10,8 +18,12 @@ export declare class TrieRouterDataMapper extends Service {
    * Constructor.
    *
    * @param container
+   * @param options
    */
-  constructor(container?: ServiceContainer);
+  constructor(
+    container?: ServiceContainer,
+    options?: TrieRouterDataMapperOptions,
+  );
 
   /**
    * Create state by mapping schema.

+ 50 - 3
src/trie-router-data-mapper.js

@@ -6,6 +6,12 @@ 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} [ignoreRequestDataSchema]
+ * @property {boolean} [ignoreResponseDataSchema]
+ */
+
 /**
  * Константа HttpData определяет какое свойство контекста
  * запроса будет использовано для формирования данных.
@@ -24,12 +30,20 @@ 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) {
+  constructor(container, options = {}) {
     super(container);
     const router = this.getService(TrieRouter);
     if (!router.hasPreHandler(dataMappingPreHandler)) {
@@ -38,6 +52,33 @@ 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.ignoreRequestDataSchema !== undefined &&
+      typeof options.ignoreRequestDataSchema !== 'boolean'
+    ) {
+      throw new InvalidArgumentError(
+        'Option "ignoreRequestDataSchema" must be a Boolean, ' +
+          'but %v was given.',
+        options.ignoreRequestDataSchema,
+      );
+    }
+    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;
   }
 
   /**
@@ -96,7 +137,10 @@ export class TrieRouterDataMapper extends Service {
       }
       // если определена схема данных,
       // то выполняется разбор значения
-      if (propOptions.schema !== undefined) {
+      if (
+        !this.options.ignoreRequestDataSchema &&
+        propOptions.schema !== undefined
+      ) {
         const sourcePath = propOptions.property
           ? `request.${ctxProp}.${propOptions.property}`
           : `request.${ctxProp}`;
@@ -156,7 +200,10 @@ export class TrieRouterDataMapper extends Service {
       }
       // если определена схема данных,
       // то выполняется разбор значения
-      if (propOptions.schema !== undefined) {
+      if (
+        !this.options.ignoreResponseDataSchema &&
+        propOptions.schema !== undefined
+      ) {
         const sourcePath = 'response.body';
         if (DATA_TYPE_LIST.includes(propOptions.schema)) {
           const dataSchema = {type: propOptions.schema};