/* istanbul ignore file */
import { __spreadArray } from "tslib";
/*
Something in this file does not compile correctly while measuring code coverage
and will lead to a
  Uncaught [ReferenceError: cov_1zb8w312au is not defined]
if we do not ignore this file in code coverage.

As we only use this file in our internal tests, we can safely ignore it.
*/
import { within, screen } from "@testing-library/dom";
import { JSDOM, VirtualConsole } from "jsdom";
import { applyStackTrace, captureStackTrace } from "./traces.js";
/** @internal */
var RenderInstance = /** @class */ (function () {
    function RenderInstance(baseRender, snapshot, stringifiedDOM, renderedComponents) {
        this.snapshot = snapshot;
        this.stringifiedDOM = stringifiedDOM;
        this.renderedComponents = renderedComponents;
        this.id = baseRender.id;
        this.phase = baseRender.phase;
        this.actualDuration = baseRender.actualDuration;
        this.baseDuration = baseRender.baseDuration;
        this.startTime = baseRender.startTime;
        this.commitTime = baseRender.commitTime;
        this.count = baseRender.count;
    }
    Object.defineProperty(RenderInstance.prototype, "domSnapshot", {
        get: function () {
            if (this._domSnapshot)
                return this._domSnapshot;
            if (!this.stringifiedDOM) {
                throw new Error("DOM snapshot is not available - please set the `snapshotDOM` option");
            }
            var virtualConsole = new VirtualConsole();
            var stackTrace = captureStackTrace("RenderInstance.get");
            virtualConsole.on("jsdomError", function (error) {
                throw applyStackTrace(error, stackTrace);
            });
            var snapDOM = new JSDOM(this.stringifiedDOM, {
                runScripts: "dangerously",
                virtualConsole: virtualConsole,
            });
            var document = snapDOM.window.document;
            var body = document.body;
            var script = document.createElement("script");
            script.type = "text/javascript";
            script.text = "\n        ".concat(errorOnDomInteraction.toString(), ";\n        ").concat(errorOnDomInteraction.name, "();\n      ");
            body.appendChild(script);
            body.removeChild(script);
            return (this._domSnapshot = body);
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(RenderInstance.prototype, "withinDOM", {
        get: function () {
            var _this = this;
            var snapScreen = Object.assign(within(this.domSnapshot), {
                debug: function () {
                    var _a = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        _a[_i] = arguments[_i];
                    }
                    var _b = _a[0], dom = _b === void 0 ? _this.domSnapshot : _b, rest = _a.slice(1);
                    screen.debug.apply(screen, __spreadArray([dom], rest, false));
                },
                logTestingPlaygroundURL: function () {
                    var _a = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        _a[_i] = arguments[_i];
                    }
                    var _b = _a[0], dom = _b === void 0 ? _this.domSnapshot : _b, rest = _a.slice(1);
                    screen.logTestingPlaygroundURL.apply(screen, __spreadArray([dom], rest, false));
                },
            });
            return function () { return snapScreen; };
        },
        enumerable: false,
        configurable: true
    });
    return RenderInstance;
}());
export { RenderInstance };
/** @internal */
export function errorOnDomInteraction() {
    var events = [
        "auxclick",
        "blur",
        "change",
        "click",
        "copy",
        "cut",
        "dblclick",
        "drag",
        "dragend",
        "dragenter",
        "dragleave",
        "dragover",
        "dragstart",
        "drop",
        "focus",
        "focusin",
        "focusout",
        "input",
        "keydown",
        "keypress",
        "keyup",
        "mousedown",
        "mouseenter",
        "mouseleave",
        "mousemove",
        "mouseout",
        "mouseover",
        "mouseup",
        "paste",
        "pointercancel",
        "pointerdown",
        "pointerenter",
        "pointerleave",
        "pointermove",
        "pointerout",
        "pointerover",
        "pointerup",
        "scroll",
        "select",
        "selectionchange",
        "selectstart",
        "submit",
        "toggle",
        "touchcancel",
        "touchend",
        "touchmove",
        "touchstart",
        "wheel",
    ];
    function warnOnDomInteraction() {
        throw new Error("\n    DOM interaction with a snapshot detected in test.\n    Please don't interact with the DOM you get from `withinDOM`,\n    but still use `screen' to get elements for simulating user interaction.\n    ");
    }
    events.forEach(function (event) {
        document.addEventListener(event, warnOnDomInteraction);
    });
}
//# sourceMappingURL=Render.js.map