UNPKG

@ethicdevs/react-global-state-hooks-debugger

Version:

A small websocket based debugger for use with the react-global-state-hooks library

953 lines (860 loc) 85.3 kB
/******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "./node_modules/@ethicdevs/json-tree-view/dist/index.js": /*!**************************************************************!*\ !*** ./node_modules/@ethicdevs/json-tree-view/dist/index.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "renderJSONTreeView": () => (/* binding */ renderJSONTreeView) /* harmony export */ }); /** * @name @ethicdevs/json-tree-view * @license MIT * @maintainer <William Nemencha, EthicDevs, https://github.com/EthicDevs/json-tree-view> * @forked-from <前端通過元素展示Json樹狀資料,因, https://github.com/yuda-lyu/w-jsonview-tree> * @itself-forked-from <沒有加入預先展開數據功能,自己下載來修改, https://github.com/pgrabovets/json-view> */ /** * @export * @param {Object} jsonObj 輸入Json物件 * @param {Element} rootElem 輸入初始化元素 * @param {Object} [option={}] 輸入設定物件,預設為空物件 * @param {Boolean} [option.expanded=false] 輸入是否預先展開,預設為false */ function renderJSONTreeView(jsonObj, rootElem, options) { if (options === void 0) { options = {}; } //default expanded var _expanded = false; function init() { //get expanded if (options) { _expanded = options["expanded"] === true; } //clear rootElem.innerHTML = ""; //add class rootElem.classList.add("CompCssDJsonViewTree"); //render var tree = createTree(jsonObj); render(tree, rootElem); return tree; } /** * Create html element * @param {String} type html element * @param {Object} config */ function createElement(type, config) { var htmlElement = document.createElement(type); if (config === undefined) { return htmlElement; } if (config.className) { htmlElement.className = config.className; } if (config.content) { htmlElement.textContent = config.content; } if (config.children) { config.children.forEach(function (el) { if (el !== null) { htmlElement.appendChild(el); } }); } return htmlElement; } function createExpandedElement(node) { var _a, _b, _c; var iElem = createElement("i"); if (node.expanded) { iElem.className = "wicon w-caret-down"; } else { iElem.className = "wicon w-caret-right"; } var caretElem = createElement("div", { className: "wjv-caret-icon", children: [iElem], }); var handleClick = node.toggle.bind(node); caretElem.addEventListener("click", handleClick); var indexElem = createElement("div", { className: "wjv-json-index", content: node.key, }); var typeElem = createElement("div", { className: "wjv-json-type", content: node.type, }); var keyElem = createElement("div", { className: "wjv-json-key", content: node.key, }); var sizeElem = createElement("div", { className: "wjv-json-size", }); if (node.type === "array") { sizeElem.innerText = "[" + ((_a = node.children) === null || _a === void 0 ? void 0 : _a.length) + "]"; } else if (node.type === "object") { sizeElem.innerText = "{" + ((_b = node.children) === null || _b === void 0 ? void 0 : _b.length) + "}"; } var lineChildren; if (node.key === null) { lineChildren = [caretElem, typeElem, sizeElem]; } else if (((_c = node === null || node === void 0 ? void 0 : node.parent) === null || _c === void 0 ? void 0 : _c.type) === "array") { lineChildren = [caretElem, indexElem, sizeElem]; } else { lineChildren = [caretElem, keyElem, sizeElem]; } var lineElem = createElement("div", { className: "wjv-line", children: lineChildren, }); if (node.depth > 0) { //lineElem.style = 'margin-left: ' + node.depth * 24 + 'px;' //IE11 strict模式下無法指派, style為唯讀屬性 lineElem.setAttribute("style", "margin-left: " + node.depth * 24 + "px;"); } return lineElem; } /** * Create not expanded element * @param {Object} node * @return {HTMLElement} */ function createNotExpandedElement(node) { var caretElem = createElement("div", { className: "wjv-empty-icon", }); var keyElem = createElement("div", { className: "wjv-json-key", content: node.key, }); var separatorElement = createElement("div", { className: "wjv-json-separator", content: ":", }); var valueType = " wjv-json-" + typeof node.value; var valueContent = String(node.value); var valueElement = createElement("div", { className: "wjv-json-value" + valueType, content: valueContent, }); var lineElem = createElement("div", { className: "wjv-line", children: [caretElem, keyElem, separatorElement, valueElement], }); if (node.depth > 0) { //lineElem.style = 'margin-left: ' + node.depth * 24 + 'px;' //IE11 strict模式下無法指派, style為唯讀屬性 lineElem.setAttribute("style", "margin-left: " + node.depth * 24 + "px;"); } return lineElem; } /** * Create tree node * @return {Object} */ function createNode() { return { key: null, parent: null, value: null, expanded: _expanded, type: null, children: null, elem: null, depth: 0, setCaretIconRight: function () { var _a; var icon = (_a = this.elem) === null || _a === void 0 ? void 0 : _a.querySelector(".wicon"); icon === null || icon === void 0 ? void 0 : icon.classList.replace("w-caret-down", "w-caret-right"); }, setCaretIconDown: function () { var _a; var icon = (_a = this.elem) === null || _a === void 0 ? void 0 : _a.querySelector(".wicon"); icon === null || icon === void 0 ? void 0 : icon.classList.replace("w-caret-right", "w-caret-down"); }, hideChildren: function () { if (this.children !== null) { this.children.forEach(function (item) { var _a; (_a = item.elem) === null || _a === void 0 ? void 0 : _a.classList.add("wjv-json-hide"); if (item.expanded) { item.hideChildren(); } }); } }, showChildren: function () { if (this.children !== null) { this.children.forEach(function (item) { var _a; (_a = item.elem) === null || _a === void 0 ? void 0 : _a.classList.remove("wjv-json-hide"); if (item.expanded) { item.showChildren(); } }); } }, toggle: function () { if (this.expanded) { this.expanded = false; this.hideChildren(); this.setCaretIconRight(); } else { this.expanded = true; this.showChildren(); this.setCaretIconDown(); } }, }; } /** * Return variable type * @param {*} val */ function getType(val) { var type = typeof val; if (Array.isArray(val)) { type = "array"; } else if (val === null) { type = "null"; } return type; } /** * Recursively traverse json object * @param {Object} obj parsed json object * @param {Object} parent of object tree */ function traverseObject(obj, parent) { for (var key in obj) { var child = createNode(); child.parent = parent; child.key = key; child.type = getType(obj[key]); child.depth = parent.depth + 1; child.expanded = _expanded; if (typeof obj[key] === "object") { child.children = []; if (parent.children == null) { parent.children = []; } parent.children.push(child); traverseObject(obj[key], child); child.elem = createExpandedElement(child); } else { child.value = obj[key]; child.elem = createNotExpandedElement(child); if (parent.children == null) { parent.children = []; } parent.children.push(child); } } } /** * Create root of a tree * @param {Object} obj Json object * @return {Object} */ function createTree(obj) { var tree = createNode(); tree.type = getType(obj); tree.children = []; tree.expanded = _expanded; traverseObject(obj, tree); tree.elem = createExpandedElement(tree); return tree; } /** * Recursively traverse Tree object * @param {Object} node * @param {Callback} callback */ function traverseTree(node, callback) { callback(node); if (node.children !== null) { node.children.forEach(function (item) { traverseTree(item, callback); }); } } /** * Render Tree object * @param {Object} tree * @param {String} rootElem */ function render(tree, rootElem) { traverseTree(tree, function (node) { if (!node.expanded) { node.hideChildren(); } if (node.elem) { rootElem.appendChild(node.elem); } }); } return init(); } /***/ }), /***/ "./node_modules/deep-object-diff/mjs/added.js": /*!****************************************************!*\ !*** ./node_modules/deep-object-diff/mjs/added.js ***! \****************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/deep-object-diff/mjs/utils.js"); const addedDiff = (lhs, rhs) => { if (lhs === rhs || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(lhs) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(rhs)) return {}; const l = lhs; const r = rhs; return Object.keys(r).reduce((acc, key) => { if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.hasOwnProperty)(l, key)) { const difference = addedDiff(l[key], r[key]); if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(difference) && (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(difference)) return acc; acc[key] = difference; return acc; } acc[key] = r[key]; return acc; }, {}); }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (addedDiff); /***/ }), /***/ "./node_modules/deep-object-diff/mjs/deleted.js": /*!******************************************************!*\ !*** ./node_modules/deep-object-diff/mjs/deleted.js ***! \******************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/deep-object-diff/mjs/utils.js"); const deletedDiff = (lhs, rhs) => { if (lhs === rhs || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(lhs) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(rhs)) return {}; const l = lhs; const r = rhs; return Object.keys(l).reduce((acc, key) => { if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.hasOwnProperty)(r, key)) { const difference = deletedDiff(l[key], r[key]); if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(difference) && (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(difference)) return acc; acc[key] = difference; return acc; } acc[key] = undefined; return acc; }, {}); }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (deletedDiff); /***/ }), /***/ "./node_modules/deep-object-diff/mjs/detailed.js": /*!*******************************************************!*\ !*** ./node_modules/deep-object-diff/mjs/detailed.js ***! \*******************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _added_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./added.js */ "./node_modules/deep-object-diff/mjs/added.js"); /* harmony import */ var _deleted_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./deleted.js */ "./node_modules/deep-object-diff/mjs/deleted.js"); /* harmony import */ var _updated_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updated.js */ "./node_modules/deep-object-diff/mjs/updated.js"); const detailedDiff = (lhs, rhs) => ({ added: (0,_added_js__WEBPACK_IMPORTED_MODULE_0__["default"])(lhs, rhs), deleted: (0,_deleted_js__WEBPACK_IMPORTED_MODULE_1__["default"])(lhs, rhs), updated: (0,_updated_js__WEBPACK_IMPORTED_MODULE_2__["default"])(lhs, rhs), }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (detailedDiff); /***/ }), /***/ "./node_modules/deep-object-diff/mjs/diff.js": /*!***************************************************!*\ !*** ./node_modules/deep-object-diff/mjs/diff.js ***! \***************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/deep-object-diff/mjs/utils.js"); const diff = (lhs, rhs) => { if (lhs === rhs) return {}; // equal return no diff if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(lhs) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(rhs)) return rhs; // return updated rhs const l = lhs; const r = rhs; const deletedValues = Object.keys(l).reduce((acc, key) => { if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.hasOwnProperty)(r, key)) { acc[key] = undefined; } return acc; }, {}); if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(l) || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(r)) { if (l.valueOf() == r.valueOf()) return {}; return r; } return Object.keys(r).reduce((acc, key) => { if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.hasOwnProperty)(l, key)){ acc[key] = r[key]; // return added r key return acc; } const difference = diff(l[key], r[key]); // If the difference is empty, and the lhs is an empty object or the rhs is not an empty object if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(difference) && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(difference) && ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(l[key]) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(r[key]))) return acc; // return no diff acc[key] = difference // return updated key return acc; // return updated key }, deletedValues); }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (diff); /***/ }), /***/ "./node_modules/deep-object-diff/mjs/index.js": /*!****************************************************!*\ !*** ./node_modules/deep-object-diff/mjs/index.js ***! \****************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "addedDiff": () => (/* reexport safe */ _added_js__WEBPACK_IMPORTED_MODULE_1__["default"]), /* harmony export */ "deletedDiff": () => (/* reexport safe */ _deleted_js__WEBPACK_IMPORTED_MODULE_2__["default"]), /* harmony export */ "detailedDiff": () => (/* reexport safe */ _detailed_js__WEBPACK_IMPORTED_MODULE_4__["default"]), /* harmony export */ "diff": () => (/* reexport safe */ _diff_js__WEBPACK_IMPORTED_MODULE_0__["default"]), /* harmony export */ "updatedDiff": () => (/* reexport safe */ _updated_js__WEBPACK_IMPORTED_MODULE_3__["default"]) /* harmony export */ }); /* harmony import */ var _diff_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./diff.js */ "./node_modules/deep-object-diff/mjs/diff.js"); /* harmony import */ var _added_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./added.js */ "./node_modules/deep-object-diff/mjs/added.js"); /* harmony import */ var _deleted_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./deleted.js */ "./node_modules/deep-object-diff/mjs/deleted.js"); /* harmony import */ var _updated_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./updated.js */ "./node_modules/deep-object-diff/mjs/updated.js"); /* harmony import */ var _detailed_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./detailed.js */ "./node_modules/deep-object-diff/mjs/detailed.js"); /***/ }), /***/ "./node_modules/deep-object-diff/mjs/updated.js": /*!******************************************************!*\ !*** ./node_modules/deep-object-diff/mjs/updated.js ***! \******************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/deep-object-diff/mjs/utils.js"); const updatedDiff = (lhs, rhs) => { if (lhs === rhs) return {}; if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(lhs) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(rhs)) return rhs; const l = lhs; const r = rhs; if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(l) || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(r)) { if (l.valueOf() == r.valueOf()) return {}; return r; } return Object.keys(r).reduce((acc, key) => { if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.hasOwnProperty)(l, key)) { const difference = updatedDiff(l[key], r[key]); // If the difference is empty, and the lhs is an empty object or the rhs is not an empty object if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(difference) && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(difference) && ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(l[key]) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(r[key]))) return acc; // return no diff acc[key] = difference; return acc; } return acc; }, {}); }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (updatedDiff); /***/ }), /***/ "./node_modules/deep-object-diff/mjs/utils.js": /*!****************************************************!*\ !*** ./node_modules/deep-object-diff/mjs/utils.js ***! \****************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "hasOwnProperty": () => (/* binding */ hasOwnProperty), /* harmony export */ "isDate": () => (/* binding */ isDate), /* harmony export */ "isEmpty": () => (/* binding */ isEmpty), /* harmony export */ "isEmptyObject": () => (/* binding */ isEmptyObject), /* harmony export */ "isObject": () => (/* binding */ isObject) /* harmony export */ }); const isDate = d => d instanceof Date; const isEmpty = o => Object.keys(o).length === 0; const isObject = o => o != null && typeof o === 'object'; const hasOwnProperty = (o, ...args) => Object.prototype.hasOwnProperty.call(o, ...args) const isEmptyObject = (o) => isObject(o) && isEmpty(o); /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. (() => { /*!************************************!*\ !*** ./debugger-ui/debugger-ui.ts ***! \************************************/ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "WS_READY_STATE": () => (/* binding */ WS_READY_STATE) /* harmony export */ }); /* harmony import */ var _ethicdevs_json_tree_view__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethicdevs/json-tree-view */ "./node_modules/@ethicdevs/json-tree-view/dist/index.js"); /* harmony import */ var deep_object_diff__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! deep-object-diff */ "./node_modules/deep-object-diff/mjs/index.js"); var __assign = (undefined && undefined.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; var WS_READY_STATE; (function (WS_READY_STATE) { WS_READY_STATE[WS_READY_STATE["Connecting"] = 0] = "Connecting"; WS_READY_STATE[WS_READY_STATE["Open"] = 1] = "Open"; WS_READY_STATE[WS_READY_STATE["Closing"] = 2] = "Closing"; WS_READY_STATE[WS_READY_STATE["Closed"] = 3] = "Closed"; })(WS_READY_STATE || (WS_READY_STATE = {})); function nestedIncludes(obj, toMatch) { var entries = Object.entries(obj); var mappedEntries = entries.map(function (_a) { var k = _a[0], v = _a[1]; if (typeof v === "object") { return [k, nestedIncludes(v, toMatch)]; } else if (typeof v === "function" || typeof v === "undefined" || typeof v === "symbol" || typeof v === "bigint" || typeof v === "number") { return [k, false]; } else if (typeof v === "string") { return [k, v.includes(toMatch)]; } else { return [k, false]; } }); return mappedEntries.some(function (_a) { var _ = _a[0], v = _a[1]; return v === true; }); } function strToBytesLen(str) { try { return new TextEncoder().encode(str).length; } catch (_) { return -1; } } function humanFileSize(bytes, si, dp) { if (si === void 0) { si = false; } if (dp === void 0) { dp = 1; } var thresh = si ? 1000 : 1024; if (Math.abs(bytes) < thresh) { return bytes + " B"; } var units = si ? ["kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] : ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]; var u = -1; var r = Math.pow(10, dp); do { bytes /= thresh; ++u; } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1); return bytes.toFixed(dp) + " " + units[u]; } function getLogLines(packet, packetBytes) { var _a; var date = new Date(packet._t).toLocaleString(); var packetType = (_a = packet._d) === null || _a === void 0 ? void 0 : _a.type; var packetSize = humanFileSize(packetBytes); var maybeActionType = packetType == null ? "" : "".concat(packetType, " => "); var content = JSON.stringify(packet._d, null, 2); var str = "[".concat(date, "] (").concat(packetSize, ") => ").concat(maybeActionType, "\n").concat(content); var _b = str.split("\n"), firstLine = _b[0], otherLines = _b.slice(1); return __spreadArray([firstLine], otherLines, true); } /* function makeLogEntry(packet: DebuggerPacket) { const date = new Date(packet._t).toLocaleString(); const packetType = packet._d?.type; const maybeActionType = packetType == null ? "" : `${packetType} => `; const content = JSON.stringify(packet._d, null, 2); const str = `[${date}]: ${maybeActionType}${content}`; const [firstLine, ...otherLines] = str.split("\n"); const node = document.createElement("li"); const detailsNode = document.createElement("details"); const summaryNode = document.createElement("summary"); const preNode = document.createElement("pre"); const summaryTextNode = document.createTextNode(firstLine); const textNode = document.createTextNode(otherLines.join("\n")); detailsNode.setAttribute("open", "true"); detailsNode.classList.add("log"); detailsNode.classList.add(`log-${packet._k}`); summaryNode.appendChild(summaryTextNode); preNode.appendChild(textNode); detailsNode.appendChild(summaryNode); detailsNode.appendChild(preNode); node.appendChild(detailsNode); return node; } */ var makeNodeToggleFolding = function (allFolded) { return function (node) { if (allFolded) { node.setAttribute("open", true); } else { node.removeAttribute("open"); } }; }; (function iife(wsUri) { if (wsUri === void 0) { wsUri = "ws://localhost:8080"; } console.log("[rgsh-debugger/ui] Hey, will connect to ws on: ".concat(wsUri)); var ws = new WebSocket(wsUri); var stats = { dispatchedActions: 0, stateUpdates: 0, }; var state = { actionsAllFolded: false, stateAllFolded: false, stateDiffMode: false, lastStateData: null, actionsFilterByValue: "", stateFilterByValue: "", }; var wsReadyStateEl = document.querySelector("#ws-ready-state"); var actionsLog = document.querySelector("#actions-dispatch-wrapper"); var actionsInputFilter = document.querySelector("#input-filter-actions"); var actionsDispatchCounter = document.querySelector("#dispatched-actions-counter"); var actionsToggleFoldingButton = document.querySelector("#btn-action-toggle-folding"); var stateLog = document.querySelector("#state-updates-wrapper"); var stateInputFilter = document.querySelector("#input-filter-state"); var stateUpdatesCounter = document.querySelector("#state-updates-counter"); var stateDiffModeStatus = document.querySelector("#state-diff-mode"); var stateToggleFoldingButton = document.querySelector("#btn-state-toggle-folding"); var stateToggleDiffModeButton = document.querySelector("#btn-state-toggle-diff-mode"); function log(message) { if (wsReadyStateEl != null) { wsReadyStateEl.textContent = message; } } function wsOpen(_) { ws.send("tail"); log("Connected!"); } function wsError(ev, reconnectWebSocket) { log("Socket error: " + ev.message); reconnectWebSocket(); } function wsClose(_a, reconnectWebSocket) { var code = _a.code, reason = _a.reason; var tags = ["code=".concat(code || "none"), "reason=".concat(reason || "none")]; log("Connection closed. ".concat(tags.join(" "))); reconnectWebSocket(); } function wsMessage(ev) { var data = ev.data.toString(); var packet = JSON.parse(data); var packetBytes = strToBytesLen(data); if (packet._k === "action") { stats.dispatchedActions += 1; } else if (packet._k === "state") { stats.stateUpdates += 1; } if (packet._k === "state" && state.stateFilterByValue != null && state.stateFilterByValue.trim() !== "" && nestedIncludes(packet._d, state.stateFilterByValue) === false) { console.log("includesStateFilter:", nestedIncludes(packet._d, state.stateFilterByValue)); return; // skip } if (packet._k === "action" && state.actionsFilterByValue != null && state.actionsFilterByValue.trim() !== "" && nestedIncludes(packet._d, state.actionsFilterByValue) === false) { console.log("includesActionsFilter:", nestedIncludes(packet._d, state.actionsFilterByValue)); return; // skip } //let logEntry; var logLines = []; var nodeToUpdate; if (packet._k === "state" && state.stateDiffMode === true && state.lastStateData != null) { var diffResult = (0,deep_object_diff__WEBPACK_IMPORTED_MODULE_1__.updatedDiff)(state.lastStateData, packet._d); var diffPacket = __assign(__assign({}, packet), { _d: diffResult }); //logEntry = makeLogEntry(diffPacket); logLines = getLogLines(diffPacket, strToBytesLen(JSON.stringify(diffPacket))); nodeToUpdate = stateLog; } else { //logEntry = makeLogEntry(packet); logLines = getLogLines(packet, packetBytes); nodeToUpdate = packet._k === "action" ? actionsLog : stateLog; } if (nodeToUpdate != null) { var jsonTreeViewNode = document.createElement("div"); (0,_ethicdevs_json_tree_view__WEBPACK_IMPORTED_MODULE_0__.renderJSONTreeView)(packet._d, jsonTreeViewNode, { expanded: false, }); var firstLine = logLines[0]; var firstLineNode = document.createTextNode(firstLine); var wrapperNode = document.createElement("div"); wrapperNode.appendChild(firstLineNode); wrapperNode.appendChild(jsonTreeViewNode); nodeToUpdate.appendChild(wrapperNode); if (nodeToUpdate.parentElement != null) { nodeToUpdate.parentElement.scrollTop = nodeToUpdate.parentElement.scrollHeight; } } if (actionsDispatchCounter != null) { actionsDispatchCounter.textContent = "(".concat(stats.dispatchedActions, " dispatches)"); } if (stateUpdatesCounter != null) { stateUpdatesCounter.textContent = "(".concat(stats.stateUpdates, " updates)"); } state.lastStateData = packet._d; } function recreateWebSocket(bindEvents, firstTime) { if (ws.readyState === WS_READY_STATE.Closed) { log("Lost connection to debugger. Sleeping 3s before reconnecting..."); } // Try reconnecting every 3s var reconnectIntervalId = setInterval(function () { if (ws.readyState === WS_READY_STATE.Closed) { log("Trying to ".concat(firstTime ? "re" : "", "connect...")); ws = new WebSocket(wsUri); } else if (ws.readyState === WS_READY_STATE.Open) { if (reconnectIntervalId) { clearInterval(reconnectIntervalId); reconnectIntervalId = null; log(firstTime ? "Connected!" : "Re-connected!"); bindEvents(ws); ws.send("tail"); } } return undefined; }, 1000 * 3); return undefined; } function bindWsEvents(socket) { socket.onopen = wsOpen; socket.onmessage = wsMessage; socket.onerror = function (ev) { wsError(ev, recreateWebSocket.bind(null, bindWsEvents)); }; socket.onclose = function (ev) { wsClose(ev, recreateWebSocket.bind(null, bindWsEvents)); }; } bindWsEvents(ws); ws.send("tail"); actionsInputFilter === null || actionsInputFilter === void 0 ? void 0 : actionsInputFilter.addEventListener("change", function (ev) { if (ev.target.value != null) { state.actionsFilterByValue = ev.target.value; } }); stateInputFilter === null || stateInputFilter === void 0 ? void 0 : stateInputFilter.addEventListener("change", function (ev) { if (ev.target.value != null) { state.stateFilterByValue = ev.target.value; } }); actionsToggleFoldingButton === null || actionsToggleFoldingButton === void 0 ? void 0 : actionsToggleFoldingButton.addEventListener("click", function () { var allActionNodes = document.querySelectorAll(".log-action"); allActionNodes.forEach(makeNodeToggleFolding(state.actionsAllFolded)); state.actionsAllFolded = !state.actionsAllFolded; }); stateToggleFoldingButton === null || stateToggleFoldingButton === void 0 ? void 0 : stateToggleFoldingButton.addEventListener("click", function () { var allStateNodes = document.querySelectorAll(".log-state"); allStateNodes.forEach(makeNodeToggleFolding(state.stateAllFolded)); state.stateAllFolded = !state.stateAllFolded; }); stateToggleDiffModeButton === null || stateToggleDiffModeButton === void 0 ? void 0 : stateToggleDiffModeButton.addEventListener("click", function () { state.stateDiffMode = !state.stateDiffMode; if (stateDiffModeStatus != null) { stateDiffModeStatus.textContent = state.stateDiffMode ? "On" : "Off"; } }); })(); })(); /******/ })() ; //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qiw2REFBSTtBQUNqQyxpREFBaUQsYUFBYSxnQkFBZ0I7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksNkVBQWtCO0FBQzlCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGV0aGljZGV2cy9yZWFjdC1nbG9iYWwtc3RhdGUtaG9va3MtZGVidWdnZXIvLi9ub2RlX21vZHVsZXMvQGV0aGljZGV2cy9qc29uLXRyZWUtdmlldy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyLy4vbm9kZV9tb2R1bGVzL2RlZXAtb2JqZWN0LWRpZmYvbWpzL2FkZGVkLmpzIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyLy4vbm9kZV9tb2R1bGVzL2RlZXAtb2JqZWN0LWRpZmYvbWpzL2RlbGV0ZWQuanMiLCJ3ZWJwYWNrOi8vQGV0aGljZGV2cy9yZWFjdC1nbG9iYWwtc3RhdGUtaG9va3MtZGVidWdnZXIvLi9ub2RlX21vZHVsZXMvZGVlcC1vYmplY3QtZGlmZi9tanMvZGV0YWlsZWQuanMiLCJ3ZWJwYWNrOi8vQGV0aGljZGV2cy9yZWFjdC1nbG9iYWwtc3RhdGUtaG9va3MtZGVidWdnZXIvLi9ub2RlX21vZHVsZXMvZGVlcC1vYmplY3QtZGlmZi9tanMvZGlmZi5qcyIsIndlYnBhY2s6Ly9AZXRoaWNkZXZzL3JlYWN0LWdsb2JhbC1zdGF0ZS1ob29rcy1kZWJ1Z2dlci8uL25vZGVfbW9kdWxlcy9kZWVwLW9iamVjdC1kaWZmL21qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9AZXRoaWNkZXZzL3JlYWN0LWdsb2JhbC1zdGF0ZS1ob29rcy1kZWJ1Z2dlci8uL25vZGVfbW9kdWxlcy9kZWVwLW9iamVjdC1kaWZmL21qcy91cGRhdGVkLmpzIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyLy4vbm9kZV9tb2R1bGVzL2RlZXAtb2JqZWN0LWRpZmYvbWpzL3V0aWxzLmpzIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9AZXRoaWNkZXZzL3JlYWN0LWdsb2JhbC1zdGF0ZS1ob29rcy1kZWJ1Z2dlci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQGV0aGljZGV2cy9yZWFjdC1nbG9iYWwtc3RhdGUtaG9va3MtZGVidWdnZXIvLi9kZWJ1Z2dlci11aS9kZWJ1Z2dlci11aS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBuYW1lIEBldGhpY2RldnMvanNvbi10cmVlLXZpZXdcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1haW50YWluZXIgPFdpbGxpYW0gTmVtZW5jaGEsIEV0aGljRGV2cywgaHR0cHM6Ly9naXRodWIuY29tL0V0aGljRGV2cy9qc29uLXRyZWUtdmlldz5cbiAqIEBmb3JrZWQtZnJvbSA85YmN56uv6YCa6YGO5YWD57Sg5bGV56S6SnNvbuaoueeLgOizh+aWme+8jOWboCwgaHR0cHM6Ly9naXRodWIuY29tL3l1ZGEtbHl1L3ctanNvbnZpZXctdHJlZT5cbiAqIEBpdHNlbGYtZm9ya2VkLWZyb20gPOaykuacieWKoOWFpemgkOWFiOWxlemWi+aVuOaTmuWKn+iDve+8jOiHquW3seS4i+i8ieS+huS/ruaUuSwgaHR0cHM6Ly9naXRodWIuY29tL3BncmFib3ZldHMvanNvbi12aWV3PlxuICovXG4vKipcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc29uT2JqIOi8uOWFpUpzb27nianku7ZcbiAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsZW0g6Ly45YWl5Yid5aeL5YyW5YWD57SgXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbj17fV0g6Ly45YWl6Kit5a6a54mp5Lu277yM6aCQ6Kit54K656m654mp5Lu2XG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb24uZXhwYW5kZWQ9ZmFsc2VdIOi8uOWFpeaYr+WQpumgkOWFiOWxlemWi++8jOmgkOioreeCumZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJKU09OVHJlZVZpZXcoanNvbk9iaiwgcm9vdEVsZW0sIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIC8vZGVmYXVsdCBleHBhbmRlZFxuICAgIHZhciBfZXhwYW5kZWQgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAvL2dldCBleHBhbmRlZFxuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgX2V4cGFuZGVkID0gb3B0aW9uc1tcImV4cGFuZGVkXCJdID09PSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgcm9vdEVsZW0uaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgLy9hZGQgY2xhc3NcbiAgICAgICAgcm9vdEVsZW0uY2xhc3NMaXN0LmFkZChcIkNvbXBDc3NESnNvblZpZXdUcmVlXCIpO1xuICAgICAgICAvL3JlbmRlclxuICAgICAgICB2YXIgdHJlZSA9IGNyZWF0ZVRyZWUoanNvbk9iaik7XG4gICAgICAgIHJlbmRlcih0cmVlLCByb290RWxlbSk7XG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgaHRtbCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgaHRtbCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7XG4gICAgICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBodG1sRWxlbWVudC5jbGFzc05hbWUgPSBjb25maWcuY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuY29udGVudCkge1xuICAgICAgICAgICAgaHRtbEVsZW1lbnQudGV4dENvbnRlbnQgPSBjb25maWcuY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25maWcuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRXhwYW5kZWRFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHZhciBpRWxlbSA9IGNyZWF0ZUVsZW1lbnQoXCJpXCIpO1xuICAgICAgICBpZiAobm9kZS5leHBhbmRlZCkge1xuICAgICAgICAgICAgaUVsZW0uY2xhc3NOYW1lID0gXCJ3aWNvbiB3LWNhcmV0LWRvd25cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlFbGVtLmNsYXNzTmFtZSA9IFwid2ljb24gdy1jYXJldC1yaWdodFwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjYXJldEVsZW0gPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ3anYtY2FyZXQtaWNvblwiLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtpRWxlbV0sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgaGFuZGxlQ2xpY2sgPSBub2RlLnRvZ2dsZS5iaW5kKG5vZGUpO1xuICAgICAgICBjYXJldEVsZW0uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgdmFyIGluZGV4RWxlbSA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIndqdi1qc29uLWluZGV4XCIsXG4gICAgICAgICAgICBjb250ZW50OiBub2RlLmtleSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB0eXBlRWxlbSA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcInd