processMutations function ✓ 100.0%

Last updated: 2026-03-05T11:49:57.418Z

Metrics

LOC: 67 Complexity: 16 Params: 1 Coverage: 100.0% (22/22 lines, 0x executed)

Signature

processMutations(mutations: MutationRecord[]): : void

Architecture violations

View all

  • [warning] max-cyclomatic-complexity: 'processMutations' has cyclomatic complexity 16 (max 10)

Source Code

function processMutations(mutations: MutationRecord[]): void {
  if (!session || session.status !== "recording") return;

  const addedElements = new Set<Element>();
  const removedElements = new Set<Element>();

  for (const mutation of mutations) {
    if (mutation.type === "childList") {
      for (const node of mutation.addedNodes) {
        if (node instanceof Element) {
          addedElements.add(node);
          // Also check for form fields inside added containers
          for (const child of node.querySelectorAll(FORM_FIELD_SELECTOR)) {
            addedElements.add(child);
          }
        }
      }
      for (const node of mutation.removedNodes) {
        if (node instanceof Element) {
          removedElements.add(node);
        }
      }
    }
  }

  // Detect new visible form fields (cascading selects, dynamic fields)
  const newFormFields = [...addedElements].filter(
    (el) => isFormField(el) && isVisible(el) && !isExtensionUI(el),
  );

  if (newFormFields.length > 0) {
    const firstField = newFormFields[0];
    addStep(
      buildStep("wait-for-element", firstField, {
        label: `Wait for ${newFormFields.length} new field(s)`,
        waitTimeout: 5000,
      }),
    );
  }

  // Detect loading spinners disappearing
  const spinnerSelectors = [
    ".loading",
    ".spinner",
    ".loader",
    "[aria-busy='true']",
    ".ant-spin",
    ".MuiCircularProgress-root",
    ".sk-spinner",
  ];

  for (const el of removedElements) {
    const isSpinner = spinnerSelectors.some(
      (sel) => el.matches?.(sel) || el.querySelector?.(sel),
    );
    if (isSpinner) {
      addStep({
        type: "wait-for-hidden",
        timestamp: now(),
        selector: buildQuickSelector(el),
        label: "Wait for loading to finish",
        waitTimeout: 10000,
      });
      break;
    }
  }
}

Dependencies (Outgoing)

graph LR processMutations["processMutations"] isFormField["isFormField"] isVisible["isVisible"] isExtensionUI["isExtensionUI"] addStep["addStep"] buildStep["buildStep"] now["now"] buildQuickSelector["buildQuickSelector"] processMutations -->|calls| isFormField processMutations -->|calls| isVisible processMutations -->|calls| isExtensionUI processMutations -->|calls| addStep processMutations -->|calls| buildStep processMutations -->|calls| now processMutations -->|calls| buildQuickSelector style processMutations fill:#dbeafe,stroke:#2563eb,stroke-width:2px click processMutations "1402c8dfccd81bea.html" click isFormField "59ce5e4523d62013.html" click isVisible "2564ad14dba9855a.html" click isExtensionUI "d32bf4175ca1ff44.html" click addStep "012da91201f9487b.html" click buildStep "6d1088fe63d8f4bc.html" click now "b0f01bcc017e0081.html" click buildQuickSelector "077a2e134af1a6be.html"
TargetType
isFormField calls
isVisible calls
isExtensionUI calls
addStep calls
buildStep calls
now calls
buildQuickSelector calls

Impact (Incoming)

graph LR processMutations["processMutations"] startMutationObserver["startMutationObserver"] startMutationObserver -->|calls| processMutations style processMutations fill:#dbeafe,stroke:#2563eb,stroke-width:2px click processMutations "1402c8dfccd81bea.html" click startMutationObserver "b9d35cd1c4fa11fe.html"
SourceType
startMutationObserver calls