'use strict';

Object.defineProperty(exports, '__esModule', {
  value: true
});
exports.test = exports.serialize = undefined;

var _markup = require('./lib/markup');

/**
 * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 *
 */

const testSymbol = Symbol.for('react.test.json');

const getPropKeys = object => {
  const props = object.props;

  return props
    ? Object.keys(props)
        .filter(key => props[key] !== undefined)
        .sort()
    : [];
};

const serialize = (exports.serialize = (
  object,
  config,
  indentation,
  depth,
  refs,
  printer
) =>
  ++depth > config.maxDepth
    ? (0, _markup.printElementAsLeaf)(object.type, config)
    : (0, _markup.printElement)(
        object.type,
        object.props
          ? (0, _markup.printProps)(
              getPropKeys(object),
              // Despite ternary expression, Flow 0.51.0 found incorrect error:
              // undefined is incompatible with the expected param type of Object
              // $FlowFixMe
              object.props,
              config,
              indentation + config.indent,
              depth,
              refs,
              printer
            )
          : '',
        object.children
          ? (0, _markup.printChildren)(
              object.children,
              config,
              indentation + config.indent,
              depth,
              refs,
              printer
            )
          : '',
        config,
        indentation
      ));

const test = (exports.test = val => val && val.$$typeof === testSymbol);

exports.default = {serialize: serialize, test: test};
