retrocycle.js 2.32 KB
"use strict";

require("core-js/modules/es6.object.define-property");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = retrocycle;

require("core-js/modules/es7.symbol.async-iterator");

require("core-js/modules/es6.symbol");

require("core-js/modules/es6.function.name");

require("core-js/modules/es6.array.is-array");

var _reviver = _interopRequireDefault(require("./reviver"));

var _muteProperty = _interopRequireDefault(require("./util/muteProperty"));

var _constants = require("../constants");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

// eslint-disable-next-line no-control-regex
var pathReg = /^\$(?:\[(?:\d+|"(?:[^\\"\u0000-\u001f]|\\([\\"/bfnrt]|u[0-9a-zA-Z]{4}))*")])*$/;

function retrocycle(json) {
  var $ = JSON.parse(json, _reviver.default);

  if (_typeof($) !== 'object' || $ === null) {
    return $;
  }

  (function rez(value) {
    if (value && _typeof(value) === 'object') {
      if (Array.isArray(value)) {
        for (var i = 0; i < value.length; i += 1) {
          var item = value[i];

          if (item && _typeof(item) === 'object') {
            var path = item.$ref;

            if (typeof path === 'string' && pathReg.test(path)) {
              value[i] = eval(path); // eslint-disable-line no-eval, no-param-reassign
            } else {
              rez(item);
            }
          }
        }
      } else {
        // eslint-disable-next-line no-restricted-syntax, guard-for-in
        for (var name in value) {
          var _item = value[name];

          if (_typeof(_item) === 'object' && _item !== null) {
            var _path = _item.$ref;

            if (typeof _path === 'string' && pathReg.test(_path)) {
              value[name] = eval(_path); // eslint-disable-line no-eval, no-param-reassign
            } else {
              rez(_item);
            }
          }
        }
      }
    }
  })($);

  (0, _muteProperty.default)(_constants.CYCLIC_KEY, $);
  return $;
}