File: //proc/1526/task/1530/cwd/zaklada/html/node_modules/jsdom/lib/jsdom/living/node-list.js
"use strict";
const lengthFromProperties = require("../utils").lengthFromProperties;
const privates = Symbol("NodeList internal slots");
class NodeList {
  constructor(secret, config) {
    if (secret !== privates) {
      throw new TypeError("Invalid constructor");
    }
    if (config.nodes) {
      this[privates] = {
        isLive: false,
        length: config.nodes.length
      };
      for (let i = 0; i < config.nodes.length; ++i) {
        this[i] = config.nodes[i];
      }
    } else {
      this[privates] = {
        isLive: true,
        element: config.element,
        query: config.query,
        snapshot: undefined,
        length: 0,
        version: -1
      };
      updateNodeList(this);
    }
  }
  get length() {
    updateNodeList(this);
    return this[privates].length;
  }
  item(index) {
    updateNodeList(this);
    return this[index] || null;
  }
}
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
function updateNodeList(nodeList) {
  if (nodeList[privates].isLive) {
    if (nodeList[privates].version < nodeList[privates].element._version) {
      nodeList[privates].snapshot = nodeList[privates].query();
      resetNodeListTo(nodeList, nodeList[privates].snapshot);
      nodeList[privates].version = nodeList[privates].element._version;
    }
  } else {
    nodeList[privates].length = lengthFromProperties(nodeList);
  }
}
function resetNodeListTo(nodeList, nodes) {
  const startingLength = lengthFromProperties(nodeList);
  for (let i = 0; i < startingLength; ++i) {
    delete nodeList[i];
  }
  for (let i = 0; i < nodes.length; ++i) {
    nodeList[i] = nodes[i];
  }
  nodeList[privates].length = nodes.length;
}
module.exports = function (core) {
  core.NodeList = NodeList;
};
module.exports.createLive = function (element, query) {
  return new NodeList(privates, { element, query });
};
module.exports.createStatic = function (nodes) {
  return new NodeList(privates, { nodes });
};
module.exports.update = updateNodeList;