@mongoosejs/studio 0.1.15 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,11 @@
1
1
  /******/ (() => { // webpackBootstrap
2
2
  /******/ var __webpack_modules__ = ({
3
3
 
4
- /***/ "./frontend/src sync recursive ^\\.\\/.*$":
4
+ /***/ "./frontend/src sync recursive ^\\.\\/.*$"
5
5
  /*!*************************************!*\
6
6
  !*** ./frontend/src/ sync ^\.\/.*$ ***!
7
7
  \*************************************/
8
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
8
+ (module, __unused_webpack_exports, __webpack_require__) {
9
9
 
10
10
  var map = {
11
11
  "./": "./frontend/src/index.js",
@@ -13,6 +13,8 @@ var map = {
13
13
  "./api.js": "./frontend/src/api.js",
14
14
  "./appendCSS": "./frontend/src/appendCSS.js",
15
15
  "./appendCSS.js": "./frontend/src/appendCSS.js",
16
+ "./array-utils": "./frontend/src/array-utils.js",
17
+ "./array-utils.js": "./frontend/src/array-utils.js",
16
18
  "./async-button/async-button": "./frontend/src/async-button/async-button.js",
17
19
  "./async-button/async-button.html": "./frontend/src/async-button/async-button.html",
18
20
  "./async-button/async-button.js": "./frontend/src/async-button/async-button.js",
@@ -48,6 +50,9 @@ var map = {
48
50
  "./dashboard-result/dashboard-map/dashboard-map": "./frontend/src/dashboard-result/dashboard-map/dashboard-map.js",
49
51
  "./dashboard-result/dashboard-map/dashboard-map.html": "./frontend/src/dashboard-result/dashboard-map/dashboard-map.html",
50
52
  "./dashboard-result/dashboard-map/dashboard-map.js": "./frontend/src/dashboard-result/dashboard-map/dashboard-map.js",
53
+ "./dashboard-result/dashboard-object/dashboard-object": "./frontend/src/dashboard-result/dashboard-object/dashboard-object.js",
54
+ "./dashboard-result/dashboard-object/dashboard-object.html": "./frontend/src/dashboard-result/dashboard-object/dashboard-object.html",
55
+ "./dashboard-result/dashboard-object/dashboard-object.js": "./frontend/src/dashboard-result/dashboard-object/dashboard-object.js",
51
56
  "./dashboard-result/dashboard-primitive/dashboard-primitive": "./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.js",
52
57
  "./dashboard-result/dashboard-primitive/dashboard-primitive.html": "./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.html",
53
58
  "./dashboard-result/dashboard-primitive/dashboard-primitive.js": "./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.js",
@@ -91,7 +96,6 @@ var map = {
91
96
  "./document/document.html": "./frontend/src/document/document.html",
92
97
  "./document/document.js": "./frontend/src/document/document.js",
93
98
  "./edit-array/edit-array": "./frontend/src/edit-array/edit-array.js",
94
- "./edit-array/edit-array.css": "./frontend/src/edit-array/edit-array.css",
95
99
  "./edit-array/edit-array.html": "./frontend/src/edit-array/edit-array.html",
96
100
  "./edit-array/edit-array.js": "./frontend/src/edit-array/edit-array.js",
97
101
  "./edit-boolean/edit-boolean": "./frontend/src/edit-boolean/edit-boolean.js",
@@ -121,7 +125,6 @@ var map = {
121
125
  "./index": "./frontend/src/index.js",
122
126
  "./index.js": "./frontend/src/index.js",
123
127
  "./list-array/list-array": "./frontend/src/list-array/list-array.js",
124
- "./list-array/list-array.css": "./frontend/src/list-array/list-array.css",
125
128
  "./list-array/list-array.html": "./frontend/src/list-array/list-array.html",
126
129
  "./list-array/list-array.js": "./frontend/src/list-array/list-array.js",
127
130
  "./list-default/list-default": "./frontend/src/list-default/list-default.js",
@@ -200,13 +203,13 @@ webpackContext.resolve = webpackContextResolve;
200
203
  module.exports = webpackContext;
201
204
  webpackContext.id = "./frontend/src sync recursive ^\\.\\/.*$";
202
205
 
203
- /***/ }),
206
+ /***/ },
204
207
 
205
- /***/ "./frontend/src/api.js":
208
+ /***/ "./frontend/src/api.js"
206
209
  /*!*****************************!*\
207
210
  !*** ./frontend/src/api.js ***!
208
211
  \*****************************/
209
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
212
+ (__unused_webpack_module, exports, __webpack_require__) {
210
213
 
211
214
  "use strict";
212
215
 
@@ -568,13 +571,13 @@ if (window.MONGOOSE_STUDIO_CONFIG.isLambda) {
568
571
  }
569
572
 
570
573
 
571
- /***/ }),
574
+ /***/ },
572
575
 
573
- /***/ "./frontend/src/appendCSS.js":
576
+ /***/ "./frontend/src/appendCSS.js"
574
577
  /*!***********************************!*\
575
578
  !*** ./frontend/src/appendCSS.js ***!
576
579
  \***********************************/
577
- /***/ ((module) => {
580
+ (module) {
578
581
 
579
582
  "use strict";
580
583
 
@@ -589,24 +592,101 @@ module.exports = function appendCSS(css) {
589
592
  style.appendChild(document.createTextNode(css));
590
593
  };
591
594
 
592
- /***/ }),
595
+ /***/ },
593
596
 
594
- /***/ "./frontend/src/async-button/async-button.html":
597
+ /***/ "./frontend/src/array-utils.js"
598
+ /*!*************************************!*\
599
+ !*** ./frontend/src/array-utils.js ***!
600
+ \*************************************/
601
+ (module, __unused_webpack_exports, __webpack_require__) {
602
+
603
+ "use strict";
604
+
605
+
606
+ const { inspect } = __webpack_require__(/*! node-inspect-extracted */ "./node_modules/node-inspect-extracted/dist/inspect.js");
607
+
608
+ /**
609
+ * Format a value for display in array views
610
+ * @param {*} item - The item to format
611
+ * @returns {string} - Formatted string representation
612
+ */
613
+ function formatValue(item) {
614
+ if (item == null) {
615
+ return 'null';
616
+ }
617
+ if (typeof item === 'object') {
618
+ return inspect(item, { maxArrayLength: 50 });
619
+ }
620
+ return String(item);
621
+ }
622
+
623
+ /**
624
+ * Check if an item is a plain object (not array, not null)
625
+ * @param {*} item - The item to check
626
+ * @returns {boolean} - True if item is a plain object
627
+ */
628
+ function isObjectItem(item) {
629
+ return item != null && typeof item === 'object' && !Array.isArray(item) && item.constructor === Object;
630
+ }
631
+
632
+ /**
633
+ * Get the keys of an object item
634
+ * @param {*} item - The item to get keys from
635
+ * @returns {string[]} - Array of keys, or empty array if not an object
636
+ */
637
+ function getItemKeys(item) {
638
+ if (!isObjectItem(item)) {
639
+ return [];
640
+ }
641
+ return Object.keys(item);
642
+ }
643
+
644
+ /**
645
+ * Format a specific value from an object item by key
646
+ * @param {*} item - The object item
647
+ * @param {string} key - The key to get the value for
648
+ * @returns {string} - Formatted string representation of the value
649
+ */
650
+ function formatItemValue(item, key) {
651
+ const value = item[key];
652
+ if (value === null) {
653
+ return 'null';
654
+ }
655
+ if (value === undefined) {
656
+ return 'undefined';
657
+ }
658
+ if (typeof value === 'object') {
659
+ return inspect(value, { maxArrayLength: 50 });
660
+ }
661
+ return String(value);
662
+ }
663
+
664
+ module.exports = {
665
+ formatValue,
666
+ isObjectItem,
667
+ getItemKeys,
668
+ formatItemValue
669
+ };
670
+
671
+
672
+ /***/ },
673
+
674
+ /***/ "./frontend/src/async-button/async-button.html"
595
675
  /*!*****************************************************!*\
596
676
  !*** ./frontend/src/async-button/async-button.html ***!
597
677
  \*****************************************************/
598
- /***/ ((module) => {
678
+ (module) {
599
679
 
600
680
  "use strict";
601
681
  module.exports = "<button v-bind=\"attrsToBind\" :disabled=\"isDisabled\" @click=\"handleClick\">\n <div v-if=\"status === 'in_progress'\" style=\"text-align: center\">\n <svg style=\"height: 1em\" class=\"mx-auto\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" opacity=\"0.3\" />\n <path d=\"M12 2a10 10 0 0 1 10 10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 12 12\" to=\"360 12 12\" dur=\"1s\" repeatCount=\"indefinite\" />\n </path>\n </g>\n </svg>\n </div>\n <slot v-if=\"status == 'success' || status == 'init'\"></slot>\n</button>\n";
602
682
 
603
- /***/ }),
683
+ /***/ },
604
684
 
605
- /***/ "./frontend/src/async-button/async-button.js":
685
+ /***/ "./frontend/src/async-button/async-button.js"
606
686
  /*!***************************************************!*\
607
687
  !*** ./frontend/src/async-button/async-button.js ***!
608
688
  \***************************************************/
609
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
689
+ (module, __unused_webpack_exports, __webpack_require__) {
610
690
 
611
691
  "use strict";
612
692
 
@@ -659,24 +739,24 @@ module.exports = app => app.component('async-button', {
659
739
  });
660
740
 
661
741
 
662
- /***/ }),
742
+ /***/ },
663
743
 
664
- /***/ "./frontend/src/chat/chat-message-script/chat-message-script.html":
744
+ /***/ "./frontend/src/chat/chat-message-script/chat-message-script.html"
665
745
  /*!************************************************************************!*\
666
746
  !*** ./frontend/src/chat/chat-message-script/chat-message-script.html ***!
667
747
  \************************************************************************/
668
- /***/ ((module) => {
748
+ (module) {
669
749
 
670
750
  "use strict";
671
751
  module.exports = "<div class=\"relative border rounded bg-gray-100 text-black text-sm overflow-hidden\">\n <div class=\"flex border-b pt-[1px] text-xs font-medium bg-gray-200\">\n <button\n class=\"px-3 py-1 border-r border-gray-300 hover:bg-green-300\"\n :class=\"{'bg-gray-300': activeTab === 'code', 'bg-green-300': activeTab === 'code'}\"\n @click=\"activeTab = 'code'\">\n Code\n </button>\n <button\n class=\"px-3 py-1 hover:bg-green-300\"\n :class=\"{'bg-green-300': activeTab === 'output'}\"\n @click=\"activeTab = 'output'\">\n Output\n </button>\n <div class=\"ml-auto mr-1 flex\">\n <button\n v-if=\"activeTab === 'output'\"\n class=\"px-2 py-1 mr-1 text-xs bg-gray-500 text-white border-none rounded cursor-pointer hover:bg-gray-600 transition-colors flex items-center\"\n @click=\"copyOutput\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3m2 4H10m0 0l3-3m-3 3l3 3\" />\n </svg>\n </button>\n <button\n v-if=\"activeTab === 'output'\"\n class=\"px-2 py-1 mr-1 text-xs bg-blue-500 text-white border-none rounded cursor-pointer hover:bg-blue-600 transition-colors flex items-center\"\n @click=\"openDetailModal\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 1v4m0 0h-4m4 0l-5-5\" />\n </svg>\n </button>\n <button\n v-if=\"activeTab === 'code' && !isEditing\"\n class=\"px-2 py-1 mr-1 text-xs bg-gray-500 text-white border-none rounded cursor-pointer hover:bg-gray-600 transition-colors flex items-center\"\n @click.stop=\"startEditing\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-3 w-3\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M13.586 3.586a2 2 0 112.828 2.828l-.793.793-2.828-2.828.793-.793zM4 13.5V16h2.5l7.086-7.086-2.828-2.828L4 13.5z\" />\n </svg>\n </button>\n <async-button\n v-if=\"!isEditing\"\n class=\"px-2 py-1 text-xs bg-green-500 text-white border-none rounded cursor-pointer hover:bg-green-600 transition-colors disabled:bg-gray-400\"\n @click=\"executeScript\">\n Execute\n </async-button>\n <div class=\"relative ml-1\" ref=\"dropdown\">\n <button\n @click.stop=\"toggleDropdown\"\n class=\"px-1 py-1 text-xs hover:bg-gray-300 rounded flex items-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 6a2 2 0 110-4 2 2 0 010 4zm0 6a2 2 0 110-4 2 2 0 010 4zm0 6a2 2 0 110-4 2 2 0 010 4z\" />\n </svg>\n </button>\n <div\n v-if=\"showDropdown\"\n class=\"absolute right-0 z-10 mt-1 w-64 origin-top-right rounded-md bg-white py-1 shadow-lg ring-1 ring-black/5\">\n <button\n class=\"block w-full text-left px-4 py-2 text-xs text-gray-700 hover:bg-gray-100\"\n @click=\"openCreateDashboardModal(); showDropdown = false\">\n Create Dashboard\n </button>\n <button\n v-if=\"canOverwriteDashboard\"\n class=\"block w-full text-left px-4 py-2 text-xs text-gray-700 hover:bg-gray-100\"\n @click=\"openOverwriteDashboardConfirmation(); showDropdown = false\">\n Overwrite Dashboard\n </button>\n <button\n class=\"block w-full text-left px-4 py-2 text-xs text-gray-700 hover:bg-gray-100\"\n @click=\"$emit('copyMessage'); showDropdown = false\">\n Copy Full Message\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"p-3 max-h-[50vh] max-w-[calc(100vw-4rem)] lg:max-w-[calc(100vw-20rem)] overflow-y-auto\" v-show=\"activeTab === 'code'\">\n <div v-if=\"isEditing\" class=\"flex flex-col space-y-2\">\n <div class=\"border border-gray-200\">\n <textarea ref=\"scriptEditor\" class=\"w-full h-[45vh]\" @input=\"handleScriptInput\"></textarea>\n </div>\n <div class=\"flex justify-end gap-2\">\n <button\n class=\"px-2 py-1 text-xs bg-gray-300 text-gray-800 border-none rounded cursor-pointer hover:bg-gray-400 transition-colors\"\n @click.stop=\"cancelEditing\">\n Cancel\n </button>\n <async-button\n class=\"px-2 py-1 text-xs bg-green-500 text-white border-none rounded cursor-pointer hover:bg-green-600 transition-colors disabled:bg-gray-400\"\n @click=\"executeScript\">\n Execute\n </async-button>\n </div>\n </div>\n <pre v-else class=\"whitespace-pre-wrap\"><code v-text=\"script\" ref=\"code\" :class=\"'language-' + language\"></code></pre>\n </div>\n\n <div class=\"p-3 whitespace-pre-wrap max-h-[50vh] overflow-y-auto bg-white border-t max-w-[calc(100vw-4rem)] lg:max-w-[calc(100vw-20rem)] relative\" v-show=\"activeTab === 'output'\">\n <dashboard-chart v-if=\"message.executionResult?.output?.$chart\" :value=\"message.executionResult?.output\" />\n <dashboard-map v-else-if=\"message.executionResult?.output?.$featureCollection\" :value=\"message.executionResult?.output\" />\n <pre v-else>{{ message.executionResult?.output || 'No output' }}</pre>\n\n <div v-if=\"message.executionResult?.logs?.length\" class=\"mt-3 pt-3 border-t border-gray-200\">\n <div class=\"text-xs font-semibold text-gray-600 uppercase tracking-wide\">Console</div>\n <pre class=\"mt-1 bg-gray-100 text-gray-900 p-3 rounded whitespace-pre-wrap overflow-x-auto max-h-[280px]\">{{ message.executionResult.logs }}</pre>\n </div>\n </div>\n\n <modal ref=\"outputModal\" v-if=\"showDetailModal\" containerClass=\"!h-[90vh] !w-[90vw]\">\n <template #body>\n <div class=\"absolute font-mono right-1 top-1 cursor-pointer text-xl\" @click=\"showDetailModal = false;\">&times;</div>\n <div class=\"h-full overflow-auto\">\n <dashboard-chart v-if=\"message.executionResult?.output?.$chart\" :value=\"message.executionResult?.output\" :responsive=\"true\" />\n <dashboard-map\n v-else-if=\"message.executionResult?.output?.$featureCollection\"\n :value=\"message.executionResult?.output\"\n height=\"80vh\" />\n <pre v-else class=\"whitespace-pre-wrap\">{{ message.executionResult?.output || 'No output' }}</pre>\n </div>\n </template>\n </modal>\n <modal v-if=\"showCreateDashboardModal\">\n <template #body>\n <div class=\"modal-exit\" @click=\"showCreateDashboardModal = false\">&times;</div>\n <div>\n <div class=\"mt-4 text-gray-900 font-semibold\">Create Dashboard</div>\n <div class=\"mt-4\">\n <label class=\"block text-sm font-medium leading-6 text-gray-900\">Title</label>\n <div class=\"mt-2\">\n <div class=\"w-full flex rounded-md shadow-sm ring-1 ring-inset ring-gray-300 focus-within:ring-2 focus-within:ring-inset focus-within:ring-teal-600\">\n <input type=\"text\" v-model=\"newDashboardTitle\" class=\"outline-none block flex-1 border-0 bg-transparent py-1.5 pl-1 text-gray-900 placeholder:text-gray-400 focus:ring-0 sm:text-sm sm:leading-6\" placeholder=\"My Dashboard\">\n </div>\n </div>\n </div>\n <div class=\"my-4\">\n <label class=\"block text-sm font-medium leading-6 text-gray-900\">Code</label>\n <div class=\"border border-gray-200\">\n <textarea class=\"p-2 h-[300px] w-full\" ref=\"dashboardCodeEditor\"></textarea>\n </div>\n </div>\n <async-button\n @click=\"createDashboardFromScript\"\n class=\"rounded-md bg-teal-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-teal-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600\">\n Submit\n </async-button>\n <div v-if=\"createError\" class=\"rounded-md bg-red-50 p-4 mt-1\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">Error</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n {{createError}}\n </div>\n </div>\n </div>\n </div>\n </div>\n </template>\n </modal>\n <modal v-if=\"showOverwriteDashboardConfirmationModal\">\n <template #body>\n <div class=\"modal-exit\" @click=\"showOverwriteDashboardConfirmationModal = false\">&times;</div>\n <div>\n <div class=\"mt-4 text-gray-900 font-semibold\">Overwrite Dashboard</div>\n <p class=\"mt-2 text-sm text-gray-700\">\n This will replace the linked dashboard's code with the script below.\n </p>\n <p class=\"mt-1 text-xs text-gray-600 break-all\" v-if=\"targetDashboardId\">\n Dashboard ID: {{ targetDashboardId }}\n </p>\n <div class=\"my-4 border border-gray-200 bg-gray-50 rounded\">\n <pre class=\"p-2 h-[300px] overflow-auto whitespace-pre-wrap text-xs\">{{ overwriteDashboardCode }}</pre>\n </div>\n <div class=\"flex items-center gap-2\">\n <async-button\n @click=\"confirmOverwriteDashboard\"\n class=\"rounded-md bg-teal-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-teal-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600\">\n Confirm Overwrite\n </async-button>\n <button\n class=\"px-2.5 py-1.5 rounded-md text-sm font-semibold text-gray-700 bg-gray-200 hover:bg-gray-300\"\n @click=\"showOverwriteDashboardConfirmationModal = false\">\n Cancel\n </button>\n </div>\n <div v-if=\"overwriteError\" class=\"rounded-md bg-red-50 p-4 mt-3\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">Error</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n {{overwriteError}}\n </div>\n </div>\n </div>\n </div>\n </div>\n </template>\n </modal>\n</div>\n";
672
752
 
673
- /***/ }),
753
+ /***/ },
674
754
 
675
- /***/ "./frontend/src/chat/chat-message-script/chat-message-script.js":
755
+ /***/ "./frontend/src/chat/chat-message-script/chat-message-script.js"
676
756
  /*!**********************************************************************!*\
677
757
  !*** ./frontend/src/chat/chat-message-script/chat-message-script.js ***!
678
758
  \**********************************************************************/
679
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
759
+ (module, __unused_webpack_exports, __webpack_require__) {
680
760
 
681
761
  "use strict";
682
762
  /* global CodeMirror, Prism */
@@ -923,24 +1003,24 @@ module.exports = app => app.component('chat-message-script', {
923
1003
  });
924
1004
 
925
1005
 
926
- /***/ }),
1006
+ /***/ },
927
1007
 
928
- /***/ "./frontend/src/chat/chat-message/chat-message.html":
1008
+ /***/ "./frontend/src/chat/chat-message/chat-message.html"
929
1009
  /*!**********************************************************!*\
930
1010
  !*** ./frontend/src/chat/chat-message/chat-message.html ***!
931
1011
  \**********************************************************/
932
- /***/ ((module) => {
1012
+ (module) {
933
1013
 
934
1014
  "use strict";
935
1015
  module.exports = "<div class=\"relative flex items-start\" :class=\"{'justify-end': message.role === 'user'}\">\n <div\n class=\"min-w-0 max-w-[calc(100vw-3rem)] lg:max-w-[calc(100vw-15rem)]\"\n :class=\"{'text-right': message.role === 'user'}\">\n\n <div class=\"text-sm text-gray-900 rounded-md inline-block relative\" :class=\"styleForMessage\">\n <div v-for=\"part in contentSplitByScripts\">\n <div v-if=\"part.type === 'text'\" v-html=\"marked(part.content)\">\n </div>\n <div v-else-if=\"part.type === 'code'\">\n <chat-message-script\n :message=\"message\"\n :script=\"part.content\"\n :language=\"part.language\"\n :target-dashboard-id=\"targetDashboardId\"\n @copyMessage=\"copyMessage\"></chat-message-script>\n </div>\n </div>\n </div>\n </div>\n</div>\n";
936
1016
 
937
- /***/ }),
1017
+ /***/ },
938
1018
 
939
- /***/ "./frontend/src/chat/chat-message/chat-message.js":
1019
+ /***/ "./frontend/src/chat/chat-message/chat-message.js"
940
1020
  /*!********************************************************!*\
941
1021
  !*** ./frontend/src/chat/chat-message/chat-message.js ***!
942
1022
  \********************************************************/
943
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1023
+ (module, __unused_webpack_exports, __webpack_require__) {
944
1024
 
945
1025
  "use strict";
946
1026
 
@@ -1043,24 +1123,24 @@ module.exports = app => app.component('chat-message', {
1043
1123
  });
1044
1124
 
1045
1125
 
1046
- /***/ }),
1126
+ /***/ },
1047
1127
 
1048
- /***/ "./frontend/src/chat/chat.html":
1128
+ /***/ "./frontend/src/chat/chat.html"
1049
1129
  /*!*************************************!*\
1050
1130
  !*** ./frontend/src/chat/chat.html ***!
1051
1131
  \*************************************/
1052
- /***/ ((module) => {
1132
+ (module) {
1053
1133
 
1054
1134
  "use strict";
1055
1135
  module.exports = "<div class=\"flex\" style=\"height: calc(100vh - 55px); height: calc(100dvh - 55px)\">\n <div class=\"fixed top-[65px] cursor-pointer bg-gray-100 rounded-r-md z-10\" @click=\"hideSidebar = false\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"h-5 w-5\" viewBox=\"0 -960 960 960\" class=\"w-5\" fill=\"#5f6368\"><path d=\"M360-120v-720h80v720h-80Zm160-160v-400l200 200-200 200Z\"/></svg>\n </div>\n <button\n class=\"fixed top-[65px] right-4 z-10 p-2 rounded-md shadow bg-white\"\n :class=\"hasWorkspace ? 'text-gray-700 hover:bg-gray-100' : 'text-gray-300 cursor-not-allowed bg-gray-50'\"\n @click=\"toggleShareThread\"\n :disabled=\"!hasWorkspace || !chatThreadId || sharingThread\"\n aria-label=\"Share thread with workspace\"\n title=\"Share thread with workspace\"\n >\n <svg v-if=\"hasWorkspace\" xmlns=\"http://www.w3.org/2000/svg\" class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7a2.48 2.48 0 0 0 0-1.39l7.02-4.11a2.5 2.5 0 1 0-.87-1.37L8.04 9.94a2.5 2.5 0 1 0 0 4.12l7.12 4.16a2.5 2.5 0 1 0 .84-1.34l-7.05-4.12c-.04-.02-.08-.05-.11-.07a2.48 2.48 0 0 0 0-1.39c.03-.02.07-.04.11-.07l7.11-4.16c.52.47 1.2.76 1.94.76a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0-1.94.94L7.97 8.43a2.5 2.5 0 1 0 0 7.14l9.09 5.3c.52-.47 1.2-.76 1.94-.76a2.5 2.5 0 1 0 0-5z\"/></svg>\n <svg v-else xmlns=\"http://www.w3.org/2000/svg\" class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 1a5 5 0 00-5 5v3H6a2 2 0 00-2 2v9a2 2 0 002 2h12a2 2 0 002-2v-9a2 2 0 00-2-2h-1V6a5 5 0 00-5-5zm-3 8V6a3 3 0 016 0v3H9zm9 2v9H6v-9h12z\"/></svg>\n </button>\n <!-- Sidebar: Chat Threads -->\n <aside class=\"bg-gray-50 border-r overflow-y-auto overflow-x-hidden h-full transition-all duration-300 ease-in-out z-20 w-0 lg:w-64 fixed lg:relative\" :class=\"hideSidebar === true ? '!w-0' : hideSidebar === false ? '!w-64' : ''\">\n <div class=\"flex items-center border-b border-gray-100 w-64 overflow-x-hidden\">\n <div class=\"p-4 font-bold text-lg\">Chat Threads</div>\n <button\n @click=\"hideSidebar = true\"\n class=\"ml-auto mr-2 p-2 rounded hover:bg-gray-200 focus:outline-none\"\n aria-label=\"Close sidebar\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"h-5 w-5\" viewBox=\"0 -960 960 960\" class=\"w-5\" fill=\"currentColor\"><path d=\"M660-320v-320L500-480l160 160ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm120-80v-560H200v560h120Zm80 0h360v-560H400v560Zm-80 0H200h120Z\"/></svg>\n </button>\n </div>\n <div class=\"p-4 w-64\">\n <async-button\n @click=\"createNewThread\"\n class=\"w-full bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700\"\n >\n Create New Thread\n </async-button>\n </div>\n <div v-if=\"status === 'loaded' && chatThreads.length === 0\" class=\"p-4 text-sm text-gray-700\">\n No threads yet\n </div>\n <ul v-if=\"status === 'loaded'\" class=\"w-64\">\n <li\n v-for=\"thread in chatThreads\"\n :key=\"thread._id\"\n @click=\"selectThread(thread._id)\"\n class=\"p-4 hover:bg-gray-200 cursor-pointer w-64\"\n :class=\"{ 'bg-gray-300': thread._id === chatThreadId }\"\n >\n {{ thread.title || 'Untitled Thread' }}\n </li>\n </ul>\n </aside>\n\n <!-- Main Chat Area -->\n <main class=\"flex-1 flex flex-col\">\n <div class=\"flex-1 overflow-y-auto p-6 space-y-4\" ref=\"messagesContainer\">\n <ul role=\"list\" class=\"space-y-4\">\n <div v-if=\"true\">\n <div class=\"flex items-center justify-center py-3 mb-4\">\n <div class=\"bg-gray-300 h-px flex-grow max-w-xs\"></div>\n <p class=\"mx-4 text-sm font-medium text-gray-500\">This is the beginning of the message thread</p>\n <div class=\"bg-gray-300 h-px flex-grow max-w-xs\"></div>\n </div>\n </div>\n <li v-for=\"message in chatMessages\" :key=\"message._id\">\n <chat-message :message=\"message\" :target-dashboard-id=\"currentThread?.dashboardId\"></chat-message>\n </li>\n </ul>\n </div>\n\n\n <!-- Input Area -->\n <div class=\"border-t p-4\">\n <form @submit.prevent=\"sendMessage\" :disabled=\"sendingMessage\" class=\"flex gap-2 items-end justify-end\">\n <textarea\n v-model=\"newMessage\"\n :placeholder=\"sendingMessage ? 'Sending...' : 'Ask something...'\"\n class=\"flex-1 border rounded px-4 py-2 resize-none overflow-y-auto\"\n :disabled=\"sendingMessage\"\n rows=\"1\"\n ref=\"messageInput\"\n @input=\"adjustTextareaHeight\"\n @keydown.enter.exact.prevent=\"handleEnter\"\n ></textarea>\n <button class=\"bg-blue-600 text-white px-4 h-[42px] rounded disabled:bg-gray-600\" :disabled=\"sendingMessage\">\n <svg v-if=\"sendingMessage\" style=\"height: 1em\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" opacity=\"0.3\" />\n <path d=\"M12 2a10 10 0 0 1 10 10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 12 12\" to=\"360 12 12\" dur=\"1s\" repeatCount=\"indefinite\" />\n </path>\n </g>\n </svg>\n <span v-else>Send</span>\n </button>\n </form>\n </div>\n </main>\n</div>\n";
1056
1136
 
1057
- /***/ }),
1137
+ /***/ },
1058
1138
 
1059
- /***/ "./frontend/src/chat/chat.js":
1139
+ /***/ "./frontend/src/chat/chat.js"
1060
1140
  /*!***********************************!*\
1061
1141
  !*** ./frontend/src/chat/chat.js ***!
1062
1142
  \***********************************/
1063
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1143
+ (module, __unused_webpack_exports, __webpack_require__) {
1064
1144
 
1065
1145
  "use strict";
1066
1146
 
@@ -1253,35 +1333,35 @@ module.exports = app => app.component('chat', {
1253
1333
  });
1254
1334
 
1255
1335
 
1256
- /***/ }),
1336
+ /***/ },
1257
1337
 
1258
- /***/ "./frontend/src/clone-document/clone-document.css":
1338
+ /***/ "./frontend/src/clone-document/clone-document.css"
1259
1339
  /*!********************************************************!*\
1260
1340
  !*** ./frontend/src/clone-document/clone-document.css ***!
1261
1341
  \********************************************************/
1262
- /***/ ((module) => {
1342
+ (module) {
1263
1343
 
1264
1344
  "use strict";
1265
1345
  module.exports = "";
1266
1346
 
1267
- /***/ }),
1347
+ /***/ },
1268
1348
 
1269
- /***/ "./frontend/src/clone-document/clone-document.html":
1349
+ /***/ "./frontend/src/clone-document/clone-document.html"
1270
1350
  /*!*********************************************************!*\
1271
1351
  !*** ./frontend/src/clone-document/clone-document.html ***!
1272
1352
  \*********************************************************/
1273
- /***/ ((module) => {
1353
+ (module) {
1274
1354
 
1275
1355
  "use strict";
1276
1356
  module.exports = "<div>\n <div class=\"mb-2\">\n <textarea class=\"border border-gray-200 p-2 h-[300px] w-full\" ref=\"codeEditor\"></textarea>\n </div>\n <button @click=\"cloneDocument()\" class=\"rounded-md bg-ultramarine-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600\">Submit</button>\n <div v-if=\"errors.length > 0\" class=\"rounded-md bg-red-50 p-4 mt-1\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">There were {{errors.length}} errors with your submission</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n <ul role=\"list\" class=\"list-disc space-y-1 pl-5\">\n <li v-for=\"error in errors\">\n {{error}}\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n ";
1277
1357
 
1278
- /***/ }),
1358
+ /***/ },
1279
1359
 
1280
- /***/ "./frontend/src/clone-document/clone-document.js":
1360
+ /***/ "./frontend/src/clone-document/clone-document.js"
1281
1361
  /*!*******************************************************!*\
1282
1362
  !*** ./frontend/src/clone-document/clone-document.js ***!
1283
1363
  \*******************************************************/
1284
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1364
+ (module, __unused_webpack_exports, __webpack_require__) {
1285
1365
 
1286
1366
  "use strict";
1287
1367
 
@@ -1358,24 +1438,24 @@ module.exports = app => app.component('clone-document', {
1358
1438
  });
1359
1439
 
1360
1440
 
1361
- /***/ }),
1441
+ /***/ },
1362
1442
 
1363
- /***/ "./frontend/src/create-dashboard/create-dashboard.html":
1443
+ /***/ "./frontend/src/create-dashboard/create-dashboard.html"
1364
1444
  /*!*************************************************************!*\
1365
1445
  !*** ./frontend/src/create-dashboard/create-dashboard.html ***!
1366
1446
  \*************************************************************/
1367
- /***/ ((module) => {
1447
+ (module) {
1368
1448
 
1369
1449
  "use strict";
1370
1450
  module.exports = "<div>\n <div class=\"mt-4 text-gray-900 font-semibold\">\n Create New Dashboard\n </div>\n <div class=\"mt-4\">\n <label class=\"block text-sm font-medium leading-6 text-gray-900\">Title</label>\n <div class=\"mt-2\">\n <div class=\"w-full flex rounded-md shadow-sm ring-1 ring-inset ring-gray-300 focus-within:ring-2 focus-within:ring-inset focus-within:ring-teal-600\">\n <input type=\"text\" v-model=\"title\" class=\"outline-none block flex-1 border-0 bg-transparent py-1.5 pl-1 text-gray-900 placeholder:text-gray-400 focus:ring-0 sm:text-sm sm:leading-6\" placeholder=\"ACME-123\">\n </div>\n </div>\n </div>\n <div class=\"my-4\">\n <label class=\"block text-sm font-medium leading-6 text-gray-900\">Code</label>\n <div class=\"border border-gray-200\">\n <textarea class=\"p-2 h-[300px] w-full\" ref=\"codeEditor\"></textarea>\n </div>\n </div>\n <async-button\n @click=\"createDashboard()\"\n class=\"rounded-md bg-teal-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-teal-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600\">\n Submit\n </async-button>\n <div v-if=\"errors.length > 0\" class=\"rounded-md bg-red-50 p-4 mt-1\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">There were {{errors.length}} errors with your submission</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n <ul role=\"list\" class=\"list-disc space-y-1 pl-5\">\n <li v-for=\"error in errors\">\n {{error}}\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n</div>";
1371
1451
 
1372
- /***/ }),
1452
+ /***/ },
1373
1453
 
1374
- /***/ "./frontend/src/create-dashboard/create-dashboard.js":
1454
+ /***/ "./frontend/src/create-dashboard/create-dashboard.js"
1375
1455
  /*!***********************************************************!*\
1376
1456
  !*** ./frontend/src/create-dashboard/create-dashboard.js ***!
1377
1457
  \***********************************************************/
1378
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1458
+ (module, __unused_webpack_exports, __webpack_require__) {
1379
1459
 
1380
1460
  "use strict";
1381
1461
 
@@ -1419,35 +1499,35 @@ module.exports = app => app.component('create-dashboard', {
1419
1499
  }
1420
1500
  });
1421
1501
 
1422
- /***/ }),
1502
+ /***/ },
1423
1503
 
1424
- /***/ "./frontend/src/create-document/create-document.css":
1504
+ /***/ "./frontend/src/create-document/create-document.css"
1425
1505
  /*!**********************************************************!*\
1426
1506
  !*** ./frontend/src/create-document/create-document.css ***!
1427
1507
  \**********************************************************/
1428
- /***/ ((module) => {
1508
+ (module) {
1429
1509
 
1430
1510
  "use strict";
1431
1511
  module.exports = "";
1432
1512
 
1433
- /***/ }),
1513
+ /***/ },
1434
1514
 
1435
- /***/ "./frontend/src/create-document/create-document.html":
1515
+ /***/ "./frontend/src/create-document/create-document.html"
1436
1516
  /*!***********************************************************!*\
1437
1517
  !*** ./frontend/src/create-document/create-document.html ***!
1438
1518
  \***********************************************************/
1439
- /***/ ((module) => {
1519
+ (module) {
1440
1520
 
1441
1521
  "use strict";
1442
1522
  module.exports = "<div>\n <div class=\"mb-2\">\n <textarea class=\"border border-gray-200 p-2 h-[300px] w-full\" ref=\"codeEditor\"></textarea>\n </div>\n <button @click=\"createDocument()\" class=\"rounded-md bg-ultramarine-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600\">Submit</button>\n <div v-if=\"errors.length > 0\" class=\"rounded-md bg-red-50 p-4 mt-1\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">There were {{errors.length}} errors with your submission</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n <ul role=\"list\" class=\"list-disc space-y-1 pl-5\">\n <li v-for=\"error in errors\">\n {{error}}\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n</div>\n";
1443
1523
 
1444
- /***/ }),
1524
+ /***/ },
1445
1525
 
1446
- /***/ "./frontend/src/create-document/create-document.js":
1526
+ /***/ "./frontend/src/create-document/create-document.js"
1447
1527
  /*!*********************************************************!*\
1448
1528
  !*** ./frontend/src/create-document/create-document.js ***!
1449
1529
  \*********************************************************/
1450
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1530
+ (module, __unused_webpack_exports, __webpack_require__) {
1451
1531
 
1452
1532
  "use strict";
1453
1533
 
@@ -1514,24 +1594,24 @@ module.exports = app => app.component('create-document', {
1514
1594
  });
1515
1595
 
1516
1596
 
1517
- /***/ }),
1597
+ /***/ },
1518
1598
 
1519
- /***/ "./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.html":
1599
+ /***/ "./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.html"
1520
1600
  /*!****************************************************************************!*\
1521
1601
  !*** ./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.html ***!
1522
1602
  \****************************************************************************/
1523
- /***/ ((module) => {
1603
+ (module) {
1524
1604
 
1525
1605
  "use strict";
1526
1606
  module.exports = "<div :class=\"responsive ? 'h-full' : ''\">\n <div v-if=\"header && !fullscreen\" class=\"border-b border-gray-100 px-2 pb-2 flex items-center gap-1\">\n <div class=\"text-xl font-bold\">{{header}}</div>\n <button\n class=\"ml-auto px-2 py-1 text-xs bg-ultramarine-600 text-white border-none rounded cursor-pointer hover:bg-ultramarine-500 transition-colors\"\n @click=\"exportPNG\"\n title=\"Export PNG\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"height: 1.5em;\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"M280-280h400v-80H280v80Zm200-120 160-160-56-56-64 62v-166h-80v166l-64-62-56 56 160 160Zm0 320q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\"/></svg>\n </button>\n <button\n class=\"px-2 py-1 text-xs bg-ultramarine-600 text-white border-none rounded cursor-pointer hover:bg-ultramarine-500 transition-colors flex items-center\"\n @click=\"$emit('fullscreen')\"\n aria-label=\"Expand dashboard result\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"height: 1.5em\" class=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 1v4m0 0h-4m4 0l-5-5\" />\n </svg>\n </button>\n </div>\n <div v-else-if=\"!fullscreen\" class=\"pt-1 border-b border-gray-100 px-2 pb-2 text-right flex items-center justify-end gap-1 w-full\">\n <button\n class=\"px-2 py-1 text-xs bg-ultramarine-600 text-white border-none rounded cursor-pointer hover:bg-ultramarine-500 transition-colors\"\n @click=\"exportPNG\"\n title=\"Export PNG\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"height: 1.5em;\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"M280-280h400v-80H280v80Zm200-120 160-160-56-56-64 62v-166h-80v166l-64-62-56 56 160 160Zm0 320q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\"/></svg>\n </button>\n <button\n class=\"px-2 py-1 text-xs bg-ultramarine-600 text-white border-none rounded cursor-pointer hover:bg-ultramarine-500 transition-colors flex items-center\"\n @click=\"$emit('fullscreen')\"\n aria-label=\"Expand dashboard result\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"height: 1.5em\" class=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 1v4m0 0h-4m4 0l-5-5\" />\n </svg>\n </button>\n </div>\n <div :class=\"responsive ? 'relative h-full min-h-0' : ''\">\n <canvas ref=\"chart\" class=\"block w-full h-full\"></canvas>\n </div>\n</div>\n";
1527
1607
 
1528
- /***/ }),
1608
+ /***/ },
1529
1609
 
1530
- /***/ "./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.js":
1610
+ /***/ "./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.js"
1531
1611
  /*!**************************************************************************!*\
1532
1612
  !*** ./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.js ***!
1533
1613
  \**************************************************************************/
1534
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1614
+ (module, __unused_webpack_exports, __webpack_require__) {
1535
1615
 
1536
1616
  "use strict";
1537
1617
 
@@ -1575,24 +1655,24 @@ module.exports = app => app.component('dashboard-chart', {
1575
1655
  });
1576
1656
 
1577
1657
 
1578
- /***/ }),
1658
+ /***/ },
1579
1659
 
1580
- /***/ "./frontend/src/dashboard-result/dashboard-document/dashboard-document.html":
1660
+ /***/ "./frontend/src/dashboard-result/dashboard-document/dashboard-document.html"
1581
1661
  /*!**********************************************************************************!*\
1582
1662
  !*** ./frontend/src/dashboard-result/dashboard-document/dashboard-document.html ***!
1583
1663
  \**********************************************************************************/
1584
- /***/ ((module) => {
1664
+ (module) {
1585
1665
 
1586
1666
  "use strict";
1587
1667
  module.exports = "<div class=\"py-2\">\n <div v-if=\"header\" class=\"border-b border-gray-100 px-2 pb-2 text-xl font-bold\">\n {{header}}\n </div>\n <div class=\"text-xl pb-2\">\n <document-details :document=\"value.$document.document\" :schemaPaths=\"schemaPaths\" />\n </div>\n</div>";
1588
1668
 
1589
- /***/ }),
1669
+ /***/ },
1590
1670
 
1591
- /***/ "./frontend/src/dashboard-result/dashboard-document/dashboard-document.js":
1671
+ /***/ "./frontend/src/dashboard-result/dashboard-document/dashboard-document.js"
1592
1672
  /*!********************************************************************************!*\
1593
1673
  !*** ./frontend/src/dashboard-result/dashboard-document/dashboard-document.js ***!
1594
1674
  \********************************************************************************/
1595
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1675
+ (module, __unused_webpack_exports, __webpack_require__) {
1596
1676
 
1597
1677
  "use strict";
1598
1678
 
@@ -1626,24 +1706,24 @@ module.exports = app => app.component('dashboard-document', {
1626
1706
  });
1627
1707
 
1628
1708
 
1629
- /***/ }),
1709
+ /***/ },
1630
1710
 
1631
- /***/ "./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.html":
1711
+ /***/ "./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.html"
1632
1712
  /*!**************************************************************************!*\
1633
1713
  !*** ./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.html ***!
1634
1714
  \**************************************************************************/
1635
- /***/ ((module) => {
1715
+ (module) {
1636
1716
 
1637
1717
  "use strict";
1638
1718
  module.exports = "<div class=\"grid gap-2\" :style=\"{ gridTemplateColumns: gridTemplateColumns }\">\n <template v-for=\"(row, rowIndex) in value.$grid\" :key=\"rowIndex\">\n <dashboard-result\n v-for=\"(cell, colIndex) in row\"\n :key=\"rowIndex + '-' + colIndex\"\n :result=\"cell\">\n </dashboard-result>\n </template>\n</div>\n";
1639
1719
 
1640
- /***/ }),
1720
+ /***/ },
1641
1721
 
1642
- /***/ "./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.js":
1722
+ /***/ "./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.js"
1643
1723
  /*!************************************************************************!*\
1644
1724
  !*** ./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.js ***!
1645
1725
  \************************************************************************/
1646
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1726
+ (module, __unused_webpack_exports, __webpack_require__) {
1647
1727
 
1648
1728
  "use strict";
1649
1729
 
@@ -1668,24 +1748,24 @@ module.exports = app => app.component('dashboard-grid', {
1668
1748
  });
1669
1749
 
1670
1750
 
1671
- /***/ }),
1751
+ /***/ },
1672
1752
 
1673
- /***/ "./frontend/src/dashboard-result/dashboard-map/dashboard-map.html":
1753
+ /***/ "./frontend/src/dashboard-result/dashboard-map/dashboard-map.html"
1674
1754
  /*!************************************************************************!*\
1675
1755
  !*** ./frontend/src/dashboard-result/dashboard-map/dashboard-map.html ***!
1676
1756
  \************************************************************************/
1677
- /***/ ((module) => {
1757
+ (module) {
1678
1758
 
1679
1759
  "use strict";
1680
1760
  module.exports = "<div class=\"py-2 h-full flex flex-col\">\n <div v-if=\"header\" class=\"border-b border-gray-100 px-2 pb-2 text-xl font-bold\">\n {{header}}\n </div>\n <div class=\"text-xl flex-1 min-h-[200px]\">\n <div ref=\"map\" class=\"w-full h-full\" :style=\"mapStyle\"></div>\n </div>\n</div>\n";
1681
1761
 
1682
- /***/ }),
1762
+ /***/ },
1683
1763
 
1684
- /***/ "./frontend/src/dashboard-result/dashboard-map/dashboard-map.js":
1764
+ /***/ "./frontend/src/dashboard-result/dashboard-map/dashboard-map.js"
1685
1765
  /*!**********************************************************************!*\
1686
1766
  !*** ./frontend/src/dashboard-result/dashboard-map/dashboard-map.js ***!
1687
1767
  \**********************************************************************/
1688
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1768
+ (module, __unused_webpack_exports, __webpack_require__) {
1689
1769
 
1690
1770
  "use strict";
1691
1771
  /* global L */
@@ -1726,24 +1806,66 @@ module.exports = app => app.component('dashboard-map', {
1726
1806
  });
1727
1807
 
1728
1808
 
1729
- /***/ }),
1809
+ /***/ },
1810
+
1811
+ /***/ "./frontend/src/dashboard-result/dashboard-object/dashboard-object.html"
1812
+ /*!******************************************************************************!*\
1813
+ !*** ./frontend/src/dashboard-result/dashboard-object/dashboard-object.html ***!
1814
+ \******************************************************************************/
1815
+ (module) {
1816
+
1817
+ "use strict";
1818
+ module.exports = "<div class=\"py-2\">\n <div v-if=\"header\" class=\"border-b border-gray-100 px-2 pb-2 text-xl font-bold\">\n {{header}}\n </div>\n <pre class=\"text-sm p-2 whitespace-pre-wrap overflow-auto\"><code>{{formattedValue}}</code></pre>\n</div>\n";
1819
+
1820
+ /***/ },
1821
+
1822
+ /***/ "./frontend/src/dashboard-result/dashboard-object/dashboard-object.js"
1823
+ /*!****************************************************************************!*\
1824
+ !*** ./frontend/src/dashboard-result/dashboard-object/dashboard-object.js ***!
1825
+ \****************************************************************************/
1826
+ (module, __unused_webpack_exports, __webpack_require__) {
1827
+
1828
+ "use strict";
1829
+
1830
+
1831
+ const template = __webpack_require__(/*! ./dashboard-object.html */ "./frontend/src/dashboard-result/dashboard-object/dashboard-object.html");
1832
+
1833
+ module.exports = app => app.component('dashboard-object', {
1834
+ template: template,
1835
+ props: ['value'],
1836
+ computed: {
1837
+ header() {
1838
+ return this.value?.header || null;
1839
+ },
1840
+ formattedValue() {
1841
+ try {
1842
+ return JSON.stringify(this.value, null, 2);
1843
+ } catch (err) {
1844
+ return String(this.value);
1845
+ }
1846
+ }
1847
+ }
1848
+ });
1849
+
1850
+
1851
+ /***/ },
1730
1852
 
1731
- /***/ "./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.html":
1853
+ /***/ "./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.html"
1732
1854
  /*!************************************************************************************!*\
1733
1855
  !*** ./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.html ***!
1734
1856
  \************************************************************************************/
1735
- /***/ ((module) => {
1857
+ (module) {
1736
1858
 
1737
1859
  "use strict";
1738
1860
  module.exports = "<div class=\"py-2\">\n <div v-if=\"header\" class=\"border-b border-gray-100 px-2 pb-2 text-xl font-bold\">\n {{header}}\n </div>\n <div class=\"text-xl p-2\">\n {{displayValue}}\n </div>\n</div>";
1739
1861
 
1740
- /***/ }),
1862
+ /***/ },
1741
1863
 
1742
- /***/ "./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.js":
1864
+ /***/ "./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.js"
1743
1865
  /*!**********************************************************************************!*\
1744
1866
  !*** ./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.js ***!
1745
1867
  \**********************************************************************************/
1746
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1868
+ (module, __unused_webpack_exports, __webpack_require__) {
1747
1869
 
1748
1870
  "use strict";
1749
1871
 
@@ -1772,24 +1894,24 @@ module.exports = app => app.component('dashboard-primitive', {
1772
1894
  });
1773
1895
 
1774
1896
 
1775
- /***/ }),
1897
+ /***/ },
1776
1898
 
1777
- /***/ "./frontend/src/dashboard-result/dashboard-result.html":
1899
+ /***/ "./frontend/src/dashboard-result/dashboard-result.html"
1778
1900
  /*!*************************************************************!*\
1779
1901
  !*** ./frontend/src/dashboard-result/dashboard-result.html ***!
1780
1902
  \*************************************************************/
1781
- /***/ ((module) => {
1903
+ (module) {
1782
1904
 
1783
1905
  "use strict";
1784
1906
  module.exports = "<div>\n <div v-if=\"Array.isArray(result)\">\n <div v-for=\"el in result\" :key=\"el._id || el.finishedEvaluatingAt\">\n <component\n class=\"bg-white shadow-sm ring-1 ring-gray-900/5 sm:rounded-xl\"\n :is=\"getComponentForValue(el)\"\n :value=\"el\">\n </component>\n </div>\n </div>\n <div v-else>\n <component\n class=\"bg-white shadow-sm ring-1 ring-gray-900/5 sm:rounded-xl\"\n :is=\"getComponentForValue(result)\"\n :value=\"result\"\n :fullscreen=\"fullscreen\"\n @fullscreen=\"$emit('fullscreen')\">\n </component>\n </div>\n <div class=\"text-right text-sm text-gray-700 mt-1\" v-if=\"finishedEvaluatingAt && !fullscreen\">\n Last Evaluated: {{ format.isoToLongDateTime(finishedEvaluatingAt) }}\n </div>\n</div>\n";
1785
1907
 
1786
- /***/ }),
1908
+ /***/ },
1787
1909
 
1788
- /***/ "./frontend/src/dashboard-result/dashboard-result.js":
1910
+ /***/ "./frontend/src/dashboard-result/dashboard-result.js"
1789
1911
  /*!***********************************************************!*\
1790
1912
  !*** ./frontend/src/dashboard-result/dashboard-result.js ***!
1791
1913
  \***********************************************************/
1792
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1914
+ (module, __unused_webpack_exports, __webpack_require__) {
1793
1915
 
1794
1916
  "use strict";
1795
1917
 
@@ -1828,29 +1950,30 @@ module.exports = app => app.component('dashboard-result', {
1828
1950
  if (value.$grid) {
1829
1951
  return 'dashboard-grid';
1830
1952
  }
1953
+ return 'dashboard-object';
1831
1954
  }
1832
1955
  }
1833
1956
  });
1834
1957
 
1835
1958
 
1836
- /***/ }),
1959
+ /***/ },
1837
1960
 
1838
- /***/ "./frontend/src/dashboard-result/dashboard-text/dashboard-text.html":
1961
+ /***/ "./frontend/src/dashboard-result/dashboard-text/dashboard-text.html"
1839
1962
  /*!**************************************************************************!*\
1840
1963
  !*** ./frontend/src/dashboard-result/dashboard-text/dashboard-text.html ***!
1841
1964
  \**************************************************************************/
1842
- /***/ ((module) => {
1965
+ (module) {
1843
1966
 
1844
1967
  "use strict";
1845
1968
  module.exports = "<div class=\"py-2\">\n <div v-if=\"header\" class=\"border-b border-gray-100 px-2 pb-2 text-xl font-bold\">\n {{header}}\n </div>\n <div class=\"text-xl p-2\">\n <pre v-text=\"value.$text\"></pre>\n </div>\n</div>\n";
1846
1969
 
1847
- /***/ }),
1970
+ /***/ },
1848
1971
 
1849
- /***/ "./frontend/src/dashboard-result/dashboard-text/dashboard-text.js":
1972
+ /***/ "./frontend/src/dashboard-result/dashboard-text/dashboard-text.js"
1850
1973
  /*!************************************************************************!*\
1851
1974
  !*** ./frontend/src/dashboard-result/dashboard-text/dashboard-text.js ***!
1852
1975
  \************************************************************************/
1853
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1976
+ (module, __unused_webpack_exports, __webpack_require__) {
1854
1977
 
1855
1978
  "use strict";
1856
1979
 
@@ -1863,24 +1986,24 @@ module.exports = app => app.component('dashboard-text', {
1863
1986
  });
1864
1987
 
1865
1988
 
1866
- /***/ }),
1989
+ /***/ },
1867
1990
 
1868
- /***/ "./frontend/src/dashboard/dashboard.html":
1991
+ /***/ "./frontend/src/dashboard/dashboard.html"
1869
1992
  /*!***********************************************!*\
1870
1993
  !*** ./frontend/src/dashboard/dashboard.html ***!
1871
1994
  \***********************************************/
1872
- /***/ ((module) => {
1995
+ (module) {
1873
1996
 
1874
1997
  "use strict";
1875
1998
  module.exports = "<div class=\"dashboard px-1\">\n <div v-if=\"status === 'loading'\" class=\"max-w-5xl mx-auto text-center\">\n <img src=\"images/loader.gif\" class=\"inline mt-10\">\n </div>\n <div v-if=\"dashboard && status !== 'loading'\" class=\"max-w-5xl mx-auto\">\n <div class=\"flex items-center w-full\" v-if=\"!showEditor\">\n <h2 class=\"mt-4 mb-4 text-gray-900 font-semibold text-xl grow shrink\">{{title}}</h2>\n <div class=\"flex gap-2\">\n <button\n @click=\"showEditor = true\"\n type=\"button\"\n :disabled=\"status === 'evaluating'\"\n class=\"flex items-center rounded-md bg-ultramarine-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600 disabled:cursor-not-allowed disabled:bg-gray-600\">\n <img src=\"images/edit.svg\" class=\"inline h-[1.25em] mr-1\" /> Edit\n </button>\n\n <async-button\n @click=\"evaluateDashboard\"\n type=\"button\"\n :disabled=\"status === 'evaluating'\"\n class=\"flex items-center rounded-md bg-ultramarine-600 px-4 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600 disabled:cursor-not-allowed disabled:bg-gray-600\"\n >\n <svg class=\"inline h-[1.25em] mr-1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"m670-140 160-100-160-100v200ZM240-600h480v-80H240v80ZM720-40q-83 0-141.5-58.5T520-240q0-83 58.5-141.5T720-440q83 0 141.5 58.5T920-240q0 83-58.5 141.5T720-40ZM120-80v-680q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v267q-19-9-39-15t-41-9v-243H200v562h243q5 31 15.5 59T486-86l-6 6-60-60-60 60-60-60-60 60-60-60-60 60Zm120-200h203q3-21 9-41t15-39H240v80Zm0-160h284q38-37 88.5-58.5T720-520H240v80Zm-40 242v-562 562Z\"/></svg>\n Evaluate\n </async-button>\n <div class=\"relative\" ref=\"actionsMenu\">\n <button\n type=\"button\"\n @click.stop=\"toggleActionsMenu\"\n class=\"flex items-center rounded-md bg-gray-100 px-3 py-1.5 text-sm font-semibold text-gray-700 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-200 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-500\"\n aria-haspopup=\"true\"\n :aria-expanded=\"showActionsMenu\"\n >\n More\n <svg class=\"ml-1 h-4 w-4\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n <div\n v-if=\"showActionsMenu\"\n class=\"absolute right-0 mt-2 w-44 origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black/5 z-20\"\n role=\"menu\"\n aria-label=\"Dashboard actions\"\n >\n <button\n type=\"button\"\n :disabled=\"startingChat\"\n @click.stop=\"startChatWithDashboard\"\n class=\"flex w-full items-center gap-2 px-3 py-2 text-left text-sm text-gray-700 hover:bg-ultramarine-100 disabled:cursor-not-allowed disabled:text-gray-400\"\n role=\"menuitem\"\n >\n <svg class=\"h-4 w-4\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M8 10h.01M12 10h.01M16 10h.01m-8 4h8m-9 5 10-3.333L7 12.333 3 14l.667-4.333L9 7l4-3 4.333 2.667L21 11l-3 3.667V19a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-1z\" />\n </svg>\n Start Chat\n </button>\n </div>\n </div>\n </div>\n </div>\n <div v-if=\"!showEditor\" class=\"mt-4 mb-4\">\n <div v-if=\"dashboardResults.length === 0\">\n <div class=\"flex flex-col items-center justify-center py-8\">\n <p class=\"text-gray-700 text-base mb-4\">This dashboard hasn't been evaluated yet.</p>\n <async-button\n @click=\"evaluateDashboard\"\n type=\"button\"\n :disabled=\"status === 'evaluating'\"\n class=\"rounded-md bg-ultramarine-600 px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600 disabled:cursor-not-allowed disabled:bg-gray-600\"\n >\n Evaluate Dashboard\n </async-button>\n </div>\n </div>\n <div v-else-if=\"dashboardResult\">\n <div class=\"relative\">\n <div v-if=\"status === 'evaluating'\" class=\"absolute inset-0 flex items-center justify-center bg-white bg-opacity-60 z-10 flex flex-col gap-2\">\n <div>Evaluating Dashboard...</div>\n <img src=\"images/loader.gif\" class=\"h-12 w-12\" alt=\"Loading...\" />\n </div>\n <div v-else-if=\"dashboardResult.error\" class=\"rounded-md bg-red-50 p-4 mt-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">{{dashboardResult.error.message || 'Unknown Error'}}</h3>\n </div>\n </div>\n </div>\n <dashboard-result\n v-else\n :key=\"dashboardResult.finishedEvaluatingAt\"\n :result=\"dashboardResult.result\"\n :finishedEvaluatingAt=\"dashboardResult.finishedEvaluatingAt\"\n @fullscreen=\"showDetailModal = true\"\n class=\"h-[40vh]\"\n >\n </dashboard-result>\n </div>\n </div>\n </div>\n <div v-if=\"showEditor\" class=\"mt-4\">\n <edit-dashboard\n :dashboardId=\"dashboard._id\"\n :code=\"code\"\n :currentDescription=\"description\"\n :currentTitle=\"title\"\n @close=\"showEditor=false;\"\n @update=\"updateCode\"></edit-dashboard>\n </div>\n\n </div>\n <div v-if=\"!dashboard && status !== 'loading'\">\n No dashboard with the given id could be found.\n </div>\n</div>\n\n<modal\n v-if=\"showDetailModal\"\n containerClass=\"!h-[90vh] !w-[90vw]\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Dashboard Details\"\n>\n <template #body>\n <div class=\"absolute font-mono right-1 top-1 cursor-pointer text-xl\" @click=\"showDetailModal = false;\" role=\"button\" aria-label=\"Close modal\">&times;</div>\n <div class=\"h-full overflow-auto\">\n <dashboard-result\n v-if=\"dashboardResult\"\n :result=\"dashboardResult.result\"\n :finishedEvaluatingAt=\"dashboardResult.finishedEvaluatingAt\"\n :fullscreen=\"true\"\n :responsive=\"true\">\n </dashboard-result>\n </div>\n </template>\n</modal>\n";
1876
1999
 
1877
- /***/ }),
2000
+ /***/ },
1878
2001
 
1879
- /***/ "./frontend/src/dashboard/dashboard.js":
2002
+ /***/ "./frontend/src/dashboard/dashboard.js"
1880
2003
  /*!*********************************************!*\
1881
2004
  !*** ./frontend/src/dashboard/dashboard.js ***!
1882
2005
  \*********************************************/
1883
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2006
+ (module, __unused_webpack_exports, __webpack_require__) {
1884
2007
 
1885
2008
  "use strict";
1886
2009
 
@@ -2026,28 +2149,28 @@ module.exports = app => app.component('dashboard', {
2026
2149
  },
2027
2150
  beforeDestroy() {
2028
2151
  document.removeEventListener('click', this.handleDocumentClick);
2029
- },
2152
+ }
2030
2153
  });
2031
2154
 
2032
2155
 
2033
- /***/ }),
2156
+ /***/ },
2034
2157
 
2035
- /***/ "./frontend/src/dashboard/edit-dashboard/edit-dashboard.html":
2158
+ /***/ "./frontend/src/dashboard/edit-dashboard/edit-dashboard.html"
2036
2159
  /*!*******************************************************************!*\
2037
2160
  !*** ./frontend/src/dashboard/edit-dashboard/edit-dashboard.html ***!
2038
2161
  \*******************************************************************/
2039
- /***/ ((module) => {
2162
+ (module) {
2040
2163
 
2041
2164
  "use strict";
2042
2165
  module.exports = "<div class=\"p-4 bg-gray-100 rounded-lg shadow-lg\">\n <div v-show=\"status === 'loading'\" class=\"max-w-5xl mx-auto text-center\">\n <img src=\"images/loader.gif\" class=\"inline mt-10\">\n </div>\n <div v-show=\"status !== 'loading'\" class=\"flex flex-col gap-4\">\n <div>\n <input v-model=\"title\" class=\"w-full p-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\" placeholder=\"Title\"/>\n </div>\n <div>\n <textarea v-model=\"description\" class=\"w-full p-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\" rows=\"4\" placeholder=\"Description\">{{description}}</textarea>\n </div>\n <div class=\"border border-gray-300 rounded-md\">\n <textarea ref=\"codeEditor\" class=\"w-full p-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\" rows=\"6\">{{code}}</textarea>\n <textarea v-model=\"chatMessage\" class=\"w-full p-2\"></textarea>\n </div>\n <div class=\"flex space-x-2\">\n <async-button @click=\"updateCode\" class=\"px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500\">Submit</async-button>\n <button @click=\"closeEditor\" class=\"px-4 py-2 bg-gray-500 text-white rounded-md hover:bg-gray-600 focus:outline-none focus:ring-2 focus:ring-gray-500\">Cancel</button>\n </div>\n </div>\n</div>\n";
2043
2166
 
2044
- /***/ }),
2167
+ /***/ },
2045
2168
 
2046
- /***/ "./frontend/src/dashboard/edit-dashboard/edit-dashboard.js":
2169
+ /***/ "./frontend/src/dashboard/edit-dashboard/edit-dashboard.js"
2047
2170
  /*!*****************************************************************!*\
2048
2171
  !*** ./frontend/src/dashboard/edit-dashboard/edit-dashboard.js ***!
2049
2172
  \*****************************************************************/
2050
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2173
+ (module, __unused_webpack_exports, __webpack_require__) {
2051
2174
 
2052
2175
  "use strict";
2053
2176
 
@@ -2111,24 +2234,24 @@ module.exports = app => app.component('edit-dashboard', {
2111
2234
  });
2112
2235
 
2113
2236
 
2114
- /***/ }),
2237
+ /***/ },
2115
2238
 
2116
- /***/ "./frontend/src/dashboards/dashboards.html":
2239
+ /***/ "./frontend/src/dashboards/dashboards.html"
2117
2240
  /*!*************************************************!*\
2118
2241
  !*** ./frontend/src/dashboards/dashboards.html ***!
2119
2242
  \*************************************************/
2120
- /***/ ((module) => {
2243
+ (module) {
2121
2244
 
2122
2245
  "use strict";
2123
2246
  module.exports = "<div class=\"dashboards max-w-5xl mx-auto mt-8\">\n <div v-if=\"status === 'loading'\" class=\"text-center mt-4\">\n <svg\n class=\"inline w-8 h-8 animate-spin text-ultramarine-600\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n class=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"\n ></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z\"\n ></path>\n </svg>\n </div>\n <div v-if=\"status === 'loaded' && dashboards.length === 0\">\n <div class=\"text-center\">\n <h3 class=\"mt-2 text-sm font-semibold text-gray-900\">No dashboards yet</h3>\n <p class=\"mt-1 text-sm text-gray-500\">Get started by creating a new dashboard.</p>\n <div class=\"mt-6\">\n <button type=\"button\" class=\"inline-flex items-center rounded-md bg-ultramarine-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n <svg class=\"-ml-0.5 mr-1.5 h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z\" />\n </svg>\n New Dashboard\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"px-4 sm:px-6 lg:px-8\">\n <div class=\"sm:flex sm:items-center\">\n <div class=\"sm:flex-auto\">\n <h1 class=\"text-base font-semibold leading-6 text-gray-900\">Dashboards</h1>\n </div>\n <div class=\"mt-4 sm:ml-16 sm:mt-0 sm:flex-none\">\n <button\n type=\"button\"\n @click=\"showCreateDashboardModal = true\"\n class=\"block rounded-md bg-ultramarine-600 px-3 py-2 text-center text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">Create New Dashboard</button>\n </div>\n </div>\n <div class=\"mt-8 flow-root\">\n <div class=\"-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <table class=\"min-w-full divide-y divide-gray-300\">\n <thead>\n <tr>\n <th scope=\"col\" class=\"py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6 lg:pl-8\">Title</th>\n <th scope=\"col\" class=\"px-3 py-3.5 text-left text-sm font-semibold text-gray-900 w-[50%]\">Description</th>\n <th scope=\"col\" class=\"relative py-3.5 pl-3 pr-4 sm:pr-6 lg:pr-8\">\n </th>\n <th scope=\"col\" class=\"relative py-3.5 pl-3 pr-4 sm:pr-6 lg:pr-8\">\n </th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200 bg-white\">\n <tr v-for=\"dashboard in dashboards\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6 lg:pl-8\">{{dashboard.title}}</td>\n <td class=\"whitespace-nowrap px-3 py-4 text-sm text-gray-500 truncate w-[50%]\">{{dashboard.description}}</td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6 lg:pr-8\">\n <router-link\n :to=\"'/dashboard/' + dashboard._id + '?edit=true'\"\n class=\"text-ultramarine-600 hover:text-ultramarine-900\">\n Edit\n </router-link>\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6 lg:pr-8\">\n <router-link\n :to=\"'/dashboard/' + dashboard._id\"\n class=\"text-ultramarine-600 hover:text-ultramarine-900\">\n View\n </router-link>\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6 lg:pr-8\">\n <button\n @click=\"showDeleteDashboardModal=dashboard\"\n class=\"text-ultramarine-600 hover:text-ultramarine-900\">\n Delete\n </button>\n </td>\n </tr>\n\n <!-- More people... -->\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n\n <modal v-if=\"showCreateDashboardModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"showCreateDashboardModal = false;\">&times;</div>\n\n <create-dashboard @close=\"insertNewDashboard\"></create-dashboard>\n </template>\n </modal>\n\n <modal v-if=\"showDeleteDashboardModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"showDeleteDashboardModal = null;\">&times;</div>\n <h2>Are you sure you want to delete this dashboard titled {{showDeleteDashboardModal.title}}?</h2>\n <div class=\"flex space-x-2\">\n <button class=\"px-4 py-2 bg-red-500 text-white rounded-md hover:bg-red-600 focus:outline-none focus:ring-2 focus:ring-red-500\" @click=\"deleteDashboard(showDeleteDashboardModal)\">Yes, delete</button>\n <button class=\"px-4 py-2 bg-gray-500 text-white rounded-md hover:bg-gray-600 focus:outline-none focus:ring-2 focus:ring-gray-600\" @click=\"showDeleteDashboardModal=null;\">Cancel</button>\n </div>\n </template>\n </modal>\n </div>\n</div>";
2124
2247
 
2125
- /***/ }),
2248
+ /***/ },
2126
2249
 
2127
- /***/ "./frontend/src/dashboards/dashboards.js":
2250
+ /***/ "./frontend/src/dashboards/dashboards.js"
2128
2251
  /*!***********************************************!*\
2129
2252
  !*** ./frontend/src/dashboards/dashboards.js ***!
2130
2253
  \***********************************************/
2131
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2254
+ (module, __unused_webpack_exports, __webpack_require__) {
2132
2255
 
2133
2256
  "use strict";
2134
2257
 
@@ -2168,65 +2291,81 @@ module.exports = app => app.component('dashboards', {
2168
2291
  });
2169
2292
 
2170
2293
 
2171
- /***/ }),
2294
+ /***/ },
2172
2295
 
2173
- /***/ "./frontend/src/detail-array/detail-array.html":
2296
+ /***/ "./frontend/src/detail-array/detail-array.html"
2174
2297
  /*!*****************************************************!*\
2175
2298
  !*** ./frontend/src/detail-array/detail-array.html ***!
2176
2299
  \*****************************************************/
2177
- /***/ ((module) => {
2300
+ (module) {
2178
2301
 
2179
2302
  "use strict";
2180
- module.exports = "<div class=\"detail-array\">\n <pre><code ref=\"code\" class=\"language-javascript\" v-text=\"displayValue\"></code></pre>\n</div>";
2303
+ module.exports = "<div class=\"w-full\">\n <div v-if=\"!arrayValue || arrayValue.length === 0\" class=\"text-gray-400 text-xs py-2 text-center\">\n Empty array\n </div>\n\n <div v-else class=\"mt-2\">\n <div\n v-for=\"(item, index) in arrayValue\"\n :key=\"index\"\n :title=\"'Index: ' + index\"\n class=\"mb-1.5 last:mb-0 py-2.5 px-3 pl-4 bg-transparent border-l-[3px] border-l-blue-500 rounded-none transition-all duration-200 cursor-pointer relative hover:bg-slate-50 hover:border-l-blue-600 hover:shadow-lg hover:-translate-y-0.5\">\n <div class=\"absolute -left-3 top-1/2 -translate-y-1/2 w-5 h-5 bg-blue-500 text-white rounded-full flex items-center justify-center text-[10px] font-semibold font-mono z-10 hover:bg-blue-600\">{{ index >= 1000 ? '1k+' : index }}</div>\n <div v-if=\"arrayUtils.isObjectItem(item)\" class=\"flex flex-col gap-1 mt-1 px-2\">\n <div\n v-for=\"key in arrayUtils.getItemKeys(item)\"\n :key=\"key\"\n class=\"flex items-start gap-2 text-xs font-mono\">\n <span class=\"font-semibold text-gray-600 flex-shrink-0 min-w-[80px]\">{{ key }}:</span>\n <span class=\"text-gray-800 break-words whitespace-pre-wrap flex-1\">{{ arrayUtils.formatItemValue(item, key) }}</span>\n </div>\n </div>\n <div v-else class=\"text-xs py-1.5 px-2 font-mono text-gray-800 break-words whitespace-pre-wrap mt-1\">{{ arrayUtils.formatValue(item) }}</div>\n </div>\n </div>\n</div>\n";
2181
2304
 
2182
- /***/ }),
2305
+ /***/ },
2183
2306
 
2184
- /***/ "./frontend/src/detail-array/detail-array.js":
2307
+ /***/ "./frontend/src/detail-array/detail-array.js"
2185
2308
  /*!***************************************************!*\
2186
2309
  !*** ./frontend/src/detail-array/detail-array.js ***!
2187
2310
  \***************************************************/
2188
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2311
+ (module, __unused_webpack_exports, __webpack_require__) {
2189
2312
 
2190
2313
  "use strict";
2191
2314
 
2192
2315
 
2193
2316
  const template = __webpack_require__(/*! ./detail-array.html */ "./frontend/src/detail-array/detail-array.html");
2194
- const { inspect } = __webpack_require__(/*! node-inspect-extracted */ "./node_modules/node-inspect-extracted/dist/inspect.js");
2195
2317
 
2196
2318
  module.exports = app => app.component('detail-array', {
2197
2319
  template: template,
2198
2320
  props: ['value'],
2199
- computed: {
2200
- displayValue() {
2321
+ data() {
2322
+ return {
2323
+ arrayValue: []
2324
+ };
2325
+ },
2326
+ methods: {
2327
+ initializeArray() {
2201
2328
  if (this.value == null) {
2202
- return this.value;
2329
+ this.arrayValue = [];
2330
+ } else if (Array.isArray(this.value)) {
2331
+ this.arrayValue = this.value;
2332
+ } else {
2333
+ this.arrayValue = [];
2203
2334
  }
2204
- return inspect(this.value, { maxArrayLength: 50 });
2205
2335
  }
2206
2336
  },
2207
2337
  mounted() {
2208
- Prism.highlightElement(this.$refs.code);
2338
+ this.initializeArray();
2339
+ },
2340
+ watch: {
2341
+ value: {
2342
+ handler(newValue) {
2343
+ this.initializeArray();
2344
+ },
2345
+ deep: true,
2346
+ immediate: true
2347
+ }
2209
2348
  }
2210
2349
  });
2211
2350
 
2212
- /***/ }),
2351
+ /***/ },
2213
2352
 
2214
- /***/ "./frontend/src/detail-default/detail-default.html":
2353
+ /***/ "./frontend/src/detail-default/detail-default.html"
2215
2354
  /*!*********************************************************!*\
2216
2355
  !*** ./frontend/src/detail-default/detail-default.html ***!
2217
2356
  \*********************************************************/
2218
- /***/ ((module) => {
2357
+ (module) {
2219
2358
 
2220
2359
  "use strict";
2221
2360
  module.exports = "<div class=\"w-full\">\n <pre class=\"w-full whitespace-pre-wrap break-words font-mono text-sm text-gray-700 m-0\">{{displayValue}}</pre>\n</div>";
2222
2361
 
2223
- /***/ }),
2362
+ /***/ },
2224
2363
 
2225
- /***/ "./frontend/src/detail-default/detail-default.js":
2364
+ /***/ "./frontend/src/detail-default/detail-default.js"
2226
2365
  /*!*******************************************************!*\
2227
2366
  !*** ./frontend/src/detail-default/detail-default.js ***!
2228
2367
  \*******************************************************/
2229
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2368
+ (module, __unused_webpack_exports, __webpack_require__) {
2230
2369
 
2231
2370
  "use strict";
2232
2371
 
@@ -2258,35 +2397,35 @@ module.exports = app => app.component('detail-default', {
2258
2397
  }
2259
2398
  });
2260
2399
 
2261
- /***/ }),
2400
+ /***/ },
2262
2401
 
2263
- /***/ "./frontend/src/document-details/document-details.css":
2402
+ /***/ "./frontend/src/document-details/document-details.css"
2264
2403
  /*!************************************************************!*\
2265
2404
  !*** ./frontend/src/document-details/document-details.css ***!
2266
2405
  \************************************************************/
2267
- /***/ ((module) => {
2406
+ (module) {
2268
2407
 
2269
2408
  "use strict";
2270
2409
  module.exports = ".document-details {\n width: 100%;\n}\n\n.document-details .value {\n padding-top: 10px;\n padding-bottom: 10px;\n}\n\n.document-details .path-key {\n background-color: #f0f0f0;\n margin-bottom: 0.5em;\n}\n\n.document-details .path-type {\n color: rgba(0,0,0,.36);\n font-size: 0.8em;\n}\n\n.document-details .date-position {\n float: right;\n margin-top: -7px;\n}\n\n/* Add Field Modal Styles */\n.add-field-modal {\n max-width: 500px;\n width: 100%;\n}\n\n.add-field-modal .modal-exit {\n position: absolute;\n top: 15px;\n right: 20px;\n font-size: 24px;\n cursor: pointer;\n color: #6b7280;\n z-index: 10;\n}\n\n.add-field-modal .modal-exit:hover {\n color: #374151;\n}\n\n.add-field-modal form {\n max-height: 70vh;\n overflow-y: auto;\n}\n\n.add-field-modal input[type=\"text\"],\n.add-field-modal input[type=\"email\"],\n.add-field-modal input[type=\"password\"],\n.add-field-modal select,\n.add-field-modal textarea {\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n.add-field-modal input:focus,\n.add-field-modal select:focus,\n.add-field-modal textarea:focus {\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n}\n\n.add-field-modal .border-red-500 {\n border-color: #ef4444 !important;\n}\n\n.add-field-modal .border-red-500:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1) !important;\n}\n\n/* CodeMirror styling in modal */\n.add-field-modal .CodeMirror {\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 14px;\n height: auto;\n min-height: 100px;\n}\n\n.add-field-modal .CodeMirror:focus-within {\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n}\n\n.add-field-modal .CodeMirror.CodeMirror-focused {\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n}\n\n/* JSON View Styles */\n.json-view {\n width: 100%;\n}\n\n.json-view pre {\n margin: 0;\n max-height: 70vh;\n overflow: auto;\n line-height: 1.5;\n}\n\n.json-view pre::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.json-view pre::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 4px;\n}\n\n.json-view pre::-webkit-scrollbar-thumb {\n background: #888;\n border-radius: 4px;\n}\n\n.json-view pre::-webkit-scrollbar-thumb:hover {\n background: #555;\n}";
2271
2410
 
2272
- /***/ }),
2411
+ /***/ },
2273
2412
 
2274
- /***/ "./frontend/src/document-details/document-details.html":
2413
+ /***/ "./frontend/src/document-details/document-details.html"
2275
2414
  /*!*************************************************************!*\
2276
2415
  !*** ./frontend/src/document-details/document-details.html ***!
2277
2416
  \*************************************************************/
2278
- /***/ ((module) => {
2417
+ (module) {
2279
2418
 
2280
2419
  "use strict";
2281
- module.exports = "<div class=\"document-details\">\n <!-- View Toggle and Search/Filter Bar -->\n <div class=\"sticky top-[60px] z-40 bg-white p-4 border-b border-gray-200 shadow-sm\">\n\n <!-- Search and Filter Bar (only show in fields view) -->\n <div v-if=\"viewMode === 'fields'\" class=\"flex md:gap-3\">\n <!-- Search Bar -->\n <div class=\"relative flex-1\">\n <input\n ref=\"searchInput\"\n v-model=\"searchQuery\"\n type=\"text\"\n placeholder=\"Search fields...\"\n class=\"w-full px-4 py-2 pl-10 pr-4 text-sm border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n <div class=\"absolute inset-y-0 left-0 flex items-center pl-3\">\n <svg class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"></path>\n </svg>\n </div>\n </div>\n\n <!-- Data Type Filter -->\n <div class=\"relative hidden md:block\">\n <select\n v-model=\"selectedType\"\n class=\"px-4 py-2 pr-8 text-sm border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white min-w-[140px] appearance-none\"\n >\n <option value=\"\">All Types</option>\n <option v-for=\"type in availableTypes\" :key=\"type\" :value=\"type\">\n {{type}}\n </option>\n </select>\n <div class=\"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none\">\n <svg class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path>\n </svg>\n </div>\n </div>\n\n <!-- Add Field Button -->\n <button\n @click=\"openAddFieldModal\"\n class=\"hidden md:flex px-4 py-2 text-sm font-medium text-white bg-green-600 hover:bg-green-700 rounded-lg focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-offset-2 items-center gap-2\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v16m8-8H4\"></path>\n </svg> Add Field\n </button>\n </div>\n </div>\n\n <!-- Fields View -->\n <div v-if=\"viewMode === 'fields'\">\n <!-- Schema Paths -->\n <div\n v-for=\"path in filteredSchemaPaths\"\n :key=\"path.path || path\"\n class=\"value\"\n >\n <document-property\n :path=\"path\"\n :document=\"document\"\n :schemaPaths=\"schemaPaths\"\n :editting=\"editting\"\n :changes=\"changes\"\n :highlight=\"isSchemaPathMatched(path)\"\n :invalid=\"invalid\"></document-property>\n </div>\n\n <!-- Virtual Fields -->\n <div\n v-for=\"path in filteredVirtuals\"\n :key=\"path.name\"\n class=\"border rounded-lg mb-2 transition-all duration-200 ease-in-out\"\n :class=\"[\n isVirtualMatched(path)\n ? 'border-amber-400 ring-2 ring-amber-200 ring-offset-1'\n : 'border-gray-200'\n ]\"\n >\n <!-- Virtual Field Header (Always Visible) -->\n <div\n @click=\"toggleVirtualField(path.name)\"\n class=\"p-3 bg-slate-50 hover:bg-slate-100 cursor-pointer flex items-center justify-between border-b border-gray-200\"\n >\n <div class=\"flex items-center\">\n <svg\n :class=\"isVirtualFieldCollapsed(path.name) ? 'rotate-0' : 'rotate-90'\"\n class=\"w-4 h-4 text-gray-500 mr-2 transition-transform duration-200\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"></path>\n </svg>\n <span class=\"font-medium text-gray-900\">{{path.name}}</span>\n <span v-if=\"path.isVirtual\" class=\"ml-2 text-sm text-purple-600\">(virtual - {{getVirtualFieldType(path)}})</span>\n <span v-else class=\"ml-2 text-sm text-blue-600\">(user-added - {{getVirtualFieldType(path)}})</span>\n </div>\n </div>\n\n <!-- Virtual Field Content (Collapsible) -->\n <div v-if=\"!isVirtualFieldCollapsed(path.name)\" class=\"p-3\">\n <div v-if=\"path.value == null\" class=\"text-sky-800\">\n {{'' + path.value}}\n </div>\n <div v-else>\n {{path.value}}\n </div>\n </div>\n </div>\n\n <!-- No Results Message -->\n <div v-if=\"searchQuery.trim() && !hasSearchMatches\" class=\"text-center py-8 text-gray-500\">\n <svg class=\"w-12 h-12 mx-auto mb-4 text-gray-300\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9.172 16.172a4 4 0 015.656 0M9 12h6m-6-4h6m2 5.291A7.962 7.962 0 0112 15c-2.34 0-4.29-1.009-5.824-2.709M15 6.291A7.962 7.962 0 0012 5c-2.34 0-4.29 1.009-5.824 2.709\"></path>\n </svg>\n <p>No fields found matching \"{{searchQuery}}\"</p>\n </div>\n </div>\n\n <!-- JSON View -->\n <div v-if=\"viewMode === 'json'\" class=\"json-view\">\n <div class=\"border border-gray-300 rounded-lg bg-gray-50 p-4 overflow-auto\">\n <pre class=\"text-sm font-mono text-gray-800 whitespace-pre\">{{formattedJson}}</pre>\n </div>\n </div>\n\n <!-- Add Field Modal -->\n <modal v-if=\"showAddFieldModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"closeAddFieldModal\">&times;</div>\n <div class=\"add-field-modal\">\n <div class=\"mb-6\">\n <h2 class=\"text-xl font-semibold text-gray-900 mb-2\">Add New Field</h2>\n <p class=\"text-sm text-gray-600\">Create a new field for this document</p>\n </div>\n\n <form @submit.prevent=\"handleAddFieldSubmit\" class=\"space-y-4\">\n <!-- Field Name -->\n <div>\n <label for=\"fieldName\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Field Name *\n </label>\n <input\n id=\"fieldName\"\n v-model=\"fieldData.name\"\n type=\"text\"\n required\n placeholder=\"Enter field name...\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :class=\"{ 'border-red-500': fieldErrors.name }\"\n />\n <p v-if=\"fieldErrors.name\" class=\"mt-1 text-sm text-red-600\">{{fieldErrors.name}}</p>\n <p v-if=\"fieldData.name && getTransformedFieldName() !== fieldData.name.trim()\" class=\"mt-1 text-sm text-blue-600\">\n Field name will be: <code class=\"bg-blue-50 px-1 py-0.5 rounded text-xs\">{{getTransformedFieldName()}}</code>\n </p>\n </div>\n\n <!-- Field Type -->\n <div>\n <label for=\"fieldType\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Field Type *\n </label>\n <select\n id=\"fieldType\"\n v-model=\"fieldData.type\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :class=\"{ 'border-red-500': fieldErrors.type }\"\n >\n <option value=\"\">Select field type...</option>\n <option v-for=\"type in allFieldTypes\" :key=\"type\" :value=\"type\">\n {{type}}\n </option>\n </select>\n <p v-if=\"fieldErrors.type\" class=\"mt-1 text-sm text-red-600\">{{fieldErrors.type}}</p>\n </div>\n\n <!-- Field Value -->\n <div>\n <label for=\"fieldValue\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Initial Value\n </label>\n\n <!-- Date picker for Date type -->\n <input\n v-if=\"shouldUseDatePicker\"\n v-model=\"fieldData.value\"\n type=\"date\"\n id=\"fieldValue\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :class=\"{ 'border-red-500': fieldErrors.value }\"\n />\n\n <!-- Simple input for basic types -->\n <input\n v-else-if=\"!shouldUseCodeMirror\"\n v-model=\"fieldData.value\"\n type=\"text\"\n id=\"fieldValue\"\n placeholder=\"Enter initial value (optional)...\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :class=\"{ 'border-red-500': fieldErrors.value }\"\n />\n\n <!-- CodeMirror textarea for complex types -->\n <textarea\n v-else\n ref=\"fieldValueEditor\"\n id=\"fieldValue\"\n rows=\"3\"\n placeholder=\"Enter initial value (optional)...\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :class=\"{ 'border-red-500': fieldErrors.value }\"\n ></textarea>\n\n <p v-if=\"fieldErrors.value\" class=\"mt-1 text-sm text-red-600\">{{fieldErrors.value}}</p>\n <p class=\"mt-1 text-xs text-gray-500\">\n <span v-if=\"shouldUseDatePicker\">Select a date or leave empty for null/undefined values.</span>\n <span v-else-if=\"shouldUseCodeMirror\">Leave empty for null/undefined values. Use valid JSON format.</span>\n <span v-else>Leave empty for null/undefined values.</span>\n </p>\n </div>\n\n\n <!-- Action Buttons -->\n <div class=\"flex justify-end gap-3 pt-4 border-t border-gray-200\">\n <button\n type=\"button\"\n @click=\"closeAddFieldModal\"\n class=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n :disabled=\"isSubmittingField\"\n class=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n <span v-if=\"isSubmittingField\">Adding...</span>\n <span v-else>Add Field</span>\n </button>\n </div>\n </form>\n </div>\n </template>\n </modal>\n</div>\n";
2420
+ module.exports = "<div class=\"document-details\">\n <!-- View Toggle and Search/Filter Bar -->\n <div class=\"sticky top-[60px] z-40 bg-white p-4 border-b border-gray-200 shadow-sm\">\n\n <!-- Search and Filter Bar (only show in fields view) -->\n <div v-if=\"viewMode === 'fields'\" class=\"flex md:gap-3\">\n <!-- Search Bar -->\n <div class=\"relative flex-1\">\n <input\n ref=\"searchInput\"\n v-model=\"searchQuery\"\n type=\"text\"\n placeholder=\"Search fields...\"\n class=\"w-full px-4 py-2 pl-10 pr-4 text-sm border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n <div class=\"absolute inset-y-0 left-0 flex items-center pl-3\">\n <svg class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"></path>\n </svg>\n </div>\n </div>\n\n <!-- Data Type Filter -->\n <div class=\"relative hidden md:block\">\n <select\n v-model=\"selectedType\"\n class=\"px-4 py-2 pr-8 text-sm border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white min-w-[140px] appearance-none\"\n >\n <option value=\"\">All Types</option>\n <option v-for=\"type in availableTypes\" :key=\"type\" :value=\"type\">\n {{type}}\n </option>\n </select>\n <div class=\"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none\">\n <svg class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path>\n </svg>\n </div>\n </div>\n\n <!-- Add Field Button -->\n <button\n @click=\"openAddFieldModal\"\n class=\"hidden md:flex px-4 py-2 text-sm font-medium text-white bg-green-600 hover:bg-green-700 rounded-lg focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-offset-2 items-center gap-2\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v16m8-8H4\"></path>\n </svg> Add Field\n </button>\n </div>\n </div>\n\n <!-- Fields View -->\n <div v-if=\"viewMode === 'fields'\">\n <!-- Matched Schema Paths (shown first when searching) -->\n <div\n v-for=\"path in matchedSchemaPaths\"\n :key=\"path.path || path\"\n class=\"value\"\n >\n <document-property\n :path=\"path\"\n :document=\"document\"\n :schemaPaths=\"schemaPaths\"\n :editting=\"editting\"\n :changes=\"changes\"\n :highlight=\"true\"\n :invalid=\"invalid\"></document-property>\n </div>\n\n <!-- Matched Virtual Fields (shown after matched schema paths when searching) -->\n <div\n v-for=\"path in matchedVirtuals\"\n :key=\"path.name\"\n class=\"border border-gray-200 rounded-lg mb-2 transition-all duration-200 ease-in-out mt-4\"\n >\n <!-- Virtual Field Header (Always Visible) -->\n <div\n @click=\"toggleVirtualField(path.name)\"\n class=\"p-3 bg-amber-100 hover:bg-amber-200 cursor-pointer flex items-center justify-between border-b border-gray-200 transition-colors duration-200 ease-in-out\"\n >\n <div class=\"flex items-center\">\n <svg\n :class=\"isVirtualFieldCollapsed(path.name) ? 'rotate-0' : 'rotate-90'\"\n class=\"w-4 h-4 text-gray-500 mr-2 transition-transform duration-200\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"></path>\n </svg>\n <span class=\"font-medium text-gray-900\">{{path.name}}</span>\n <span v-if=\"path.isVirtual\" class=\"ml-2 text-sm text-purple-600\">(virtual - {{getVirtualFieldType(path)}})</span>\n <span v-else class=\"ml-2 text-sm text-blue-600\">(user-added - {{getVirtualFieldType(path)}})</span>\n </div>\n </div>\n\n <!-- Virtual Field Content (Collapsible) -->\n <div v-if=\"!isVirtualFieldCollapsed(path.name)\" class=\"p-3\">\n <div v-if=\"path.value == null\" class=\"text-sky-800\">\n {{'' + path.value}}\n </div>\n <div v-else>\n {{path.value}}\n </div>\n </div>\n </div>\n\n <!-- Unmatched Schema Paths (shown after matched items when searching, or all when not searching) -->\n <div\n v-for=\"path in unmatchedSchemaPaths\"\n :key=\"path.path || path\"\n class=\"value\"\n >\n <document-property\n :path=\"path\"\n :document=\"document\"\n :schemaPaths=\"schemaPaths\"\n :editting=\"editting\"\n :changes=\"changes\"\n :highlight=\"false\"\n :invalid=\"invalid\"></document-property>\n </div>\n\n <!-- Unmatched Virtual Fields (shown last) -->\n <div\n v-for=\"path in unmatchedVirtuals\"\n :key=\"path.name\"\n class=\"border border-gray-200 rounded-lg mb-2 transition-all duration-200 ease-in-out\"\n >\n <!-- Virtual Field Header (Always Visible) -->\n <div\n @click=\"toggleVirtualField(path.name)\"\n class=\"p-3 bg-gray-50 hover:bg-gray-100 cursor-pointer flex items-center justify-between border-b border-gray-200 transition-colors duration-200 ease-in-out\"\n >\n <div class=\"flex items-center\">\n <svg\n :class=\"isVirtualFieldCollapsed(path.name) ? 'rotate-0' : 'rotate-90'\"\n class=\"w-4 h-4 text-gray-500 mr-2 transition-transform duration-200\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"></path>\n </svg>\n <span class=\"font-medium text-gray-900\">{{path.name}}</span>\n <span v-if=\"path.isVirtual\" class=\"ml-2 text-sm text-purple-600\">(virtual - {{getVirtualFieldType(path)}})</span>\n <span v-else class=\"ml-2 text-sm text-blue-600\">(user-added - {{getVirtualFieldType(path)}})</span>\n </div>\n </div>\n\n <!-- Virtual Field Content (Collapsible) -->\n <div v-if=\"!isVirtualFieldCollapsed(path.name)\" class=\"p-3\">\n <div v-if=\"path.value == null\" class=\"text-sky-800\">\n {{'' + path.value}}\n </div>\n <div v-else>\n {{path.value}}\n </div>\n </div>\n </div>\n\n <!-- No Results Message -->\n <div v-if=\"searchQuery.trim() && !hasSearchMatches\" class=\"text-center py-8 text-gray-500\">\n <svg class=\"w-12 h-12 mx-auto mb-4 text-gray-300\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9.172 16.172a4 4 0 015.656 0M9 12h6m-6-4h6m2 5.291A7.962 7.962 0 0112 15c-2.34 0-4.29-1.009-5.824-2.709M15 6.291A7.962 7.962 0 0012 5c-2.34 0-4.29 1.009-5.824 2.709\"></path>\n </svg>\n <p>No fields found matching \"{{searchQuery}}\"</p>\n </div>\n </div>\n\n <!-- JSON View -->\n <div v-if=\"viewMode === 'json'\" class=\"json-view\">\n <div class=\"border border-gray-300 rounded-lg bg-gray-50 p-4 overflow-auto\">\n <pre class=\"text-sm font-mono text-gray-800 whitespace-pre\">{{formattedJson}}</pre>\n </div>\n </div>\n\n <!-- Add Field Modal -->\n <modal v-if=\"showAddFieldModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"closeAddFieldModal\">&times;</div>\n <div class=\"add-field-modal\">\n <div class=\"mb-6\">\n <h2 class=\"text-xl font-semibold text-gray-900 mb-2\">Add New Field</h2>\n <p class=\"text-sm text-gray-600\">Create a new field for this document</p>\n </div>\n\n <form @submit.prevent=\"handleAddFieldSubmit\" class=\"space-y-4\">\n <!-- Field Name -->\n <div>\n <label for=\"fieldName\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Field Name *\n </label>\n <input\n id=\"fieldName\"\n v-model=\"fieldData.name\"\n type=\"text\"\n required\n placeholder=\"Enter field name...\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :class=\"{ 'border-red-500': fieldErrors.name }\"\n />\n <p v-if=\"fieldErrors.name\" class=\"mt-1 text-sm text-red-600\">{{fieldErrors.name}}</p>\n <p v-if=\"fieldData.name && getTransformedFieldName() !== fieldData.name.trim()\" class=\"mt-1 text-sm text-blue-600\">\n Field name will be: <code class=\"bg-blue-50 px-1 py-0.5 rounded text-xs\">{{getTransformedFieldName()}}</code>\n </p>\n </div>\n\n <!-- Field Type -->\n <div>\n <label for=\"fieldType\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Field Type *\n </label>\n <select\n id=\"fieldType\"\n v-model=\"fieldData.type\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :class=\"{ 'border-red-500': fieldErrors.type }\"\n >\n <option value=\"\">Select field type...</option>\n <option v-for=\"type in allFieldTypes\" :key=\"type\" :value=\"type\">\n {{type}}\n </option>\n </select>\n <p v-if=\"fieldErrors.type\" class=\"mt-1 text-sm text-red-600\">{{fieldErrors.type}}</p>\n </div>\n\n <!-- Field Value -->\n <div>\n <label for=\"fieldValue\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Initial Value\n </label>\n\n <!-- Date picker for Date type -->\n <input\n v-if=\"shouldUseDatePicker\"\n v-model=\"fieldData.value\"\n type=\"date\"\n id=\"fieldValue\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :class=\"{ 'border-red-500': fieldErrors.value }\"\n />\n\n <!-- Simple input for basic types -->\n <input\n v-else-if=\"!shouldUseCodeMirror\"\n v-model=\"fieldData.value\"\n type=\"text\"\n id=\"fieldValue\"\n placeholder=\"Enter initial value (optional)...\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :class=\"{ 'border-red-500': fieldErrors.value }\"\n />\n\n <!-- CodeMirror textarea for complex types -->\n <textarea\n v-else\n ref=\"fieldValueEditor\"\n id=\"fieldValue\"\n rows=\"3\"\n placeholder=\"Enter initial value (optional)...\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :class=\"{ 'border-red-500': fieldErrors.value }\"\n ></textarea>\n\n <p v-if=\"fieldErrors.value\" class=\"mt-1 text-sm text-red-600\">{{fieldErrors.value}}</p>\n <p class=\"mt-1 text-xs text-gray-500\">\n <span v-if=\"shouldUseDatePicker\">Select a date or leave empty for null/undefined values.</span>\n <span v-else-if=\"shouldUseCodeMirror\">Leave empty for null/undefined values. Use valid JSON format.</span>\n <span v-else>Leave empty for null/undefined values.</span>\n </p>\n </div>\n\n\n <!-- Action Buttons -->\n <div class=\"flex justify-end gap-3 pt-4 border-t border-gray-200\">\n <button\n type=\"button\"\n @click=\"closeAddFieldModal\"\n class=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n :disabled=\"isSubmittingField\"\n class=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n <span v-if=\"isSubmittingField\">Adding...</span>\n <span v-else>Add Field</span>\n </button>\n </div>\n </form>\n </div>\n </template>\n </modal>\n</div>\n";
2282
2421
 
2283
- /***/ }),
2422
+ /***/ },
2284
2423
 
2285
- /***/ "./frontend/src/document-details/document-details.js":
2424
+ /***/ "./frontend/src/document-details/document-details.js"
2286
2425
  /*!***********************************************************!*\
2287
2426
  !*** ./frontend/src/document-details/document-details.js ***!
2288
2427
  \***********************************************************/
2289
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2428
+ (module, __unused_webpack_exports, __webpack_require__) {
2290
2429
 
2291
2430
  "use strict";
2292
2431
 
@@ -2436,6 +2575,20 @@ module.exports = app => app.component('document-details', {
2436
2575
 
2437
2576
  return matches.concat(nonMatches);
2438
2577
  },
2578
+ matchedSchemaPaths() {
2579
+ if (!this.searchQuery.trim()) {
2580
+ return [];
2581
+ }
2582
+ const query = this.searchQuery.toLowerCase();
2583
+ return this.typeFilteredSchemaPaths.filter(path => path.path.toLowerCase().includes(query));
2584
+ },
2585
+ unmatchedSchemaPaths() {
2586
+ if (!this.searchQuery.trim()) {
2587
+ return this.typeFilteredSchemaPaths;
2588
+ }
2589
+ const query = this.searchQuery.toLowerCase();
2590
+ return this.typeFilteredSchemaPaths.filter(path => !path.path.toLowerCase().includes(query));
2591
+ },
2439
2592
  typeFilteredVirtuals() {
2440
2593
  let virtuals = this.virtuals;
2441
2594
 
@@ -2469,6 +2622,20 @@ module.exports = app => app.component('document-details', {
2469
2622
 
2470
2623
  return matches.concat(nonMatches);
2471
2624
  },
2625
+ matchedVirtuals() {
2626
+ if (!this.searchQuery.trim()) {
2627
+ return [];
2628
+ }
2629
+ const query = this.searchQuery.toLowerCase();
2630
+ return this.typeFilteredVirtuals.filter(virtual => virtual.name.toLowerCase().includes(query));
2631
+ },
2632
+ unmatchedVirtuals() {
2633
+ if (!this.searchQuery.trim()) {
2634
+ return this.typeFilteredVirtuals;
2635
+ }
2636
+ const query = this.searchQuery.toLowerCase();
2637
+ return this.typeFilteredVirtuals.filter(virtual => !virtual.name.toLowerCase().includes(query));
2638
+ },
2472
2639
  schemaSearchMatchSet() {
2473
2640
  if (!this.searchQuery.trim()) {
2474
2641
  return new Set();
@@ -2716,35 +2883,35 @@ module.exports = app => app.component('document-details', {
2716
2883
  });
2717
2884
 
2718
2885
 
2719
- /***/ }),
2886
+ /***/ },
2720
2887
 
2721
- /***/ "./frontend/src/document-details/document-property/document-property.css":
2888
+ /***/ "./frontend/src/document-details/document-property/document-property.css"
2722
2889
  /*!*******************************************************************************!*\
2723
2890
  !*** ./frontend/src/document-details/document-property/document-property.css ***!
2724
2891
  \*******************************************************************************/
2725
- /***/ ((module) => {
2892
+ (module) {
2726
2893
 
2727
2894
  "use strict";
2728
2895
  module.exports = ".document-details {\n width: 100%;\n }\n \n .document-details .value {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n \n .document-details .path-key {\n background-color: #f0f0f0;\n margin-bottom: 0.5em;\n }\n \n .document-details .path-type {\n color: rgba(0,0,0,.36);\n font-size: 0.8em;\n }\n \n .document-details .date-position {\n float: right;\n margin-top: -7px;\n }\n";
2729
2896
 
2730
- /***/ }),
2897
+ /***/ },
2731
2898
 
2732
- /***/ "./frontend/src/document-details/document-property/document-property.html":
2899
+ /***/ "./frontend/src/document-details/document-property/document-property.html"
2733
2900
  /*!********************************************************************************!*\
2734
2901
  !*** ./frontend/src/document-details/document-property/document-property.html ***!
2735
2902
  \********************************************************************************/
2736
- /***/ ((module) => {
2903
+ (module) {
2737
2904
 
2738
2905
  "use strict";
2739
- module.exports = "<div class=\"border border-gray-200 rounded-lg mb-2\">\n <!-- Collapsible Header -->\n <div\n @click=\"toggleCollapse\"\n class=\"p-3 hover:bg-gray-100 cursor-pointer flex items-center justify-between border-b border-gray-200 transition-colors duration-200 ease-in-out\"\n :class=\"{ 'bg-amber-100': highlight, 'bg-gray-50': !highlight }\"\n >\n <div class=\"flex items-center\" >\n <svg\n :class=\"isCollapsed ? 'rotate-0' : 'rotate-90'\"\n class=\"w-4 h-4 text-gray-500 mr-2 transition-transform duration-200\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"></path>\n </svg>\n <span class=\"font-medium text-gray-900\">{{path.path}}</span>\n <span class=\"ml-2 text-sm text-gray-500\">({{(path.instance || 'unknown').toLowerCase()}})</span>\n </div>\n <div class=\"flex items-center gap-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-1 text-sm text-gray-600 hover:text-gray-800 px-2 py-1 rounded-md border border-transparent hover:border-gray-300 bg-white\"\n @click.stop.prevent=\"copyPropertyValue\"\n title=\"Copy value\"\n aria-label=\"Copy property value\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 7h8m-8 4h8m-8 4h5m-7-9a2 2 0 012-2h7a2 2 0 012 2v10a2 2 0 01-2 2H8l-4-4V7a2 2 0 012-2z\" />\n </svg>\n {{copyButtonLabel}}\n </button>\n <router-link\n v-if=\"path.ref && getValueForPath(path.path)\"\n :to=\"`/model/${path.ref}/document/${getValueForPath(path.path)}`\"\n class=\"bg-ultramarine-600 hover:bg-ultramarine-500 text-white px-2 py-1 text-sm rounded-md\"\n @click.stop\n >View Document\n </router-link>\n </div>\n </div>\n\n <!-- Collapsible Content -->\n <div v-if=\"!isCollapsed\" class=\"p-3\">\n <!-- Date Type Selector (when editing dates) -->\n <div v-if=\"editting && path.instance === 'Date'\" class=\"mb-3 flex gap-1.5\">\n <div\n @click=\"dateType = 'picker'\"\n :class=\"dateType === 'picker' ? 'bg-teal-600' : ''\"\n class=\"self-stretch px-2 py-1 rounded-sm justify-center items-center gap-1.5 flex cursor-pointer\">\n <div\n :class=\"dateType === 'picker' ? 'text-white' : ''\"\n class=\"text-xs font-medium font-['Lato'] capitalize leading-tight\">\n Date Picker\n </div>\n </div>\n <div\n @click=\"dateType = 'iso'\"\n :class=\"dateType === 'iso' ? 'bg-teal-600' : ''\"\n class=\"self-stretch px-2 py-1 rounded-sm justify-center items-center gap-1.5 flex cursor-pointer\">\n <div\n :class=\"dateType === 'iso' ? 'text-white' : ''\"\n class=\"text-xs font-medium font-['Lato'] capitalize leading-tight\">\n ISO String\n </div>\n </div>\n </div>\n\n <!-- Field Content -->\n <div v-if=\"editting && path.path !== '_id'\">\n <component\n :is=\"getEditComponentForPath(path)\"\n :value=\"getEditValueForPath(path)\"\n :format=\"dateType\"\n v-bind=\"getEditComponentProps(path)\"\n @input=\"changes[path.path] = $event; delete invalid[path.path];\"\n @error=\"invalid[path.path] = $event;\"\n >\n </component>\n </div>\n <div v-else>\n <!-- Show truncated or full value based on needsTruncation and isValueExpanded -->\n <div v-if=\"needsTruncation && !isValueExpanded\" class=\"relative\">\n <div class=\"text-gray-700 whitespace-pre-wrap break-words font-mono text-sm\">{{truncatedString}}</div>\n <button\n @click=\"toggleValueExpansion\"\n class=\"mt-2 text-blue-600 hover:text-blue-800 text-sm font-medium flex items-center gap-1 transform transition-all duration-200 ease-in-out hover:translate-x-0.5\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path>\n </svg>\n Show more ({{valueAsString.length}} characters)\n </button>\n </div>\n <div v-else-if=\"needsTruncation && isValueExpanded\" class=\"relative\">\n <component :is=\"getComponentForPath(path)\" :value=\"getValueForPath(path.path)\"></component>\n <button\n @click=\"toggleValueExpansion\"\n class=\"mt-2 text-blue-600 hover:text-blue-800 text-sm font-medium flex items-center gap-1 transform transition-all duration-200 ease-in-out hover:translate-x-0.5\"\n >\n <svg class=\"w-4 h-4 rotate-180\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path>\n </svg>\n Show less\n </button>\n </div>\n <div v-else>\n <component :is=\"getComponentForPath(path)\" :value=\"getValueForPath(path.path)\"></component>\n </div>\n </div>\n </div>\n</div>\n";
2906
+ module.exports = "<div class=\"border border-gray-200 rounded-lg mb-2\">\n <!-- Collapsible Header -->\n <div\n @click=\"toggleCollapse\"\n class=\"p-3 cursor-pointer flex items-center justify-between border-b border-gray-200 transition-colors duration-200 ease-in-out\"\n :class=\"{ 'bg-amber-100 hover:bg-amber-200': highlight, 'bg-gray-50 hover:bg-gray-100': !highlight }\"\n >\n <div class=\"flex items-center\" >\n <svg\n :class=\"isCollapsed ? 'rotate-0' : 'rotate-90'\"\n class=\"w-4 h-4 text-gray-500 mr-2 transition-transform duration-200\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"></path>\n </svg>\n <span class=\"font-medium text-gray-900\">{{path.path}}</span>\n <span class=\"ml-2 text-sm text-gray-500\">({{(path.instance || 'unknown').toLowerCase()}})</span>\n </div>\n <div class=\"flex items-center gap-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-1 text-sm text-gray-600 hover:text-gray-800 px-2 py-1 rounded-md border border-transparent hover:border-gray-300 bg-white\"\n @click.stop.prevent=\"copyPropertyValue\"\n title=\"Copy value\"\n aria-label=\"Copy property value\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 7h8m-8 4h8m-8 4h5m-7-9a2 2 0 012-2h7a2 2 0 012 2v10a2 2 0 01-2 2H8l-4-4V7a2 2 0 012-2z\" />\n </svg>\n {{copyButtonLabel}}\n </button>\n <router-link\n v-if=\"path.ref && getValueForPath(path.path)\"\n :to=\"`/model/${path.ref}/document/${getValueForPath(path.path)}`\"\n class=\"bg-ultramarine-600 hover:bg-ultramarine-500 text-white px-2 py-1 text-sm rounded-md\"\n @click.stop\n >View Document\n </router-link>\n </div>\n </div>\n\n <!-- Collapsible Content -->\n <div v-if=\"!isCollapsed\" class=\"p-3\">\n <!-- Date Type Selector (when editing dates) -->\n <div v-if=\"editting && path.instance === 'Date'\" class=\"mb-3 flex gap-1.5\">\n <div\n @click=\"dateType = 'picker'\"\n :class=\"dateType === 'picker' ? 'bg-teal-600' : ''\"\n class=\"self-stretch px-2 py-1 rounded-sm justify-center items-center gap-1.5 flex cursor-pointer\">\n <div\n :class=\"dateType === 'picker' ? 'text-white' : ''\"\n class=\"text-xs font-medium font-['Lato'] capitalize leading-tight\">\n Date Picker\n </div>\n </div>\n <div\n @click=\"dateType = 'iso'\"\n :class=\"dateType === 'iso' ? 'bg-teal-600' : ''\"\n class=\"self-stretch px-2 py-1 rounded-sm justify-center items-center gap-1.5 flex cursor-pointer\">\n <div\n :class=\"dateType === 'iso' ? 'text-white' : ''\"\n class=\"text-xs font-medium font-['Lato'] capitalize leading-tight\">\n ISO String\n </div>\n </div>\n </div>\n\n <!-- Field Content -->\n <div v-if=\"editting && path.path !== '_id'\">\n <component\n :is=\"getEditComponentForPath(path)\"\n :value=\"getEditValueForPath(path)\"\n :format=\"dateType\"\n v-bind=\"getEditComponentProps(path)\"\n @input=\"changes[path.path] = $event; delete invalid[path.path];\"\n @error=\"invalid[path.path] = $event;\"\n >\n </component>\n </div>\n <div v-else>\n <!-- Show truncated or full value based on needsTruncation and isValueExpanded -->\n <!-- Special handling for truncated arrays -->\n <div v-if=\"isArray && shouldShowTruncated\" class=\"w-full\">\n <div class=\"mt-2\">\n <div\n v-for=\"(item, index) in truncatedArrayItems\"\n :key=\"index\"\n class=\"mb-1.5 py-2.5 px-3 pl-4 bg-transparent border-l-[3px] border-l-blue-500 rounded-none transition-all duration-200 cursor-pointer relative hover:bg-slate-50 hover:border-l-blue-600\">\n <div class=\"absolute -left-2 top-1/2 -translate-y-1/2 w-5 h-5 bg-blue-500 text-white rounded-full flex items-center justify-center text-[10px] font-semibold font-mono z-10 hover:bg-blue-600\">{{ index }}</div>\n <div v-if=\"arrayUtils.isObjectItem(item)\" class=\"flex flex-col gap-1 mt-1 px-2\">\n <div\n v-for=\"key in arrayUtils.getItemKeys(item)\"\n :key=\"key\"\n class=\"flex items-start gap-2 text-xs font-mono\">\n <span class=\"font-semibold text-gray-600 flex-shrink-0 min-w-[80px]\">{{ key }}:</span>\n <span class=\"text-gray-800 break-words whitespace-pre-wrap flex-1\">{{ arrayUtils.formatItemValue(item, key) }}</span>\n </div>\n </div>\n <div v-else class=\"text-xs py-1.5 px-2 font-mono text-gray-800 break-words whitespace-pre-wrap mt-1\">{{ arrayUtils.formatValue(item) }}</div>\n </div>\n <div class=\"mb-1.5 py-2.5 px-3 pl-4 bg-transparent border-none border-l-[3px] border-l-blue-500 rounded-none transition-all duration-200 cursor-pointer relative opacity-70 hover:opacity-100\">\n <div class=\"text-xs py-1.5 px-2 font-mono text-gray-500 italic break-words whitespace-pre-wrap mt-1\">\n ... and {{ remainingArrayCount }} more item{{ remainingArrayCount !== 1 ? 's' : '' }}\n </div>\n </div>\n </div>\n <button\n @click=\"toggleValueExpansion\"\n class=\"mt-2 text-blue-600 hover:text-blue-800 text-sm font-medium flex items-center gap-1 transform transition-all duration-200 ease-in-out hover:translate-x-0.5\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path>\n </svg>\n Show all {{ arrayValue.length }} items\n </button>\n </div>\n <!-- Non-array truncated view -->\n <div v-else-if=\"shouldShowTruncated && !isArray\" class=\"relative\">\n <div class=\"text-gray-700 whitespace-pre-wrap break-words font-mono text-sm\">{{truncatedString}}</div>\n <button\n @click=\"toggleValueExpansion\"\n class=\"mt-2 text-blue-600 hover:text-blue-800 text-sm font-medium flex items-center gap-1 transform transition-all duration-200 ease-in-out hover:translate-x-0.5\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path>\n </svg>\n Show more ({{valueAsString.length}} characters)\n </button>\n </div>\n <!-- Expanded view -->\n <div v-else-if=\"needsTruncation && isValueExpanded\" class=\"relative\">\n <component :is=\"getComponentForPath(path)\" :value=\"getValueForPath(path.path)\"></component>\n <button\n @click=\"toggleValueExpansion\"\n class=\"mt-2 text-blue-600 hover:text-blue-800 text-sm font-medium flex items-center gap-1 transform transition-all duration-200 ease-in-out hover:translate-x-0.5\"\n >\n <svg class=\"w-4 h-4 rotate-180\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path>\n </svg>\n Show less\n </button>\n </div>\n <!-- Full view (no truncation needed) -->\n <div v-else>\n <component :is=\"getComponentForPath(path)\" :value=\"getValueForPath(path.path)\"></component>\n </div>\n </div>\n </div>\n</div>\n";
2740
2907
 
2741
- /***/ }),
2908
+ /***/ },
2742
2909
 
2743
- /***/ "./frontend/src/document-details/document-property/document-property.js":
2910
+ /***/ "./frontend/src/document-details/document-property/document-property.js"
2744
2911
  /*!******************************************************************************!*\
2745
2912
  !*** ./frontend/src/document-details/document-property/document-property.js ***!
2746
2913
  \******************************************************************************/
2747
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2914
+ (module, __unused_webpack_exports, __webpack_require__) {
2748
2915
 
2749
2916
  "use strict";
2750
2917
  /* global clearTimeout setTimeout */
@@ -2752,6 +2919,7 @@ module.exports = "<div class=\"border border-gray-200 rounded-lg mb-2\">\n <!--
2752
2919
 
2753
2920
 
2754
2921
  const mpath = __webpack_require__(/*! mpath */ "./node_modules/mpath/index.js");
2922
+ const { inspect } = __webpack_require__(/*! node-inspect-extracted */ "./node_modules/node-inspect-extracted/dist/inspect.js");
2755
2923
  const template = __webpack_require__(/*! ./document-property.html */ "./frontend/src/document-details/document-property/document-property.html");
2756
2924
 
2757
2925
  const appendCSS = __webpack_require__(/*! ../../appendCSS */ "./frontend/src/appendCSS.js");
@@ -2787,10 +2955,32 @@ module.exports = app => app.component('document-property', {
2787
2955
  }
2788
2956
  return String(value);
2789
2957
  },
2958
+ _arrayValueData() {
2959
+ const value = this.getValueForPath(this.path.path);
2960
+ return {
2961
+ value: Array.isArray(value) ? value : [],
2962
+ isArray: Array.isArray(value)
2963
+ };
2964
+ },
2965
+ isArray() {
2966
+ return this._arrayValueData.isArray;
2967
+ },
2968
+ arrayValue() {
2969
+ return this._arrayValueData.value;
2970
+ },
2790
2971
  needsTruncation() {
2791
- // Truncate if value is longer than 200 characters
2972
+ // For arrays, check if it has more than 3 items (regardless of expansion state)
2973
+ if (this.isArray) {
2974
+ const arr = this.arrayValue;
2975
+ return arr && arr.length > 3;
2976
+ }
2977
+ // For other types, truncate if value is longer than 200 characters
2792
2978
  return this.valueAsString.length > 200;
2793
2979
  },
2980
+ shouldShowTruncated() {
2981
+ // For other types, show truncated if needs truncation and not expanded
2982
+ return this.needsTruncation && !this.isValueExpanded;
2983
+ },
2794
2984
  displayValue() {
2795
2985
  if (!this.needsTruncation || this.isValueExpanded) {
2796
2986
  return this.getValueForPath(this.path.path);
@@ -2800,9 +2990,24 @@ module.exports = app => app.component('document-property', {
2800
2990
  },
2801
2991
  truncatedString() {
2802
2992
  if (this.needsTruncation && !this.isValueExpanded) {
2803
- return this.valueAsString.substring(0, 200) + '...';
2993
+ // Arrays are handled in template, so this is for non-arrays
2994
+ if (!this.isArray) {
2995
+ return this.valueAsString.substring(0, 200) + '...';
2996
+ }
2804
2997
  }
2805
2998
  return this.valueAsString;
2999
+ },
3000
+ truncatedArrayItems() {
3001
+ if (this.isArray && this.needsTruncation && !this.isValueExpanded) {
3002
+ return this.arrayValue.slice(0, 2);
3003
+ }
3004
+ return [];
3005
+ },
3006
+ remainingArrayCount() {
3007
+ if (this.isArray && this.needsTruncation && !this.isValueExpanded) {
3008
+ return this.arrayValue.length - 2;
3009
+ }
3010
+ return 0;
2806
3011
  }
2807
3012
  },
2808
3013
  methods: {
@@ -2828,6 +3033,9 @@ module.exports = app => app.component('document-property', {
2828
3033
  if (path.instance === 'Embedded') {
2829
3034
  return 'edit-subdocument';
2830
3035
  }
3036
+ if (path.instance === 'Mixed') {
3037
+ return 'edit-subdocument';
3038
+ }
2831
3039
  if (path.instance === 'Boolean') {
2832
3040
  return 'edit-boolean';
2833
3041
  }
@@ -2840,6 +3048,10 @@ module.exports = app => app.component('document-property', {
2840
3048
  props.enumValues = path.enum;
2841
3049
  }
2842
3050
  }
3051
+ if (path.instance === 'Array') {
3052
+ props.path = path;
3053
+ props.schemaPaths = this.schemaPaths;
3054
+ }
2843
3055
  return props;
2844
3056
  },
2845
3057
  getValueForPath(path) {
@@ -2915,24 +3127,24 @@ module.exports = app => app.component('document-property', {
2915
3127
  });
2916
3128
 
2917
3129
 
2918
- /***/ }),
3130
+ /***/ },
2919
3131
 
2920
- /***/ "./frontend/src/document/confirm-changes/confirm-changes.html":
3132
+ /***/ "./frontend/src/document/confirm-changes/confirm-changes.html"
2921
3133
  /*!********************************************************************!*\
2922
3134
  !*** ./frontend/src/document/confirm-changes/confirm-changes.html ***!
2923
3135
  \********************************************************************/
2924
- /***/ ((module) => {
3136
+ (module) {
2925
3137
 
2926
3138
  "use strict";
2927
3139
  module.exports = "<div>\n <h2>\n Are you sure you want to save the following changes?\n </h2>\n <pre class=\"max-h-[50vh] overflow-auto\"><code ref=\"code\" class=\"language-javascript\" v-text=\"displayValue\"></code></pre>\n <div class=\"flex gap-2 mt-2\">\n <async-button\n class=\"rounded-md bg-green-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-green-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-green-600\"\n @click=\"startSave\">\n Confirm\n </async-button>\n <button \n class=\"rounded-md bg-gray-200 px-2.5 py-1.5 text-sm font-semibold text-black shadow-sm hover:bg-gray-300 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-300\"\n @click=\"closeConfirm\">\n Cancel\n </button>\n </div>\n</div>";
2928
3140
 
2929
- /***/ }),
3141
+ /***/ },
2930
3142
 
2931
- /***/ "./frontend/src/document/confirm-changes/confirm-changes.js":
3143
+ /***/ "./frontend/src/document/confirm-changes/confirm-changes.js"
2932
3144
  /*!******************************************************************!*\
2933
3145
  !*** ./frontend/src/document/confirm-changes/confirm-changes.js ***!
2934
3146
  \******************************************************************/
2935
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3147
+ (module, __unused_webpack_exports, __webpack_require__) {
2936
3148
 
2937
3149
  "use strict";
2938
3150
 
@@ -2960,24 +3172,24 @@ module.exports = app => app.component('confirm-changes', {
2960
3172
  }
2961
3173
  });
2962
3174
 
2963
- /***/ }),
3175
+ /***/ },
2964
3176
 
2965
- /***/ "./frontend/src/document/confirm-delete/confirm-delete.html":
3177
+ /***/ "./frontend/src/document/confirm-delete/confirm-delete.html"
2966
3178
  /*!******************************************************************!*\
2967
3179
  !*** ./frontend/src/document/confirm-delete/confirm-delete.html ***!
2968
3180
  \******************************************************************/
2969
- /***/ ((module) => {
3181
+ (module) {
2970
3182
 
2971
3183
  "use strict";
2972
3184
  module.exports = "<div>\n <h2>\n Are you sure you want to delete the following document?\n </h2>\n <pre class=\"max-h-[50vh] overflow-auto\"><code ref=\"code\" class=\"language-javascript\" v-text=\"displayValue\"></code></pre>\n <div class=\"flex gap-2 mt-2\">\n <async-button\n class=\"rounded-md bg-green-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-green-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-green-600\"\n @click=\"startDelete\">\n Confirm\n </async-button>\n <button\n class=\"rounded-md bg-gray-200 px-2.5 py-1.5 text-sm font-semibold text-black shadow-sm hover:bg-gray-300 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-300\"\n @click=\"closeDelete\">\n Cancel\n </button>\n </div>\n</div>\n";
2973
3185
 
2974
- /***/ }),
3186
+ /***/ },
2975
3187
 
2976
- /***/ "./frontend/src/document/confirm-delete/confirm-delete.js":
3188
+ /***/ "./frontend/src/document/confirm-delete/confirm-delete.js"
2977
3189
  /*!****************************************************************!*\
2978
3190
  !*** ./frontend/src/document/confirm-delete/confirm-delete.js ***!
2979
3191
  \****************************************************************/
2980
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3192
+ (module, __unused_webpack_exports, __webpack_require__) {
2981
3193
 
2982
3194
  "use strict";
2983
3195
 
@@ -3005,35 +3217,35 @@ module.exports = app => app.component('confirm-delete', {
3005
3217
  }
3006
3218
  });
3007
3219
 
3008
- /***/ }),
3220
+ /***/ },
3009
3221
 
3010
- /***/ "./frontend/src/document/document.css":
3222
+ /***/ "./frontend/src/document/document.css"
3011
3223
  /*!********************************************!*\
3012
3224
  !*** ./frontend/src/document/document.css ***!
3013
3225
  \********************************************/
3014
- /***/ ((module) => {
3226
+ (module) {
3015
3227
 
3016
3228
  "use strict";
3017
3229
  module.exports = ".document {\n max-width: 1200px;\n margin-left: auto;\n margin-right: auto;\n padding-top: 25px;\n}\n\n.document .document-menu {\n display: flex;\n position: sticky;\n top: 0;\n z-index: 100;\n background-color: white;\n border-radius: 5px;\n padding: 15px 15px;\n margin: -15px 0 15px 0;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.document .document-menu .left {\n flex-grow: 1;\n}\n\n.document .document-menu .right {\n flex-grow: 1;\n text-align: right;\n}\n\n.document .document-menu .right button:not(:last-child) {\n margin-right: 0.5em;\n}\n\n.document button img {\n height: 1em;\n}";
3018
3230
 
3019
- /***/ }),
3231
+ /***/ },
3020
3232
 
3021
- /***/ "./frontend/src/document/document.html":
3233
+ /***/ "./frontend/src/document/document.html"
3022
3234
  /*!*********************************************!*\
3023
3235
  !*** ./frontend/src/document/document.html ***!
3024
3236
  \*********************************************/
3025
- /***/ ((module) => {
3237
+ (module) {
3026
3238
 
3027
3239
  "use strict";
3028
3240
  module.exports = "<div class=\"document px-1 md:px-0\">\n <div class=\"flex justify-between sticky top-0 z-50 bg-white p-4 border-b border-gray-200 shadow-sm\">\n <div class=\"flex\">\n <button\n @click=\"goBack\"\n class=\"mr-2 rounded-md bg-gray-400 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-slate-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-slate-600\">\n &lsaquo; Back\n </button>\n <button\n @click=\"viewMode = 'fields'\"\n :class=\"viewMode === 'fields'\n ? 'bg-blue-600 text-white z-10'\n : 'bg-gray-200 text-gray-700 hover:bg-gray-300'\"\n class=\"px-4 py-2 text-sm font-medium focus:outline-none focus:ring-2 focus:ring-blue-500 flex items-center gap-2 border border-gray-300 border-r-0 rounded-l-lg rounded-r-none\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"></path>\n </svg>\n Fields\n </button>\n <button\n @click=\"viewMode = 'json'\"\n :class=\"viewMode === 'json'\n ? 'bg-blue-600 text-white z-10'\n : 'bg-gray-200 text-gray-700 hover:bg-gray-300'\"\n class=\"px-4 py-2 text-sm font-medium focus:outline-none focus:ring-2 focus:ring-blue-500 flex items-center gap-2 border border-gray-300 rounded-r-lg rounded-l-none\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\"></path>\n </svg>\n JSON\n </button>\n </div>\n\n <div class=\"gap-2 hidden md:flex\">\n <button\n v-if=\"!editting\"\n @click=\"editting = true\"\n :disabled=\"!canEdit\"\n :class=\"{'cursor-not-allowed opacity-50': !canEdit}\"\n type=\"button\"\n class=\"rounded-md bg-ultramarine-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600\">\n <img src=\"images/edit.svg\" class=\"inline\" /> Edit\n </button>\n <button\n v-if=\"editting\"\n @click=\"editting = false\"\n type=\"button\"\n class=\"rounded-md bg-slate-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-slate-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-slate-600\">\n &times; Cancel\n </button>\n <button\n v-if=\"editting\"\n :disabled=\"!canManipulate\"\n :class=\"{'cursor-not-allowed opacity-50': !canManipulate}\"\n @click=\"shouldShowConfirmModal=true;\"\n type=\"button\"\n class=\"rounded-md bg-forest-green-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-green-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-green-600\">\n <img src=\"images/save.svg\" class=\"inline\" /> Save\n </button>\n <button\n @click=\"shouldShowDeleteModal=true;\"\n :disabled=\"!canManipulate\"\n :class=\"{'cursor-not-allowed opacity-50': !canManipulate}\"\n type=\"button\"\n class=\"rounded-md bg-valencia-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-valencia-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600\">\n <img src=\"images/delete.svg\" class=\"inline\" /> Delete\n </button>\n <button\n @click=\"shouldShowCloneModal=true;\"\n :disabled=\"!canManipulate\"\n :class=\"{'cursor-not-allowed opacity-50': !canManipulate}\"\n type=\"button\"\n class=\"rounded-md bg-pink-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-valencia-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600\">\n <img src=\"images/duplicate.svg\" class=\"inline\" /> Clone\n </button>\n </div>\n <div class=\"md:hidden flex items-center\">\n <div class=\"relative\">\n <button\n @click=\"mobileMenuOpen = !mobileMenuOpen\"\n type=\"button\"\n class=\"inline-flex items-center justify-center rounded-md bg-gray-200 px-3 py-2 text-sm font-medium text-gray-700 hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n aria-expanded=\"mobileMenuOpen\"\n aria-label=\"Open menu\"\n >\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M4 6h16M4 12h16M4 18h16\"></path>\n </svg>\n </button>\n <div\n v-show=\"mobileMenuOpen\"\n @click.away=\"mobileMenuOpen = false\"\n class=\"origin-top-right absolute right-0 mt-2 w-52 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 z-50\"\n >\n <div class=\"py-1 flex flex-col\">\n <button\n v-if=\"!editting\"\n @click=\"editting = true; mobileMenuOpen = false\"\n :disabled=\"!canEdit\"\n :class=\"['flex items-center px-4 py-2 text-sm text-gray-700', !canEdit ? 'cursor-not-allowed opacity-50' : 'hover:bg-ultramarine-100']\"\n type=\"button\"\n >\n <img src=\"images/edit.svg\" class=\"inline mr-2\" /> Edit\n </button>\n <button\n v-if=\"editting\"\n @click=\"editting = false; mobileMenuOpen = false\"\n type=\"button\"\n class=\"flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-slate-100\"\n >\n &times; Cancel\n </button>\n <button\n v-if=\"editting\"\n :disabled=\"!canManipulate\"\n :class=\"['flex items-center px-4 py-2 text-sm text-gray-700', !canManipulate ? 'cursor-not-allowed opacity-50' : 'hover:bg-green-100']\"\n @click=\"shouldShowConfirmModal=true; mobileMenuOpen = false\"\n type=\"button\"\n >\n <img src=\"images/save.svg\" class=\"inline mr-2\" /> Save\n </button>\n <button\n @click=\"shouldShowDeleteModal=true; mobileMenuOpen = false\"\n :disabled=\"!canManipulate\"\n :class=\"['flex items-center px-4 py-2 text-sm text-gray-700', !canManipulate ? 'cursor-not-allowed opacity-50' : 'hover:bg-red-100']\"\n type=\"button\"\n >\n <img src=\"images/delete.svg\" class=\"inline mr-2\" /> Delete\n </button>\n <button\n @click=\"shouldShowCloneModal=true; mobileMenuOpen = false\"\n :disabled=\"!canManipulate\"\n :class=\"['flex items-center px-4 py-2 text-sm text-gray-700', !canManipulate ? 'cursor-not-allowed opacity-50' : 'hover:bg-pink-100']\"\n type=\"button\"\n >\n <img src=\"images/duplicate.svg\" class=\"inline mr-2\" /> Clone\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div v-if=\"status === 'loaded'\">\n <document-details\n :document=\"document\"\n :schemaPaths=\"schemaPaths\"\n :virtualPaths=\"virtualPaths\"\n :editting=\"editting\"\n :changes=\"changes\"\n :invalid=\"invalid\"\n :viewMode=\"viewMode\"\n @add-field=\"addField\"\n @view-mode-change=\"updateViewMode\"></document-details>\n <modal v-if=\"shouldShowConfirmModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowConfirmModal = false;\">&times;</div>\n <confirm-changes @close=\"shouldShowConfirmModal = false;\" @save=\"save\" :value=\"changes\"></confirm-changes>\n </template>\n </modal>\n <modal v-if=\"shouldShowDeleteModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowDeleteModal = false;\">&times;</div>\n <confirm-delete @close=\"shouldShowDeleteModal = false;\" @remove=\"remove\" :value=\"document\"></confirm-delete>\n </template>\n </modal>\n <modal v-if=\"shouldShowCloneModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowCloneModal = false;\">&times;</div>\n <clone-document :currentModel=\"model\" :doc=\"document\" :schemaPaths=\"schemaPaths\" @close=\"showClonedDocument\"></clone-document>\n </template>\n </modal>\n </div>\n</div>\n";
3029
3241
 
3030
- /***/ }),
3242
+ /***/ },
3031
3243
 
3032
- /***/ "./frontend/src/document/document.js":
3244
+ /***/ "./frontend/src/document/document.js"
3033
3245
  /*!*******************************************!*\
3034
3246
  !*** ./frontend/src/document/document.js ***!
3035
3247
  \*******************************************/
3036
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3248
+ (module, __unused_webpack_exports, __webpack_require__) {
3037
3249
 
3038
3250
  "use strict";
3039
3251
 
@@ -3178,35 +3390,24 @@ module.exports = app => app.component('document', {
3178
3390
  });
3179
3391
 
3180
3392
 
3181
- /***/ }),
3393
+ /***/ },
3182
3394
 
3183
- /***/ "./frontend/src/edit-array/edit-array.css":
3184
- /*!************************************************!*\
3185
- !*** ./frontend/src/edit-array/edit-array.css ***!
3186
- \************************************************/
3187
- /***/ ((module) => {
3188
-
3189
- "use strict";
3190
- module.exports = ".edit-array button {\n margin-top: 0.5em;\n}";
3191
-
3192
- /***/ }),
3193
-
3194
- /***/ "./frontend/src/edit-array/edit-array.html":
3395
+ /***/ "./frontend/src/edit-array/edit-array.html"
3195
3396
  /*!*************************************************!*\
3196
3397
  !*** ./frontend/src/edit-array/edit-array.html ***!
3197
3398
  \*************************************************/
3198
- /***/ ((module) => {
3399
+ (module) {
3199
3400
 
3200
3401
  "use strict";
3201
- module.exports = "<div class=\"edit-array\">\n <textarea\n ref=\"arrayEditor\"\n class=\"w-full border border-gray-300 p-1 h-[300px]\"></textarea>\n</div>";
3402
+ module.exports = "<div class=\"w-full\">\n <!-- CodeMirror editor for the entire array -->\n <textarea\n ref=\"arrayEditor\"\n class=\"w-full border border-gray-300 p-2 font-mono\"\n :style=\"{ minHeight: '300px' }\">\n </textarea>\n</div>";
3202
3403
 
3203
- /***/ }),
3404
+ /***/ },
3204
3405
 
3205
- /***/ "./frontend/src/edit-array/edit-array.js":
3406
+ /***/ "./frontend/src/edit-array/edit-array.js"
3206
3407
  /*!***********************************************!*\
3207
3408
  !*** ./frontend/src/edit-array/edit-array.js ***!
3208
3409
  \***********************************************/
3209
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3410
+ (module, __unused_webpack_exports, __webpack_require__) {
3210
3411
 
3211
3412
  "use strict";
3212
3413
 
@@ -3221,67 +3422,123 @@ const ObjectId = new Proxy(BSON.ObjectId, {
3221
3422
  }
3222
3423
  });
3223
3424
 
3224
- const appendCSS = __webpack_require__(/*! ../appendCSS */ "./frontend/src/appendCSS.js");
3225
- appendCSS(__webpack_require__(/*! ./edit-array.css */ "./frontend/src/edit-array/edit-array.css"));
3226
3425
 
3227
3426
  module.exports = app => app.component('edit-array', {
3228
3427
  template: template,
3229
3428
  props: ['value'],
3230
- data: () => ({ currentValue: -1 }),
3231
- mounted() {
3232
- this.currentValue = this.value == null
3233
- ? '' + this.value
3234
- : JSON.stringify(this.value, null, ' ').trim();
3235
- this.$refs.arrayEditor.value = this.currentValue;
3236
- this.editor = CodeMirror.fromTextArea(this.$refs.arrayEditor, {
3237
- mode: 'javascript',
3238
- lineNumbers: true
3239
- });
3240
- this.editor.on('change', ev => {
3241
- this.currentValue = this.editor.getValue();
3242
- });
3429
+ data() {
3430
+ return {
3431
+ arrayValue: [],
3432
+ arrayEditor: null
3433
+ };
3243
3434
  },
3244
- watch: {
3245
- currentValue(newValue, oldValue) {
3246
- // Hacky way of skipping initial trigger because `immediate: false` doesn't work in Vue 3
3247
- if (oldValue === -1) {
3435
+ methods: {
3436
+ initializeArray() {
3437
+ if (this.value == null) {
3438
+ this.arrayValue = [];
3439
+ } else if (Array.isArray(this.value)) {
3440
+ this.arrayValue = JSON.parse(JSON.stringify(this.value));
3441
+ } else {
3442
+ this.arrayValue = [];
3443
+ }
3444
+
3445
+ // Update CodeMirror editor if it exists
3446
+ this.$nextTick(() => {
3447
+ if (this.arrayEditor) {
3448
+ const arrayStr = JSON.stringify(this.arrayValue, null, 2);
3449
+ this.arrayEditor.setValue(arrayStr);
3450
+ }
3451
+ });
3452
+ },
3453
+ initializeArrayEditor() {
3454
+ this.$nextTick(() => {
3455
+ const textareaRef = this.$refs.arrayEditor;
3456
+ const textarea = Array.isArray(textareaRef) ? textareaRef[0] : textareaRef;
3457
+ if (textarea && !this.arrayEditor) {
3458
+ const arrayStr = JSON.stringify(this.arrayValue, null, 2);
3459
+ textarea.value = arrayStr;
3460
+ this.arrayEditor = CodeMirror.fromTextArea(textarea, {
3461
+ mode: 'javascript',
3462
+ lineNumbers: true
3463
+ });
3464
+ this.arrayEditor.on('change', () => {
3465
+ this.updateArrayFromEditor();
3466
+ });
3467
+ }
3468
+ });
3469
+ },
3470
+ updateArrayFromEditor() {
3471
+ if (!this.arrayEditor) {
3248
3472
  return;
3249
3473
  }
3250
3474
  try {
3251
- const array = eval(`(${this.currentValue})`);
3252
- this.$emit('input', array);
3475
+ const value = this.arrayEditor.getValue();
3476
+ if (value.trim() === '') {
3477
+ this.arrayValue = [];
3478
+ } else {
3479
+ this.arrayValue = JSON.parse(value);
3480
+ }
3481
+ this.emitUpdate();
3482
+ } catch (err) {
3483
+ // Invalid JSON, don't update
3484
+ }
3485
+ },
3486
+ emitUpdate() {
3487
+ try {
3488
+ this.$emit('input', this.arrayValue);
3253
3489
  } catch (err) {
3254
3490
  this.$emit('error', err);
3255
3491
  }
3256
3492
  }
3257
3493
  },
3494
+ mounted() {
3495
+ this.initializeArray();
3496
+ this.initializeArrayEditor();
3497
+ },
3258
3498
  beforeDestroy() {
3259
- if (this.editor) {
3260
- this.editor.toTextArea();
3499
+ if (this.arrayEditor) {
3500
+ this.arrayEditor.toTextArea();
3501
+ }
3502
+ },
3503
+ watch: {
3504
+ value: {
3505
+ handler(newValue, oldValue) {
3506
+ // Initialize array when value prop changes
3507
+ this.initializeArray();
3508
+ // Update array editor if it exists
3509
+ if (this.arrayEditor) {
3510
+ this.$nextTick(() => {
3511
+ const arrayStr = JSON.stringify(this.arrayValue, null, 2);
3512
+ this.arrayEditor.setValue(arrayStr);
3513
+ });
3514
+ }
3515
+ },
3516
+ deep: true,
3517
+ immediate: true
3261
3518
  }
3262
3519
  },
3263
3520
  emits: ['input', 'error']
3264
3521
  });
3265
3522
 
3266
3523
 
3267
- /***/ }),
3524
+ /***/ },
3268
3525
 
3269
- /***/ "./frontend/src/edit-boolean/edit-boolean.html":
3526
+ /***/ "./frontend/src/edit-boolean/edit-boolean.html"
3270
3527
  /*!*****************************************************!*\
3271
3528
  !*** ./frontend/src/edit-boolean/edit-boolean.html ***!
3272
3529
  \*****************************************************/
3273
- /***/ ((module) => {
3530
+ (module) {
3274
3531
 
3275
3532
  "use strict";
3276
3533
  module.exports = "<div class=\"edit-boolean\">\n <div class=\"flex flex-wrap gap-2\">\n <label class=\"flex items-center gap-2 px-3 py-2 border rounded cursor-pointer hover:bg-gray-50\" \n :class=\"selectedValue === true ? 'bg-blue-100 border-blue-300 text-blue-800' : 'border-gray-300 text-gray-700'\">\n <input\n type=\"radio\"\n :checked=\"selectedValue === true\"\n @change=\"selectValue(true)\"\n class=\"w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500\"\n />\n <span class=\"text-sm font-medium\">true</span>\n </label>\n \n <label class=\"flex items-center gap-2 px-3 py-2 border rounded cursor-pointer hover:bg-gray-50\"\n :class=\"selectedValue === false ? 'bg-blue-100 border-blue-300 text-blue-800' : 'border-gray-300 text-gray-700'\">\n <input\n type=\"radio\"\n :checked=\"selectedValue === false\"\n @change=\"selectValue(false)\"\n class=\"w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500\"\n />\n <span class=\"text-sm font-medium\">false</span>\n </label>\n \n <label class=\"flex items-center gap-2 px-3 py-2 border rounded cursor-pointer hover:bg-gray-50\"\n :class=\"selectedValue === null ? 'bg-blue-100 border-blue-300 text-blue-800' : 'border-gray-300 text-gray-700'\">\n <input\n type=\"radio\"\n :checked=\"selectedValue === null\"\n @change=\"selectValue(null)\"\n class=\"w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500\"\n />\n <span class=\"text-sm font-medium\">null</span>\n </label>\n \n <label class=\"flex items-center gap-2 px-3 py-2 border rounded cursor-pointer hover:bg-gray-50\"\n :class=\"selectedValue === undefined ? 'bg-blue-100 border-blue-300 text-blue-800' : 'border-gray-300 text-gray-700'\">\n <input\n type=\"radio\"\n :checked=\"selectedValue === undefined\"\n @change=\"selectValue(undefined)\"\n class=\"w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500\"\n />\n <span class=\"text-sm font-medium\">undefined</span>\n </label>\n </div>\n</div>\n";
3277
3534
 
3278
- /***/ }),
3535
+ /***/ },
3279
3536
 
3280
- /***/ "./frontend/src/edit-boolean/edit-boolean.js":
3537
+ /***/ "./frontend/src/edit-boolean/edit-boolean.js"
3281
3538
  /*!***************************************************!*\
3282
3539
  !*** ./frontend/src/edit-boolean/edit-boolean.js ***!
3283
3540
  \***************************************************/
3284
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3541
+ (module, __unused_webpack_exports, __webpack_require__) {
3285
3542
 
3286
3543
  "use strict";
3287
3544
 
@@ -3324,24 +3581,24 @@ module.exports = app => app.component('edit-boolean', {
3324
3581
  });
3325
3582
 
3326
3583
 
3327
- /***/ }),
3584
+ /***/ },
3328
3585
 
3329
- /***/ "./frontend/src/edit-date/edit-date.html":
3586
+ /***/ "./frontend/src/edit-date/edit-date.html"
3330
3587
  /*!***********************************************!*\
3331
3588
  !*** ./frontend/src/edit-date/edit-date.html ***!
3332
3589
  \***********************************************/
3333
- /***/ ((module) => {
3590
+ (module) {
3334
3591
 
3335
3592
  "use strict";
3336
3593
  module.exports = "<div>\n <input\n v-if=\"dateSelection == 'picker'\"\n class=\"w-64 h-8 border border-gray-300 outline-0\"\n type=\"datetime-local\"\n :value=\"valueAsLocalString\"\n @input=\"$emit('input', $event.target.value)\">\n <input\n v-if=\"dateSelection == 'iso'\"\n type=\"text\"\n class=\"w-64 h-8 border border-gray-300 outline-0\"\n :value=\"valueAsISOString\"\n @input=\"updateFromISO\">\n</div>";
3337
3594
 
3338
- /***/ }),
3595
+ /***/ },
3339
3596
 
3340
- /***/ "./frontend/src/edit-date/edit-date.js":
3597
+ /***/ "./frontend/src/edit-date/edit-date.js"
3341
3598
  /*!*********************************************!*\
3342
3599
  !*** ./frontend/src/edit-date/edit-date.js ***!
3343
3600
  \*********************************************/
3344
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3601
+ (module, __unused_webpack_exports, __webpack_require__) {
3345
3602
 
3346
3603
  "use strict";
3347
3604
 
@@ -3405,24 +3662,24 @@ module.exports = app => app.component('edit-date', {
3405
3662
  });
3406
3663
 
3407
3664
 
3408
- /***/ }),
3665
+ /***/ },
3409
3666
 
3410
- /***/ "./frontend/src/edit-default/edit-default.html":
3667
+ /***/ "./frontend/src/edit-default/edit-default.html"
3411
3668
  /*!*****************************************************!*\
3412
3669
  !*** ./frontend/src/edit-default/edit-default.html ***!
3413
3670
  \*****************************************************/
3414
- /***/ ((module) => {
3671
+ (module) {
3415
3672
 
3416
3673
  "use strict";
3417
3674
  module.exports = "<div>\n <input type=\"text\" :value=\"value\" @input=\"$emit('input', $event.target.value)\" class=\"w-full p-1 border border-gray-300 outline-0\">\n</div>";
3418
3675
 
3419
- /***/ }),
3676
+ /***/ },
3420
3677
 
3421
- /***/ "./frontend/src/edit-default/edit-default.js":
3678
+ /***/ "./frontend/src/edit-default/edit-default.js"
3422
3679
  /*!***************************************************!*\
3423
3680
  !*** ./frontend/src/edit-default/edit-default.js ***!
3424
3681
  \***************************************************/
3425
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3682
+ (module, __unused_webpack_exports, __webpack_require__) {
3426
3683
 
3427
3684
  "use strict";
3428
3685
 
@@ -3446,24 +3703,24 @@ module.exports = app => app.component('edit-default', {
3446
3703
  }
3447
3704
  });
3448
3705
 
3449
- /***/ }),
3706
+ /***/ },
3450
3707
 
3451
- /***/ "./frontend/src/edit-number/edit-number.html":
3708
+ /***/ "./frontend/src/edit-number/edit-number.html"
3452
3709
  /*!***************************************************!*\
3453
3710
  !*** ./frontend/src/edit-number/edit-number.html ***!
3454
3711
  \***************************************************/
3455
- /***/ ((module) => {
3712
+ (module) {
3456
3713
 
3457
3714
  "use strict";
3458
3715
  module.exports = "<div>\n <input type=\"number\" :value=\"value\" @input=\"$emit('input', $event.target.value)\">\n</div>";
3459
3716
 
3460
- /***/ }),
3717
+ /***/ },
3461
3718
 
3462
- /***/ "./frontend/src/edit-number/edit-number.js":
3719
+ /***/ "./frontend/src/edit-number/edit-number.js"
3463
3720
  /*!*************************************************!*\
3464
3721
  !*** ./frontend/src/edit-number/edit-number.js ***!
3465
3722
  \*************************************************/
3466
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3723
+ (module, __unused_webpack_exports, __webpack_require__) {
3467
3724
 
3468
3725
  "use strict";
3469
3726
 
@@ -3487,24 +3744,24 @@ module.exports = app => app.component('edit-number', {
3487
3744
  }
3488
3745
  });
3489
3746
 
3490
- /***/ }),
3747
+ /***/ },
3491
3748
 
3492
- /***/ "./frontend/src/edit-string/edit-string.html":
3749
+ /***/ "./frontend/src/edit-string/edit-string.html"
3493
3750
  /*!***************************************************!*\
3494
3751
  !*** ./frontend/src/edit-string/edit-string.html ***!
3495
3752
  \***************************************************/
3496
- /***/ ((module) => {
3753
+ (module) {
3497
3754
 
3498
3755
  "use strict";
3499
3756
  module.exports = "<div>\n <div v-if=\"hasEnumValues\" class=\"space-y-2\">\n <select\n class=\"w-full px-3 py-2 border border-gray-300 bg-white rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :value=\"selectedOption\"\n @change=\"onSelectChange\"\n >\n <option v-for=\"option in normalizedEnums\" :key=\"`enum-${option}`\" :value=\"option\">\n {{ option }}\n </option>\n <option :value=\"'__null'\">null</option>\n <option :value=\"'__other'\">Other</option>\n </select>\n <input\n v-if=\"selectedOption === '__other'\"\n type=\"text\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :value=\"otherValue\"\n @input=\"onOtherInput\"\n placeholder=\"Enter a value\"\n />\n </div>\n <div v-else>\n <input\n type=\"text\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n :value=\"value != null ? value : ''\"\n @input=\"onTextInput\"\n placeholder=\"Enter a value\"\n />\n </div>\n</div>\n";
3500
3757
 
3501
- /***/ }),
3758
+ /***/ },
3502
3759
 
3503
- /***/ "./frontend/src/edit-string/edit-string.js":
3760
+ /***/ "./frontend/src/edit-string/edit-string.js"
3504
3761
  /*!*************************************************!*\
3505
3762
  !*** ./frontend/src/edit-string/edit-string.js ***!
3506
3763
  \*************************************************/
3507
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3764
+ (module, __unused_webpack_exports, __webpack_require__) {
3508
3765
 
3509
3766
  "use strict";
3510
3767
 
@@ -3657,24 +3914,24 @@ module.exports = app => app.component('edit-string', {
3657
3914
  });
3658
3915
 
3659
3916
 
3660
- /***/ }),
3917
+ /***/ },
3661
3918
 
3662
- /***/ "./frontend/src/edit-subdocument/edit-subdocument.html":
3919
+ /***/ "./frontend/src/edit-subdocument/edit-subdocument.html"
3663
3920
  /*!*************************************************************!*\
3664
3921
  !*** ./frontend/src/edit-subdocument/edit-subdocument.html ***!
3665
3922
  \*************************************************************/
3666
- /***/ ((module) => {
3923
+ (module) {
3667
3924
 
3668
3925
  "use strict";
3669
3926
  module.exports = "<div class=\"edit-subdocument\">\n <textarea\n ref=\"editor\"\n v-model=\"currentValue\"\n class=\"w-full border border-gray-300 p-1 h-[300px]\"></textarea>\n</div>";
3670
3927
 
3671
- /***/ }),
3928
+ /***/ },
3672
3929
 
3673
- /***/ "./frontend/src/edit-subdocument/edit-subdocument.js":
3930
+ /***/ "./frontend/src/edit-subdocument/edit-subdocument.js"
3674
3931
  /*!***********************************************************!*\
3675
3932
  !*** ./frontend/src/edit-subdocument/edit-subdocument.js ***!
3676
3933
  \***********************************************************/
3677
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3934
+ (module, __unused_webpack_exports, __webpack_require__) {
3678
3935
 
3679
3936
  "use strict";
3680
3937
 
@@ -3729,35 +3986,35 @@ module.exports = app => app.component('edit-subdocument', {
3729
3986
  });
3730
3987
 
3731
3988
 
3732
- /***/ }),
3989
+ /***/ },
3733
3990
 
3734
- /***/ "./frontend/src/export-query-results/export-query-results.css":
3991
+ /***/ "./frontend/src/export-query-results/export-query-results.css"
3735
3992
  /*!********************************************************************!*\
3736
3993
  !*** ./frontend/src/export-query-results/export-query-results.css ***!
3737
3994
  \********************************************************************/
3738
- /***/ ((module) => {
3995
+ (module) {
3739
3996
 
3740
3997
  "use strict";
3741
3998
  module.exports = "";
3742
3999
 
3743
- /***/ }),
4000
+ /***/ },
3744
4001
 
3745
- /***/ "./frontend/src/export-query-results/export-query-results.html":
4002
+ /***/ "./frontend/src/export-query-results/export-query-results.html"
3746
4003
  /*!*********************************************************************!*\
3747
4004
  !*** ./frontend/src/export-query-results/export-query-results.html ***!
3748
4005
  \*********************************************************************/
3749
- /***/ ((module) => {
4006
+ (module) {
3750
4007
 
3751
4008
  "use strict";
3752
4009
  module.exports = "<div class=\"export-query-results\">\n <h2>Export as CSV</h2>\n <div>\n Choose fields to export\n </div>\n <div v-for=\"(schemaPath,index) in schemaPaths\" class=\"w-5 flex items-center\">\n <input type=\"checkbox\" class=\"mt-0 h-4 w-4 rounded border-gray-300 text-sky-600 focus:ring-sky-600 accent-sky-600\" v-model=\"shouldExport[schemaPath.path]\" :id=\"'schemaPath.path'+index\">\n <div class=\"ml-2 text-gray-700 grow shrink text-left\">\n <label :for=\"'schemaPath.path'+index\">{{schemaPath.path}}</label>\n </div>\n </div>\n <async-button class=\"rounded-md bg-ultramarine-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600\" @click=\"exportQueryResults\">Export</async-button>\n</div>";
3753
4010
 
3754
- /***/ }),
4011
+ /***/ },
3755
4012
 
3756
- /***/ "./frontend/src/export-query-results/export-query-results.js":
4013
+ /***/ "./frontend/src/export-query-results/export-query-results.js"
3757
4014
  /*!*******************************************************************!*\
3758
4015
  !*** ./frontend/src/export-query-results/export-query-results.js ***!
3759
4016
  \*******************************************************************/
3760
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4017
+ (module, __unused_webpack_exports, __webpack_require__) {
3761
4018
 
3762
4019
  "use strict";
3763
4020
 
@@ -3798,13 +4055,13 @@ module.exports = app => app.component('export-query-results', {
3798
4055
  }
3799
4056
  });
3800
4057
 
3801
- /***/ }),
4058
+ /***/ },
3802
4059
 
3803
- /***/ "./frontend/src/format.js":
4060
+ /***/ "./frontend/src/format.js"
3804
4061
  /*!********************************!*\
3805
4062
  !*** ./frontend/src/format.js ***!
3806
4063
  \********************************/
3807
- /***/ ((__unused_webpack_module, exports) => {
4064
+ (__unused_webpack_module, exports) {
3808
4065
 
3809
4066
  "use strict";
3810
4067
 
@@ -3818,13 +4075,13 @@ exports.isoToLongDateTime = function isoToLongDateTime(str) {
3818
4075
  };
3819
4076
 
3820
4077
 
3821
- /***/ }),
4078
+ /***/ },
3822
4079
 
3823
- /***/ "./frontend/src/index.js":
4080
+ /***/ "./frontend/src/index.js"
3824
4081
  /*!*******************************!*\
3825
4082
  !*** ./frontend/src/index.js ***!
3826
4083
  \*******************************/
3827
- /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4084
+ (__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3828
4085
 
3829
4086
  "use strict";
3830
4087
 
@@ -3838,6 +4095,7 @@ console.log(`Mongoose Studio Version ${version}`);
3838
4095
 
3839
4096
  const api = __webpack_require__(/*! ./api */ "./frontend/src/api.js");
3840
4097
  const format = __webpack_require__(/*! ./format */ "./frontend/src/format.js");
4098
+ const arrayUtils = __webpack_require__(/*! ./array-utils */ "./frontend/src/array-utils.js");
3841
4099
  const mothership = __webpack_require__(/*! ./mothership */ "./frontend/src/mothership.js");
3842
4100
  const { routes } = __webpack_require__(/*! ./routes */ "./frontend/src/routes.js");
3843
4101
  const vanillatoasts = __webpack_require__(/*! vanillatoasts */ "./node_modules/vanillatoasts/vanillatoasts.js");
@@ -3975,49 +4233,36 @@ router.beforeEach((to, from, next) => {
3975
4233
  }
3976
4234
  });
3977
4235
 
3978
- app.config.globalProperties = { format };
4236
+ app.config.globalProperties = { format, arrayUtils };
3979
4237
  app.use(router);
3980
4238
 
3981
4239
  app.mount('#content');
3982
4240
 
3983
4241
 
3984
- /***/ }),
3985
-
3986
- /***/ "./frontend/src/list-array/list-array.css":
3987
- /*!************************************************!*\
3988
- !*** ./frontend/src/list-array/list-array.css ***!
3989
- \************************************************/
3990
- /***/ ((module) => {
3991
-
3992
- "use strict";
3993
- module.exports = ".list-array pre {\n max-height: 6.5em;\n max-width: 30em;\n}\n\n.list-array pre.maximized {\n max-height: auto;\n}\n";
3994
-
3995
- /***/ }),
4242
+ /***/ },
3996
4243
 
3997
- /***/ "./frontend/src/list-array/list-array.html":
4244
+ /***/ "./frontend/src/list-array/list-array.html"
3998
4245
  /*!*************************************************!*\
3999
4246
  !*** ./frontend/src/list-array/list-array.html ***!
4000
4247
  \*************************************************/
4001
- /***/ ((module) => {
4248
+ (module) {
4002
4249
 
4003
4250
  "use strict";
4004
- module.exports = "<div class=\"list-array\">\n <pre><code ref=\"code\" class=\"language-javascript\" v-text=\"displayValue\"></code></pre>\n</div>";
4251
+ module.exports = "<div class=\"list-array\">\n <pre class=\"max-h-[6.5em] max-w-[30em]\"><code ref=\"code\" class=\"language-javascript\" v-text=\"displayValue\"></code></pre>\n</div>";
4005
4252
 
4006
- /***/ }),
4253
+ /***/ },
4007
4254
 
4008
- /***/ "./frontend/src/list-array/list-array.js":
4255
+ /***/ "./frontend/src/list-array/list-array.js"
4009
4256
  /*!***********************************************!*\
4010
4257
  !*** ./frontend/src/list-array/list-array.js ***!
4011
4258
  \***********************************************/
4012
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4259
+ (module, __unused_webpack_exports, __webpack_require__) {
4013
4260
 
4014
4261
  "use strict";
4015
4262
 
4016
4263
 
4017
4264
  const template = __webpack_require__(/*! ./list-array.html */ "./frontend/src/list-array/list-array.html");
4018
4265
 
4019
- __webpack_require__(/*! ../appendCSS */ "./frontend/src/appendCSS.js")(__webpack_require__(/*! ./list-array.css */ "./frontend/src/list-array/list-array.css"));
4020
-
4021
4266
  module.exports = app => app.component('list-array', {
4022
4267
  template: template,
4023
4268
  props: ['value'],
@@ -4032,35 +4277,35 @@ module.exports = app => app.component('list-array', {
4032
4277
  });
4033
4278
 
4034
4279
 
4035
- /***/ }),
4280
+ /***/ },
4036
4281
 
4037
- /***/ "./frontend/src/list-default/list-default.css":
4282
+ /***/ "./frontend/src/list-default/list-default.css"
4038
4283
  /*!****************************************************!*\
4039
4284
  !*** ./frontend/src/list-default/list-default.css ***!
4040
4285
  \****************************************************/
4041
- /***/ ((module) => {
4286
+ (module) {
4042
4287
 
4043
4288
  "use strict";
4044
4289
  module.exports = ".list-default pre {\n max-height: 6.5em;\n max-width: 30em;\n}\n";
4045
4290
 
4046
- /***/ }),
4291
+ /***/ },
4047
4292
 
4048
- /***/ "./frontend/src/list-default/list-default.html":
4293
+ /***/ "./frontend/src/list-default/list-default.html"
4049
4294
  /*!*****************************************************!*\
4050
4295
  !*** ./frontend/src/list-default/list-default.html ***!
4051
4296
  \*****************************************************/
4052
- /***/ ((module) => {
4297
+ (module) {
4053
4298
 
4054
4299
  "use strict";
4055
4300
  module.exports = "<div class=\"list-default\" ref=\"itemData\" class=\"tooltip\">\n {{displayValue}}\n <div class=\"tooltiptext\" style=\"display:flex; width: 100%; justify-content: space-around; align-items: center; min-width: 180px;\">\n <div class=\"tooltiptextchild\" v-if=\"allude\" @click.stop=\"goToDoc(value)\">View Document</div>\n <div class=\"tooltiptextchild\" @click.stop=\"copyText(value)\">copy &#x1F4CB;</div>\n </div>\n</div>\n";
4056
4301
 
4057
- /***/ }),
4302
+ /***/ },
4058
4303
 
4059
- /***/ "./frontend/src/list-default/list-default.js":
4304
+ /***/ "./frontend/src/list-default/list-default.js"
4060
4305
  /*!***************************************************!*\
4061
4306
  !*** ./frontend/src/list-default/list-default.js ***!
4062
4307
  \***************************************************/
4063
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4308
+ (module, __unused_webpack_exports, __webpack_require__) {
4064
4309
 
4065
4310
  "use strict";
4066
4311
 
@@ -4115,35 +4360,35 @@ module.exports = app => app.component('list-default', {
4115
4360
  }
4116
4361
  });
4117
4362
 
4118
- /***/ }),
4363
+ /***/ },
4119
4364
 
4120
- /***/ "./frontend/src/list-json/json-node.html":
4365
+ /***/ "./frontend/src/list-json/json-node.html"
4121
4366
  /*!***********************************************!*\
4122
4367
  !*** ./frontend/src/list-json/json-node.html ***!
4123
4368
  \***********************************************/
4124
- /***/ ((module) => {
4369
+ (module) {
4125
4370
 
4126
4371
  "use strict";
4127
4372
  module.exports = "<div>\n <div class=\"flex items-baseline whitespace-pre\" :style=\"indentStyle\">\n <button\n v-if=\"showToggle\"\n type=\"button\"\n class=\"w-4 h-4 mr-1 inline-flex items-center justify-center leading-none text-gray-500 hover:text-gray-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-slate-400 cursor-pointer\"\n @click.stop=\"handleToggle\"\n >\n {{ isCollapsedNode ? '+' : '-' }}\n </button>\n <span v-else class=\"w-4 h-4 mr-1 inline-flex items-center justify-center invisible flex-shrink-0\"></span>\n <template v-if=\"hasKey\">\n <span class=\"text-blue-600\">\"{{ nodeKey }}\"</span><span>: </span>\n </template>\n <template v-if=\"isComplex\">\n <template v-if=\"hasChildren\">\n <span>{{ openingBracket }}</span>\n <span v-if=\"isCollapsedNode\" class=\"mx-1\">…</span>\n <span v-if=\"isCollapsedNode\">{{ closingBracket }}{{ comma }}</span>\n </template>\n <template v-else>\n <span>{{ openingBracket }}{{ closingBracket }}{{ comma }}</span>\n </template>\n </template>\n <template v-else>\n <!--\n If value is a string and overflows its container (i.e. goes over one line), show an ellipsis.\n This is done via CSS ellipsis strategy.\n -->\n <span\n v-if=\"shouldShowReferenceLink\"\n class=\"inline-flex items-baseline group\"\n >\n <span\n :class=\"[...valueClasses, 'underline', 'decoration-dotted', 'underline-offset-2']\"\n :style=\"typeof value === 'string'\n ? {\n display: 'inline-block',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n verticalAlign: 'bottom'\n }\n : {}\"\n :title=\"typeof value === 'string' && $el && $el.scrollWidth > $el.clientWidth ? value : undefined\"\n >\n {{ formattedValue }}\n </span>\n <span>\n {{ comma }}\n </span>\n <a\n href=\"#\"\n class=\"ml-1 text-sm text-sky-700 opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity\"\n @click.stop.prevent=\"goToReference(value)\"\n >\n View Document\n </a>\n </span>\n <span\n v-else\n :class=\"valueClasses\"\n :style=\"typeof value === 'string'\n ? {\n display: 'inline-block',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n verticalAlign: 'bottom'\n }\n : {}\"\n :title=\"typeof value === 'string' && $el && $el.scrollWidth > $el.clientWidth ? value : undefined\"\n >\n {{ formattedValue }}{{ comma }}\n </span>\n </template>\n </div>\n <template v-if=\"isComplex && hasChildren && !isCollapsedNode\">\n <json-node\n v-for=\"child in children\"\n :key=\"child.path\"\n :node-key=\"child.displayKey\"\n :value=\"child.value\"\n :level=\"level + 1\"\n :is-last=\"child.isLast\"\n :path=\"child.path\"\n :toggle-collapse=\"toggleCollapse\"\n :is-collapsed=\"isCollapsed\"\n :create-child-path=\"createChildPath\"\n :indent-size=\"indentSize\"\n :max-top-level-fields=\"maxTopLevelFields\"\n :top-level-expanded=\"topLevelExpanded\"\n :expand-top-level=\"expandTopLevel\"\n :references=\"references\"\n ></json-node>\n <div\n v-if=\"hasHiddenRootChildren\"\n class=\"flex items-baseline whitespace-pre\"\n :style=\"indentStyle\"\n >\n <span class=\"w-4 h-4 mr-1 inline-flex items-center justify-center invisible\"></span>\n <button\n type=\"button\"\n class=\"text-xs inline-flex items-center gap-1 ml-4 text-slate-500 hover:text-slate-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-slate-400\"\n :title=\"hiddenChildrenTooltip\"\n @click.stop=\"handleExpandTopLevel\"\n >\n <span aria-hidden=\"true\">{{hiddenChildrenLabel}}…</span>\n </button>\n </div>\n <div class=\"flex items-baseline whitespace-pre\" :style=\"indentStyle\">\n <span class=\"w-4 h-4 mr-1 inline-flex items-center justify-center invisible\"></span>\n <span>{{ closingBracket }}{{ comma }}</span>\n </div>\n </template>\n</div>\n";
4128
4373
 
4129
- /***/ }),
4374
+ /***/ },
4130
4375
 
4131
- /***/ "./frontend/src/list-json/list-json.html":
4376
+ /***/ "./frontend/src/list-json/list-json.html"
4132
4377
  /*!***********************************************!*\
4133
4378
  !*** ./frontend/src/list-json/list-json.html ***!
4134
4379
  \***********************************************/
4135
- /***/ ((module) => {
4380
+ (module) {
4136
4381
 
4137
4382
  "use strict";
4138
4383
  module.exports = "<div class=\"tooltip w-full font-mono text-sm py-3 text-slate-800\">\n <div class=\"w-full\">\n <json-node\n :node-key=\"null\"\n :value=\"value\"\n :level=\"0\"\n :is-last=\"true\"\n path=\"root\"\n :toggle-collapse=\"toggleCollapse\"\n :is-collapsed=\"isPathCollapsed\"\n :create-child-path=\"createChildPath\"\n :indent-size=\"indentSize\"\n :max-top-level-fields=\"maxTopLevelFields\"\n :top-level-expanded=\"topLevelExpanded\"\n :expand-top-level=\"expandTopLevel\"\n :references=\"references\"\n ></json-node>\n </div>\n</div>\n";
4139
4384
 
4140
- /***/ }),
4385
+ /***/ },
4141
4386
 
4142
- /***/ "./frontend/src/list-json/list-json.js":
4387
+ /***/ "./frontend/src/list-json/list-json.js"
4143
4388
  /*!*********************************************!*\
4144
4389
  !*** ./frontend/src/list-json/list-json.js ***!
4145
4390
  \*********************************************/
4146
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4391
+ (module, __unused_webpack_exports, __webpack_require__) {
4147
4392
 
4148
4393
  "use strict";
4149
4394
 
@@ -4463,35 +4708,35 @@ module.exports = app => app.component('list-json', {
4463
4708
  });
4464
4709
 
4465
4710
 
4466
- /***/ }),
4711
+ /***/ },
4467
4712
 
4468
- /***/ "./frontend/src/list-mixed/list-mixed.css":
4713
+ /***/ "./frontend/src/list-mixed/list-mixed.css"
4469
4714
  /*!************************************************!*\
4470
4715
  !*** ./frontend/src/list-mixed/list-mixed.css ***!
4471
4716
  \************************************************/
4472
- /***/ ((module) => {
4717
+ (module) {
4473
4718
 
4474
4719
  "use strict";
4475
4720
  module.exports = ".list-mixed pre {\n max-height: 6.5em;\n max-width: 30em;\n}\n\n";
4476
4721
 
4477
- /***/ }),
4722
+ /***/ },
4478
4723
 
4479
- /***/ "./frontend/src/list-mixed/list-mixed.html":
4724
+ /***/ "./frontend/src/list-mixed/list-mixed.html"
4480
4725
  /*!*************************************************!*\
4481
4726
  !*** ./frontend/src/list-mixed/list-mixed.html ***!
4482
4727
  \*************************************************/
4483
- /***/ ((module) => {
4728
+ (module) {
4484
4729
 
4485
4730
  "use strict";
4486
4731
  module.exports = "<div class=\"list-mixed tooltip\">\n <pre>\n <code ref=\"MixedCode\" class=\"language-javascript\">{{shortenValue}}</code>\n <span class=\"tooltiptext\" @click.stop=\"copyText(value)\">copy &#x1F4CB;</span>\n </pre>\n</div>\n ";
4487
4732
 
4488
- /***/ }),
4733
+ /***/ },
4489
4734
 
4490
- /***/ "./frontend/src/list-mixed/list-mixed.js":
4735
+ /***/ "./frontend/src/list-mixed/list-mixed.js"
4491
4736
  /*!***********************************************!*\
4492
4737
  !*** ./frontend/src/list-mixed/list-mixed.js ***!
4493
4738
  \***********************************************/
4494
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4739
+ (module, __unused_webpack_exports, __webpack_require__) {
4495
4740
 
4496
4741
  "use strict";
4497
4742
 
@@ -4537,35 +4782,35 @@ module.exports = app => app.component('list-mixed', {
4537
4782
 
4538
4783
 
4539
4784
 
4540
- /***/ }),
4785
+ /***/ },
4541
4786
 
4542
- /***/ "./frontend/src/list-string/list-string.css":
4787
+ /***/ "./frontend/src/list-string/list-string.css"
4543
4788
  /*!**************************************************!*\
4544
4789
  !*** ./frontend/src/list-string/list-string.css ***!
4545
4790
  \**************************************************/
4546
- /***/ ((module) => {
4791
+ (module) {
4547
4792
 
4548
4793
  "use strict";
4549
4794
  module.exports = ".list-string {\n display: inline;\n max-width: 300px;\n}";
4550
4795
 
4551
- /***/ }),
4796
+ /***/ },
4552
4797
 
4553
- /***/ "./frontend/src/list-string/list-string.html":
4798
+ /***/ "./frontend/src/list-string/list-string.html"
4554
4799
  /*!***************************************************!*\
4555
4800
  !*** ./frontend/src/list-string/list-string.html ***!
4556
4801
  \***************************************************/
4557
- /***/ ((module) => {
4802
+ (module) {
4558
4803
 
4559
4804
  "use strict";
4560
4805
  module.exports = "<div class=\"list-string tooltip\" ref=\"itemData\">\n {{displayValue}}\n <span class=\"tooltiptext\" @click.stop=\"copyText(value)\">copy &#x1F4CB;</span>\n</div>";
4561
4806
 
4562
- /***/ }),
4807
+ /***/ },
4563
4808
 
4564
- /***/ "./frontend/src/list-string/list-string.js":
4809
+ /***/ "./frontend/src/list-string/list-string.js"
4565
4810
  /*!*************************************************!*\
4566
4811
  !*** ./frontend/src/list-string/list-string.js ***!
4567
4812
  \*************************************************/
4568
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4813
+ (module, __unused_webpack_exports, __webpack_require__) {
4569
4814
 
4570
4815
  "use strict";
4571
4816
 
@@ -4612,35 +4857,35 @@ module.exports = app => app.component('list-string', {
4612
4857
  }
4613
4858
  });
4614
4859
 
4615
- /***/ }),
4860
+ /***/ },
4616
4861
 
4617
- /***/ "./frontend/src/list-subdocument/list-subdocument.css":
4862
+ /***/ "./frontend/src/list-subdocument/list-subdocument.css"
4618
4863
  /*!************************************************************!*\
4619
4864
  !*** ./frontend/src/list-subdocument/list-subdocument.css ***!
4620
4865
  \************************************************************/
4621
- /***/ ((module) => {
4866
+ (module) {
4622
4867
 
4623
4868
  "use strict";
4624
4869
  module.exports = ".list-subdocument pre {\n max-height: 6.5em;\n max-width: 30em;\n}\n";
4625
4870
 
4626
- /***/ }),
4871
+ /***/ },
4627
4872
 
4628
- /***/ "./frontend/src/list-subdocument/list-subdocument.html":
4873
+ /***/ "./frontend/src/list-subdocument/list-subdocument.html"
4629
4874
  /*!*************************************************************!*\
4630
4875
  !*** ./frontend/src/list-subdocument/list-subdocument.html ***!
4631
4876
  \*************************************************************/
4632
- /***/ ((module) => {
4877
+ (module) {
4633
4878
 
4634
4879
  "use strict";
4635
4880
  module.exports = "<div class=\"list-subdocument tooltip\">\n <pre>\n <code ref=\"SubDocCode\" class=\"language-javascript\">{{shortenValue}}</code>\n <span class=\"tooltiptext\" @click.stop=\"copyText(value)\">copy &#x1F4CB;</span>\n </pre>\n</div>\n";
4636
4881
 
4637
- /***/ }),
4882
+ /***/ },
4638
4883
 
4639
- /***/ "./frontend/src/list-subdocument/list-subdocument.js":
4884
+ /***/ "./frontend/src/list-subdocument/list-subdocument.js"
4640
4885
  /*!***********************************************************!*\
4641
4886
  !*** ./frontend/src/list-subdocument/list-subdocument.js ***!
4642
4887
  \***********************************************************/
4643
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4888
+ (module, __unused_webpack_exports, __webpack_require__) {
4644
4889
 
4645
4890
  "use strict";
4646
4891
 
@@ -4683,35 +4928,35 @@ module.exports = app => app.component('list-subdocument', {
4683
4928
  }
4684
4929
  });
4685
4930
 
4686
- /***/ }),
4931
+ /***/ },
4687
4932
 
4688
- /***/ "./frontend/src/modal/modal.css":
4933
+ /***/ "./frontend/src/modal/modal.css"
4689
4934
  /*!**************************************!*\
4690
4935
  !*** ./frontend/src/modal/modal.css ***!
4691
4936
  \**************************************/
4692
- /***/ ((module) => {
4937
+ (module) {
4693
4938
 
4694
4939
  "use strict";
4695
4940
  module.exports = "/** Vue modal */\n\n.modal-mask {\n position: fixed;\n z-index: 9998;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.5);\n display: table;\n transition: opacity 0.3s ease;\n}\n\n.modal-wrapper {\n display: table-cell;\n vertical-align: middle;\n}\n\n.modal-container {\n width: 600px;\n margin: 0px auto;\n padding: 20px 30px;\n padding-bottom: 40px;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.33);\n transition: all 0.3s ease;\n font-family: Helvetica, Arial, sans-serif;\n position: relative;\n}\n\n.modal-header {\n margin-top: 0;\n font-size: 18px;\n font-weight: bold;\n}\n\n.modal-header-success {\n color: #42b983;\n}\n\n.modal-header-error {\n color: #ff0000;\n}\n\n.modal-body {\n margin: 20px 0;\n max-height: calc(100vh - 40px - 60px - 10px);\n overflow: auto;\n}\n\n.modal__button--default {\n float: right;\n}\n\n/*\n * The following styles are auto-applied to elements with\n * transition=\"modal\" when their visibility is toggled\n * by Vue.js.\n *\n * You can easily play with the modal transition by editing\n * these styles.\n */\n\n.modal-enter {\n opacity: 0;\n}\n\n.modal-leave-active {\n opacity: 0;\n}\n\n.modal-enter .modal-container,\n.modal-leave-active .modal-container {\n -webkit-transform: scale(1.1);\n transform: scale(1.1);\n}\n\n.modal-container .modal-exit {\n position: absolute;\n right: 0.25em;\n top: 0.25em;\n cursor: pointer;\n font-size: 1.25em;\n height: 1.25em;\n width: 1.25em;\n border-radius: 100%;\n border: 1px solid #ddd;\n display: flex;\n align-items: center;\n justify-content: center;\n padding-bottom: 0.25em;\n}\n\n.modal-container .modal-exit:hover {\n background-color: #f1f5ff;\n}\n\n@media (max-width: 767px) {\n .modal-container {\n width: calc(100vw - 10px);\n margin: 0;\n margin-left: 5px;\n }\n}\n";
4696
4941
 
4697
- /***/ }),
4942
+ /***/ },
4698
4943
 
4699
- /***/ "./frontend/src/modal/modal.html":
4944
+ /***/ "./frontend/src/modal/modal.html"
4700
4945
  /*!***************************************!*\
4701
4946
  !*** ./frontend/src/modal/modal.html ***!
4702
4947
  \***************************************/
4703
- /***/ ((module) => {
4948
+ (module) {
4704
4949
 
4705
4950
  "use strict";
4706
4951
  module.exports = "<transition name=\"modal\">\n <div class=\"modal-mask\">\n <div class=\"modal-wrapper\">\n <div class=\"modal-container\" :class=\"containerClass\">\n <div class=\"modal-body\">\n <slot name=\"body\">\n </slot>\n </div>\n </div>\n </div>\n </div>\n</transition>\n";
4707
4952
 
4708
- /***/ }),
4953
+ /***/ },
4709
4954
 
4710
- /***/ "./frontend/src/modal/modal.js":
4955
+ /***/ "./frontend/src/modal/modal.js"
4711
4956
  /*!*************************************!*\
4712
4957
  !*** ./frontend/src/modal/modal.js ***!
4713
4958
  \*************************************/
4714
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4959
+ (module, __unused_webpack_exports, __webpack_require__) {
4715
4960
 
4716
4961
  "use strict";
4717
4962
 
@@ -4727,24 +4972,24 @@ module.exports = app => app.component('modal', {
4727
4972
  });
4728
4973
 
4729
4974
 
4730
- /***/ }),
4975
+ /***/ },
4731
4976
 
4732
- /***/ "./frontend/src/models/document-search/document-search.html":
4977
+ /***/ "./frontend/src/models/document-search/document-search.html"
4733
4978
  /*!******************************************************************!*\
4734
4979
  !*** ./frontend/src/models/document-search/document-search.html ***!
4735
4980
  \******************************************************************/
4736
- /***/ ((module) => {
4981
+ (module) {
4737
4982
 
4738
4983
  "use strict";
4739
4984
  module.exports = "<form @submit.prevent=\"emitSearch\" class=\"relative flex-grow m-0\">\n <input\n ref=\"searchInput\"\n class=\"w-full font-mono rounded-md p-1 border border-gray-300 outline-gray-300 text-lg focus:ring-1 focus:ring-ultramarine-200 focus:ring-offset-0 focus:outline-none\"\n type=\"text\"\n placeholder=\"Filter\"\n v-model=\"searchText\"\n @click=\"initFilter\"\n @input=\"updateAutocomplete\"\n @keydown=\"handleKeyDown\"\n />\n <ul v-if=\"autocompleteSuggestions.length\" class=\"absolute z-[9999] bg-white border border-gray-300 rounded mt-1 w-full max-h-40 overflow-y-auto shadow\">\n <li\n v-for=\"(suggestion, index) in autocompleteSuggestions\"\n :key=\"suggestion\"\n class=\"px-2 py-1 cursor-pointer\"\n :class=\"{ 'bg-ultramarine-100': index === autocompleteIndex }\"\n @mousedown.prevent=\"applySuggestion(index)\"\n >\n {{ suggestion }}\n </li>\n </ul>\n</form>\n";
4740
4985
 
4741
- /***/ }),
4986
+ /***/ },
4742
4987
 
4743
- /***/ "./frontend/src/models/document-search/document-search.js":
4988
+ /***/ "./frontend/src/models/document-search/document-search.js"
4744
4989
  /*!****************************************************************!*\
4745
4990
  !*** ./frontend/src/models/document-search/document-search.js ***!
4746
4991
  \****************************************************************/
4747
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4992
+ (module, __unused_webpack_exports, __webpack_require__) {
4748
4993
 
4749
4994
  "use strict";
4750
4995
 
@@ -4976,35 +5221,35 @@ module.exports = app => app.component('document-search', {
4976
5221
  });
4977
5222
 
4978
5223
 
4979
- /***/ }),
5224
+ /***/ },
4980
5225
 
4981
- /***/ "./frontend/src/models/models.css":
5226
+ /***/ "./frontend/src/models/models.css"
4982
5227
  /*!****************************************!*\
4983
5228
  !*** ./frontend/src/models/models.css ***!
4984
5229
  \****************************************/
4985
- /***/ ((module) => {
5230
+ (module) {
4986
5231
 
4987
5232
  "use strict";
4988
5233
  module.exports = ".models {\n position: relative;\n display: flex;\n flex-direction: row;\n min-height: calc(100% - 56px);\n}\n\n.models button.gray {\n color: black;\n background-color: #eee;\n}\n\n.models .model-selector {\n background-color: #eee;\n flex-grow: 0;\n padding: 15px;\n padding-top: 0px;\n}\n\n.models h1 {\n margin-top: 0px;\n}\n\n.models .documents {\n flex-grow: 1;\n overflow: scroll;\n max-height: calc(100vh - 56px);\n}\n\n.models .documents table {\n /* max-width: -moz-fit-content;\n max-width: fit-content; */\n width: 100%;\n table-layout: auto;\n font-size: small;\n padding: 0;\n margin-right: 1em;\n white-space: nowrap;\n z-index: -1;\n border-collapse: collapse;\n line-height: 1.5em;\n}\n\n.models .documents table th {\n position: sticky;\n top: 42px;\n background-color: white;\n z-index: 1;\n}\n\n.models .documents table th:after {\n content: \"\";\n position: absolute;\n left: 0;\n width: 100%;\n bottom: -1px;\n border-bottom: thin solid rgba(0, 0, 0, 0.12);\n}\n\n.models .documents table tr {\n color: black;\n border-spacing: 0px 0px;\n background-color: white;\n cursor: pointer;\n}\n\n.models .documents table tr:nth-child(even) {\n background-color: #f5f5f5;\n}\n\n.models .documents table tr:hover {\n background-color: #a7b9ff;\n}\n\n.models .documents table th,\ntd {\n border-bottom: thin solid rgba(0, 0, 0, 0.12);\n text-align: left;\n padding: 0 16px;\n height: 48px;\n}\n\n.models textarea {\n font-size: 1.2em;\n}\n\n.models .path-type {\n color: rgba(0, 0, 0, 0.36);\n font-size: 0.8em;\n}\n\n.models .documents-menu {\n position: fixed;\n background-color: white;\n z-index: 1;\n padding: 4px;\n display: flex;\n width: 100vw;\n}\n\n@media (min-width: 1024px) {\n .models .documents-menu {\n width: calc(100vw - 12rem);\n }\n}\n\n.models .documents-menu .search-input {\n flex-grow: 1;\n align-items: center;\n}\n\n.models .search-input input {\n padding: 0.25em 0.5em;\n font-size: 1.1em;\n border: 1px solid #ddd;\n border-radius: 3px;\n width: calc(100% - 1em);\n}\n\n.models .sort-arrow {\n padding-left: 10px;\n padding-right: 10px;\n}\n\n.models .loader {\n width: 100%;\n text-align: center;\n}\n\n.models .loader img {\n height: 4em;\n}\n\n.models .documents .buttons {\n display: inline-flex;\n justify-content: space-around;\n align-items: center;\n}\n\n";
4989
5234
 
4990
- /***/ }),
5235
+ /***/ },
4991
5236
 
4992
- /***/ "./frontend/src/models/models.html":
5237
+ /***/ "./frontend/src/models/models.html"
4993
5238
  /*!*****************************************!*\
4994
5239
  !*** ./frontend/src/models/models.html ***!
4995
5240
  \*****************************************/
4996
- /***/ ((module) => {
5241
+ (module) {
4997
5242
 
4998
5243
  "use strict";
4999
- module.exports = "<div class=\"models flex\" style=\"height: calc(100vh - 55px); height: calc(100dvh - 55px)\">\n <div class=\"fixed top-[65px] cursor-pointer bg-gray-100 rounded-r-md z-10\" @click=\"hideSidebar = false\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"h-5 w-5\" viewBox=\"0 -960 960 960\" class=\"w-5\" fill=\"#5f6368\"><path d=\"M360-120v-720h80v720h-80Zm160-160v-400l200 200-200 200Z\"/></svg>\n </div>\n <aside class=\"bg-white border-r overflow-y-auto overflow-x-hidden h-full transition-all duration-300 ease-in-out z-20 w-0 lg:w-48 fixed lg:relative shrink-0\" :class=\"hideSidebar === true ? '!w-0' : hideSidebar === false ? '!w-48' : ''\">\n <div class=\"flex items-center border-b border-gray-100 w-48 overflow-x-hidden\">\n <div class=\"p-4 font-bold text-lg\">Models</div>\n <button\n @click=\"hideSidebar = true\"\n class=\"ml-auto mr-2 p-2 rounded hover:bg-gray-200 focus:outline-none\"\n aria-label=\"Close sidebar\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"h-5 w-5\" viewBox=\"0 -960 960 960\" class=\"w-5\" fill=\"currentColor\"><path d=\"M660-320v-320L500-480l160 160ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm120-80v-560H200v560h120Zm80 0h360v-560H400v560Zm-80 0H200h120Z\"/></svg>\n </button>\n </div>\n <nav class=\"flex flex-1 flex-col\">\n <ul role=\"list\" class=\"flex flex-1 flex-col gap-y-7\">\n <li>\n <ul role=\"list\">\n <li v-for=\"model in models\">\n <router-link\n :to=\"'/model/' + model\"\n class=\"block truncate rounded-md py-2 pr-2 pl-2 text-sm font-semibold text-gray-700\"\n :class=\"model === currentModel ? 'bg-ultramarine-100 font-bold' : 'hover:bg-ultramarine-100'\">\n {{model}}\n </router-link>\n </li>\n </ul>\n </li>\n </ul>\n <div v-if=\"models.length === 0 && status === 'loaded'\" class=\"p-2 bg-red-100\">\n No models found\n </div>\n </nav>\n </aside>\n <div class=\"documents\" ref=\"documentsList\">\n <div class=\"relative h-[42px] z-10\">\n <div class=\"documents-menu\">\n <div class=\"flex flex-row items-center w-full gap-2\">\n <document-search\n ref=\"documentSearch\"\n :value=\"searchText\"\n :schema-paths=\"schemaPaths\"\n @search=\"search\"\n >\n </document-search>\n <div>\n <span v-if=\"numDocuments == null\">Loading ...</span>\n <span v-else-if=\"typeof numDocuments === 'number'\">{{numDocuments === 1 ? numDocuments+ ' document' : numDocuments + ' documents'}}</span>\n </div>\n <button\n @click=\"shouldShowExportModal = true\"\n type=\"button\"\n v-show=\"!selectMultiple\"\n class=\"rounded bg-ultramarine-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n Export\n </button>\n <button\n @click=\"stagingSelect\"\n type=\"button\"\n :class=\"{ 'bg-gray-500 ring-inset ring-2 ring-gray-300 hover:bg-gray-600': selectMultiple, 'bg-ultramarine-600 hover:bg-ultramarine-500' : !selectMultiple }\"\n class=\"rounded px-2 py-2 text-sm font-semibold text-white shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\"\n >\n {{ selectMultiple ? 'Cancel' : 'Select' }}\n </button>\n <button\n v-show=\"selectMultiple\"\n @click=\"shouldShowUpdateMultipleModal=true;\"\n type=\"button\"\n class=\"rounded bg-green-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-green-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-green-600\"\n >\n Update\n </button>\n <button\n @click=\"shouldShowDeleteMultipleModal=true;\"\n type=\"button\"\n v-show=\"selectMultiple\"\n class=\"rounded bg-red-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-red-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-500\"\n >\n Delete\n </button>\n <button\n @click=\"openIndexModal\"\n type=\"button\"\n v-show=\"!selectMultiple\"\n class=\"rounded bg-ultramarine-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n Indexes\n </button>\n <button\n @click=\"shouldShowCreateModal = true;\"\n type=\"button\"\n v-show=\"!selectMultiple\"\n class=\"rounded bg-ultramarine-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n Create\n </button>\n <button\n @click=\"openFieldSelection\"\n type=\"button\"\n v-show=\"!selectMultiple\"\n class=\"rounded bg-ultramarine-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n Fields\n </button>\n <span class=\"isolate inline-flex rounded-md shadow-sm\">\n <button\n @click=\"setOutputType('table')\"\n type=\"button\"\n class=\"relative inline-flex items-center rounded-none rounded-l-md px-2 py-2 text-gray-400 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 focus:z-10\"\n :class=\"outputType === 'table' ? 'bg-gray-200' : 'bg-white'\">\n <img class=\"h-5 w-5\" src=\"images/table.svg\">\n </button>\n <button\n @click=\"setOutputType('json')\"\n type=\"button\"\n class=\"relative -ml-px inline-flex items-center rounded-none rounded-r-md px-2 py-2 text-gray-400 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 focus:z-10\"\n :class=\"outputType === 'json' ? 'bg-gray-200' : 'bg-white'\">\n <img class=\"h-5 w-5\" src=\"images/json.svg\">\n </button>\n </span>\n </div>\n </div>\n </div>\n <div class=\"documents-container relative\">\n <div v-if=\"error\">\n <div class=\"bg-red-100 border border-red-400 text-red-700 px-4 py-3 relative m-4 rounded-md\" role=\"alert\">\n <span class=\"block font-bold\">Error</span>\n <span class=\"block\">{{ error }}</span>\n </div>\n </div>\n <table v-else-if=\"outputType === 'table'\">\n <thead>\n <th v-for=\"path in filteredPaths\" @click=\"addPathFilter(path.path)\" class=\"cursor-pointer\">\n {{path.path}}\n <span class=\"path-type\">\n ({{(path.instance || 'unknown')}})\n </span>\n <span class=\"sort-arrow\" @click=\"sortDocs(1, path.path)\">{{sortBy[path.path] == 1 ? 'X' : '↑'}}</span>\n <span class=\"sort-arrow\" @click=\"sortDocs(-1, path.path)\">{{sortBy[path.path] == -1 ? 'X' : '↓'}}</span>\n </th>\n </thead>\n <tbody>\n <tr v-for=\"document in documents\" @click=\"handleDocumentClick(document, $event)\" :key=\"document._id\">\n <td v-for=\"schemaPath in filteredPaths\" :class=\"{ 'bg-blue-200': selectedDocuments.some(x => x._id.toString() === document._id.toString()) }\">\n <component\n :is=\"getComponentForPath(schemaPath)\"\n :value=\"getValueForPath(document, schemaPath.path)\"\n :allude=\"getReferenceModel(schemaPath)\">\n </component>\n </td>\n </tr>\n </tbody>\n </table>\n <div v-else-if=\"outputType === 'json'\" class=\"flex flex-col space-y-6\">\n <div\n v-for=\"document in documents\"\n :key=\"document._id\"\n @click=\"handleDocumentContainerClick(document, $event)\"\n :class=\"[\n 'group relative transition-colors',\n selectedDocuments.some(x => x._id.toString() === document._id.toString()) ? 'bg-blue-200' : 'hover:bg-slate-100'\n ]\"\n >\n <button\n type=\"button\"\n class=\"absolute top-2 right-2 z-10 inline-flex items-center rounded bg-ultramarine-600 px-2 py-1 text-xs font-semibold text-white shadow-sm transition-opacity duration-150 opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\"\n @click.stop=\"openDocument(document)\"\n >\n Open this Document\n </button>\n <list-json :value=\"filterDocument(document)\" :references=\"referenceMap\">\n </list-json>\n </div>\n </div>\n <div v-if=\"status === 'loading'\" class=\"loader\">\n <img src=\"images/loader.gif\">\n </div>\n </div>\n </div>\n <modal v-if=\"shouldShowExportModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowExportModal = false\">&times;</div>\n <export-query-results\n :schemaPaths=\"schemaPaths\"\n :search-text=\"searchText\"\n :currentModel=\"currentModel\"\n @done=\"shouldShowExportModal = false\">\n </export-query-results>\n </template>\n </modal>\n <modal v-if=\"shouldShowIndexModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowIndexModal = false\">&times;</div>\n <div class=\"text-xl font-bold mb-2\">Indexes</div>\n <div v-for=\"index in mongoDBIndexes\" class=\"w-full flex items-center\">\n <div class=\"grow shrink text-left flex justify-between items-center\" v-if=\"index.name != '_id_'\">\n <div>\n <div class=\"font-bold\">{{ index.name }}</div>\n <div class=\"text-sm font-mono\">{{ JSON.stringify(index.key) }}</div>\n </div>\n <div>\n <async-button\n type=\"button\"\n @click=\"dropIndex(index.name)\"\n class=\"rounded-md bg-valencia-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-valencia-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600 disabled:bg-gray-400 disabled:cursor-not-allowed\">\n Drop\n </async-button>\n </div>\n </div>\n </div>\n </template>\n </modal>\n <modal v-if=\"shouldShowFieldModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowFieldModal = false; selectedPaths = [...filteredPaths];\">&times;</div>\n <div v-for=\"(path, index) in schemaPaths\" :key=\"index\" class=\"w-5 flex items-center\">\n <input class=\"mt-0 h-4 w-4 rounded border-gray-300 text-sky-600 focus:ring-sky-600 accent-sky-600\" type=\"checkbox\" :id=\"'path.path'+index\" @change=\"addOrRemove(path)\" :value=\"path.path\" :checked=\"isSelected(path.path)\" />\n <div class=\"ml-2 text-gray-700 grow shrink text-left\">\n <label :for=\"'path.path' + index\">{{path.path}}</label>\n </div>\n </div>\n <div class=\"mt-4 flex gap-2\">\n <button type=\"button\" @click=\"filterDocuments()\" class=\"rounded-md bg-ultramarine-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600\">Filter Selection</button>\n <button type=\"button\" @click=\"selectAll()\" class=\"rounded-md bg-forest-green-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-green-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-green-600\">Select All</button>\n <button type=\"button\" @click=\"deselectAll()\" class=\"rounded-md bg-valencia-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-valencia-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600\">Deselect All</button>\n <button type=\"button\" @click=\"resetDocuments()\" class=\"rounded-md bg-gray-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-gray-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-green-600\" >Cancel</button>\n </div>\n </template>\n </modal>\n <modal v-if=\"shouldShowCreateModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowCreateModal = false;\">&times;</div>\n <create-document :currentModel=\"currentModel\" :paths=\"schemaPaths\" @close=\"closeCreationModal\"></create-document>\n </template>\n </modal>\n <modal v-if=\"shouldShowUpdateMultipleModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowUpdateMultipleModal = false;\">&times;</div>\n <update-document :currentModel=\"currentModel\" :document=\"selectedDocuments\" :multiple=\"true\" @update=\"updateDocuments\" @close=\"shouldShowUpdateMultipleModal=false;\"></update-document>\n </template>\n </modal>\n <modal v-if=\"shouldShowDeleteMultipleModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowDeleteMultipleModal = false;\">&times;</div>\n <h2>Are you sure you want to delete {{selectedDocuments.length}} documents?</h2>\n <div>\n <list-json :value=\"selectedDocuments\"></list-json>\n </div>\n <div class=\"flex gap-4\">\n <async-button @click=\"deleteDocuments\" class=\"rounded bg-red-500 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-red-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600\">\n Confirm\n </async-button>\n <button @click=\"shouldShowDeleteMultipleModal = false;\" class=\"rounded bg-gray-400 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-gray-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-500\">\n Cancel\n </button>\n </div>\n </template>\n </modal>\n</div>\n";
5244
+ module.exports = "<div class=\"models flex\" style=\"height: calc(100vh - 55px); height: calc(100dvh - 55px)\">\n <div class=\"fixed top-[65px] cursor-pointer bg-gray-100 rounded-r-md z-10\" @click=\"hideSidebar = false\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"h-5 w-5\" viewBox=\"0 -960 960 960\" class=\"w-5\" fill=\"#5f6368\"><path d=\"M360-120v-720h80v720h-80Zm160-160v-400l200 200-200 200Z\"/></svg>\n </div>\n <aside class=\"bg-white border-r overflow-y-auto overflow-x-hidden h-full transition-all duration-300 ease-in-out z-20 w-0 lg:w-48 fixed lg:relative shrink-0\" :class=\"hideSidebar === true ? '!w-0' : hideSidebar === false ? '!w-48' : ''\">\n <div class=\"flex items-center border-b border-gray-100 w-48 overflow-x-hidden\">\n <div class=\"p-4 font-bold text-lg\">Models</div>\n <button\n @click=\"hideSidebar = true\"\n class=\"ml-auto mr-2 p-2 rounded hover:bg-gray-200 focus:outline-none\"\n aria-label=\"Close sidebar\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"h-5 w-5\" viewBox=\"0 -960 960 960\" class=\"w-5\" fill=\"currentColor\"><path d=\"M660-320v-320L500-480l160 160ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm120-80v-560H200v560h120Zm80 0h360v-560H400v560Zm-80 0H200h120Z\"/></svg>\n </button>\n </div>\n <nav class=\"flex flex-1 flex-col\">\n <ul role=\"list\" class=\"flex flex-1 flex-col gap-y-7\">\n <li>\n <ul role=\"list\">\n <li v-for=\"model in models\">\n <router-link\n :to=\"'/model/' + model\"\n class=\"block truncate rounded-md py-2 pr-2 pl-2 text-sm font-semibold text-gray-700\"\n :class=\"model === currentModel ? 'bg-ultramarine-100 font-bold' : 'hover:bg-ultramarine-100'\">\n {{model}}\n </router-link>\n </li>\n </ul>\n </li>\n </ul>\n <div v-if=\"models.length === 0 && status === 'loaded'\" class=\"p-2 bg-red-100\">\n No models found\n </div>\n </nav>\n </aside>\n <div class=\"documents\" ref=\"documentsList\">\n <div class=\"relative h-[42px] z-10\">\n <div class=\"documents-menu\">\n <div class=\"flex flex-row items-center w-full gap-2\">\n <document-search\n ref=\"documentSearch\"\n :value=\"searchText\"\n :schema-paths=\"schemaPaths\"\n @search=\"search\"\n >\n </document-search>\n <div>\n <span v-if=\"numDocuments == null\">Loading ...</span>\n <span v-else-if=\"typeof numDocuments === 'number'\">{{numDocuments === 1 ? numDocuments+ ' document' : numDocuments + ' documents'}}</span>\n </div>\n <button\n @click=\"shouldShowExportModal = true\"\n type=\"button\"\n v-show=\"!selectMultiple\"\n class=\"rounded bg-ultramarine-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n Export\n </button>\n <button\n @click=\"stagingSelect\"\n type=\"button\"\n :class=\"{ 'bg-gray-500 ring-inset ring-2 ring-gray-300 hover:bg-gray-600': selectMultiple, 'bg-ultramarine-600 hover:bg-ultramarine-500' : !selectMultiple }\"\n class=\"rounded px-2 py-2 text-sm font-semibold text-white shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\"\n >\n {{ selectMultiple ? 'Cancel' : 'Select' }}\n </button>\n <button\n v-show=\"selectMultiple\"\n @click=\"shouldShowUpdateMultipleModal=true;\"\n type=\"button\"\n class=\"rounded bg-green-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-green-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-green-600\"\n >\n Update\n </button>\n <button\n @click=\"shouldShowDeleteMultipleModal=true;\"\n type=\"button\"\n v-show=\"selectMultiple\"\n class=\"rounded bg-red-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-red-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-500\"\n >\n Delete\n </button>\n <button\n @click=\"openIndexModal\"\n type=\"button\"\n v-show=\"!selectMultiple\"\n class=\"rounded bg-ultramarine-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n Indexes\n </button>\n <button\n @click=\"shouldShowCreateModal = true;\"\n type=\"button\"\n v-show=\"!selectMultiple\"\n class=\"rounded bg-ultramarine-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n Create\n </button>\n <button\n @click=\"openFieldSelection\"\n type=\"button\"\n v-show=\"!selectMultiple\"\n class=\"rounded bg-ultramarine-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n Fields\n </button>\n <span class=\"isolate inline-flex rounded-md shadow-sm\">\n <button\n @click=\"setOutputType('table')\"\n type=\"button\"\n class=\"relative inline-flex items-center rounded-none rounded-l-md px-2 py-2 text-gray-400 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 focus:z-10\"\n :class=\"outputType === 'table' ? 'bg-gray-200' : 'bg-white'\">\n <img class=\"h-5 w-5\" src=\"images/table.svg\">\n </button>\n <button\n @click=\"setOutputType('json')\"\n type=\"button\"\n class=\"relative -ml-px inline-flex items-center rounded-none rounded-r-md px-2 py-2 text-gray-400 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 focus:z-10\"\n :class=\"outputType === 'json' ? 'bg-gray-200' : 'bg-white'\">\n <img class=\"h-5 w-5\" src=\"images/json.svg\">\n </button>\n </span>\n </div>\n </div>\n </div>\n <div class=\"documents-container relative\">\n <div v-if=\"error\">\n <div class=\"bg-red-100 border border-red-400 text-red-700 px-4 py-3 relative m-4 rounded-md\" role=\"alert\">\n <span class=\"block font-bold\">Error</span>\n <span class=\"block\">{{ error }}</span>\n </div>\n </div>\n <table v-else-if=\"outputType === 'table'\">\n <thead>\n <th v-for=\"path in filteredPaths\" @click=\"addPathFilter(path.path)\" class=\"cursor-pointer\">\n {{path.path}}\n <span class=\"path-type\">\n ({{(path.instance || 'unknown')}})\n </span>\n <span class=\"sort-arrow\" @click=\"sortDocs(1, path.path)\">{{sortBy[path.path] == 1 ? 'X' : '↑'}}</span>\n <span class=\"sort-arrow\" @click=\"sortDocs(-1, path.path)\">{{sortBy[path.path] == -1 ? 'X' : '↓'}}</span>\n </th>\n </thead>\n <tbody>\n <tr v-for=\"document in documents\" @click=\"handleDocumentClick(document, $event)\" :key=\"document._id\">\n <td v-for=\"schemaPath in filteredPaths\" :class=\"{ 'bg-blue-200': selectedDocuments.some(x => x._id.toString() === document._id.toString()) }\">\n <component\n :is=\"getComponentForPath(schemaPath)\"\n :value=\"getValueForPath(document, schemaPath.path)\"\n :allude=\"getReferenceModel(schemaPath)\">\n </component>\n </td>\n </tr>\n </tbody>\n </table>\n <div v-else-if=\"outputType === 'json'\" class=\"flex flex-col space-y-6\">\n <div\n v-for=\"document in documents\"\n :key=\"document._id\"\n @click=\"handleDocumentContainerClick(document, $event)\"\n :class=\"[\n 'group relative transition-colors',\n selectedDocuments.some(x => x._id.toString() === document._id.toString()) ? 'bg-blue-200' : 'hover:bg-slate-100'\n ]\"\n >\n <button\n type=\"button\"\n class=\"absolute top-2 right-2 z-10 inline-flex items-center rounded bg-ultramarine-600 px-2 py-1 text-xs font-semibold text-white shadow-sm transition-opacity duration-150 opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\"\n @click.stop=\"openDocument(document)\"\n >\n Open this Document\n </button>\n <list-json :value=\"filterDocument(document)\" :references=\"referenceMap\">\n </list-json>\n </div>\n </div>\n <div v-if=\"status === 'loading'\" class=\"loader\">\n <img src=\"images/loader.gif\">\n </div>\n </div>\n </div>\n <modal v-if=\"shouldShowExportModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowExportModal = false\">&times;</div>\n <export-query-results\n :schemaPaths=\"schemaPaths\"\n :search-text=\"searchText\"\n :currentModel=\"currentModel\"\n @done=\"shouldShowExportModal = false\">\n </export-query-results>\n </template>\n </modal>\n <modal v-if=\"shouldShowIndexModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowIndexModal = false\">&times;</div>\n <div class=\"text-xl font-bold mb-2\">Indexes</div>\n <div v-for=\"index in mongoDBIndexes\" class=\"w-full flex items-center\">\n <div class=\"grow shrink text-left flex justify-between items-center\" v-if=\"index.name != '_id_'\">\n <div>\n <div class=\"font-bold flex items-center gap-2\">\n <div>{{ index.name }}</div>\n <div v-if=\"isTTLIndex(index)\" class=\"rounded-full bg-ultramarine-100 px-2 py-0.5 text-xs font-semibold text-ultramarine-700\">\n TTL: {{ formatTTL(index.expireAfterSeconds) }}\n </div>\n </div>\n <div class=\"text-sm font-mono\">{{ JSON.stringify(index.key) }}</div>\n </div>\n <div>\n <async-button\n type=\"button\"\n @click=\"dropIndex(index.name)\"\n class=\"rounded-md bg-valencia-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-valencia-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600 disabled:bg-gray-400 disabled:cursor-not-allowed\">\n Drop\n </async-button>\n </div>\n </div>\n </div>\n </template>\n </modal>\n <modal v-if=\"shouldShowFieldModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowFieldModal = false; selectedPaths = [...filteredPaths];\">&times;</div>\n <div v-for=\"(path, index) in schemaPaths\" :key=\"index\" class=\"w-5 flex items-center\">\n <input class=\"mt-0 h-4 w-4 rounded border-gray-300 text-sky-600 focus:ring-sky-600 accent-sky-600\" type=\"checkbox\" :id=\"'path.path'+index\" @change=\"addOrRemove(path)\" :value=\"path.path\" :checked=\"isSelected(path.path)\" />\n <div class=\"ml-2 text-gray-700 grow shrink text-left\">\n <label :for=\"'path.path' + index\">{{path.path}}</label>\n </div>\n </div>\n <div class=\"mt-4 flex gap-2\">\n <button type=\"button\" @click=\"filterDocuments()\" class=\"rounded-md bg-ultramarine-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600\">Filter Selection</button>\n <button type=\"button\" @click=\"selectAll()\" class=\"rounded-md bg-forest-green-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-green-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-green-600\">Select All</button>\n <button type=\"button\" @click=\"deselectAll()\" class=\"rounded-md bg-valencia-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-valencia-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600\">Deselect All</button>\n <button type=\"button\" @click=\"resetDocuments()\" class=\"rounded-md bg-gray-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-gray-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-green-600\" >Cancel</button>\n </div>\n </template>\n </modal>\n <modal v-if=\"shouldShowCreateModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowCreateModal = false;\">&times;</div>\n <create-document :currentModel=\"currentModel\" :paths=\"schemaPaths\" @close=\"closeCreationModal\"></create-document>\n </template>\n </modal>\n <modal v-if=\"shouldShowUpdateMultipleModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowUpdateMultipleModal = false;\">&times;</div>\n <update-document :currentModel=\"currentModel\" :document=\"selectedDocuments\" :multiple=\"true\" @update=\"updateDocuments\" @close=\"shouldShowUpdateMultipleModal=false;\"></update-document>\n </template>\n </modal>\n <modal v-if=\"shouldShowDeleteMultipleModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"shouldShowDeleteMultipleModal = false;\">&times;</div>\n <h2>Are you sure you want to delete {{selectedDocuments.length}} documents?</h2>\n <div>\n <list-json :value=\"selectedDocuments\"></list-json>\n </div>\n <div class=\"flex gap-4\">\n <async-button @click=\"deleteDocuments\" class=\"rounded bg-red-500 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-red-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600\">\n Confirm\n </async-button>\n <button @click=\"shouldShowDeleteMultipleModal = false;\" class=\"rounded bg-gray-400 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-gray-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-500\">\n Cancel\n </button>\n </div>\n </template>\n </modal>\n</div>\n";
5000
5245
 
5001
- /***/ }),
5246
+ /***/ },
5002
5247
 
5003
- /***/ "./frontend/src/models/models.js":
5248
+ /***/ "./frontend/src/models/models.js"
5004
5249
  /*!***************************************!*\
5005
5250
  !*** ./frontend/src/models/models.js ***!
5006
5251
  \***************************************/
5007
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
5252
+ (module, __unused_webpack_exports, __webpack_require__) {
5008
5253
 
5009
5254
  "use strict";
5010
5255
 
@@ -5246,6 +5491,38 @@ module.exports = app => app.component('models', {
5246
5491
  this.mongoDBIndexes = mongoDBIndexes;
5247
5492
  this.schemaIndexes = schemaIndexes;
5248
5493
  },
5494
+ isTTLIndex(index) {
5495
+ return index != null && index.expireAfterSeconds != null;
5496
+ },
5497
+ formatTTL(expireAfterSeconds) {
5498
+ if (typeof expireAfterSeconds !== 'number') {
5499
+ return '';
5500
+ }
5501
+
5502
+ let remaining = expireAfterSeconds;
5503
+ const days = Math.floor(remaining / (24 * 60 * 60));
5504
+ remaining = remaining % (24 * 60 * 60);
5505
+ const hours = Math.floor(remaining / (60 * 60));
5506
+ remaining = remaining % (60 * 60);
5507
+ const minutes = Math.floor(remaining / 60);
5508
+ const seconds = remaining % 60;
5509
+
5510
+ const parts = [];
5511
+ if (days > 0) {
5512
+ parts.push(`${days} day${days === 1 ? '' : 's'}`);
5513
+ }
5514
+ if (hours > 0) {
5515
+ parts.push(`${hours} hour${hours === 1 ? '' : 's'}`);
5516
+ }
5517
+ if (minutes > 0) {
5518
+ parts.push(`${minutes} minute${minutes === 1 ? '' : 's'}`);
5519
+ }
5520
+ if (seconds > 0 || parts.length === 0) {
5521
+ parts.push(`${seconds} second${seconds === 1 ? '' : 's'}`);
5522
+ }
5523
+
5524
+ return parts.join(', ');
5525
+ },
5249
5526
  checkIndexLocation(indexName) {
5250
5527
  if (this.schemaIndexes.find(x => x.name == indexName) && this.mongoDBIndexes.find(x => x.name == indexName)) {
5251
5528
  return 'text-gray-500';
@@ -5502,13 +5779,13 @@ module.exports = app => app.component('models', {
5502
5779
  });
5503
5780
 
5504
5781
 
5505
- /***/ }),
5782
+ /***/ },
5506
5783
 
5507
- /***/ "./frontend/src/models/trie.js":
5784
+ /***/ "./frontend/src/models/trie.js"
5508
5785
  /*!*************************************!*\
5509
5786
  !*** ./frontend/src/models/trie.js ***!
5510
5787
  \*************************************/
5511
- /***/ ((module) => {
5788
+ (module) {
5512
5789
 
5513
5790
  "use strict";
5514
5791
 
@@ -5656,13 +5933,13 @@ module.exports = {
5656
5933
  };
5657
5934
 
5658
5935
 
5659
- /***/ }),
5936
+ /***/ },
5660
5937
 
5661
- /***/ "./frontend/src/mothership.js":
5938
+ /***/ "./frontend/src/mothership.js"
5662
5939
  /*!************************************!*\
5663
5940
  !*** ./frontend/src/mothership.js ***!
5664
5941
  \************************************/
5665
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5942
+ (__unused_webpack_module, exports, __webpack_require__) {
5666
5943
 
5667
5944
  "use strict";
5668
5945
 
@@ -5728,35 +6005,35 @@ exports.updateWorkspaceMember = function updateWorkspaceMember(params) {
5728
6005
  exports.hasAPIKey = client.hasAPIKey;
5729
6006
 
5730
6007
 
5731
- /***/ }),
6008
+ /***/ },
5732
6009
 
5733
- /***/ "./frontend/src/navbar/navbar.css":
6010
+ /***/ "./frontend/src/navbar/navbar.css"
5734
6011
  /*!****************************************!*\
5735
6012
  !*** ./frontend/src/navbar/navbar.css ***!
5736
6013
  \****************************************/
5737
- /***/ ((module) => {
6014
+ (module) {
5738
6015
 
5739
6016
  "use strict";
5740
6017
  module.exports = ".active {\n text-decoration: underline;\n}\n\n.navbar .nav-left {\n float: left;\n line-height: 54px;\n font-size: 20px;\n padding-left: 20px;\n}\n\n.navbar .nav-left a {\n color: #232323;\n}\n\n.navbar .nav-right {\n float: right;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n font-size: 16px;\n line-height: 54px;\n padding-right: 20px;\n}\n\n.navbar .nav-right .nav-item {\n flex-grow: 1;\n padding: 0px 12px;\n position: relative;\n z-index: 21000;\n}\n\n.navbar .nav-right .nav-item:hover {\n flex-grow: 1;\n padding: 0px 12px;\n border-bottom: 1px solid #E1B9A0;\n}\n\n.navbar .nav-right .nav-item.active {\n border-bottom: 1px solid #E1B9A0;\n}\n\n.navbar .nav-action {\n cursor: pointer;\n color: #E1B9A0;\n}\n\n.navbar .nav-action svg {\n height: 1em;\n vertical-align: middle;\n}\n\n.navbar .nav-right .nav-item .flyout {\n position: absolute;\n top: 55px;\n right: 0px;\n visibility: hidden;\n opacity: 0;\n transition: opacity .25s,visibility .25s,transform .25s;\n width: auto;\n box-shadow: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);\n background-color: #393944;\n padding-left: 0.5em;\n padding-right: 0.5em;\n z-index: 1000;\n min-width: 192px;\n font-size: 0.9em;\n}\n\n.navbar .nav-right .nav-item:hover .flyout a {\n color: #E1B9A0;\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n\n.navbar .nav-right .nav-item:hover .flyout a:hover {\n color: #E1B9A0;\n}\n\n.navbar .nav-right .nav-item:hover .flyout .nav-action {\n color: #E1B9A0;\n margin-top: 0.25em;\n margin-bottom: 0.25em;\n}\n\n.navbar .nav-right .nav-item:hover .flyout .nav-action:hover {\n color: #E1B9A0;\n}\n\n.navbar .nav-right .nav-item:hover .flyout {\n visibility: visible;\n opacity: 1;\n}\n\n#bar-1 {\n\ttransform: translateY(-4px);\n}\n#bar-3 {\n\ttransform: translateY(4px);\n}\n.menu {\n display: none;\n}\n.menu {\n\twidth: 35px;\n\theight: 30px;\n\tmargin: 18px 2px 0px 0px;\n\tcursor: pointer;\n float: right;\n}\n.bar {\n\theight: 5px;\n\twidth: 100%;\n\tbackground-color: #fff;\n\tdisplay: block;\n\tborder-radius: 5px;\n\ttransition: 0.4s ease;\n}\n.change-icon #bar-1 {\n transform: translateY(4px) rotateZ(-405deg);\n}\n.change-icon #bar-2 {\n opacity: 0;\n}\n.change-icon #bar-3 {\n transform: translateY(-6px) rotateZ(405deg);\n}\n\n@media (max-width: 767px) {\n .menu {\n display: block;\n }\n\n .change-icon ~ div.nav-right {\n left: 0;\n }\n\n .navbar .nav-right {\n\t\tposition: fixed;\n\t\ttop: 55px;\n\t\tleft: -130%;\n\t\tbackground: #111;\n\t\theight: 100vh;\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t\tdisplay: block;\n\t\ttransition: all 0.3s ease;\n z-index: 10000;\n\t}\n}\n";
5741
6018
 
5742
- /***/ }),
6019
+ /***/ },
5743
6020
 
5744
- /***/ "./frontend/src/navbar/navbar.html":
6021
+ /***/ "./frontend/src/navbar/navbar.html"
5745
6022
  /*!*****************************************!*\
5746
6023
  !*** ./frontend/src/navbar/navbar.html ***!
5747
6024
  \*****************************************/
5748
- /***/ ((module) => {
6025
+ (module) {
5749
6026
 
5750
6027
  "use strict";
5751
6028
  module.exports = "<div class=\"navbar w-full bg-gray-50 flex justify-between border-b border-gray-200 !h-[55px]\">\n <div class=\"flex items-center gap-4 h-full pl-4\">\n <router-link :to=\"{ name: defaultRoute }\">\n <img src=\"images/logo.svg\" class=\"h-[32px] mr-1\" alt=\"Mongoose Studio Logo\" />\n </router-link>\n <div v-if=\"!!state.nodeEnv\" title=\"NODE_ENV\" class=\"inline-flex items-center rounded-md px-2 py-1 text-sm font-medium text-gray-900\" :class=\"warnEnv ? 'bg-red-300' : 'bg-yellow-300'\">\n {{state.nodeEnv}}\n </div>\n </div>\n <div class=\"h-full pr-4 hidden md:block\">\n <div class=\"sm:ml-6 sm:flex sm:space-x-8 h-full\">\n <a v-if=\"hasAccess(roles, 'root')\"\n href=\"#/\"\n class=\"inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium\"\n :class=\"documentView ? 'text-gray-900 border-ultramarine-500' : 'border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700'\">Documents</a>\n <span v-else class=\"inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium text-gray-300 cursor-not-allowed\" aria-disabled=\"true\">\n Documents\n <svg class=\"h-4 w-4 ml-1\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 2a4 4 0 00-4 4v2H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-1V6a4 4 0 00-4-4zm-3 6V6a3 3 0 116 0v2H7z\" clip-rule=\"evenodd\" />\n </svg>\n </span>\n <a v-if=\"hasAccess(roles, 'dashboards')\"\n href=\"#/dashboards\"\n class=\"inline-flex items-center border-b-2 px-1 pt-1 text-sm font-medium\"\n :class=\"dashboardView ? 'text-gray-900 border-ultramarine-500' : 'border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700'\">Dashboards</a>\n <span v-else class=\"inline-flex items-center border-b-2 px-1 pt-1 text-sm font-medium text-gray-300 cursor-not-allowed\">\n Dashboards\n <svg class=\"h-4 w-4 ml-1\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 2a4 4 0 00-4 4v2H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-1V6a4 4 0 00-4-4zm-3 6V6a3 3 0 116 0v2H7z\" clip-rule=\"evenodd\" />\n </svg>\n </span>\n <a v-if=\"hasAccess(roles, 'chat')\"\n href=\"#/chat\"\n class=\"inline-flex items-center border-b-2 px-1 pt-1 text-sm font-medium\"\n :class=\"chatView ? 'text-gray-900 border-ultramarine-500' : 'border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700'\">Chat</a>\n <span v-else class=\"inline-flex items-center border-b-2 px-1 pt-1 text-sm font-medium text-gray-300 cursor-not-allowed\">\n Chat\n <svg class=\"h-4 w-4 ml-1\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 2a4 4 0 00-4 4v2H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-1V6a4 4 0 00-4-4zm-3 6V6a3 3 0 116 0v2H7z\" clip-rule=\"evenodd\" />\n </svg>\n </span>\n <a\n href=\"https://studio.mongoosejs.io/docs\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"inline-flex items-center border-b-2 px-1 pt-1 text-sm font-medium text-gray-500 hover:border-gray-300 hover:text-gray-700 border-transparent\"\n >\n Docs\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"ml-1 h-4 w-4\" viewBox=\"0 -960 960 960\" fill=\"currentColor\"><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h280v80H200v560h560v-280h80v280q0 33-23.5 56.5T760-120H200Zm188-212-56-56 372-372H560v-80h280v280h-80v-144L388-332Z\"/></svg>\n </a>\n\n <div class=\"h-full flex items-center\" v-if=\"!user && hasAPIKey\">\n <button\n type=\"button\"\n @click=\"loginWithGithub\"\n class=\"rounded bg-ultramarine-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n Login\n </button>\n </div>\n <div v-if=\"user && hasAPIKey\" class=\"h-full flex items-center relative\" v-clickOutside=\"hideFlyout\">\n <div>\n <button type=\"button\" @click=\"showFlyout = !showFlyout\" class=\"relative flex rounded-full bg-gray-800 text-sm focus:outline-none focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-gray-800\" id=\"user-menu-button\" aria-expanded=\"false\" aria-haspopup=\"true\">\n <span class=\"absolute -inset-1.5\"></span>\n <span class=\"sr-only\">Open user menu</span>\n <img class=\"size-8 rounded-full\" :src=\"user.picture\" alt=\"\">\n </button>\n </div>\n\n <div v-if=\"showFlyout\" class=\"absolute right-0 z-[100] top-[90%] w-48 origin-top-right rounded-md bg-white py-1 shadow-lg ring-1 ring-black/5 focus:outline-none\" role=\"menu\" aria-orientation=\"vertical\" aria-labelledby=\"user-menu-button\" tabindex=\"-1\">\n <router-link to=\"/team\" v-if=\"hasAccess(roles, 'team')\" @click=\"showFlyout = false\" class=\"cursor-pointer block px-4 py-2 text-sm text-gray-700 hover:bg-ultramarine-200\" role=\"menuitem\" tabindex=\"-1\" id=\"user-menu-item-2\">Team</router-link>\n <span v-else class=\"block px-4 py-2 text-sm text-gray-300 cursor-not-allowed\" role=\"menuitem\" tabindex=\"-1\" id=\"user-menu-item-2\">\n Team\n <svg class=\"h-4 w-4 ml-1 inline\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 2a4 4 0 00-4 4v2H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-1V6a4 4 0 00-4-4zm-3 6V6a3 3 0 116 0v2H7z\" clip-rule=\"evenodd\" />\n </svg>\n </span>\n <span @click=\"logout\" class=\"cursor-pointer block px-4 py-2 text-sm text-gray-700 hover:bg-ultramarine-200\" role=\"menuitem\" tabindex=\"-1\" id=\"user-menu-item-2\">Sign out</span>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"md:hidden flex items-center\">\n <!-- Mobile menu toggle, controls the 'mobileMenuOpen' state. -->\n <button type=\"button\" id=\"open-mobile-menu\" class=\"-ml-2 rounded-md p-2 pr-4 text-gray-400\">\n <span class=\"sr-only\">Open menu</span>\n <svg class=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\" />\n </svg>\n </button>\n </div>\n\n <!-- Mobile menu mask -->\n <div id=\"mobile-menu-mask\" class=\"fixed inset-0 bg-black bg-opacity-40 z-40 hidden\"></div>\n <!-- Mobile menu drawer -->\n <div id=\"mobile-menu\" class=\"fixed inset-0 bg-white shadow-lg z-50 transform translate-x-full transition-transform duration-200 ease-in-out flex flex-col\">\n <div class=\"flex items-center justify-between px-4 !h-[55px] border-b border-gray-200\">\n <router-link :to=\"{ name: defaultRoute }\">\n <img src=\"images/logo.svg\" class=\"h-[32px]\" alt=\"Mongoose Studio Logo\" />\n </router-link>\n <button type=\"button\" id=\"close-mobile-menu\" class=\"text-gray-400 p-2 rounded-md\">\n <span class=\"sr-only\">Close menu</span>\n <svg class=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <nav class=\"flex-1 px-4 py-4 space-y-2\">\n <a v-if=\"hasAccess(roles, 'root')\"\n href=\"#/\"\n class=\"block px-3 py-2 rounded-md text-base font-medium\"\n :class=\"documentView ? 'text-ultramarine-700 bg-ultramarine-100' : 'text-gray-700 hover:bg-gray-100'\">Documents</a>\n <span v-else class=\"block px-3 py-2 rounded-md text-base font-medium text-gray-300 cursor-not-allowed\">\n Documents\n <svg class=\"h-4 w-4 ml-1 inline\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 2a4 4 0 00-4 4v2H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-1V6a4 4 0 00-4-4zm-3 6V6a3 3 0 116 0v2H7z\" clip-rule=\"evenodd\" />\n </svg>\n </span>\n <a v-if=\"hasAccess(roles, 'dashboards')\"\n href=\"#/dashboards\"\n class=\"block px-3 py-2 rounded-md text-base font-medium\"\n :class=\"dashboardView ? 'text-ultramarine-700 bg-ultramarine-100' : 'text-gray-700 hover:bg-gray-100'\">Dashboards</a>\n <span v-else class=\"block px-3 py-2 rounded-md text-base font-medium text-gray-300 cursor-not-allowed\">\n Dashboards\n <svg class=\"h-4 w-4 ml-1 inline\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 2a4 4 0 00-4 4v2H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-1V6a4 4 0 00-4-4zm-3 6V6a3 3 0 116 0v2H7z\" clip-rule=\"evenodd\" />\n </svg>\n </span>\n <a v-if=\"hasAccess(roles, 'chat')\"\n href=\"#/chat\"\n class=\"block px-3 py-2 rounded-md text-base font-medium\"\n :class=\"chatView ? 'text-ultramarine-700 bg-ultramarine-100' : 'text-gray-700 hover:bg-gray-100'\">Chat</a>\n <span v-else class=\"block px-3 py-2 rounded-md text-base font-medium text-gray-300 cursor-not-allowed\">\n Chat\n <svg class=\"h-4 w-4 ml-1 inline\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 2a4 4 0 00-4 4v2H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-1V6a4 4 0 00-4-4zm-3 6V6a3 3 0 116 0v2H7z\" clip-rule=\"evenodd\" />\n </svg>\n </span>\n <div v-if=\"!user && hasAPIKey\" class=\"mt-4\">\n <button\n type=\"button\"\n @click=\"loginWithGithub\"\n class=\"w-full rounded bg-ultramarine-600 px-3 py-2 text-base font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n Login\n </button>\n </div>\n <div v-if=\"user && hasAPIKey\" class=\"mt-4\">\n <div class=\"flex items-center gap-3 px-3 py-2 bg-gray-50 rounded-md\">\n <img class=\"size-8 rounded-full\" :src=\"user.picture\" alt=\"\">\n <span class=\"text-gray-900 font-medium\">{{ user.name }}</span>\n </div>\n <div class=\"mt-2 space-y-1\">\n <router-link to=\"/team\" v-if=\"hasAccess(roles, 'team')\" class=\"block px-3 py-2 rounded-md text-base text-gray-700 hover:bg-ultramarine-100\">Team</router-link>\n <span v-else class=\"block px-3 py-2 rounded-md text-base text-gray-300 cursor-not-allowed\">\n Team\n <svg class=\"h-4 w-4 ml-1 inline\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 2a4 4 0 00-4 4v2H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-1V6a4 4 0 00-4-4zm-3 6V6a3 3 0 116 0v2H7z\" clip-rule=\"evenodd\" />\n </svg>\n </span>\n <span @click=\"logout\" class=\"block px-3 py-2 rounded-md text-base text-gray-700 hover:bg-ultramarine-100 cursor-pointer\">Sign out</span>\n </div>\n </div>\n </nav>\n </div>\n</div>\n";
5752
6029
 
5753
- /***/ }),
6030
+ /***/ },
5754
6031
 
5755
- /***/ "./frontend/src/navbar/navbar.js":
6032
+ /***/ "./frontend/src/navbar/navbar.js"
5756
6033
  /*!***************************************!*\
5757
6034
  !*** ./frontend/src/navbar/navbar.js ***!
5758
6035
  \***************************************/
5759
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6036
+ (module, __unused_webpack_exports, __webpack_require__) {
5760
6037
 
5761
6038
  "use strict";
5762
6039
 
@@ -5856,13 +6133,13 @@ module.exports = app => app.component('navbar', {
5856
6133
  });
5857
6134
 
5858
6135
 
5859
- /***/ }),
6136
+ /***/ },
5860
6137
 
5861
- /***/ "./frontend/src/routes.js":
6138
+ /***/ "./frontend/src/routes.js"
5862
6139
  /*!********************************!*\
5863
6140
  !*** ./frontend/src/routes.js ***!
5864
6141
  \********************************/
5865
- /***/ ((module) => {
6142
+ (module) {
5866
6143
 
5867
6144
  "use strict";
5868
6145
 
@@ -5957,24 +6234,24 @@ module.exports = {
5957
6234
  };
5958
6235
 
5959
6236
 
5960
- /***/ }),
6237
+ /***/ },
5961
6238
 
5962
- /***/ "./frontend/src/splash/splash.html":
6239
+ /***/ "./frontend/src/splash/splash.html"
5963
6240
  /*!*****************************************!*\
5964
6241
  !*** ./frontend/src/splash/splash.html ***!
5965
6242
  \*****************************************/
5966
- /***/ ((module) => {
6243
+ (module) {
5967
6244
 
5968
6245
  "use strict";
5969
6246
  module.exports = "<div class=\"w-full h-full flex items-center justify-center\">\n <div class=\"text-center\">\n <div class=\"rounded-full bg-gray-100 p-6 inline-block\">\n <img src=\"images/logo.svg\" class=\"w-48 h-48\">\n </div>\n <div class=\"text-lg mt-2 font-bold\">\n Mongoose Studio\n </div>\n <div v-if=\"loading\" class=\"mt-2\">\n <img src=\"images/loader.gif\" class=\"inline w-16 h-16\">\n </div>\n <div class=\"mt-2 text-gray-700\" v-if=\"!loading\">\n {{workspaceName}}\n </div>\n <div class=\"mt-4 flex gap-4 justify-center\" v-if=\"!loading\">\n <div>\n <async-button\n type=\"button\"\n @click=\"loginWithGithub\"\n class=\"rounded bg-ultramarine-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600 disabled:bg-gray-500\">\n <svg viewBox=\"0 0 98 98\" class=\"inline mr-1\" height=\"1.5em\" xmlns=\"http://www.w3.org/2000/svg\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z\" fill=\"#fff\"/></svg>\n Login With GitHub\n </async-button>\n </div>\n <div>\n <async-button\n type=\"button\"\n @click=\"loginWithGoogle\"\n class=\"rounded bg-ultramarine-600 px-2 py-2 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600 disabled:bg-gray-500\">\n <svg class=\"inline\" xmlns=\"http://www.w3.org/2000/svg\" height=\"1.5em\" viewBox=\"0 0 512 512\"><path fill=\"#fff\" d=\"M386 400c45-42 65-112 53-179H260v74h102c-4 24-18 44-38 57z\"/><path fill=\"#fff\" d=\"M90 341a192 192 0 0 0 296 59l-62-48c-53 35-141 22-171-60z\"/><path fill=\"#fff\" d=\"M153 292c-8-25-8-48 0-73l-63-49c-23 46-30 111 0 171z\"/><path fill=\"#fff\" d=\"M153 219c22-69 116-109 179-50l55-54c-78-75-230-72-297 55z\"/></svg>\n Login With Google\n </async-button>\n </div>\n </div>\n <div class=\"mt-4\" v-if=\"state.authError\">\n <div class=\"rounded-md bg-red-50 p-4\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"size-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">{{state.authError}}</h3>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n";
5970
6247
 
5971
- /***/ }),
6248
+ /***/ },
5972
6249
 
5973
- /***/ "./frontend/src/splash/splash.js":
6250
+ /***/ "./frontend/src/splash/splash.js"
5974
6251
  /*!***************************************!*\
5975
6252
  !*** ./frontend/src/splash/splash.js ***!
5976
6253
  \***************************************/
5977
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6254
+ (module, __unused_webpack_exports, __webpack_require__) {
5978
6255
 
5979
6256
  "use strict";
5980
6257
 
@@ -6005,24 +6282,24 @@ module.exports = app => app.component('splash', {
6005
6282
  });
6006
6283
 
6007
6284
 
6008
- /***/ }),
6285
+ /***/ },
6009
6286
 
6010
- /***/ "./frontend/src/team/new-invitation/new-invitation.html":
6287
+ /***/ "./frontend/src/team/new-invitation/new-invitation.html"
6011
6288
  /*!**************************************************************!*\
6012
6289
  !*** ./frontend/src/team/new-invitation/new-invitation.html ***!
6013
6290
  \**************************************************************/
6014
- /***/ ((module) => {
6291
+ (module) {
6015
6292
 
6016
6293
  "use strict";
6017
6294
  module.exports = "<div class=\"p-1\">\n <form class=\"space-y-4\">\n <div class=\"text-lg font-bold\">\n New Invitation\n </div>\n\n <div>\n <label for=\"githubUsername\" class=\"block text-sm/6 font-medium text-gray-900\">GitHub Username</label>\n <div class=\"mt-2\">\n <input type=\"githubUsername\" name=\"githubUsername\" id=\"githubUsername\" v-model=\"githubUsername\" class=\"block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-ultramarine-600 sm:text-sm/6\" placeholder=\"johnsmith12\">\n </div>\n </div>\n\n <div>\n <label for=\"email\" class=\"block text-sm/6 font-medium text-gray-900\">Email (Optional)</label>\n <div class=\"mt-2\">\n <input type=\"email\" name=\"email\" id=\"email\" v-model=\"email\" class=\"block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-ultramarine-600 sm:text-sm/6\" placeholder=\"you@example.com\">\n </div>\n </div>\n\n <div>\n <label for=\"location\" class=\"block text-sm/6 font-medium text-gray-900\">Role</label>\n <div class=\"mt-2 grid grid-cols-1\">\n <select id=\"role\" :disabled=\"tier == null\" name=\"role\" v-model=\"role\" class=\"col-start-1 row-start-1 w-full appearance-none rounded-md bg-white py-1.5 pl-3 pr-8 text-base text-gray-900 outline outline-1 -outline-offset-1 outline-gray-300 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:text-sm/6\">\n <option value=\"admin\">Admin</option>\n <option value=\"member\">Member</option>\n <option value=\"readonly\">Read-only</option>\n <option value=\"dashboards\">Dashboards Only</option>\n </select>\n <svg class=\"pointer-events-none col-start-1 row-start-1 mr-2 size-5 self-center justify-self-end text-gray-500 sm:size-4\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div v-if=\"tier == null\" class=\"text-sm text-gray-700\">\n You can only invite \"Dashboards Only\" users until you set up a subscription.\n </div>\n </div>\n\n <async-button\n type=\"submit\"\n @click=\"inviteToWorkspace\"\n class=\"inline-flex justify-center rounded-md border border-transparent bg-forest-green-600 py-2 px-4 text-sm font-medium text-white shadow-sm hover:bg-forest-green-500 focus:outline-none focus:ring-2 focus:ring-forest-green-500 focus:ring-offset-2\">\n Submit\n </async-button>\n </form>\n</div>\n";
6018
6295
 
6019
- /***/ }),
6296
+ /***/ },
6020
6297
 
6021
- /***/ "./frontend/src/team/new-invitation/new-invitation.js":
6298
+ /***/ "./frontend/src/team/new-invitation/new-invitation.js"
6022
6299
  /*!************************************************************!*\
6023
6300
  !*** ./frontend/src/team/new-invitation/new-invitation.js ***!
6024
6301
  \************************************************************/
6025
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6302
+ (module, __unused_webpack_exports, __webpack_require__) {
6026
6303
 
6027
6304
  "use strict";
6028
6305
 
@@ -6054,24 +6331,24 @@ module.exports = app => app.component('new-invitation', {
6054
6331
  });
6055
6332
 
6056
6333
 
6057
- /***/ }),
6334
+ /***/ },
6058
6335
 
6059
- /***/ "./frontend/src/team/team.html":
6336
+ /***/ "./frontend/src/team/team.html"
6060
6337
  /*!*************************************!*\
6061
6338
  !*** ./frontend/src/team/team.html ***!
6062
6339
  \*************************************/
6063
- /***/ ((module) => {
6340
+ (module) {
6064
6341
 
6065
6342
  "use strict";
6066
6343
  module.exports = "<div class=\"mx-auto max-w-5xl py-6 px-2 flex flex-col gap-8\">\n <div>\n <div class=\"text-xl font-bold\">\n Subscription Details\n </div>\n <div v-if=\"status === 'loading'\" class=\"mt-4\">\n <img src=\"images/loader.gif\" class=\"inline w-8 h-8\">\n </div>\n <div v-else-if=\"workspace && workspace.subscriptionTier\" class=\"mt-4 flex justify-between items-center\">\n <div>\n <span class=\"font-bold\">Tier:</span> {{workspace.subscriptionTier ?? 'No subscription'}}\n </div>\n <div>\n <async-button\n type=\"submit\"\n @click=\"getWorkspaceCustomerPortalLink\"\n class=\"inline-flex items-center justify-center rounded-md border border-transparent bg-ultramarine-600 py-1 px-2 text-sm font-medium text-white shadow-sm hover:bg-ultramarine-500 focus:outline-none focus:ring-2 focus:ring-forest-green-500 focus:ring-offset-2\">\n View in Stripe\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-4 h-4 ml-1\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\" />\n </svg>\n </async-button>\n </div>\n </div>\n <div v-else-if=\"workspace && !workspace.subscriptionTier\" class=\"mt-4 flex justify-between items-center\">\n <div>\n <span class=\"font-bold\">No active subscription</span>\n <div class=\"text-sm text-gray-700\">\n You won't be able to invite your team until you activate a subscription\n </div>\n </div>\n <div>\n <a\n :href=\"paymentLink\"\n target=\"_blank\"\n class=\"inline-flex items-center justify-center rounded-md border border-transparent bg-ultramarine-600 py-1 px-2 text-sm font-medium text-white shadow-sm hover:bg-ultramarine-500 focus:outline-none focus:ring-2 focus:ring-ultramarine-500 focus:ring-offset-2\">\n Subscribe With Stripe\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-4 h-4 ml-1\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\" />\n </svg>\n </a>\n </div>\n </div>\n </div>\n <div>\n <div class=\"text-xl font-bold\">\n Current Members\n </div>\n <div v-if=\"status === 'loading'\" class=\"mt-4\">\n <img src=\"images/loader.gif\" class=\"inline w-8 h-8\">\n </div>\n <ul v-else role=\"list\" class=\"divide-y divide-gray-100\">\n <li class=\"flex justify-between gap-x-6 py-5\" v-for=\"user in users\">\n <div class=\"flex min-w-0 gap-x-4\">\n <img class=\"size-12 flex-none rounded-full bg-gray-50\" :src=\"user.picture ?? 'images/logo.svg'\" alt=\"\">\n <div class=\"min-w-0 flex-auto\">\n <p class=\"text-sm/6 font-semibold text-gray-900\">\n {{user.name || user.githubUsername}}\n <span v-if=\"user.isFreeUser\" class=\"ml-1 inline-flex items-center rounded-md bg-green-50 px-2 py-1 text-xs font-medium text-green-700 ring-1 ring-inset ring-green-600/20\">Free</span>\n </p>\n <p class=\"mt-1 truncate text-xs/5 text-gray-500\">{{user.email ?? 'No Email'}}</p>\n </div>\n </div>\n <div class=\"hidden shrink-0 sm:flex sm:flex-col sm:items-end\">\n <p class=\"text-sm/6 text-gray-900 capitalize\">{{getRolesForUser(user).join(', ')}}</p>\n <div class=\"flex gap-3\">\n <button\n type=\"button\"\n class=\"mt-1 text-xs/5 text-gray-500 cursor-pointer disabled:cursor-not-allowed disabled:text-gray-300\"\n :disabled=\"getRolesForUser(user).includes('owner')\"\n @click=\"openEditModal(user)\">\n Edit\n </button>\n <button\n class=\"mt-1 text-xs/5 text-valencia-500 cursor-pointer disabled:cursor-not-allowed disabled:text-gray-300\"\n :disabled=\"getRolesForUser(user).includes('owner')\"\n @click=\"showRemoveModal = user\">\n Remove\n </button>\n </div>\n </div>\n </li>\n </ul>\n </div>\n <div>\n <div class=\"flex items-center justify-between\">\n <div class=\"text-xl font-bold\">\n Invitations\n </div>\n <div class=\"mt-4 sm:ml-16 sm:mt-0 sm:flex-none\">\n <button\n type=\"button\"\n @click=\"showNewInvitationModal = true\"\n :disabled=\"status === 'loading'\"\n :tier=\"workspace?.subscriptionTier\"\n class=\"block rounded-md bg-ultramarine-600 px-3 py-2 text-center text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 disabled:bg-gray-500 disabled:cursor-not-allowed focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600\">\n New Invitation\n <svg class=\"inline w-4 h-4 ml-1\" v-if=\"workspace && !workspace.subscriptionTier\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M12 1.5a5.25 5.25 0 00-5.25 5.25v3a3 3 0 00-3 3v6.75a3 3 0 003 3h10.5a3 3 0 003-3v-6.75a3 3 0 00-3-3v-3c0-2.9-2.35-5.25-5.25-5.25zm3.75 8.25v-3a3.75 3.75 0 10-7.5 0v3h7.5z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n <div v-if=\"status === 'loading'\" class=\"mt-4\">\n <img src=\"images/loader.gif\" class=\"inline w-8 h-8\">\n </div>\n <div v-else-if=\"invitations?.length > 0\" class=\"mt-8 flow-root\" v-if=\"invitations?.length > 0\">\n <div class=\"-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8\">\n <table class=\"min-w-full divide-y divide-gray-300\">\n <thead>\n <tr>\n <th scope=\"col\" class=\"py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-0\">GitHub Username</th>\n <th scope=\"col\" class=\"px-3 py-3.5 text-left text-sm font-semibold text-gray-900\">Email</th>\n <th scope=\"col\" class=\"px-3 py-3.5 text-left text-sm font-semibold text-gray-900\">Status</th>\n <th scope=\"col\" class=\"px-3 py-3.5 text-left text-sm font-semibold text-gray-900\">Role</th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200 bg-white\">\n <tr v-for=\"invitation in invitations\">\n <td class=\"whitespace-nowrap py-5 pl-4 pr-3 text-sm sm:pl-0\">\n {{invitation.githubUsername}}\n </td>\n <td class=\"whitespace-nowrap px-3 py-5 text-sm text-gray-500\">\n {{invitation.email}}\n </td>\n <td class=\"whitespace-nowrap px-3 py-5 text-sm text-gray-500\">\n <span class=\"inline-flex items-center rounded-md bg-gray-50 px-2 py-1 text-xs font-medium text-gray-700 ring-1 ring-inset ring-gray-600/20\">\n Pending\n </span>\n </td>\n <td class=\"whitespace-nowrap px-3 py-5 text-sm text-gray-500\">\n {{invitation.roles.join(', ')}}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n <div v-else-if=\"invitations?.length === 0\" class=\"mt-4\">\n <div class=\"text-center\">\n <svg class=\"mx-auto size-12 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path vector-effect=\"non-scaling-stroke\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z\" />\n </svg>\n <h3 class=\"mt-2 text-sm font-semibold text-gray-900\">No invitations</h3>\n <p class=\"mt-1 text-sm text-gray-500\">You have no outstanding invitations</p>\n </div>\n </div>\n </div>\n\n <modal v-if=\"showNewInvitationModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"showNewInvitationModal = false\">&times;</div>\n <new-invitation @close=\"showNewInvitationModal = false\" @invitationCreated=\"invitations.push($event.invitation)\"></new-invitation>\n </template>\n </modal>\n\n <modal v-if=\"showEditModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"closeEditModal\">&times;</div>\n <div class=\"p-1 space-y-4\">\n <div class=\"text-lg font-bold\">\n Edit Member\n </div>\n\n <div>\n <div class=\"text-sm/6 font-semibold text-gray-900\">\n {{showEditModal.user.name || showEditModal.user.githubUsername}}\n </div>\n <div class=\"text-xs/5 text-gray-500\">\n {{showEditModal.user.email ?? 'No Email'}}\n </div>\n </div>\n\n <div>\n <label for=\"editRole\" class=\"block text-sm/6 font-medium text-gray-900\">Role</label>\n <div class=\"mt-2 grid grid-cols-1\">\n <select\n id=\"editRole\"\n name=\"editRole\"\n v-model=\"showEditModal.role\"\n class=\"col-start-1 row-start-1 w-full appearance-none rounded-md bg-white py-1.5 pl-3 pr-8 text-base text-gray-900 outline outline-1 -outline-offset-1 outline-gray-300 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-ultramarine-600 sm:text-sm/6\">\n <option value=\"admin\" :disabled=\"disableRoleOption('admin')\">Admin</option>\n <option value=\"member\" :disabled=\"disableRoleOption('member')\">Member</option>\n <option value=\"readonly\" :disabled=\"disableRoleOption('readonly')\">Read-only</option>\n <option value=\"dashboards\" :disabled=\"disableRoleOption('dashboards')\">Dashboards Only</option>\n </select>\n <svg class=\"pointer-events-none col-start-1 row-start-1 mr-2 size-5 self-center justify-self-end text-gray-500 sm:size-4\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div v-if=\"!workspace?.subscriptionTier\" class=\"mt-2 text-sm text-gray-700\">\n You can only assign the \"Dashboards Only\" role until you activate a subscription.\n </div>\n </div>\n\n <div class=\"mt-6 grid grid-cols-2 gap-4\">\n <async-button\n @click=\"updateWorkspaceMember\"\n :disabled=\"showEditModal.role === showEditModal.originalRole\"\n class=\"border-0 mt-0 flex w-full items-center justify-center gap-3 rounded-md bg-ultramarine-600 hover:bg-ultramarine-500 px-3 py-1.5 text-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-500\">\n <span class=\"text-sm font-semibold leading-6\">Save</span>\n </async-button>\n\n <span @click=\"closeEditModal\" class=\"cursor-pointer flex w-full items-center justify-center gap-3 rounded-md bg-slate-500 hover:bg-slate-400 px-3 py-1.5 text-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-slate-400\">\n <span class=\"text-sm font-semibold leading-6\">Cancel</span>\n </span>\n </div>\n </div>\n </template>\n </modal>\n\n <modal v-if=\"showRemoveModal\">\n <template v-slot:body>\n <div class=\"modal-exit\" @click=\"showRemoveModal = null\">&times;</div>\n <div>\n Are you sure you want to remove user <span class=\"font-bold\">{{showRemoveModal.githubUsername}}</span> from this workspace?\n </div>\n <div class=\"mt-6 grid grid-cols-2 gap-4\">\n <async-button\n @click=\"removeFromWorkspace\"\n class=\"border-0 mt-0 flex w-full items-center justify-center gap-3 rounded-md bg-valencia-500 hover:bg-valencia-400 px-3 py-1.5 text-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-orange-400\">\n <span class=\"text-sm font-semibold leading-6\">Yes, Remove</span>\n </async-button>\n\n <span @click=\"showRemoveModal = null\" class=\"cursor-pointer flex w-full items-center justify-center gap-3 rounded-md bg-slate-500 hover:bg-slate-400 px-3 py-1.5 text-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-slate-400\">\n <span class=\"text-sm font-semibold leading-6\">Cancel</span>\n </span>\n </div>\n </template>\n </modal>\n</div>\n";
6067
6344
 
6068
- /***/ }),
6345
+ /***/ },
6069
6346
 
6070
- /***/ "./frontend/src/team/team.js":
6347
+ /***/ "./frontend/src/team/team.js"
6071
6348
  /*!***********************************!*\
6072
6349
  !*** ./frontend/src/team/team.js ***!
6073
6350
  \***********************************/
6074
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6351
+ (module, __unused_webpack_exports, __webpack_require__) {
6075
6352
 
6076
6353
  "use strict";
6077
6354
 
@@ -6168,35 +6445,35 @@ module.exports = app => app.component('team', {
6168
6445
  });
6169
6446
 
6170
6447
 
6171
- /***/ }),
6448
+ /***/ },
6172
6449
 
6173
- /***/ "./frontend/src/update-document/update-document.css":
6450
+ /***/ "./frontend/src/update-document/update-document.css"
6174
6451
  /*!**********************************************************!*\
6175
6452
  !*** ./frontend/src/update-document/update-document.css ***!
6176
6453
  \**********************************************************/
6177
- /***/ ((module) => {
6454
+ (module) {
6178
6455
 
6179
6456
  "use strict";
6180
6457
  module.exports = "";
6181
6458
 
6182
- /***/ }),
6459
+ /***/ },
6183
6460
 
6184
- /***/ "./frontend/src/update-document/update-document.html":
6461
+ /***/ "./frontend/src/update-document/update-document.html"
6185
6462
  /*!***********************************************************!*\
6186
6463
  !*** ./frontend/src/update-document/update-document.html ***!
6187
6464
  \***********************************************************/
6188
- /***/ ((module) => {
6465
+ (module) {
6189
6466
 
6190
6467
  "use strict";
6191
6468
  module.exports = "<div>\n <div class=\"mb-2\">\n <textarea class=\"border border-gray-200 p-2 h-[300px] w-full\" ref=\"codeEditor\"></textarea>\n </div>\n <button @click=\"updateDocument()\" class=\"rounded-md bg-ultramarine-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600\">Submit</button>\n <div v-if=\"errors.length > 0\" class=\"rounded-md bg-red-50 p-4 mt-1\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">There were {{errors.length}} errors with your submission</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n <ul role=\"list\" class=\"list-disc space-y-1 pl-5\">\n <li v-for=\"error in errors\">\n {{error}}\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n </div>";
6192
6469
 
6193
- /***/ }),
6470
+ /***/ },
6194
6471
 
6195
- /***/ "./frontend/src/update-document/update-document.js":
6472
+ /***/ "./frontend/src/update-document/update-document.js"
6196
6473
  /*!*********************************************************!*\
6197
6474
  !*** ./frontend/src/update-document/update-document.js ***!
6198
6475
  \*********************************************************/
6199
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6476
+ (module, __unused_webpack_exports, __webpack_require__) {
6200
6477
 
6201
6478
  "use strict";
6202
6479
 
@@ -6271,13 +6548,13 @@ module.exports = app => app.component('update-document', {
6271
6548
  });
6272
6549
 
6273
6550
 
6274
- /***/ }),
6551
+ /***/ },
6275
6552
 
6276
- /***/ "./node_modules/axios/dist/browser/axios.cjs":
6553
+ /***/ "./node_modules/axios/dist/browser/axios.cjs"
6277
6554
  /*!***************************************************!*\
6278
6555
  !*** ./node_modules/axios/dist/browser/axios.cjs ***!
6279
6556
  \***************************************************/
6280
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6557
+ (module, __unused_webpack_exports, __webpack_require__) {
6281
6558
 
6282
6559
  "use strict";
6283
6560
  // Axios v1.2.2 Copyright (c) 2022 Matt Zabriskie and contributors
@@ -9437,13 +9714,13 @@ module.exports = axios;
9437
9714
  //# sourceMappingURL=axios.cjs.map
9438
9715
 
9439
9716
 
9440
- /***/ }),
9717
+ /***/ },
9441
9718
 
9442
- /***/ "./node_modules/bson/lib/bson.mjs":
9719
+ /***/ "./node_modules/bson/lib/bson.mjs"
9443
9720
  /*!****************************************!*\
9444
9721
  !*** ./node_modules/bson/lib/bson.mjs ***!
9445
9722
  \****************************************/
9446
- /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
9723
+ (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
9447
9724
 
9448
9725
  "use strict";
9449
9726
  __webpack_require__.r(__webpack_exports__);
@@ -14120,13 +14397,13 @@ var bson = /*#__PURE__*/Object.freeze({
14120
14397
  //# sourceMappingURL=bson.mjs.map
14121
14398
 
14122
14399
 
14123
- /***/ }),
14400
+ /***/ },
14124
14401
 
14125
- /***/ "./node_modules/marked/lib/marked.cjs":
14402
+ /***/ "./node_modules/marked/lib/marked.cjs"
14126
14403
  /*!********************************************!*\
14127
14404
  !*** ./node_modules/marked/lib/marked.cjs ***!
14128
14405
  \********************************************/
14129
- /***/ ((module) => {
14406
+ (module) {
14130
14407
 
14131
14408
  "use strict";
14132
14409
  /**
@@ -16342,13 +16619,13 @@ var lexer = _Lexer.lex;
16342
16619
  //# sourceMappingURL=marked.cjs.map
16343
16620
 
16344
16621
 
16345
- /***/ }),
16622
+ /***/ },
16346
16623
 
16347
- /***/ "./node_modules/mongodb/lib/bson.js":
16624
+ /***/ "./node_modules/mongodb/lib/bson.js"
16348
16625
  /*!******************************************!*\
16349
16626
  !*** ./node_modules/mongodb/lib/bson.js ***!
16350
16627
  \******************************************/
16351
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
16628
+ (__unused_webpack_module, exports, __webpack_require__) {
16352
16629
 
16353
16630
  "use strict";
16354
16631
 
@@ -16436,13 +16713,13 @@ function parseUtf8ValidationOption(options) {
16436
16713
  }
16437
16714
  //# sourceMappingURL=bson.js.map
16438
16715
 
16439
- /***/ }),
16716
+ /***/ },
16440
16717
 
16441
- /***/ "./node_modules/mpath/index.js":
16718
+ /***/ "./node_modules/mpath/index.js"
16442
16719
  /*!*************************************!*\
16443
16720
  !*** ./node_modules/mpath/index.js ***!
16444
16721
  \*************************************/
16445
- /***/ ((module, exports, __webpack_require__) => {
16722
+ (module, exports, __webpack_require__) {
16446
16723
 
16447
16724
  "use strict";
16448
16725
 
@@ -16450,13 +16727,13 @@ function parseUtf8ValidationOption(options) {
16450
16727
  module.exports = exports = __webpack_require__(/*! ./lib */ "./node_modules/mpath/lib/index.js");
16451
16728
 
16452
16729
 
16453
- /***/ }),
16730
+ /***/ },
16454
16731
 
16455
- /***/ "./node_modules/mpath/lib/index.js":
16732
+ /***/ "./node_modules/mpath/lib/index.js"
16456
16733
  /*!*****************************************!*\
16457
16734
  !*** ./node_modules/mpath/lib/index.js ***!
16458
16735
  \*****************************************/
16459
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
16736
+ (__unused_webpack_module, exports, __webpack_require__) {
16460
16737
 
16461
16738
  /* eslint strict:off */
16462
16739
  /* eslint no-var: off */
@@ -16785,13 +17062,13 @@ function K(v) {
16785
17062
  return v;
16786
17063
  }
16787
17064
 
16788
- /***/ }),
17065
+ /***/ },
16789
17066
 
16790
- /***/ "./node_modules/mpath/lib/stringToParts.js":
17067
+ /***/ "./node_modules/mpath/lib/stringToParts.js"
16791
17068
  /*!*************************************************!*\
16792
17069
  !*** ./node_modules/mpath/lib/stringToParts.js ***!
16793
17070
  \*************************************************/
16794
- /***/ ((module) => {
17071
+ (module) {
16795
17072
 
16796
17073
  "use strict";
16797
17074
 
@@ -16843,13 +17120,13 @@ module.exports = function stringToParts(str) {
16843
17120
  return result;
16844
17121
  };
16845
17122
 
16846
- /***/ }),
17123
+ /***/ },
16847
17124
 
16848
- /***/ "./node_modules/node-inspect-extracted/dist/inspect.js":
17125
+ /***/ "./node_modules/node-inspect-extracted/dist/inspect.js"
16849
17126
  /*!*************************************************************!*\
16850
17127
  !*** ./node_modules/node-inspect-extracted/dist/inspect.js ***!
16851
17128
  \*************************************************************/
16852
- /***/ (function(module) {
17129
+ (module) {
16853
17130
 
16854
17131
  /*! For license information please see inspect.js.LICENSE.txt */
16855
17132
  !function(t,e){ true?module.exports=e():0}(this,()=>(()=>{"use strict";var t={0:(t,e,r)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function o(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,c=[],u=!0,l=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=a.call(r)).done)&&(c.push(n.value),c.length!==e);u=!0);}catch(t){l=!0,o=t}finally{try{if(!u&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(l)throw o}}return c}}(t,e)||i(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=i(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,c=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return c=t.done,t},e:function(t){u=!0,a=t},f:function(){try{c||null==r.return||r.return()}finally{if(u)throw a}}}}function i(t,e){if(t){if("string"==typeof t)return c(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c(t,e):void 0}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var u=r(798),l=u.BigInt,f=u.Error,s=u.NumberParseInt,y=u.ObjectEntries,p=u.ObjectGetOwnPropertyDescriptor,g=u.ObjectGetOwnPropertyDescriptors,v=u.ObjectGetOwnPropertySymbols,h=u.ObjectPrototypeToString,d=u.Symbol,b=r(522),m=d("kPending"),S=d("kRejected");t.exports={constants:{kPending:m,kRejected:S,ALL_PROPERTIES:0,ONLY_ENUMERABLE:2},getOwnNonIndexProperties:function(t){var e,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2,n=g(t),i=[],c=a(y(n));try{for(c.s();!(e=c.n()).done;){var u=o(e.value,2),l=u[0],f=u[1];if(!/^(0|[1-9][0-9]*)$/.test(l)||s(l,10)>=Math.pow(2,32)-1){if(2===r&&!f.enumerable)continue;i.push(l)}}}catch(t){c.e(t)}finally{c.f()}var h,d=a(v(t));try{for(d.s();!(h=d.n()).done;){var b=h.value,m=p(t,b);(2!==r||m.enumerable)&&i.push(b)}}catch(t){d.e(t)}finally{d.f()}return i},getPromiseDetails:function(){return[m,void 0]},getProxyDetails:b.getProxyDetails,Proxy:b.Proxy,previewEntries:function(t){return[[],!1]},getConstructorName:function(t){var e;if(!t||"object"!==n(t))throw new f("Invalid object");if(null!==(e=t.constructor)&&void 0!==e&&e.name)return t.constructor.name;var r=h(t).match(/^\[object ([^\]]+)\]/);return r?r[1]:"Object"},getExternalValue:function(){return l(0)}}},315:t=>{t.exports={CHAR_DOT:46,CHAR_FORWARD_SLASH:47,CHAR_BACKWARD_SLASH:92}},338:(t,e,r)=>{function n(t){return function(t){if(Array.isArray(t))return c(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||i(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(t){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o(t)}function a(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=i(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,c=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return c=t.done,t},e:function(t){u=!0,a=t},f:function(){try{c||null==r.return||r.return()}finally{if(u)throw a}}}}function i(t,e){if(t){if("string"==typeof t)return c(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c(t,e):void 0}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function u(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function l(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?u(Object(r),!0).forEach(function(e){f(t,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):u(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))})}return t}function f(t,e,r){return(e=function(t){var e=function(t){if("object"!=o(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=o(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==o(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var s,y,p,g=r(798),v=g.AggregateError,h=g.AggregateErrorPrototype,d=g.Array,b=g.ArrayBuffer,m=g.ArrayBufferPrototype,S=g.ArrayIsArray,P=g.ArrayPrototype,x=g.ArrayPrototypeFilter,w=g.ArrayPrototypeForEach,A=g.ArrayPrototypeIncludes,O=g.ArrayPrototypeIndexOf,_=g.ArrayPrototypeJoin,j=g.ArrayPrototypeMap,E=g.ArrayPrototypePop,k=g.ArrayPrototypePush,I=g.ArrayPrototypePushApply,R=g.ArrayPrototypeSlice,L=g.ArrayPrototypeSort,T=g.ArrayPrototypeSplice,B=g.ArrayPrototypeUnshift,z=g.BigIntPrototypeValueOf,M=g.Boolean,C=g.BooleanPrototype,D=g.BooleanPrototypeValueOf,N=g.DataView,F=g.DataViewPrototype,W=g.Date,H=g.DatePrototype,U=g.DatePrototypeGetTime,G=g.DatePrototypeToISOString,V=g.DatePrototypeToString,Z=g.Error,$=g.ErrorPrototype,Y=g.ErrorPrototypeToString,q=g.Function,J=g.FunctionPrototype,K=g.FunctionPrototypeBind,Q=g.FunctionPrototypeCall,X=g.FunctionPrototypeSymbolHasInstance,tt=g.FunctionPrototypeToString,et=g.JSONStringify,rt=g.Map,nt=g.MapPrototype,ot=g.MapPrototypeEntries,at=g.MapPrototypeGetSize,it=g.MathFloor,ct=g.MathMax,ut=g.MathMin,lt=g.MathRound,ft=g.MathSqrt,st=g.MathTrunc,yt=g.Number,pt=g.NumberIsFinite,gt=g.NumberIsNaN,vt=g.NumberParseFloat,ht=g.NumberParseInt,dt=g.NumberPrototype,bt=g.NumberPrototypeToString,mt=g.NumberPrototypeValueOf,St=g.Object,Pt=g.ObjectAssign,xt=g.ObjectDefineProperty,wt=g.ObjectGetOwnPropertyDescriptor,At=g.ObjectGetOwnPropertyNames,Ot=g.ObjectGetOwnPropertySymbols,_t=g.ObjectGetPrototypeOf,jt=g.ObjectIs,Et=g.ObjectKeys,kt=g.ObjectPrototype,It=g.ObjectPrototypeHasOwnProperty,Rt=g.ObjectPrototypePropertyIsEnumerable,Lt=g.ObjectSeal,Tt=g.ObjectSetPrototypeOf,Bt=g.Promise,zt=g.PromisePrototype,Mt=g.RangeError,Ct=g.RangeErrorPrototype,Dt=g.ReflectApply,Nt=g.ReflectOwnKeys,Ft=g.RegExp,Wt=g.RegExpPrototype,Ht=g.RegExpPrototypeExec,Ut=g.RegExpPrototypeSymbolReplace,Gt=g.RegExpPrototypeSymbolSplit,Vt=g.RegExpPrototypeToString,Zt=g.SafeMap,$t=g.SafeSet,Yt=g.SafeStringIterator,qt=g.Set,Jt=g.SetPrototype,Kt=g.SetPrototypeGetSize,Qt=g.SetPrototypeValues,Xt=g.String,te=g.StringPrototype,ee=g.StringPrototypeCharCodeAt,re=g.StringPrototypeCodePointAt,ne=g.StringPrototypeEndsWith,oe=g.StringPrototypeIncludes,ae=g.StringPrototypeIndexOf,ie=g.StringPrototypeLastIndexOf,ce=g.StringPrototypeNormalize,ue=g.StringPrototypePadEnd,le=g.StringPrototypePadStart,fe=g.StringPrototypeRepeat,se=g.StringPrototypeReplace,ye=g.StringPrototypeReplaceAll,pe=g.StringPrototypeSlice,ge=g.StringPrototypeSplit,ve=g.StringPrototypeStartsWith,he=g.StringPrototypeToLowerCase,de=g.StringPrototypeTrim,be=g.StringPrototypeValueOf,me=g.SymbolIterator,Se=g.SymbolPrototypeToString,Pe=g.SymbolPrototypeValueOf,xe=g.SymbolToPrimitive,we=g.SymbolToStringTag,Ae=g.TypeError,Oe=g.TypeErrorPrototype,_e=g.TypedArray,je=g.TypedArrayPrototype,Ee=g.TypedArrayPrototypeGetLength,ke=g.TypedArrayPrototypeGetSymbolToStringTag,Ie=g.Uint8Array,Re=g.WeakMap,Le=g.WeakMapPrototype,Te=g.WeakSet,Be=g.WeakSetPrototype,ze=g.globalThis,Me=g.internalBinding,Ce=g.uncurryThis,De=r(0),Ne=De.constants,Fe=Ne.ALL_PROPERTIES,We=Ne.ONLY_ENUMERABLE,He=Ne.kPending,Ue=Ne.kRejected,Ge=De.getOwnNonIndexProperties,Ve=De.getPromiseDetails,Ze=De.getProxyDetails,$e=De.previewEntries,Ye=De.getConstructorName,qe=De.getExternalValue,Je=De.Proxy,Ke=r(948),Qe=Ke.customInspectSymbol,Xe=Ke.isError,tr=Ke.join,er=Ke.removeColors,rr=r(799).isStackOverflowError,nr=r(730),or=nr.isAsyncFunction,ar=nr.isGeneratorFunction,ir=nr.isAnyArrayBuffer,cr=nr.isArrayBuffer,ur=nr.isArgumentsObject,lr=nr.isBoxedPrimitive,fr=nr.isDataView,sr=nr.isExternal,yr=nr.isMap,pr=nr.isMapIterator,gr=nr.isModuleNamespaceObject,vr=nr.isNativeError,hr=nr.isPromise,dr=nr.isSet,br=nr.isSetIterator,mr=nr.isWeakMap,Sr=nr.isWeakSet,Pr=nr.isRegExp,xr=nr.isDate,wr=nr.isTypedArray,Ar=nr.isStringObject,Or=nr.isNumberObject,_r=nr.isBooleanObject,jr=nr.isBigIntObject,Er=r(758),kr=r(496).BuiltinModule,Ir=r(755),Rr=Ir.validateObject,Lr=Ir.validateString,Tr=Ir.kValidateObjectAllowArray;function Br(t){return(y=y||r(411)).pathToFileURL(t).href}var zr,Mr,Cr,Dr,Nr,Fr=new $t(x(At(ze),function(t){return null!==Ht(/^[A-Z][a-zA-Z0-9]+$/,t)})),Wr=function(t){return void 0===t&&void 0!==t},Hr=Lt({showHidden:!1,depth:2,colors:!1,customInspect:!0,showProxy:!1,maxArrayLength:100,maxStringLength:1e4,breakLength:80,compact:3,sorted:!1,getters:!1,numericSeparator:!1});try{zr=new Ft("[\\x00-\\x1f\\x27\\x5c\\x7f-\\x9f]|[\\ud800-\\udbff](?![\\udc00-\\udfff])|(?<![\\ud800-\\udbff])[\\udc00-\\udfff]"),Mr=new Ft("[\0-\\x1f\\x27\\x5c\\x7f-\\x9f]|[\\ud800-\\udbff](?![\\udc00-\\udfff])|(?<![\\ud800-\\udbff])[\\udc00-\\udfff]","g"),Cr=new Ft("[\\x00-\\x1f\\x5c\\x7f-\\x9f]|[\\ud800-\\udbff](?![\\udc00-\\udfff])|(?<![\\ud800-\\udbff])[\\udc00-\\udfff]"),Dr=new Ft("[\\x00-\\x1f\\x5c\\x7f-\\x9f]|[\\ud800-\\udbff](?![\\udc00-\\udfff])|(?<![\\ud800-\\udbff])[\\udc00-\\udfff]","g");var Ur=new Ft("(?<=\\n)");Nr=function(t){return Gt(Ur,t)}}catch(t){zr=/[\x00-\x1f\x27\x5c\x7f-\x9f]/,Mr=/[\x00-\x1f\x27\x5c\x7f-\x9f]/g,Cr=/[\x00-\x1f\x5c\x7f-\x9f]/,Dr=/[\x00-\x1f\x5c\x7f-\x9f]/g,Nr=function(t){var e=Gt(/\n/,t),r=E(e),n=j(e,function(t){return t+"\n"});return""!==r&&n.push(r),n}}var Gr,Vr=/^[a-zA-Z_][a-zA-Z_0-9]*$/,Zr=/^(0|[1-9][0-9]*)$/,$r=/^ {4}at (?:[^/\\(]+ \(|)node:(.+):\d+:\d+\)?$/,Yr=/^(\s+[^(]*?)\s*{/,qr=/(\/\/.*?\n)|(\/\*(.|\n)*?\*\/)/g,Jr=["\\x00","\\x01","\\x02","\\x03","\\x04","\\x05","\\x06","\\x07","\\b","\\t","\\n","\\x0B","\\f","\\r","\\x0E","\\x0F","\\x10","\\x11","\\x12","\\x13","\\x14","\\x15","\\x16","\\x17","\\x18","\\x19","\\x1A","\\x1B","\\x1C","\\x1D","\\x1E","\\x1F","","","","","","","","\\'","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","\\\\","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","\\x7F","\\x80","\\x81","\\x82","\\x83","\\x84","\\x85","\\x86","\\x87","\\x88","\\x89","\\x8A","\\x8B","\\x8C","\\x8D","\\x8E","\\x8F","\\x90","\\x91","\\x92","\\x93","\\x94","\\x95","\\x96","\\x97","\\x98","\\x99","\\x9A","\\x9B","\\x9C","\\x9D","\\x9E","\\x9F"],Kr=new Ft("[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/\\#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/\\#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))","g");function Qr(t,e){var r={budget:{},indentationLvl:0,seen:[],currentDepth:0,stylize:cn,showHidden:Hr.showHidden,depth:Hr.depth,colors:Hr.colors,customInspect:Hr.customInspect,showProxy:Hr.showProxy,maxArrayLength:Hr.maxArrayLength,maxStringLength:Hr.maxStringLength,breakLength:Hr.breakLength,compact:Hr.compact,sorted:Hr.sorted,getters:Hr.getters,numericSeparator:Hr.numericSeparator};if(arguments.length>1)if(arguments.length>2&&(void 0!==arguments[2]&&(r.depth=arguments[2]),arguments.length>3&&void 0!==arguments[3]&&(r.colors=arguments[3])),"boolean"==typeof e)r.showHidden=e;else if(e)for(var n=Et(e),o=0;o<n.length;++o){var a=n[o];It(Hr,a)||"stylize"===a?r[a]=e[a]:void 0===r.userOptions&&(r.userOptions=e)}return r.colors&&(r.stylize=an),null===r.maxArrayLength&&(r.maxArrayLength=1/0),null===r.maxStringLength&&(r.maxStringLength=1/0),hn(r,t,0)}Qr.custom=Qe,xt(Qr,"defaultOptions",{__proto__:null,get:function(){return Hr},set:function(t){return Rr(t,"options"),Pt(Hr,t)}});var Xr=39,tn=49;function en(t,e){xt(Qr.colors,e,{__proto__:null,get:function(){return this[t]},set:function(e){this[t]=e},configurable:!0,enumerable:!1})}function rn(t,e){return-1===e?'"'.concat(t,'"'):-2===e?"`".concat(t,"`"):"'".concat(t,"'")}function nn(t){var e=ee(t);return Jr.length>e?Jr[e]:"\\u".concat(bt(e,16))}function on(t){var e=zr,r=Mr,n=39;if(oe(t,"'")&&(oe(t,'"')?oe(t,"`")||oe(t,"${")||(n=-2):n=-1,39!==n&&(e=Cr,r=Dr)),t.length<5e3&&null===Ht(e,t))return rn(t,n);if(t.length>100)return rn(t=Ut(r,t,nn),n);for(var o="",a=0,i=0;i<t.length;i++){var c=ee(t,i);if(c===n||92===c||c<32||c>126&&c<160)o+=a===i?Jr[c]:"".concat(pe(t,a,i)).concat(Jr[c]),a=i+1;else if(c>=55296&&c<=57343){if(c<=56319&&i+1<t.length){var u=ee(t,i+1);if(u>=56320&&u<=57343){i++;continue}}o+="".concat(pe(t,a,i),"\\u").concat(bt(c,16)),a=i+1}}return a!==t.length&&(o+=pe(t,a)),rn(o,n)}function an(t,e){var r=Qr.styles[e];if(void 0!==r){var n=Qr.colors[r];if(void 0!==n)return"[".concat(n[0],"m").concat(t,"[").concat(n[1],"m")}return t}function cn(t){return t}function un(){return[]}function ln(t,e){try{return t instanceof e}catch(t){return!1}}Qr.colors={__proto__:null,reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],blink:[5,25],inverse:[7,27],hidden:[8,28],strikethrough:[9,29],doubleunderline:[21,24],black:[30,Xr],red:[31,Xr],green:[32,Xr],yellow:[33,Xr],blue:[34,Xr],magenta:[35,Xr],cyan:[36,Xr],white:[37,Xr],bgBlack:[40,tn],bgRed:[41,tn],bgGreen:[42,tn],bgYellow:[43,tn],bgBlue:[44,tn],bgMagenta:[45,tn],bgCyan:[46,tn],bgWhite:[47,tn],framed:[51,54],overlined:[53,55],gray:[90,Xr],redBright:[91,Xr],greenBright:[92,Xr],yellowBright:[93,Xr],blueBright:[94,Xr],magentaBright:[95,Xr],cyanBright:[96,Xr],whiteBright:[97,Xr],bgGray:[100,tn],bgRedBright:[101,tn],bgGreenBright:[102,tn],bgYellowBright:[103,tn],bgBlueBright:[104,tn],bgMagentaBright:[105,tn],bgCyanBright:[106,tn],bgWhiteBright:[107,tn]},en("gray","grey"),en("gray","blackBright"),en("bgGray","bgGrey"),en("bgGray","bgBlackBright"),en("dim","faint"),en("strikethrough","crossedout"),en("strikethrough","strikeThrough"),en("strikethrough","crossedOut"),en("hidden","conceal"),en("inverse","swapColors"),en("inverse","swapcolors"),en("doubleunderline","doubleUnderline"),Qr.styles=Pt({__proto__:null},{special:"cyan",number:"yellow",bigint:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",symbol:"green",date:"magenta",regexp:"red",module:"underline"});var fn=(new Zt).set(P,{name:"Array",constructor:d}).set(m,{name:"ArrayBuffer",constructor:b}).set(J,{name:"Function",constructor:q}).set(nt,{name:"Map",constructor:rt}).set(Jt,{name:"Set",constructor:qt}).set(kt,{name:"Object",constructor:St}).set(je,{name:"TypedArray",constructor:_e}).set(Wt,{name:"RegExp",constructor:Ft}).set(H,{name:"Date",constructor:W}).set(F,{name:"DataView",constructor:N}).set($,{name:"Error",constructor:Z}).set(h,{name:"AggregateError",constructor:v}).set(Ct,{name:"RangeError",constructor:Mt}).set(Oe,{name:"TypeError",constructor:Ae}).set(C,{name:"Boolean",constructor:M}).set(dt,{name:"Number",constructor:yt}).set(te,{name:"String",constructor:Xt}).set(zt,{name:"Promise",constructor:Bt}).set(Le,{name:"WeakMap",constructor:Re}).set(Be,{name:"WeakSet",constructor:Te});function sn(t,e,r,n){for(var o,a=t;t||Wr(t);){var i=fn.get(t);if(void 0!==i){var c=i.name,u=i.constructor;if(X(u,a))return void 0!==n&&o!==t&&yn(e,a,o||a,r,n),c}var f=wt(t,"constructor");if(void 0!==f&&"function"==typeof f.value&&""!==f.value.name&&ln(a,f.value))return void 0===n||o===t&&Fr.has(f.value.name)||yn(e,a,o||a,r,n),Xt(f.value.name);t=_t(t),void 0===o&&(o=t)}if(null===o)return null;var s=Ye(a);if(r>e.depth&&null!==e.depth)return"".concat(s," <Complex prototype>");var y=sn(o,e,r+1,n);return null===y?"".concat(s," <").concat(Qr(o,l(l({},e),{},{customInspect:!1,depth:-1})),">"):"".concat(s," <").concat(y,">")}function yn(t,e,r,n,o){var i,c,u=0;do{if(0!==u||e===r){if(null===(r=_t(r)))return;var l=wt(r,"constructor");if(void 0!==l&&"function"==typeof l.value&&Fr.has(l.value.name))return}0===u?c=new $t:w(i,function(t){return c.add(t)}),i=Nt(r),k(t.seen,e);var f,s=a(i);try{for(s.s();!(f=s.n()).done;){var y=f.value;if(!("constructor"===y||It(e,y)||0!==u&&c.has(y))){var p=wt(r,y);if("function"!=typeof p.value){var g=Wn(t,r,n,y,0,p,e);t.colors?k(o,"".concat(g,"")):k(o,g)}}}}catch(t){s.e(t)}finally{s.f()}E(t.seen)}while(3!==++u)}function pn(t,e,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";if(null===t)return""!==e&&r!==e?"[".concat(r).concat(n,": null prototype] [").concat(e,"] "):"[".concat(r).concat(n,": null prototype] ");var o="".concat(t).concat(n," ");if(""!==e){var a=t.indexOf(e);if(-1===a)o+="[".concat(e,"] ");else{var i=a+e.length;i!==t.length&&t[i]===t[i].toLowerCase()&&(o+="[".concat(e,"] "))}}return o}function gn(t,e){var r,n=Ot(t);if(e)r=At(t),0!==n.length&&I(r,n);else{try{r=Et(t)}catch(e){Er(vr(e)&&"ReferenceError"===e.name&&gr(t)),r=At(t)}0!==n.length&&I(r,x(n,function(e){return Rt(t,e)}))}return r}function vn(t,e,r){var n="";return null===e&&(n=Ye(t))===r&&(n="Object"),pn(e,r,n)}function hn(t,e,i,c){if("object"!==o(e)&&"function"!=typeof e&&!Wr(e))return _n(t.stylize,e,t);if(null===e)return t.stylize("null","null");var u=e,f=Ze(e,!!t.showProxy);if(void 0!==f){if(null===f||null===f[0])return t.stylize("<Revoked Proxy>","special");if(t.showProxy)return function(t,e,r){if(r>t.depth&&null!==t.depth)return t.stylize("Proxy [Array]","special");r+=1,t.indentationLvl+=2;var n=[hn(t,e[0],r),hn(t,e[1],r)];return t.indentationLvl-=2,Un(t,n,"",["Proxy [","]"],2,r)}(t,f,i);e=f}if(t.customInspect){var s,v=e[Qe];if("function"==typeof v&&v!==Qr&&(null===(s=wt(e,"constructor"))||void 0===s||null===(s=s.value)||void 0===s?void 0:s.prototype)!==e){var h=null===t.depth?null:t.depth-i,d=void 0!==f||!X(St,u),b=Q(v,u,h,function(t,e){var r=l({stylize:t.stylize,showHidden:t.showHidden,depth:t.depth,colors:t.colors,customInspect:t.customInspect,showProxy:t.showProxy,maxArrayLength:t.maxArrayLength,maxStringLength:t.maxStringLength,breakLength:t.breakLength,compact:t.compact,sorted:t.sorted,getters:t.getters,numericSeparator:t.numericSeparator},t.userOptions);if(e){Tt(r,null);var n,i=a(Et(r));try{for(i.s();!(n=i.n()).done;){var c=n.value;"object"!==o(r[c])&&"function"!=typeof r[c]||null===r[c]||delete r[c]}}catch(t){i.e(t)}finally{i.f()}r.stylize=Tt(function(e,r){var n;try{n="".concat(t.stylize(e,r))}catch(t){}return"string"!=typeof n?e:n},null)}return r}(t,d),Qr);if(b!==u)return"string"!=typeof b?hn(t,b,i):ye(b,"\n","\n".concat(fe(" ",t.indentationLvl)))}}if(t.seen.includes(e)){var m=1;return void 0===t.circular?(t.circular=new Zt,t.circular.set(e,m)):void 0===(m=t.circular.get(e))&&(m=t.circular.size+1,t.circular.set(e,m)),t.stylize("[Circular *".concat(m,"]"),"special")}return function(t,e,o,i){var c,u;t.showHidden&&(o<=t.depth||null===t.depth)&&(u=[]);var l=sn(e,t,o,u);void 0!==u&&0===u.length&&(u=void 0);var f="";try{f=e[we]}catch(t){}("string"!=typeof f||""!==f&&(t.showHidden?It:Rt)(e,we))&&(f="");var s,v,h="",d=un,b=!0,m=0,P=t.showHidden?Fe:We,x=0;if(me in e||null===l)if(b=!1,S(e)){var w="Array"!==l||""!==f?pn(l,f,"Array","(".concat(e.length,")")):"";if(c=Ge(e,P),s=["".concat(w,"["),"]"],0===e.length&&0===c.length&&void 0===u)return"".concat(s[0],"]");x=2,d=In}else if(dr(e)){var j=Kt(e),E=pn(l,f,"Set","(".concat(j,")"));if(c=gn(e,t.showHidden),d=K(Ln,null,null!==l?e:Qt(e)),0===j&&0===c.length&&void 0===u)return"".concat(E,"{}");s=["".concat(E,"{"),"}"]}else if(yr(e)){var M=at(e),C=pn(l,f,"Map","(".concat(M,")"));if(c=gn(e,t.showHidden),d=K(Tn,null,null!==l?e:ot(e)),0===M&&0===c.length&&void 0===u)return"".concat(C,"{}");s=["".concat(C,"{"),"}"]}else if(wr(e)){c=Ge(e,P);var N=e,F="";null===l&&(F=ke(e),N=new g[F](e));var W=Ee(e),H=pn(l,f,F,"(".concat(W,")"));if(s=["".concat(H,"["),"]"],0===e.length&&0===c.length&&!t.showHidden)return"".concat(s[0],"]");d=K(Rn,null,N,W),x=2}else pr(e)?(c=gn(e,t.showHidden),s=dn("Map",f),d=K(Nn,null,s)):br(e)?(c=gn(e,t.showHidden),s=dn("Set",f),d=K(Nn,null,s)):b=!0;if(b)if(c=gn(e,t.showHidden),s=["{","}"],"function"==typeof e){if(h=function(t,e,r,n){var o=tt(e);if(ve(o,"class")&&"}"===o[o.length-1]){var a=pe(o,5,-1),i=ae(a,"{");if(-1!==i&&(!oe(pe(a,0,i),"(")||null!==Ht(Yr,Ut(qr,a))))return function(t,e,r){var n=It(t,"name")&&t.name||"(anonymous)",o="class ".concat(n);if("Function"!==e&&null!==e&&(o+=" [".concat(e,"]")),""!==r&&e!==r&&(o+=" [".concat(r,"]")),null!==e){var a=_t(t).name;a&&(o+=" extends ".concat(a))}else o+=" extends [null prototype]";return"[".concat(o,"]")}(e,r,n)}var c="Function";ar(e)&&(c="Generator".concat(c)),or(e)&&(c="Async".concat(c));var u="[".concat(c);return null===r&&(u+=" (null prototype)"),""===e.name?u+=" (anonymous)":u+=": ".concat("string"==typeof e.name?e.name:hn(t,e.name)),u+="]",r!==c&&null!==r&&(u+=" ".concat(r)),""!==n&&r!==n&&(u+=" [".concat(n,"]")),u}(t,e,l,f),0===c.length&&void 0===u)return t.stylize(h,"special")}else if("Object"===l){if(ur(e)?s[0]="[Arguments] {":""!==f&&(s[0]="".concat(pn(l,f,"Object"),"{")),0===c.length&&void 0===u)return"".concat(s[0],"}")}else if(Pr(e)){h=Vt(null!==l?e:new Ft(e));var Z=pn(l,f,"RegExp");if("RegExp "!==Z&&(h="".concat(Z).concat(h)),0===c.length&&void 0===u||o>t.depth&&null!==t.depth)return t.stylize(h,"regexp")}else if(xr(e)){h=gt(U(e))?V(e):G(e);var $=pn(l,f,"Date");if("Date "!==$&&(h="".concat($).concat(h)),0===c.length&&void 0===u)return t.stylize(h,"date")}else if(Xe(e)){if(h=function(t,e,r,o,i){var c=null!=t.name?t.name:"Error",u=mn(o,t);(function(t,e,r,n){if(!t.showHidden&&0!==e.length)for(var o=0,a=["name","message","stack"];o<a.length;o++){var i=a[o],c=O(e,i);-1===c||"string"==typeof r[i]&&!oe(n,r[i])||T(e,c,1)}})(o,i,t,u),!("cause"in t)||0!==i.length&&A(i,"cause")||k(i,"cause"),!S(t.errors)||0!==i.length&&A(i,"errors")||k(i,"errors"),u=function(t,e,r,n){var o=r.length;if("string"!=typeof r&&(t=se(t,"".concat(r),"".concat(r," [").concat(pe(pn(e,n,"Error"),0,-1),"]"))),null===e||ne(r,"Error")&&ve(t,r)&&(t.length===o||":"===t[o]||"\n"===t[o])){var a="Error";if(null===e){var i=Ht(/^([A-Z][a-z_ A-Z0-9[\]()-]+)(?::|\n {4}at)/,t)||Ht(/^([a-z_A-Z0-9-]*Error)$/,t);o=(a=(null==i?void 0:i[1])||"").length,a=a||"Error"}var c=pe(pn(e,n,a),0,-1);r!==c&&(t=oe(c,r)?0===o?"".concat(c,": ").concat(t):"".concat(c).concat(pe(t,o)):"".concat(c," [").concat(r,"]").concat(pe(t,o)))}return t}(u,e,c,r);var l=t.message&&ae(u,t.message)||-1;-1!==l&&(l+=t.message.length);var f=ae(u,"\n at",l);if(-1===f)u="[".concat(u,"]");else{var s=pe(u,0,f),y=function(t,e,r){var o,a=ge(r,"\n");try{o=e.cause}catch(t){}if(null!=o&&Xe(o)){var i=mn(t,o),c=ae(i,"\n at");if(-1!==c){var u=bn(a,ge(pe(i,c+1),"\n")),l=u[0],f=u[1];if(l>0){var s=l-2,y=" ... ".concat(s," lines matching cause stack trace ...");a.splice(f+1,s,t.stylize(y,"undefined"))}}}if(a.length>10)for(var p=function(t){for(var e=[],r=new Zt,o=0;o<t.length;o++){var a=r.get(t[o]);void 0===a?r.set(t[o],[o]):a[a.length]=o}if(t.length-r.size<=3)return e;for(var i=0;i<t.length-3;i++){var c=r.get(t[i]);if(1!==c.length&&c[c.length-1]!==i){var u=c.indexOf(i)+1;if(u!==c.length){var l=c[c.length-1]-i;if(!(l<3)){var f=void 0;if(u+1<c.length){for(var s=0,y=u;y<c.length;y++){for(var p=c[y]-i;0!==p;){var g=s%p;0!==s&&(f=f||new $t).add(s),s=p,p=g}if(1===s)break}l=s,f&&(f.delete(l),f=n(f))}for(var v=l,h=0,d=0,b=i+l;;b+=l){for(var m=0,S=0;S<l&&t[i+S]===t[b+S];S++)m++;if(m===l)d++;else{var P;if(null===(P=f)||void 0===P||!P.length)break;0!==d&&v*h<l*d&&(v=l,h=d),l=f.pop(),b=i,d=0}}0!==h&&v*h>=l*d&&(l=v,d=h),d*l>=3&&(e.push(i+l,l,d),i+=l*(d+1)-1)}}}}return e}(a),g=p.length-3;g>=0;g-=3){var v=p[g],h=p[g+1],d=p[g+2],b=" ... collapsed ".concat(h*d," duplicate lines ")+"matching above "+(d>1?"".concat(h," lines ").concat(d," times..."):"lines ...");a.splice(v,h*d,t.stylize(b,"undefined"))}return a}(o,t,pe(u,f+1));if(o.colors){var p,g,v=function(){var t;try{t=process.cwd()}catch(t){return}return t}(),h=a(y);try{for(h.s();!(g=h.n()).done;){var d=g.value,b=Ht($r,d);if(null!==b&&kr.exists(b[1]))s+="\n".concat(o.stylize(d,"undefined"));else{if(s+="\n",d=Sn(o,d),void 0!==v){var m=Pn(o,d,v);m===d&&(m=Pn(o,d,p=p||Br(v))),d=m}s+=d}}}catch(t){h.e(t)}finally{h.f()}}else s+="\n".concat(_(y,"\n"));u=s}if(0!==o.indentationLvl){var P=fe(" ",o.indentationLvl);u=ye(u,"\n","\n".concat(P))}return u}(e,l,f,t,c),0===c.length&&void 0===u)return h}else if(ir(e)){var Y=pn(l,f,cr(e)?"ArrayBuffer":"SharedArrayBuffer");if(void 0===i)d=kn;else if(0===c.length&&void 0===u)return Y+"{ byteLength: ".concat(An(t.stylize,e.byteLength,!1)," }");s[0]="".concat(Y,"{"),B(c,"byteLength")}else if(fr(e))s[0]="".concat(pn(l,f,"DataView"),"{"),B(c,"byteLength","byteOffset","buffer");else if(hr(e))s[0]="".concat(pn(l,f,"Promise"),"{"),d=Fn;else if(Sr(e))s[0]="".concat(pn(l,f,"WeakSet"),"{"),d=t.showHidden?Cn:Mn;else if(mr(e))s[0]="".concat(pn(l,f,"WeakMap"),"{"),d=t.showHidden?Dn:Mn;else if(gr(e))s[0]="".concat(pn(l,f,"Module"),"{"),d=jn.bind(null,c);else if(lr(e)){if(h=function(t,e,r,n,o){var a,i;Or(t)?(a=mt,i="Number"):Ar(t)?(a=be,i="String",r.splice(0,t.length)):_r(t)?(a=D,i="Boolean"):jr(t)?(a=z,i="BigInt"):(a=Pe,i="Symbol");var c="[".concat(i);return i!==n&&(c+=null===n?" (null prototype)":" (".concat(n,")")),c+=": ".concat(_n(cn,a(t),e),"]"),""!==o&&o!==n&&(c+=" [".concat(o,"]")),0!==r.length||e.stylize===cn?c:e.stylize(c,he(i))}(e,t,c,l,f),0===c.length&&void 0===u)return h}else if(!function(t){return y=y||r(411),"string"==typeof t.href&&t instanceof y.URL}(e)||o>t.depth&&null!==t.depth){if(0===c.length&&void 0===u){if(sr(e)){var q=qe(e).toString(16);return t.stylize("[External: ".concat(q,"]"),"special")}return"".concat(vn(e,l,f),"{}")}s[0]="".concat(vn(e,l,f),"{")}else if(c=function(t){return p=p||Ot(new y.URL("http://user:pass@localhost:8080/?foo=bar#baz")),t.filter(function(t){return-1===p[t]})}(c),h=e.href,0===c.length&&void 0===u)return h;if(o>t.depth&&null!==t.depth){var J=pe(vn(e,l,f),0,-1);return null!==l&&(J="[".concat(J,"]")),t.stylize(J,"special")}o+=1,t.seen.push(e),t.currentDepth=o;var Q=t.indentationLvl;try{for(v=d(t,e,o),m=0;m<c.length;m++)k(v,Wn(t,e,o,c[m],x));void 0!==u&&I(v,u)}catch(r){if(!rr(r))throw r;return function(t,e,r,n){return t.seen.pop(),t.indentationLvl=n,t.stylize("[".concat(r,": Inspection interrupted ")+"prematurely. Maximum call stack size exceeded.]","special")}(t,0,pe(vn(e,l,f),0,-1),Q)}if(void 0!==t.circular){var X=t.circular.get(e);if(void 0!==X){var et=t.stylize("<ref *".concat(X,">"),"special");!0!==t.compact?h=""===h?et:"".concat(et," ").concat(h):s[0]="".concat(et," ").concat(s[0])}}if(t.seen.pop(),t.sorted){var rt=!0===t.sorted?void 0:t.sorted;if(0===x)L(v,rt);else if(c.length>1){var nt=L(R(v,v.length-c.length),rt);B(nt,v,v.length-c.length,c.length),Dt(T,null,nt)}}var it=Un(t,v,h,s,x,o,e),ct=(t.budget[t.indentationLvl]||0)+it.length;return t.budget[t.indentationLvl]=ct,ct>Math.pow(2,27)&&(t.depth=-1),it}(t,e,i,c)}function dn(t,e){return e!=="".concat(t," Iterator")&&(""!==e&&(e+="] ["),e+="".concat(t," Iterator")),["[".concat(e,"] {"),"}"]}function bn(t,e){for(var r=0;r<t.length-3;r++){var n=O(e,t[r]);if(-1!==n){var o=e.length-n;if(o>3){for(var a=1,i=ut(t.length-r,o);i>a&&t[r+a]===e[n+a];)a++;if(a>3)return[a,r]}}}return[0,0]}function mn(t,e){if(e.stack){if("string"==typeof e.stack)return e.stack;t.seen.push(e),t.indentationLvl+=4;var r=hn(t,e.stack);return t.indentationLvl-=4,t.seen.pop(),"".concat(Y(e),"\n ").concat(r)}return Y(e)}function Sn(t,e){for(var r="",n=0,o=0;;){var a=ae(e,"node_modules",o);if(-1===a)break;var i=e[a-1],c=e[a+12];if("/"!==c&&"\\"!==c||"/"!==i&&"\\"!==i)o=a+1;else{var u=a+13;r+=pe(e,n,u);var l=ae(e,i,u);"@"===e[u]&&(l=ae(e,i,l+1));var f=pe(e,u,l);r+=t.stylize(f,"module"),n=l,o=l}}return 0!==n&&(e=r+pe(e,n)),e}function Pn(t,e,r){var n=ae(e,r),o="",a=r.length;if(-1!==n){"file://"===pe(e,n-7,n)&&(a+=7,n-=7);var i="("===e[n-1]?n-1:n,c=i!==n&&ne(e,")")?-1:e.length,u=n+a+1,l=pe(e,i,u);o+=pe(e,0,i),o+=t.stylize(l,"undefined"),o+=pe(e,u,c),-1===c&&(o+=t.stylize(")","undefined"))}else o+=e;return o}function xn(t){var e="",r=t.length;Er(0!==r);for(var n="-"===t[0]?1:0;r>=n+4;r-=3)e="_".concat(pe(t,r-3,r)).concat(e);return r===t.length?t:"".concat(pe(t,0,r)).concat(e)}var wn=function(t){return"... ".concat(t," more item").concat(t>1?"s":"")};function An(t,e,r){if(!r)return jt(e,-0)?t("-0","number"):t("".concat(e),"number");var n=Xt(e);if(st(e)===e)return!pt(e)||oe(n,"e")?t(n,"number"):t(xn(n),"number");if(gt(e))return t(n,"number");var o=ae(n,"."),a=pe(n,0,o),i=pe(n,o+1);return t("".concat(xn(a),".").concat(function(t){for(var e="",r=0;r<t.length-3;r+=3)e+="".concat(pe(t,r,r+3),"_");return 0===r?t:"".concat(e).concat(pe(t,r))}(i)),"number")}function On(t,e,r){var n=Xt(e);return t("".concat(r?xn(n):n,"n"),"bigint")}function _n(t,e,r){if("string"==typeof e){var n="";if(e.length>r.maxStringLength){var o=e.length-r.maxStringLength;e=pe(e,0,r.maxStringLength),n="... ".concat(o," more character").concat(o>1?"s":"")}return!0!==r.compact&&e.length>16&&e.length>r.breakLength-r.indentationLvl-4?_(j(Nr(e),function(e){return t(on(e),"string")})," +\n".concat(fe(" ",r.indentationLvl+2)))+n:t(on(e),"string")+n}return"number"==typeof e?An(t,e,r.numericSeparator):"bigint"==typeof e?On(t,e,r.numericSeparator):"boolean"==typeof e?t("".concat(e),"boolean"):void 0===e?t("undefined","undefined"):t(Se(e),"symbol")}function jn(t,e,r,n){for(var o=new d(t.length),a=0;a<t.length;a++)try{o[a]=Wn(e,r,n,t[a],0)}catch(r){Er(vr(r)&&"ReferenceError"===r.name);var i=f({},t[a],"");o[a]=Wn(e,i,n,t[a],0);var c=ie(o[a]," ");o[a]=pe(o[a],0,c+1)+e.stylize("<uninitialized>","special")}return t.length=0,o}function En(t,e,r,n,o,a){for(var i=Et(e),c=a;a<i.length&&o.length<n;a++){var u=i[a],l=+u;if(l>Math.pow(2,32)-2)break;if("".concat(c)!==u){if(null===Ht(Zr,u))break;var f=l-c,s=f>1?"s":"",y="<".concat(f," empty item").concat(s,">");if(k(o,t.stylize(y,"undefined")),c=l,o.length===n)break}k(o,Wn(t,e,r,u,1)),c++}var p=e.length-c;if(o.length!==n){if(p>0){var g=p>1?"s":"",v="<".concat(p," empty item").concat(g,">");k(o,t.stylize(v,"undefined"))}}else p>0&&k(o,wn(p));return o}function kn(t,e){var n;try{n=new Ie(e)}catch(e){return[t.stylize("(detached)","special")]}void 0===s&&(s=Ce(r(526).h.prototype.hexSlice));var o=de(Ut(/(.{2})/g,s(n,0,ut(t.maxArrayLength,n.length)),"$1 ")),a=n.length-t.maxArrayLength;return a>0&&(o+=" ... ".concat(a," more byte").concat(a>1?"s":"")),["".concat(t.stylize("[Uint8Contents]","special"),": <").concat(o,">")]}function In(t,e,r){for(var n=e.length,o=ut(ct(0,t.maxArrayLength),n),a=n-o,i=[],c=0;c<o;c++){var u=wt(e,c);if(void 0===u)return En(t,e,r,o,i,c);k(i,Wn(t,e,r,c,1,u))}return a>0&&k(i,wn(a)),i}function Rn(t,e,r,n,o){for(var a=ut(ct(0,r.maxArrayLength),e),i=t.length-a,c=new d(a),u=t.length>0&&"number"==typeof t[0]?An:On,l=0;l<a;++l)c[l]=u(r.stylize,t[l],r.numericSeparator);if(i>0&&(c[a]=wn(i)),r.showHidden){r.indentationLvl+=2;for(var f=0,s=["BYTES_PER_ELEMENT","length","byteLength","byteOffset","buffer"];f<s.length;f++){var y=s[f],p=hn(r,t[y],o,!0);k(c,"[".concat(y,"]: ").concat(p))}r.indentationLvl-=2}return c}function Ln(t,e,r,n){var o=t.size,i=ut(ct(0,e.maxArrayLength),o),c=o-i,u=[];e.indentationLvl+=2;var l,f=0,s=a(t);try{for(s.s();!(l=s.n()).done;){var y=l.value;if(f>=i)break;k(u,hn(e,y,n)),f++}}catch(t){s.e(t)}finally{s.f()}return c>0&&k(u,wn(c)),e.indentationLvl-=2,u}function Tn(t,e,r,n){var o=t.size,i=ut(ct(0,e.maxArrayLength),o),c=o-i,u=[];e.indentationLvl+=2;var l,f=0,s=a(t);try{for(s.s();!(l=s.n()).done;){var y=l.value,p=y[0],g=y[1];if(f>=i)break;k(u,"".concat(hn(e,p,n)," => ").concat(hn(e,g,n))),f++}}catch(t){s.e(t)}finally{s.f()}return c>0&&k(u,wn(c)),e.indentationLvl-=2,u}function Bn(t,e,r,n){var o=ct(t.maxArrayLength,0),a=ut(o,r.length),i=new d(a);t.indentationLvl+=2;for(var c=0;c<a;c++)i[c]=hn(t,r[c],e);t.indentationLvl-=2,0!==n||t.sorted||L(i);var u=r.length-a;return u>0&&k(i,wn(u)),i}function zn(t,e,r,n){var o=ct(t.maxArrayLength,0),a=r.length/2,i=a-o,c=ut(o,a),u=new d(c),l=0;if(t.indentationLvl+=2,0===n){for(;l<c;l++){var f=2*l;u[l]="".concat(hn(t,r[f],e)," => ").concat(hn(t,r[f+1],e))}t.sorted||L(u)}else for(;l<c;l++){var s=2*l,y=[hn(t,r[s],e),hn(t,r[s+1],e)];u[l]=Un(t,y,"",["[","]"],2,e)}return t.indentationLvl-=2,i>0&&k(u,wn(i)),u}function Mn(t){return[t.stylize("<items unknown>","special")]}function Cn(t,e,r){return Bn(t,r,$e(e),0)}function Dn(t,e,r){return zn(t,r,$e(e),0)}function Nn(t,e,r,n){var o=$e(r,!0),a=o[0];return o[1]?(t[0]=Ut(/ Iterator] {$/,t[0]," Entries] {"),zn(e,n,a,2)):Bn(e,n,a,1)}function Fn(t,e,r){var n,o=Ve(e),a=o[0],i=o[1];if(a===He)n=[t.stylize("<pending>","special")];else{t.indentationLvl+=2;var c=hn(t,i,r);t.indentationLvl-=2,n=[a===Ue?"".concat(t.stylize("<rejected>","special")," ").concat(c):c]}return n}function Wn(t,e,r,n,a,i){var c,u,l=arguments.length>6&&void 0!==arguments[6]?arguments[6]:e,f=" ";if(void 0!==(i=i||wt(e,n)||{value:e[n],enumerable:!0}).value){var s=!0!==t.compact||0!==a?2:3;t.indentationLvl+=s,u=hn(t,i.value,r),3===s&&t.breakLength<Gr(u,t.colors)&&(f="\n".concat(fe(" ",t.indentationLvl))),t.indentationLvl-=s}else if(void 0!==i.get){var y=void 0!==i.set?"Getter/Setter":"Getter",p=t.stylize,g="special";if(t.getters&&(!0===t.getters||"get"===t.getters&&void 0===i.set||"set"===t.getters&&void 0!==i.set))try{var v=Q(i.get,l);if(t.indentationLvl+=2,null===v)u="".concat(p("[".concat(y,":"),g)," ").concat(p("null","null")).concat(p("]",g));else if("object"===o(v))u="".concat(p("[".concat(y,"]"),g)," ").concat(hn(t,v,r));else{var h=_n(p,v,t);u="".concat(p("[".concat(y,":"),g)," ").concat(h).concat(p("]",g))}t.indentationLvl-=2}catch(t){var d="<Inspection threw (".concat(t.message,")>");u="".concat(p("[".concat(y,":"),g)," ").concat(d).concat(p("]",g))}else u=t.stylize("[".concat(y,"]"),g)}else u=void 0!==i.set?t.stylize("[Setter]","special"):t.stylize("undefined","undefined");if(1===a)return u;if("symbol"===o(n)){var b=Ut(Mr,Se(n),nn);c=t.stylize(b,"symbol")}else c=null!==Ht(Vr,n)?"__proto__"===n?"['__proto__']":t.stylize(n,"name"):t.stylize(on(n),"string");return!1===i.enumerable&&(c="[".concat(c,"]")),"".concat(c,":").concat(f).concat(u)}function Hn(t,e,r,n){var o=e.length+r;if(o+e.length>t.breakLength)return!1;for(var a=0;a<e.length;a++)if(t.colors?o+=er(e[a]).length:o+=e[a].length,o>t.breakLength)return!1;return""===n||!oe(n,"\n")}function Un(t,e,r,n,o,a,i){if(!0!==t.compact){if("number"==typeof t.compact&&t.compact>=1){var c=e.length;if(2===o&&c>6&&(e=function(t,e,r){var n=0,o=0,a=0,i=e.length;t.maxArrayLength<e.length&&i--;for(var c=new d(i);a<i;a++){var u=Gr(e[a],t.colors);c[a]=u,n+=u+2,o<u&&(o=u)}var l=o+2;if(3*l+t.indentationLvl<t.breakLength&&(n/l>5||o<=6)){var f=ft(l-n/e.length),s=ct(l-3-f,1),y=ut(lt(ft(2.5*s*i)/s),it((t.breakLength-t.indentationLvl)/l),4*t.compact,15);if(y<=1)return e;for(var p=[],g=[],v=0;v<y;v++){for(var h=0,b=v;b<e.length;b+=y)c[b]>h&&(h=c[b]);h+=2,g[v]=h}var m=le;if(void 0!==r)for(var S=0;S<e.length;S++)if("number"!=typeof r[S]&&"bigint"!=typeof r[S]){m=ue;break}for(var P=0;P<i;P+=y){for(var x=ut(P+y,i),w="",A=P;A<x-1;A++){var O=g[A-P]+e[A].length-c[A];w+=m("".concat(e[A],", "),O," ")}if(m===le){var _=g[A-P]+e[A].length-c[A]-2;w+=le(e[A],_," ")}else w+=e[A];k(p,w)}t.maxArrayLength<e.length&&k(p,e[i]),e=p}return e}(t,e,i)),t.currentDepth-a<t.compact&&c===e.length&&Hn(t,e,e.length+t.indentationLvl+n[0].length+r.length+10,r)){var u=tr(e,", ");if(!oe(u,"\n"))return"".concat(r?"".concat(r," "):"").concat(n[0]," ").concat(u)+" ".concat(n[1])}}var l="\n".concat(fe(" ",t.indentationLvl));return"".concat(r?"".concat(r," "):"").concat(n[0]).concat(l," ")+"".concat(tr(e,",".concat(l," "))).concat(l).concat(n[1])}if(Hn(t,e,0,r))return"".concat(n[0]).concat(r?" ".concat(r):""," ").concat(tr(e,", ")," ")+n[1];var f=fe(" ",t.indentationLvl),s=""===r&&1===n[0].length?" ":"".concat(r?" ".concat(r):"","\n").concat(f," ");return"".concat(n[0]).concat(s).concat(tr(e,",\n".concat(f," "))," ").concat(n[1])}function Gn(t){var e=Ze(t,!1);if(void 0!==e){if(null===e)return!0;t=e}var r=It,n=It;if("function"!=typeof t.toString){if("function"!=typeof t[xe])return!0;if(It(t,xe))return!1;r=Vn}else{if(It(t,"toString"))return!1;if("function"!=typeof t[xe])n=Vn;else if(It(t,xe))return!1}var o=t;do{o=_t(o)}while(!r(o,"toString")&&!n(o,xe));var a=wt(o,"constructor");return void 0!==a&&"function"==typeof a.value&&Fr.has(a.value.name)}function Vn(){return!1}var Zn,$n=function(t){return ge(t.message,"\n",1)[0]};function Yn(t){try{return et(t)}catch(t){if(!Zn)try{var e={};e.a=e,et(e)}catch(t){Zn=$n(t)}if("TypeError"===t.name&&$n(t)===Zn)return"[Circular]";throw t}}function qn(t,e){var r;return An(cn,t,null!==(r=null==e?void 0:e.numericSeparator)&&void 0!==r?r:Hr.numericSeparator)}function Jn(t,e){var r;return On(cn,t,null!==(r=null==e?void 0:e.numericSeparator)&&void 0!==r?r:Hr.numericSeparator)}function Kn(t,e){var r=e[0],n=0,a="",i="";if("string"==typeof r){if(1===e.length)return r;for(var c,u=0,f=0;f<r.length-1;f++)if(37===ee(r,f)){var s=ee(r,++f);if(n+1!==e.length){switch(s){case 115:var y=e[++n];c="number"==typeof y?qn(y,t):"bigint"==typeof y?Jn(y,t):"object"===o(y)&&null!==y&&Gn(y)?Qr(y,l(l({},t),{},{compact:3,colors:!1,depth:0})):Xt(y);break;case 106:c=Yn(e[++n]);break;case 100:var p=e[++n];c="bigint"==typeof p?Jn(p,t):"symbol"===o(p)?"NaN":qn(yt(p),t);break;case 79:c=Qr(e[++n],t);break;case 111:c=Qr(e[++n],l(l({},t),{},{showHidden:!0,showProxy:!0,depth:4}));break;case 105:var g=e[++n];c="bigint"==typeof g?Jn(g,t):"symbol"===o(g)?"NaN":qn(ht(g),t);break;case 102:var v=e[++n];c="symbol"===o(v)?"NaN":qn(vt(v),t);break;case 99:n+=1,c="";break;case 37:a+=pe(r,u,f),u=f+1;continue;default:continue}u!==f-1&&(a+=pe(r,u,f-1)),a+=c,u=f+1}else 37===s&&(a+=pe(r,u,f),u=f+1)}0!==u&&(n++,i=" ",u<r.length&&(a+=pe(r,u)))}for(;n<e.length;){var h=e[n];a+=i,a+="string"!=typeof h?Qr(h,t):h,i=" ",n++}return a}function Qn(t){return t<=31||t>=127&&t<=159||t>=768&&t<=879||t>=8203&&t<=8207||t>=8400&&t<=8447||t>=65024&&t<=65039||t>=65056&&t<=65071||t>=917760&&t<=917999}if(Me("config").hasIntl)Er(!1);else{Gr=function(t){var e=0;(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])&&(t=to(t)),t=ce(t,"NFC");var r,n=a(new Yt(t));try{for(n.s();!(r=n.n()).done;){var o=r.value,i=re(o,0);Xn(i)?e+=2:Qn(i)||e++}}catch(t){n.e(t)}finally{n.f()}return e};var Xn=function(t){return t>=4352&&(t<=4447||9001===t||9002===t||t>=11904&&t<=12871&&12351!==t||t>=12880&&t<=19903||t>=19968&&t<=42182||t>=43360&&t<=43388||t>=44032&&t<=55203||t>=63744&&t<=64255||t>=65040&&t<=65049||t>=65072&&t<=65131||t>=65281&&t<=65376||t>=65504&&t<=65510||t>=110592&&t<=110593||t>=127488&&t<=127569||t>=127744&&t<=128591||t>=131072&&t<=262141)}}function to(t){return Lr(t,"str"),Ut(Kr,t,"")}var eo={34:"&quot;",38:"&amp;",39:"&apos;",60:"&lt;",62:"&gt;",160:"&nbsp;"};function ro(t){return t.replace(/[\u0000-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u00FF]/g,function(t){var e=Xt(t.charCodeAt(0));return eo[e]||"&#"+e+";"})}t.exports={identicalSequenceRange:bn,inspect:Qr,inspectDefaultOptions:Hr,format:function(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];return Kn(void 0,e)},formatWithOptions:function(t){Rr(t,"inspectOptions",Tr);for(var e=arguments.length,r=new Array(e>1?e-1:0),n=1;n<e;n++)r[n-1]=arguments[n];return Kn(t,r)},getStringWidth:Gr,stripVTControlCharacters:to,isZeroWidthCodePoint:Qn,stylizeWithColor:an,stylizeWithHTML:function(t,e){var r=Qr.styles[e];return void 0!==r?'<span style="color:'.concat(r,';">').concat(ro(t),"</span>"):ro(t)},Proxy:Je}},411:(t,e,r)=>{var n=r(798),o=n.StringPrototypeCharCodeAt,a=n.StringPrototypeIncludes,i=n.StringPrototypeReplace,c=r(999),u=r(315).CHAR_FORWARD_SLASH,l=r(503),f=/%/g,s=/\\/g,y=/\n/g,p=/\r/g,g=/\t/g;t.exports={pathToFileURL:function(t){var e=new c("file://"),r=l.resolve(t);return o(t,t.length-1)===u&&r[r.length-1]!==l.sep&&(r+="/"),e.pathname=function(t){return a(t,"%")&&(t=i(t,f,"%25")),a(t,"\\")&&(t=i(t,s,"%5C")),a(t,"\n")&&(t=i(t,y,"%0A")),a(t,"\r")&&(t=i(t,p,"%0D")),a(t,"\t")&&(t=i(t,g,"%09")),t}(r),e},URL:c}},496:t=>{var e=["_http_agent","_http_client","_http_common","_http_incoming","_http_outgoing","_http_server","_stream_duplex","_stream_passthrough","_stream_readable","_stream_transform","_stream_wrap","_stream_writable","_tls_common","_tls_wrap","assert","assert/strict","async_hooks","buffer","child_process","cluster","console","constants","crypto","dgram","diagnostics_channel","dns","dns/promises","domain","events","fs","fs/promises","http","http2","https","inspector","module","Module","net","os","path","path/posix","path/win32","perf_hooks","process","punycode","querystring","readline","readline/promises","repl","stream","stream/consumers","stream/promises","stream/web","string_decoder","sys","timers","timers/promises","tls","trace_events","tty","url","util","util/types","v8","vm","wasi","worker_threads","zlib"];t.exports.BuiltinModule={exists:function(t){return"internal/modules/cjs/foo"!==t&&(t.startsWith("internal/")||-1!==e.indexOf(t))}}},503:(t,e,r)=>{var n=r(798),o=n.StringPrototypeCharCodeAt,a=n.StringPrototypeLastIndexOf,i=n.StringPrototypeSlice,c=r(315),u=c.CHAR_DOT,l=c.CHAR_FORWARD_SLASH,f=r(755).validateString;function s(t){return t===l}function y(t,e,r,n){for(var c="",f=0,s=-1,y=0,p=0,g=0;g<=t.length;++g){if(g<t.length)p=o(t,g);else{if(n(p))break;p=l}if(n(p)){if(s===g-1||1===y);else if(2===y){if(c.length<2||2!==f||o(c,c.length-1)!==u||o(c,c.length-2)!==u){if(c.length>2){var v=a(c,r);-1===v?(c="",f=0):f=(c=i(c,0,v)).length-1-a(c,r),s=g,y=0;continue}if(0!==c.length){c="",f=0,s=g,y=0;continue}}e&&(c+=c.length>0?"".concat(r,".."):"..",f=2)}else c.length>0?c+="".concat(r).concat(i(t,s+1,g)):c=i(t,s+1,g),f=g-s-1;s=g,y=0}else p===u&&-1!==y?++y:y=-1}return c}t.exports={isPosixPathSeparator:s,normalizeString:y,resolve:function(){if((0===arguments.length||1===arguments.length&&(""===(arguments.length<=0?void 0:arguments[0])||"."===(arguments.length<=0?void 0:arguments[0])))&&o("/",0)===l)return"/";for(var t="",e=!1,r=arguments.length-1;r>=0&&!e;r--){var n=r<0||arguments.length<=r?void 0:arguments[r];f(n,"paths[".concat(r,"]")),0!==n.length&&(t="".concat(n,"/").concat(t),e=o(n,0)===l)}return e||(t="".concat("/","/").concat(t),e=o("/",0)===l),t=y(t,!e,"/",s),e?"/".concat(t):t.length>0?t:"."}}},522:(t,e,r)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function o(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,a(n.key),n)}}function a(t){var e=function(t){if("object"!=n(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==n(e)?e:e+""}var i=r(798),c=i.Proxy,u=i.ProxyRevocable,l=new(0,i.SafeWeakMap),f=function(){return t=function t(e,r){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t);var n=new c(e,r);return l.set(n,[e,r]),n},e=[{key:"getProxyDetails",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=l.get(t);if(r)return e?r:r[0]}},{key:"revocable",value:function(t,e){var r=u(t,e);l.set(r.proxy,[t,e]);var n=r.revoke;return r.revoke=function(){l.set(r.proxy,[null,null]),n()},r}}],null&&0,e&&o(t,e),Object.defineProperty(t,"prototype",{writable:!1}),t;// removed by dead control flow
@@ -16857,13 +17134,13 @@ module.exports = function stringToParts(str) {
16857
17134
  var t, e; }();e.h=c},730:(t,e,r)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=r(798),a=o.ArrayIsArray,i=o.BigInt,c=o.Boolean,u=o.DatePrototype,l=o.Error,f=o.FunctionPrototype,s=o.MapPrototypeHas,y=o.Number,p=o.ObjectDefineProperty,g=o.ObjectGetOwnPropertyDescriptor,v=o.ObjectGetPrototypeOf,h=o.ObjectIsFrozen,d=o.ObjectPrototype,b=o.SetPrototypeHas,m=o.String,S=o.Symbol,P=o.SymbolToStringTag,x=o.globalThis,w=r(0).getConstructorName;function A(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),o=1;o<e;o++)r[o-1]=arguments[o];for(var a=0,i=r;a<i.length;a++){var c=i[a],u=x[c];if(u&&t instanceof u)return!0}for(;t;){if("object"!==n(t))return!1;if(r.indexOf(w(t))>=0)return!0;t=v(t)}return!1}function O(t){return function(e){if(!A(e,t.name))return!1;try{t.prototype.valueOf.call(e)}catch(t){return!1}return!0}}"object"!==n(x)&&(p(d,"__magic__",{get:function(){return this},configurable:!0}),__magic__.globalThis=__magic__,delete d.__magic__);var _=O(m),j=O(y),E=O(c),k=O(i),I=O(S);t.exports={isAsyncFunction:function(t){return"function"==typeof t&&f.toString.call(t).startsWith("async")},isGeneratorFunction:function(t){return"function"==typeof t&&f.toString.call(t).match(/^(async\s+)?function *\*/)},isAnyArrayBuffer:function(t){return A(t,"ArrayBuffer","SharedArrayBuffer")},isArrayBuffer:function(t){return A(t,"ArrayBuffer")},isArgumentsObject:function(t){if(null!==t&&"object"===n(t)&&!a(t)&&"number"==typeof t.length&&t.length===(0|t.length)&&t.length>=0){var e=g(t,"callee");return e&&!e.enumerable}return!1},isBoxedPrimitive:function(t){return j(t)||_(t)||E(t)||k(t)||I(t)},isDataView:function(t){return A(t,"DataView")},isExternal:function(t){return"object"===n(t)&&h(t)&&null==v(t)},isMap:function(t){if(!A(t,"Map"))return!1;try{s(t)}catch(t){return!1}return!0},isMapIterator:function(t){return"[object Map Iterator]"===d.toString.call(v(t))},isModuleNamespaceObject:function(t){try{return t&&"object"===n(t)&&"Module"===t[P]}catch(t){return!1}},isNativeError:function(t){return t instanceof l&&A(t,"Error","EvalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError","AggregateError")},isPromise:function(t){return A(t,"Promise")},isSet:function(t){if(!A(t,"Set"))return!1;try{b(t)}catch(t){return!1}return!0},isSetIterator:function(t){return"[object Set Iterator]"===d.toString.call(v(t))},isWeakMap:function(t){return A(t,"WeakMap")},isWeakSet:function(t){return A(t,"WeakSet")},isRegExp:function(t){return A(t,"RegExp")},isDate:function(t){if(A(t,"Date"))try{return u.getTime.call(t),!0}catch(t){}return!1},isTypedArray:function(t){return A(t,"Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array")},isStringObject:_,isNumberObject:j,isBooleanObject:E,isBigIntObject:k,isSymbolObject:I}},755:(t,e,r)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=r(798).ArrayIsArray,a=r(799),i=a.hideStackFrames,c=a.codes.ERR_INVALID_ARG_TYPE,u=i(function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(0===r){if(null===t||o(t))throw new c(e,"Object",t);if("object"!==n(t))throw new c(e,"Object",t)}else{if(!(1&r)&&null===t)throw new c(e,"Object",t);if(!(2&r)&&o(t))throw new c(e,"Object",t);var a=!(4&r),i=n(t);if("object"!==i&&(a||"function"!==i))throw new c(e,"Object",t)}});t.exports={kValidateObjectNone:0,kValidateObjectAllowNullable:1,kValidateObjectAllowArray:2,kValidateObjectAllowFunction:4,validateObject:u,validateString:function(t,e){if("string"!=typeof t)throw new c(e,"string",t)}}},758:(t,e,r)=>{var n;function o(){return n=null!=n?n:r(799).codes.ERR_INTERNAL_ASSERTION}function a(t,e){if(!t)throw new(o())(e)}a.fail=function(t){throw new(o())(t)},t.exports=a},798:t=>{function e(){var t,n,o="function"==typeof Symbol?Symbol:{},a=o.iterator||"@@iterator",i=o.toStringTag||"@@toStringTag";function c(e,o,a,i){var c=o&&o.prototype instanceof l?o:l,f=Object.create(c.prototype);return r(f,"_invoke",function(e,r,o){var a,i,c,l=0,f=o||[],s=!1,y={p:0,n:0,v:t,a:p,f:p.bind(t,4),d:function(e,r){return a=e,i=0,c=t,y.n=r,u}};function p(e,r){for(i=e,c=r,n=0;!s&&l&&!o&&n<f.length;n++){var o,a=f[n],p=y.p,g=a[2];e>3?(o=g===r)&&(c=a[(i=a[4])?5:(i=3,3)],a[4]=a[5]=t):a[0]<=p&&((o=e<2&&p<a[1])?(i=0,y.v=r,y.n=a[1]):p<g&&(o=e<3||a[0]>r||r>g)&&(a[4]=e,a[5]=r,y.n=g,i=0))}if(o||e>1)return u;throw s=!0,r}return function(o,f,g){if(l>1)throw TypeError("Generator is already running");for(s&&1===f&&p(f,g),i=f,c=g;(n=i<2?t:c)||!s;){a||(i?i<3?(i>1&&(y.n=-1),p(i,c)):y.n=c:y.v=c);try{if(l=2,a){if(i||(o="next"),n=a[o]){if(!(n=n.call(a,c)))throw TypeError("iterator result is not an object");if(!n.done)return n;c=n.value,i<2&&(i=0)}else 1===i&&(n=a.return)&&n.call(a),i<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),i=1);a=t}else if((n=(s=y.n<0)?c:e.call(r,y))!==u)break}catch(e){a=t,i=1,c=e}finally{l=1}}return{value:n,done:s}}}(e,a,i),!0),f}var u={};function l(){}function f(){}function s(){}n=Object.getPrototypeOf;var y=[][a]?n(n([][a]())):(r(n={},a,function(){return this}),n),p=s.prototype=l.prototype=Object.create(y);function g(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,r(t,i,"GeneratorFunction")),t.prototype=Object.create(p),t}return f.prototype=s,r(p,"constructor",s),r(s,"constructor",f),f.displayName="GeneratorFunction",r(s,i,"GeneratorFunction"),r(p),r(p,i,"Generator"),r(p,a,function(){return this}),r(p,"toString",function(){return"[object Generator]"}),(e=function(){return{w:c,m:g}})()}function r(t,e,n,o){var a=Object.defineProperty;try{a({},"",{})}catch(t){a=0}r=function(t,e,n,o){function i(e,n){r(t,e,function(t){return this._invoke(e,n,t)})}e?a?a(t,e,{value:n,enumerable:!o,configurable:!o,writable:!o}):t[e]=n:(i("next",0),i("throw",1),i("return",2))},r(t,e,n,o)}function n(t,e,r){return e=a(e),function(t,e){if(e&&("object"==d(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,o()?Reflect.construct(e,r||[],a(t).constructor):e.apply(t,r))}function o(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(o=function(){return!!t})()}function a(t){return a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},a(t)}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&c(t,e)}function c(t,e){return c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},c(t,e)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,g(n.key),n)}}function f(t,e,r){return e&&l(t.prototype,e),r&&l(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t}function s(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function y(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?s(Object(r),!0).forEach(function(e){p(t,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))})}return t}function p(t,e,r){return(e=g(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function g(t){var e=function(t){if("object"!=d(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=d(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==d(e)?e:e+""}function v(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return h(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?h(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,i=!0,c=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return i=t.done,t},e:function(t){c=!0,a=t},f:function(){try{i||null==r.return||r.return()}finally{if(c)throw a}}}}function h(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function d(t){return d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},d(t)}function b(t){return function(){return new m(t.apply(this,arguments))}}function m(t){var e,r;function n(e,r){try{var a=t[e](r),i=a.value,c=i instanceof S;Promise.resolve(c?i.v:i).then(function(r){if(c){var u="return"===e?"return":"next";if(!i.k||r.done)return n(u,r);r=t[u](r).value}o(a.done?"return":"normal",r)},function(t){n("throw",t)})}catch(t){o("throw",t)}}function o(t,o){switch(t){case"return":e.resolve({value:o,done:!0});break;case"throw":e.reject(o);break;default:e.resolve({value:o,done:!1})}(e=e.next)?n(e.key,e.arg):r=null}this._invoke=function(t,o){return new Promise(function(a,i){var c={key:t,arg:o,resolve:a,reject:i,next:null};r?r=r.next=c:(e=r=c,n(t,o))})},"function"!=typeof t.return&&(this.return=void 0)}function S(t,e){this.v=t,this.k=e}m.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},m.prototype.next=function(t){return this._invoke("next",t)},m.prototype.throw=function(t){return this._invoke("throw",t)},m.prototype.return=function(t){return this._invoke("return",t)};var P={__proto__:null},x=Reflect.defineProperty,w=Reflect.getOwnPropertyDescriptor,A=Reflect.ownKeys,O=Function.prototype,_=O.apply,j=O.bind,E=O.call,k=j.bind(E);P.uncurryThis=k;var I=j.bind(_);P.applyBind=I;var R=["ArrayOf","ArrayPrototypePush","ArrayPrototypeUnshift","MathHypot","MathMax","MathMin","StringFromCharCode","StringFromCodePoint","StringPrototypeConcat","TypedArrayOf"];function L(t){return"symbol"===d(t)?"Symbol".concat(t.description[7].toUpperCase()).concat(t.description.slice(8)):"".concat(t[0].toUpperCase()).concat(t.slice(1))}function T(t,e,r,n){var o=n.enumerable,a=n.get,i=n.set;x(t,"".concat(e,"Get").concat(r),{__proto__:null,value:k(a),enumerable:o}),void 0!==i&&x(t,"".concat(e,"Set").concat(r),{__proto__:null,value:k(i),enumerable:o})}function B(t,e,r){var n,o=v(A(t));try{for(o.s();!(n=o.n()).done;){var a=n.value,i=L(a),c=w(t,a);if("get"in c)T(e,r,i,c);else{var u="".concat(r).concat(i);x(e,u,y({__proto__:null},c)),R.includes(u)&&x(e,"".concat(u,"Apply"),{__proto__:null,value:I(c.value,t)})}}}catch(t){o.e(t)}finally{o.f()}}function z(t,e,r){var n,o=v(A(t));try{for(o.s();!(n=o.n()).done;){var a=n.value,i=L(a),c=w(t,a);if("get"in c)T(e,r,i,c);else{var u=c.value;"function"==typeof u&&(c.value=k(u));var l="".concat(r).concat(i);x(e,l,y({__proto__:null},c)),R.includes(l)&&x(e,"".concat(l,"Apply"),{__proto__:null,value:I(u)})}}}catch(t){o.e(t)}finally{o.f()}}["Proxy","globalThis"].forEach(function(t){P[t]=globalThis[t]}),[decodeURI,decodeURIComponent,encodeURI,encodeURIComponent].forEach(function(t){P[t.name]=t}),[escape,eval,unescape].forEach(function(t){P[t.name]=t}),["Atomics","JSON","Math","Proxy","Reflect"].forEach(function(t){B(globalThis[t],P,t)}),["AggregateError","Array","ArrayBuffer","BigInt","BigInt64Array","BigUint64Array","Boolean","DataView","Date","Error","EvalError","FinalizationRegistry","Float32Array","Float64Array","Function","Int16Array","Int32Array","Int8Array","Map","Number","Object","RangeError","ReferenceError","RegExp","Set","String","Symbol","SyntaxError","TypeError","URIError","Uint16Array","Uint32Array","Uint8Array","Uint8ClampedArray","WeakMap","WeakRef","WeakSet"].forEach(function(t){var e=globalThis[t];e&&(P[t]=e,B(e,P,t),z(e.prototype,P,"".concat(t,"Prototype")))}),["Promise"].forEach(function(t){var e=globalThis[t];P[t]=e,function(t,e,r){var n,o=v(A(t));try{for(o.s();!(n=o.n()).done;){var a=n.value,i=L(a),c=w(t,a);if("get"in c)T(e,r,i,c);else{var u=c.value;"function"==typeof u&&(c.value=u.bind(t));var l="".concat(r).concat(i);x(e,l,y({__proto__:null},c))}}}catch(t){o.e(t)}finally{o.f()}}(e,P,t),z(e.prototype,P,"".concat(t,"Prototype"))}),[{name:"TypedArray",original:Reflect.getPrototypeOf(Uint8Array)},{name:"ArrayIterator",original:{prototype:Reflect.getPrototypeOf(Array.prototype[Symbol.iterator]())}},{name:"StringIterator",original:{prototype:Reflect.getPrototypeOf(String.prototype[Symbol.iterator]())}}].forEach(function(t){var e=t.name,r=t.original;P[e]=r,z(r,P,e),z(r.prototype,P,"".concat(e,"Prototype"))}),P.IteratorPrototype=Reflect.getPrototypeOf(P.ArrayIteratorPrototype);var M=P.ArrayPrototypeForEach,C=P.FinalizationRegistry,D=P.FunctionPrototypeCall,N=P.Map,F=P.ObjectFreeze,W=P.ObjectSetPrototypeOf,H=P.RegExp,U=P.Set,G=P.SymbolIterator,V=P.WeakMap,Z=P.WeakRef,$=P.WeakSet,Y=function(t,e){var r=function(){return f(function e(r){u(this,e),this._iterator=t(r)},[{key:"next",value:function(){return e(this._iterator)}},{key:G,value:function(){return this}}])}();return W(r.prototype,null),F(r.prototype),F(r),r};P.SafeArrayIterator=Y(P.ArrayPrototypeSymbolIterator,P.ArrayIteratorPrototypeNext),P.SafeStringIterator=Y(P.StringPrototypeSymbolIterator,P.StringIteratorPrototypeNext);var q=function(t,e){M(A(t),function(r){w(e,r)||x(e,r,y({__proto__:null},w(t,r)))})},J=function(t,e){if(G in t.prototype){var r,n=new t;M(A(t.prototype),function(o){if(!w(e.prototype,o)){var a,i=w(t.prototype,o);if("function"==typeof i.value&&0===i.value.length&&G in(null!==(a=D(i.value,n))&&void 0!==a?a:{})){var c=k(i.value);r=r||k(c(n).next);var u=Y(c,r);i.value=function(){return new u(this)}}x(e.prototype,o,y({__proto__:null},i))}})}else q(t.prototype,e.prototype);return q(t,e),W(e.prototype,null),F(e.prototype),F(e),e};P.makeSafe=J,P.SafeMap=J(N,function(t){function e(){return u(this,e),n(this,e,arguments)}return i(e,t),f(e)}(N)),P.SafeWeakMap=J(V,function(t){function e(){return u(this,e),n(this,e,arguments)}return i(e,t),f(e)}(V)),P.SafeSet=J(U,function(t){function e(){return u(this,e),n(this,e,arguments)}return i(e,t),f(e)}(U)),P.SafeWeakSet=J($,function(t){function e(){return u(this,e),n(this,e,arguments)}return i(e,t),f(e)}($)),P.SafeFinalizationRegistry=J(C,function(t){function e(){return u(this,e),n(this,e,arguments)}return i(e,t),f(e)}(C)),P.SafeWeakRef=J(Z,function(t){function e(){return u(this,e),n(this,e,arguments)}return i(e,t),f(e)}(Z)),P.AsyncIteratorPrototype=P.ReflectGetPrototypeOf(b(e().m(function t(){return e().w(function(t){for(;;)if(0===t.n)return t.a(2)},t)}))).prototype,P.internalBinding=function(t){if("config"===t)return{hasIntl:!1};throw new Error('unknown module: "'.concat(t,'"'))},P._stringPrototypeReplaceAll=function(t,e,r){return"[object regexp]"===Object.prototype.toString.call(e).toLowerCase()?t.replace(e,r):t.replace(new H(e,"g"),r)},P.StringPrototypeReplaceAll=P.StringPrototypeReplaceAll||P._stringPrototypeReplaceAll,W(P,null),F(P),t.exports=P},799:(t,e,r)=>{function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function o(t){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o(t)}function a(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,i(n.key),n)}}function i(t){var e=function(t){if("object"!=o(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=o(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==o(e)?e:e+""}function c(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(c=function(){return!!t})()}function u(t){return u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},u(t)}function l(t,e){return l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},l(t,e)}var f,s,y=r(798),p=y.ArrayIsArray,g=y.ArrayPrototypeIncludes,v=y.ArrayPrototypeIndexOf,h=y.ArrayPrototypeJoin,d=y.ArrayPrototypePush,b=y.ArrayPrototypeSlice,m=y.ArrayPrototypeSplice,S=y.Error,P=y.ErrorCaptureStackTrace,x=y.JSONStringify,w=y.ObjectDefineProperty,A=y.ReflectApply,O=y.RegExpPrototypeExec,_=y.SafeMap,j=y.SafeWeakMap,E=y.String,k=y.StringPrototypeEndsWith,I=y.StringPrototypeIncludes,R=y.StringPrototypeIndexOf,L=y.StringPrototypeSlice,T=y.StringPrototypeToLowerCase,B=y.Symbol,z=y.TypeError,M=B("kIsNodeError"),C=new _,D={},N=/^[A-Z][a-zA-Z0-9]*$/,F=["string","function","number","object","Function","Object","boolean","bigint","symbol"],W=new j,H=r(758),U=null;function G(t,e){var r=function(t){function r(){var t,n,a,l;(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")})(this,r),t=function(t,e,r){return e=u(e),function(t,e){if(e&&("object"==o(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,c()?Reflect.construct(e,r||[],u(t).constructor):e.apply(t,r))}(this,r),n=t,l=e,(a=i(a="code"))in n?Object.defineProperty(n,a,{value:l,enumerable:!0,configurable:!0,writable:!0}):n[a]=l;for(var f=arguments.length,s=new Array(f),y=0;y<f;y++)s[y]=arguments[y];return w(t,"message",{__proto__:null,value:Z(e,s,t),enumerable:!1,writable:!0,configurable:!0}),t}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&l(t,e)}(r,t),n=r,(f=[{key:"toString",value:function(){return"".concat(this.name," [").concat(e,"]: ").concat(this.message)}}])&&a(n.prototype,f),s&&a(n,s),Object.defineProperty(n,"prototype",{writable:!1}),n;// removed by dead control flow
16858
17135
  var n, f, s; }(t);return r}function V(t,e,r){C.set(t,e);var n=G(r,t);D[t]=n}function Z(t,e,r){var n=C.get(t);if("function"==typeof n)return H(n.length<=e.length,"Code: ".concat(t,"; The provided arguments length (").concat(e.length,") does not ")+"match the required ones (".concat(n.length,").")),A(n,r,e)}var $=B("kEnhanceStackBeforeInspector");function Y(t){if(null===t)return"null";if(void 0===t)return"undefined";switch(o(t)){case"bigint":return"type bigint (".concat(t,"n)");case"number":return 0===t?1/t==-1/0?"type number (-0)":"type number (0)":t!=t?"type number (NaN)":t===1/0?"type number (Infinity)":t===-1/0?"type number (-Infinity)":"type number (".concat(t,")");case"boolean":return t?"type boolean (true)":"type boolean (false)";case"symbol":return"type symbol (".concat(E(t),")");case"function":return"function ".concat(t.name);case"object":return t.constructor&&"name"in t.constructor?"an instance of ".concat(t.constructor.name):"".concat((U=U||r(338)).inspect(t,{depth:-1}));case"string":return t.length>28&&(t="".concat(L(t,0,25),"...")),-1===R(t,"'")?"type string ('".concat(t,"')"):"type string (".concat(x(t),")")}}function q(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"and";switch(t.length){case 0:return"";case 1:return"".concat(t[0]);case 2:return"".concat(t[0]," ").concat(e," ").concat(t[1]);case 3:return"".concat(t[0],", ").concat(t[1],", ").concat(e," ").concat(t[2]);default:return"".concat(h(b(t,0,-1),", "),", ").concat(e," ").concat(t[t.length-1])}}t.exports={codes:D,determineSpecificType:Y,E:V,formatList:q,getMessage:Z,hideStackFrames:function(t){function e(){try{for(var r=arguments.length,n=new Array(r),o=0;o<r;o++)n[o]=arguments[o];return A(t,this,n)}catch(t){throw S.stackTraceLimit&&P(t,e),t}}return e.withoutStackTrace=t,e},isStackOverflowError:function(t){if(void 0===s)try{var e=function(){e()};e()}catch(t){s=t.message,f=t.name}return t&&t.name===f&&t.message===s},kEnhanceStackBeforeInspector:$,kIsNodeError:M,overrideStackTrace:W},V("ERR_INTERNAL_ASSERTION",function(t){var e="This is caused by either a bug in Node.js or incorrect usage of Node.js internals.\nPlease open an issue with this stack trace at https://github.com/nodejs/node/issues\n";return void 0===t?e:"".concat(t,"\n").concat(e)},S),V("ERR_INVALID_ARG_TYPE",function(t,e,r){H("string"==typeof t,"'name' must be a string"),p(e)||(e=[e]);var o="The ";if(k(t," argument"))o+="".concat(t," ");else{var a=I(t,".")?"property":"argument";o+='"'.concat(t,'" ').concat(a," ")}o+="must be ";var i,c=[],u=[],l=[],f=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return n(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var o=0,a=function(){};return{s:a,n:function(){return o>=t.length?{done:!0}:{done:!1,value:t[o++]}},e:function(t){throw t},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,c=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return c=t.done,t},e:function(t){u=!0,i=t},f:function(){try{c||null==r.return||r.return()}finally{if(u)throw i}}}}(e);try{for(f.s();!(i=f.n()).done;){var s=i.value;H("string"==typeof s,"All expected entries have to be of type string"),g(F,s)?d(c,T(s)):null!==O(N,s)?d(u,s):(H("object"!==s,'The value "object" should be written as "Object"'),d(l,s))}}catch(t){f.e(t)}finally{f.f()}if(u.length>0){var y=v(c,"object");-1!==y&&(m(c,y,1),d(u,"Object"))}return c.length>0&&(o+="".concat(c.length>1?"one of type":"of type"," ").concat(q(c,"or")),(u.length>0||l.length>0)&&(o+=" or ")),u.length>0&&(o+="an instance of ".concat(q(u,"or")),l.length>0&&(o+=" or ")),l.length>0&&(l.length>1?o+="one of ".concat(q(l,"or")):(T(l[0])!==l[0]&&(o+="an "),o+="".concat(l[0]))),o+". Received ".concat(Y(r))},z)},948:(t,e,r)=>{var n=r(798),o=n.ArrayPrototypeJoin,a=n.Error,i=n.StringPrototypeReplace,c=n.SymbolFor,u=/\u001b\[\d\d?m/g;t.exports={customInspectSymbol:c("nodejs.util.inspect.custom"),isError:function(t){return t instanceof a},join:o,removeColors:function(t){return i(t,u,"")}}},999:t=>{t.exports=URL}},e={};return function r(n){var o=e[n];if(void 0!==o)return o.exports;var a=e[n]={exports:{}};return t[n](a,a.exports,r),a.exports}(338)})());
16859
17136
 
16860
- /***/ }),
17137
+ /***/ },
16861
17138
 
16862
- /***/ "./node_modules/vanillatoasts/vanillatoasts.js":
17139
+ /***/ "./node_modules/vanillatoasts/vanillatoasts.js"
16863
17140
  /*!*****************************************************!*\
16864
17141
  !*** ./node_modules/vanillatoasts/vanillatoasts.js ***!
16865
17142
  \*****************************************************/
16866
- /***/ (function(module) {
17143
+ (module) {
16867
17144
 
16868
17145
  (function (root, factory) {
16869
17146
  try {
@@ -17041,18 +17318,18 @@ module.exports = function stringToParts(str) {
17041
17318
  });
17042
17319
 
17043
17320
 
17044
- /***/ }),
17321
+ /***/ },
17045
17322
 
17046
- /***/ "./package.json":
17323
+ /***/ "./package.json"
17047
17324
  /*!**********************!*\
17048
17325
  !*** ./package.json ***!
17049
17326
  \**********************/
17050
- /***/ ((module) => {
17327
+ (module) {
17051
17328
 
17052
17329
  "use strict";
17053
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@mongoosejs/studio","version":"0.1.15","description":"A sleek, powerful MongoDB UI with built-in dashboarding and auth, seamlessly integrated with your Express, Vercel, or Netlify app.","homepage":"https://studio.mongoosejs.io/","repository":{"type":"git","url":"https://github.com/mongoosejs/studio"},"license":"Apache-2.0","dependencies":{"@ai-sdk/google":"2.x","@ai-sdk/openai":"2.x","@ai-sdk/anthropic":"2.x","ai":"5.x","archetype":"0.13.1","csv-stringify":"6.3.0","ejson":"^2.2.3","extrovert":"^0.2.0","marked":"15.0.12","node-inspect-extracted":"3.x","tailwindcss":"3.4.0","vanillatoasts":"^1.6.0","vue":"3.x","webpack":"5.x"},"peerDependencies":{"mongoose":"7.x || 8.x || ^9.0.0"},"devDependencies":{"@masteringjs/eslint-config":"0.1.1","axios":"1.2.2","dedent":"^1.6.0","eslint":"9.30.0","express":"4.x","mocha":"10.2.0","mongoose":"9.x"},"scripts":{"lint":"eslint .","tailwind":"tailwindcss -o ./frontend/public/tw.css","tailwind:watch":"tailwindcss -o ./frontend/public/tw.css --watch","test":"mocha test/*.test.js"}}');
17330
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@mongoosejs/studio","version":"0.1.17","description":"A sleek, powerful MongoDB UI with built-in dashboarding and auth, seamlessly integrated with your Express, Vercel, or Netlify app.","homepage":"https://studio.mongoosejs.io/","repository":{"type":"git","url":"https://github.com/mongoosejs/studio"},"license":"Apache-2.0","dependencies":{"@ai-sdk/google":"2.x","@ai-sdk/openai":"2.x","@ai-sdk/anthropic":"2.x","ai":"5.x","archetype":"0.13.1","csv-stringify":"6.3.0","ejson":"^2.2.3","extrovert":"^0.2.0","marked":"15.0.12","node-inspect-extracted":"3.x","tailwindcss":"3.4.0","vanillatoasts":"^1.6.0","vue":"3.x","webpack":"5.x"},"peerDependencies":{"mongoose":"7.x || 8.x || ^9.0.0"},"devDependencies":{"@masteringjs/eslint-config":"0.1.1","axios":"1.2.2","dedent":"^1.6.0","eslint":"9.30.0","express":"4.x","mocha":"10.2.0","mongoose":"9.x"},"scripts":{"lint":"eslint .","tailwind":"tailwindcss -o ./frontend/public/tw.css","tailwind:watch":"tailwindcss -o ./frontend/public/tw.css --watch","test":"mocha test/*.test.js"}}');
17054
17331
 
17055
- /***/ })
17332
+ /***/ }
17056
17333
 
17057
17334
  /******/ });
17058
17335
  /************************************************************************/
@@ -17066,6 +17343,12 @@ module.exports = /*#__PURE__*/JSON.parse('{"name":"@mongoosejs/studio","version"
17066
17343
  /******/ if (cachedModule !== undefined) {
17067
17344
  /******/ return cachedModule.exports;
17068
17345
  /******/ }
17346
+ /******/ // Check if module exists (development only)
17347
+ /******/ if (__webpack_modules__[moduleId] === undefined) {
17348
+ /******/ var e = new Error("Cannot find module '" + moduleId + "'");
17349
+ /******/ e.code = 'MODULE_NOT_FOUND';
17350
+ /******/ throw e;
17351
+ /******/ }
17069
17352
  /******/ // Create a new module (and put it into the cache)
17070
17353
  /******/ var module = __webpack_module_cache__[moduleId] = {
17071
17354
  /******/ // no module.id needed