/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @format * @flow strict */ // flowlint unsafe-getters-setters:off import type DOMRectReadOnly from '../Geometry/DOMRectReadOnly'; import type {ArrayLike} from './ArrayLikeUtils'; import {createValueIterator} from './ArrayLikeUtils'; // IMPORTANT: The Flow type definition for this module is defined in `DOMRectList.js.flow` // because Flow only supports indexers in classes in declaration files. // $FlowIssue[prop-missing] Flow doesn't understand [Symbol.iterator]() {} and thinks this class doesn't implement the Iterable interface. export default class DOMRectList implements Iterable { _length: number; /** * Use `createDOMRectList` to create instances of this class. * * @private This is not defined in the declaration file, so users will not see * the signature of the constructor. */ constructor(elements: $ReadOnlyArray) { for (let i = 0; i < elements.length; i++) { Object.defineProperty(this, i, { value: elements[i], enumerable: true, configurable: false, writable: false, }); } this._length = elements.length; } get length(): number { return this._length; } item(index: number): DOMRectReadOnly | null { if (index < 0 || index >= this._length) { return null; } // assigning to the interface allows us to access the indexer property in a // type-safe way. // eslint-disable-next-line consistent-this const arrayLike: ArrayLike = this; return arrayLike[index]; } // $FlowIssue[unsupported-syntax] Flow does not support computed properties in classes. [Symbol.iterator](): Iterator { return createValueIterator(this); } } /** * This is an internal method to create instances of `DOMRectList`, * which avoids leaking its constructor to end users. * We can do that because the external definition of `DOMRectList` lives in * `DOMRectList.js.flow`, not here. */ export function createDOMRectList( elements: $ReadOnlyArray, ): DOMRectList { return new DOMRectList(elements); }