object-type-parser.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import {DataType} from '../data-type.js';
  2. import {ServiceContainer} from '@e22m4u/js-service';
  3. import {DataParsingError} from '../errors/index.js';
  4. import {EmptyValuesService} from '@e22m4u/js-empty-values';
  5. /**
  6. * Object type parser.
  7. *
  8. * @param {*} value
  9. * @param {object} schema
  10. * @param {options|undefined} options
  11. * @param {ServiceContainer} container
  12. * @returns {*}
  13. */
  14. export function objectTypeParser(value, schema, options, container) {
  15. // если тип не соответствует объекту,
  16. // то проверка пропускается
  17. if (schema.type !== DataType.OBJECT) {
  18. return value;
  19. }
  20. // если значение является объектом,
  21. // то проверка пропускается
  22. if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
  23. return value;
  24. }
  25. // если значение является строкой,
  26. // то выполняется попытка преобразования
  27. if (typeof value === 'string') {
  28. value = value.trim();
  29. let newValue;
  30. try {
  31. newValue = JSON.parse(value);
  32. } catch {
  33. //
  34. }
  35. if (
  36. newValue !== null &&
  37. typeof newValue === 'object' &&
  38. !Array.isArray(newValue)
  39. ) {
  40. return newValue;
  41. }
  42. }
  43. // если значение является пустым,
  44. // то преобразование пропускается
  45. const dataType = schema.type || DataType.ANY;
  46. const emptyValues = container.get(EmptyValuesService);
  47. if (emptyValues.isEmptyByType(dataType, value)) {
  48. return value;
  49. }
  50. // если преобразовать значение не удалось,
  51. // то выбрасывается ошибка
  52. if (!options || !options.noParsingErrors) {
  53. const sourcePath = options && options.sourcePath;
  54. throw new DataParsingError(value, dataType, sourcePath);
  55. }
  56. // если установлен флаг бесшумной работы,
  57. // то значение возвращается без изменений
  58. return value;
  59. }