1. /**
    
  2.  * Copyright (c) Meta Platforms, Inc. and affiliates.
    
  3.  *
    
  4.  * This source code is licensed under the MIT license found in the
    
  5.  * LICENSE file in the root directory of this source tree.
    
  6.  *
    
  7.  * @flow
    
  8.  */
    
  9. 
    
  10. // ATTENTION
    
  11. // When adding new symbols to this file,
    
  12. // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
    
  13. 
    
  14. // The Symbol used to tag the ReactElement-like types.
    
  15. export const REACT_ELEMENT_TYPE: symbol = Symbol.for('react.element');
    
  16. export const REACT_PORTAL_TYPE: symbol = Symbol.for('react.portal');
    
  17. export const REACT_FRAGMENT_TYPE: symbol = Symbol.for('react.fragment');
    
  18. export const REACT_STRICT_MODE_TYPE: symbol = Symbol.for('react.strict_mode');
    
  19. export const REACT_PROFILER_TYPE: symbol = Symbol.for('react.profiler');
    
  20. export const REACT_PROVIDER_TYPE: symbol = Symbol.for('react.provider');
    
  21. export const REACT_CONTEXT_TYPE: symbol = Symbol.for('react.context');
    
  22. export const REACT_SERVER_CONTEXT_TYPE: symbol = Symbol.for(
    
  23.   'react.server_context',
    
  24. );
    
  25. export const REACT_FORWARD_REF_TYPE: symbol = Symbol.for('react.forward_ref');
    
  26. export const REACT_SUSPENSE_TYPE: symbol = Symbol.for('react.suspense');
    
  27. export const REACT_SUSPENSE_LIST_TYPE: symbol = Symbol.for(
    
  28.   'react.suspense_list',
    
  29. );
    
  30. export const REACT_MEMO_TYPE: symbol = Symbol.for('react.memo');
    
  31. export const REACT_LAZY_TYPE: symbol = Symbol.for('react.lazy');
    
  32. export const REACT_SCOPE_TYPE: symbol = Symbol.for('react.scope');
    
  33. export const REACT_DEBUG_TRACING_MODE_TYPE: symbol = Symbol.for(
    
  34.   'react.debug_trace_mode',
    
  35. );
    
  36. export const REACT_OFFSCREEN_TYPE: symbol = Symbol.for('react.offscreen');
    
  37. export const REACT_LEGACY_HIDDEN_TYPE: symbol = Symbol.for(
    
  38.   'react.legacy_hidden',
    
  39. );
    
  40. export const REACT_CACHE_TYPE: symbol = Symbol.for('react.cache');
    
  41. export const REACT_TRACING_MARKER_TYPE: symbol = Symbol.for(
    
  42.   'react.tracing_marker',
    
  43. );
    
  44. export const REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED: symbol = Symbol.for(
    
  45.   'react.default_value',
    
  46. );
    
  47. 
    
  48. export const REACT_MEMO_CACHE_SENTINEL: symbol = Symbol.for(
    
  49.   'react.memo_cache_sentinel',
    
  50. );
    
  51. 
    
  52. export const REACT_POSTPONE_TYPE: symbol = Symbol.for('react.postpone');
    
  53. 
    
  54. const MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
    
  55. const FAUX_ITERATOR_SYMBOL = '@@iterator';
    
  56. 
    
  57. export function getIteratorFn(maybeIterable: ?any): ?() => ?Iterator<any> {
    
  58.   if (maybeIterable === null || typeof maybeIterable !== 'object') {
    
  59.     return null;
    
  60.   }
    
  61.   const maybeIterator =
    
  62.     (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||
    
  63.     maybeIterable[FAUX_ITERATOR_SYMBOL];
    
  64.   if (typeof maybeIterator === 'function') {
    
  65.     return maybeIterator;
    
  66.   }
    
  67.   return null;
    
  68. }