@mongoosejs/studio 0.1.16 → 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",
@@ -94,7 +96,6 @@ var map = {
94
96
  "./document/document.html": "./frontend/src/document/document.html",
95
97
  "./document/document.js": "./frontend/src/document/document.js",
96
98
  "./edit-array/edit-array": "./frontend/src/edit-array/edit-array.js",
97
- "./edit-array/edit-array.css": "./frontend/src/edit-array/edit-array.css",
98
99
  "./edit-array/edit-array.html": "./frontend/src/edit-array/edit-array.html",
99
100
  "./edit-array/edit-array.js": "./frontend/src/edit-array/edit-array.js",
100
101
  "./edit-boolean/edit-boolean": "./frontend/src/edit-boolean/edit-boolean.js",
@@ -124,7 +125,6 @@ var map = {
124
125
  "./index": "./frontend/src/index.js",
125
126
  "./index.js": "./frontend/src/index.js",
126
127
  "./list-array/list-array": "./frontend/src/list-array/list-array.js",
127
- "./list-array/list-array.css": "./frontend/src/list-array/list-array.css",
128
128
  "./list-array/list-array.html": "./frontend/src/list-array/list-array.html",
129
129
  "./list-array/list-array.js": "./frontend/src/list-array/list-array.js",
130
130
  "./list-default/list-default": "./frontend/src/list-default/list-default.js",
@@ -203,13 +203,13 @@ webpackContext.resolve = webpackContextResolve;
203
203
  module.exports = webpackContext;
204
204
  webpackContext.id = "./frontend/src sync recursive ^\\.\\/.*$";
205
205
 
206
- /***/ }),
206
+ /***/ },
207
207
 
208
- /***/ "./frontend/src/api.js":
208
+ /***/ "./frontend/src/api.js"
209
209
  /*!*****************************!*\
210
210
  !*** ./frontend/src/api.js ***!
211
211
  \*****************************/
212
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
212
+ (__unused_webpack_module, exports, __webpack_require__) {
213
213
 
214
214
  "use strict";
215
215
 
@@ -571,13 +571,13 @@ if (window.MONGOOSE_STUDIO_CONFIG.isLambda) {
571
571
  }
572
572
 
573
573
 
574
- /***/ }),
574
+ /***/ },
575
575
 
576
- /***/ "./frontend/src/appendCSS.js":
576
+ /***/ "./frontend/src/appendCSS.js"
577
577
  /*!***********************************!*\
578
578
  !*** ./frontend/src/appendCSS.js ***!
579
579
  \***********************************/
580
- /***/ ((module) => {
580
+ (module) {
581
581
 
582
582
  "use strict";
583
583
 
@@ -592,24 +592,101 @@ module.exports = function appendCSS(css) {
592
592
  style.appendChild(document.createTextNode(css));
593
593
  };
594
594
 
595
- /***/ }),
595
+ /***/ },
596
596
 
597
- /***/ "./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"
598
675
  /*!*****************************************************!*\
599
676
  !*** ./frontend/src/async-button/async-button.html ***!
600
677
  \*****************************************************/
601
- /***/ ((module) => {
678
+ (module) {
602
679
 
603
680
  "use strict";
604
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";
605
682
 
606
- /***/ }),
683
+ /***/ },
607
684
 
608
- /***/ "./frontend/src/async-button/async-button.js":
685
+ /***/ "./frontend/src/async-button/async-button.js"
609
686
  /*!***************************************************!*\
610
687
  !*** ./frontend/src/async-button/async-button.js ***!
611
688
  \***************************************************/
612
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
689
+ (module, __unused_webpack_exports, __webpack_require__) {
613
690
 
614
691
  "use strict";
615
692
 
@@ -662,24 +739,24 @@ module.exports = app => app.component('async-button', {
662
739
  });
663
740
 
664
741
 
665
- /***/ }),
742
+ /***/ },
666
743
 
667
- /***/ "./frontend/src/chat/chat-message-script/chat-message-script.html":
744
+ /***/ "./frontend/src/chat/chat-message-script/chat-message-script.html"
668
745
  /*!************************************************************************!*\
669
746
  !*** ./frontend/src/chat/chat-message-script/chat-message-script.html ***!
670
747
  \************************************************************************/
671
- /***/ ((module) => {
748
+ (module) {
672
749
 
673
750
  "use strict";
674
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";
675
752
 
676
- /***/ }),
753
+ /***/ },
677
754
 
678
- /***/ "./frontend/src/chat/chat-message-script/chat-message-script.js":
755
+ /***/ "./frontend/src/chat/chat-message-script/chat-message-script.js"
679
756
  /*!**********************************************************************!*\
680
757
  !*** ./frontend/src/chat/chat-message-script/chat-message-script.js ***!
681
758
  \**********************************************************************/
682
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
759
+ (module, __unused_webpack_exports, __webpack_require__) {
683
760
 
684
761
  "use strict";
685
762
  /* global CodeMirror, Prism */
@@ -926,24 +1003,24 @@ module.exports = app => app.component('chat-message-script', {
926
1003
  });
927
1004
 
928
1005
 
929
- /***/ }),
1006
+ /***/ },
930
1007
 
931
- /***/ "./frontend/src/chat/chat-message/chat-message.html":
1008
+ /***/ "./frontend/src/chat/chat-message/chat-message.html"
932
1009
  /*!**********************************************************!*\
933
1010
  !*** ./frontend/src/chat/chat-message/chat-message.html ***!
934
1011
  \**********************************************************/
935
- /***/ ((module) => {
1012
+ (module) {
936
1013
 
937
1014
  "use strict";
938
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";
939
1016
 
940
- /***/ }),
1017
+ /***/ },
941
1018
 
942
- /***/ "./frontend/src/chat/chat-message/chat-message.js":
1019
+ /***/ "./frontend/src/chat/chat-message/chat-message.js"
943
1020
  /*!********************************************************!*\
944
1021
  !*** ./frontend/src/chat/chat-message/chat-message.js ***!
945
1022
  \********************************************************/
946
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1023
+ (module, __unused_webpack_exports, __webpack_require__) {
947
1024
 
948
1025
  "use strict";
949
1026
 
@@ -1046,24 +1123,24 @@ module.exports = app => app.component('chat-message', {
1046
1123
  });
1047
1124
 
1048
1125
 
1049
- /***/ }),
1126
+ /***/ },
1050
1127
 
1051
- /***/ "./frontend/src/chat/chat.html":
1128
+ /***/ "./frontend/src/chat/chat.html"
1052
1129
  /*!*************************************!*\
1053
1130
  !*** ./frontend/src/chat/chat.html ***!
1054
1131
  \*************************************/
1055
- /***/ ((module) => {
1132
+ (module) {
1056
1133
 
1057
1134
  "use strict";
1058
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";
1059
1136
 
1060
- /***/ }),
1137
+ /***/ },
1061
1138
 
1062
- /***/ "./frontend/src/chat/chat.js":
1139
+ /***/ "./frontend/src/chat/chat.js"
1063
1140
  /*!***********************************!*\
1064
1141
  !*** ./frontend/src/chat/chat.js ***!
1065
1142
  \***********************************/
1066
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1143
+ (module, __unused_webpack_exports, __webpack_require__) {
1067
1144
 
1068
1145
  "use strict";
1069
1146
 
@@ -1256,35 +1333,35 @@ module.exports = app => app.component('chat', {
1256
1333
  });
1257
1334
 
1258
1335
 
1259
- /***/ }),
1336
+ /***/ },
1260
1337
 
1261
- /***/ "./frontend/src/clone-document/clone-document.css":
1338
+ /***/ "./frontend/src/clone-document/clone-document.css"
1262
1339
  /*!********************************************************!*\
1263
1340
  !*** ./frontend/src/clone-document/clone-document.css ***!
1264
1341
  \********************************************************/
1265
- /***/ ((module) => {
1342
+ (module) {
1266
1343
 
1267
1344
  "use strict";
1268
1345
  module.exports = "";
1269
1346
 
1270
- /***/ }),
1347
+ /***/ },
1271
1348
 
1272
- /***/ "./frontend/src/clone-document/clone-document.html":
1349
+ /***/ "./frontend/src/clone-document/clone-document.html"
1273
1350
  /*!*********************************************************!*\
1274
1351
  !*** ./frontend/src/clone-document/clone-document.html ***!
1275
1352
  \*********************************************************/
1276
- /***/ ((module) => {
1353
+ (module) {
1277
1354
 
1278
1355
  "use strict";
1279
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 ";
1280
1357
 
1281
- /***/ }),
1358
+ /***/ },
1282
1359
 
1283
- /***/ "./frontend/src/clone-document/clone-document.js":
1360
+ /***/ "./frontend/src/clone-document/clone-document.js"
1284
1361
  /*!*******************************************************!*\
1285
1362
  !*** ./frontend/src/clone-document/clone-document.js ***!
1286
1363
  \*******************************************************/
1287
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1364
+ (module, __unused_webpack_exports, __webpack_require__) {
1288
1365
 
1289
1366
  "use strict";
1290
1367
 
@@ -1361,24 +1438,24 @@ module.exports = app => app.component('clone-document', {
1361
1438
  });
1362
1439
 
1363
1440
 
1364
- /***/ }),
1441
+ /***/ },
1365
1442
 
1366
- /***/ "./frontend/src/create-dashboard/create-dashboard.html":
1443
+ /***/ "./frontend/src/create-dashboard/create-dashboard.html"
1367
1444
  /*!*************************************************************!*\
1368
1445
  !*** ./frontend/src/create-dashboard/create-dashboard.html ***!
1369
1446
  \*************************************************************/
1370
- /***/ ((module) => {
1447
+ (module) {
1371
1448
 
1372
1449
  "use strict";
1373
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>";
1374
1451
 
1375
- /***/ }),
1452
+ /***/ },
1376
1453
 
1377
- /***/ "./frontend/src/create-dashboard/create-dashboard.js":
1454
+ /***/ "./frontend/src/create-dashboard/create-dashboard.js"
1378
1455
  /*!***********************************************************!*\
1379
1456
  !*** ./frontend/src/create-dashboard/create-dashboard.js ***!
1380
1457
  \***********************************************************/
1381
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1458
+ (module, __unused_webpack_exports, __webpack_require__) {
1382
1459
 
1383
1460
  "use strict";
1384
1461
 
@@ -1422,35 +1499,35 @@ module.exports = app => app.component('create-dashboard', {
1422
1499
  }
1423
1500
  });
1424
1501
 
1425
- /***/ }),
1502
+ /***/ },
1426
1503
 
1427
- /***/ "./frontend/src/create-document/create-document.css":
1504
+ /***/ "./frontend/src/create-document/create-document.css"
1428
1505
  /*!**********************************************************!*\
1429
1506
  !*** ./frontend/src/create-document/create-document.css ***!
1430
1507
  \**********************************************************/
1431
- /***/ ((module) => {
1508
+ (module) {
1432
1509
 
1433
1510
  "use strict";
1434
1511
  module.exports = "";
1435
1512
 
1436
- /***/ }),
1513
+ /***/ },
1437
1514
 
1438
- /***/ "./frontend/src/create-document/create-document.html":
1515
+ /***/ "./frontend/src/create-document/create-document.html"
1439
1516
  /*!***********************************************************!*\
1440
1517
  !*** ./frontend/src/create-document/create-document.html ***!
1441
1518
  \***********************************************************/
1442
- /***/ ((module) => {
1519
+ (module) {
1443
1520
 
1444
1521
  "use strict";
1445
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";
1446
1523
 
1447
- /***/ }),
1524
+ /***/ },
1448
1525
 
1449
- /***/ "./frontend/src/create-document/create-document.js":
1526
+ /***/ "./frontend/src/create-document/create-document.js"
1450
1527
  /*!*********************************************************!*\
1451
1528
  !*** ./frontend/src/create-document/create-document.js ***!
1452
1529
  \*********************************************************/
1453
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1530
+ (module, __unused_webpack_exports, __webpack_require__) {
1454
1531
 
1455
1532
  "use strict";
1456
1533
 
@@ -1517,24 +1594,24 @@ module.exports = app => app.component('create-document', {
1517
1594
  });
1518
1595
 
1519
1596
 
1520
- /***/ }),
1597
+ /***/ },
1521
1598
 
1522
- /***/ "./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.html":
1599
+ /***/ "./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.html"
1523
1600
  /*!****************************************************************************!*\
1524
1601
  !*** ./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.html ***!
1525
1602
  \****************************************************************************/
1526
- /***/ ((module) => {
1603
+ (module) {
1527
1604
 
1528
1605
  "use strict";
1529
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";
1530
1607
 
1531
- /***/ }),
1608
+ /***/ },
1532
1609
 
1533
- /***/ "./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.js":
1610
+ /***/ "./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.js"
1534
1611
  /*!**************************************************************************!*\
1535
1612
  !*** ./frontend/src/dashboard-result/dashboard-chart/dashboard-chart.js ***!
1536
1613
  \**************************************************************************/
1537
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1614
+ (module, __unused_webpack_exports, __webpack_require__) {
1538
1615
 
1539
1616
  "use strict";
1540
1617
 
@@ -1578,24 +1655,24 @@ module.exports = app => app.component('dashboard-chart', {
1578
1655
  });
1579
1656
 
1580
1657
 
1581
- /***/ }),
1658
+ /***/ },
1582
1659
 
1583
- /***/ "./frontend/src/dashboard-result/dashboard-document/dashboard-document.html":
1660
+ /***/ "./frontend/src/dashboard-result/dashboard-document/dashboard-document.html"
1584
1661
  /*!**********************************************************************************!*\
1585
1662
  !*** ./frontend/src/dashboard-result/dashboard-document/dashboard-document.html ***!
1586
1663
  \**********************************************************************************/
1587
- /***/ ((module) => {
1664
+ (module) {
1588
1665
 
1589
1666
  "use strict";
1590
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>";
1591
1668
 
1592
- /***/ }),
1669
+ /***/ },
1593
1670
 
1594
- /***/ "./frontend/src/dashboard-result/dashboard-document/dashboard-document.js":
1671
+ /***/ "./frontend/src/dashboard-result/dashboard-document/dashboard-document.js"
1595
1672
  /*!********************************************************************************!*\
1596
1673
  !*** ./frontend/src/dashboard-result/dashboard-document/dashboard-document.js ***!
1597
1674
  \********************************************************************************/
1598
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1675
+ (module, __unused_webpack_exports, __webpack_require__) {
1599
1676
 
1600
1677
  "use strict";
1601
1678
 
@@ -1629,24 +1706,24 @@ module.exports = app => app.component('dashboard-document', {
1629
1706
  });
1630
1707
 
1631
1708
 
1632
- /***/ }),
1709
+ /***/ },
1633
1710
 
1634
- /***/ "./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.html":
1711
+ /***/ "./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.html"
1635
1712
  /*!**************************************************************************!*\
1636
1713
  !*** ./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.html ***!
1637
1714
  \**************************************************************************/
1638
- /***/ ((module) => {
1715
+ (module) {
1639
1716
 
1640
1717
  "use strict";
1641
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";
1642
1719
 
1643
- /***/ }),
1720
+ /***/ },
1644
1721
 
1645
- /***/ "./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.js":
1722
+ /***/ "./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.js"
1646
1723
  /*!************************************************************************!*\
1647
1724
  !*** ./frontend/src/dashboard-result/dashboard-grid/dashboard-grid.js ***!
1648
1725
  \************************************************************************/
1649
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1726
+ (module, __unused_webpack_exports, __webpack_require__) {
1650
1727
 
1651
1728
  "use strict";
1652
1729
 
@@ -1671,24 +1748,24 @@ module.exports = app => app.component('dashboard-grid', {
1671
1748
  });
1672
1749
 
1673
1750
 
1674
- /***/ }),
1751
+ /***/ },
1675
1752
 
1676
- /***/ "./frontend/src/dashboard-result/dashboard-map/dashboard-map.html":
1753
+ /***/ "./frontend/src/dashboard-result/dashboard-map/dashboard-map.html"
1677
1754
  /*!************************************************************************!*\
1678
1755
  !*** ./frontend/src/dashboard-result/dashboard-map/dashboard-map.html ***!
1679
1756
  \************************************************************************/
1680
- /***/ ((module) => {
1757
+ (module) {
1681
1758
 
1682
1759
  "use strict";
1683
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";
1684
1761
 
1685
- /***/ }),
1762
+ /***/ },
1686
1763
 
1687
- /***/ "./frontend/src/dashboard-result/dashboard-map/dashboard-map.js":
1764
+ /***/ "./frontend/src/dashboard-result/dashboard-map/dashboard-map.js"
1688
1765
  /*!**********************************************************************!*\
1689
1766
  !*** ./frontend/src/dashboard-result/dashboard-map/dashboard-map.js ***!
1690
1767
  \**********************************************************************/
1691
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1768
+ (module, __unused_webpack_exports, __webpack_require__) {
1692
1769
 
1693
1770
  "use strict";
1694
1771
  /* global L */
@@ -1729,24 +1806,24 @@ module.exports = app => app.component('dashboard-map', {
1729
1806
  });
1730
1807
 
1731
1808
 
1732
- /***/ }),
1809
+ /***/ },
1733
1810
 
1734
- /***/ "./frontend/src/dashboard-result/dashboard-object/dashboard-object.html":
1811
+ /***/ "./frontend/src/dashboard-result/dashboard-object/dashboard-object.html"
1735
1812
  /*!******************************************************************************!*\
1736
1813
  !*** ./frontend/src/dashboard-result/dashboard-object/dashboard-object.html ***!
1737
1814
  \******************************************************************************/
1738
- /***/ ((module) => {
1815
+ (module) {
1739
1816
 
1740
1817
  "use strict";
1741
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";
1742
1819
 
1743
- /***/ }),
1820
+ /***/ },
1744
1821
 
1745
- /***/ "./frontend/src/dashboard-result/dashboard-object/dashboard-object.js":
1822
+ /***/ "./frontend/src/dashboard-result/dashboard-object/dashboard-object.js"
1746
1823
  /*!****************************************************************************!*\
1747
1824
  !*** ./frontend/src/dashboard-result/dashboard-object/dashboard-object.js ***!
1748
1825
  \****************************************************************************/
1749
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1826
+ (module, __unused_webpack_exports, __webpack_require__) {
1750
1827
 
1751
1828
  "use strict";
1752
1829
 
@@ -1771,24 +1848,24 @@ module.exports = app => app.component('dashboard-object', {
1771
1848
  });
1772
1849
 
1773
1850
 
1774
- /***/ }),
1851
+ /***/ },
1775
1852
 
1776
- /***/ "./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.html":
1853
+ /***/ "./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.html"
1777
1854
  /*!************************************************************************************!*\
1778
1855
  !*** ./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.html ***!
1779
1856
  \************************************************************************************/
1780
- /***/ ((module) => {
1857
+ (module) {
1781
1858
 
1782
1859
  "use strict";
1783
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>";
1784
1861
 
1785
- /***/ }),
1862
+ /***/ },
1786
1863
 
1787
- /***/ "./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.js":
1864
+ /***/ "./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.js"
1788
1865
  /*!**********************************************************************************!*\
1789
1866
  !*** ./frontend/src/dashboard-result/dashboard-primitive/dashboard-primitive.js ***!
1790
1867
  \**********************************************************************************/
1791
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1868
+ (module, __unused_webpack_exports, __webpack_require__) {
1792
1869
 
1793
1870
  "use strict";
1794
1871
 
@@ -1817,24 +1894,24 @@ module.exports = app => app.component('dashboard-primitive', {
1817
1894
  });
1818
1895
 
1819
1896
 
1820
- /***/ }),
1897
+ /***/ },
1821
1898
 
1822
- /***/ "./frontend/src/dashboard-result/dashboard-result.html":
1899
+ /***/ "./frontend/src/dashboard-result/dashboard-result.html"
1823
1900
  /*!*************************************************************!*\
1824
1901
  !*** ./frontend/src/dashboard-result/dashboard-result.html ***!
1825
1902
  \*************************************************************/
1826
- /***/ ((module) => {
1903
+ (module) {
1827
1904
 
1828
1905
  "use strict";
1829
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";
1830
1907
 
1831
- /***/ }),
1908
+ /***/ },
1832
1909
 
1833
- /***/ "./frontend/src/dashboard-result/dashboard-result.js":
1910
+ /***/ "./frontend/src/dashboard-result/dashboard-result.js"
1834
1911
  /*!***********************************************************!*\
1835
1912
  !*** ./frontend/src/dashboard-result/dashboard-result.js ***!
1836
1913
  \***********************************************************/
1837
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1914
+ (module, __unused_webpack_exports, __webpack_require__) {
1838
1915
 
1839
1916
  "use strict";
1840
1917
 
@@ -1879,24 +1956,24 @@ module.exports = app => app.component('dashboard-result', {
1879
1956
  });
1880
1957
 
1881
1958
 
1882
- /***/ }),
1959
+ /***/ },
1883
1960
 
1884
- /***/ "./frontend/src/dashboard-result/dashboard-text/dashboard-text.html":
1961
+ /***/ "./frontend/src/dashboard-result/dashboard-text/dashboard-text.html"
1885
1962
  /*!**************************************************************************!*\
1886
1963
  !*** ./frontend/src/dashboard-result/dashboard-text/dashboard-text.html ***!
1887
1964
  \**************************************************************************/
1888
- /***/ ((module) => {
1965
+ (module) {
1889
1966
 
1890
1967
  "use strict";
1891
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";
1892
1969
 
1893
- /***/ }),
1970
+ /***/ },
1894
1971
 
1895
- /***/ "./frontend/src/dashboard-result/dashboard-text/dashboard-text.js":
1972
+ /***/ "./frontend/src/dashboard-result/dashboard-text/dashboard-text.js"
1896
1973
  /*!************************************************************************!*\
1897
1974
  !*** ./frontend/src/dashboard-result/dashboard-text/dashboard-text.js ***!
1898
1975
  \************************************************************************/
1899
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1976
+ (module, __unused_webpack_exports, __webpack_require__) {
1900
1977
 
1901
1978
  "use strict";
1902
1979
 
@@ -1909,24 +1986,24 @@ module.exports = app => app.component('dashboard-text', {
1909
1986
  });
1910
1987
 
1911
1988
 
1912
- /***/ }),
1989
+ /***/ },
1913
1990
 
1914
- /***/ "./frontend/src/dashboard/dashboard.html":
1991
+ /***/ "./frontend/src/dashboard/dashboard.html"
1915
1992
  /*!***********************************************!*\
1916
1993
  !*** ./frontend/src/dashboard/dashboard.html ***!
1917
1994
  \***********************************************/
1918
- /***/ ((module) => {
1995
+ (module) {
1919
1996
 
1920
1997
  "use strict";
1921
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";
1922
1999
 
1923
- /***/ }),
2000
+ /***/ },
1924
2001
 
1925
- /***/ "./frontend/src/dashboard/dashboard.js":
2002
+ /***/ "./frontend/src/dashboard/dashboard.js"
1926
2003
  /*!*********************************************!*\
1927
2004
  !*** ./frontend/src/dashboard/dashboard.js ***!
1928
2005
  \*********************************************/
1929
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2006
+ (module, __unused_webpack_exports, __webpack_require__) {
1930
2007
 
1931
2008
  "use strict";
1932
2009
 
@@ -2072,28 +2149,28 @@ module.exports = app => app.component('dashboard', {
2072
2149
  },
2073
2150
  beforeDestroy() {
2074
2151
  document.removeEventListener('click', this.handleDocumentClick);
2075
- },
2152
+ }
2076
2153
  });
2077
2154
 
2078
2155
 
2079
- /***/ }),
2156
+ /***/ },
2080
2157
 
2081
- /***/ "./frontend/src/dashboard/edit-dashboard/edit-dashboard.html":
2158
+ /***/ "./frontend/src/dashboard/edit-dashboard/edit-dashboard.html"
2082
2159
  /*!*******************************************************************!*\
2083
2160
  !*** ./frontend/src/dashboard/edit-dashboard/edit-dashboard.html ***!
2084
2161
  \*******************************************************************/
2085
- /***/ ((module) => {
2162
+ (module) {
2086
2163
 
2087
2164
  "use strict";
2088
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";
2089
2166
 
2090
- /***/ }),
2167
+ /***/ },
2091
2168
 
2092
- /***/ "./frontend/src/dashboard/edit-dashboard/edit-dashboard.js":
2169
+ /***/ "./frontend/src/dashboard/edit-dashboard/edit-dashboard.js"
2093
2170
  /*!*****************************************************************!*\
2094
2171
  !*** ./frontend/src/dashboard/edit-dashboard/edit-dashboard.js ***!
2095
2172
  \*****************************************************************/
2096
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2173
+ (module, __unused_webpack_exports, __webpack_require__) {
2097
2174
 
2098
2175
  "use strict";
2099
2176
 
@@ -2157,24 +2234,24 @@ module.exports = app => app.component('edit-dashboard', {
2157
2234
  });
2158
2235
 
2159
2236
 
2160
- /***/ }),
2237
+ /***/ },
2161
2238
 
2162
- /***/ "./frontend/src/dashboards/dashboards.html":
2239
+ /***/ "./frontend/src/dashboards/dashboards.html"
2163
2240
  /*!*************************************************!*\
2164
2241
  !*** ./frontend/src/dashboards/dashboards.html ***!
2165
2242
  \*************************************************/
2166
- /***/ ((module) => {
2243
+ (module) {
2167
2244
 
2168
2245
  "use strict";
2169
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>";
2170
2247
 
2171
- /***/ }),
2248
+ /***/ },
2172
2249
 
2173
- /***/ "./frontend/src/dashboards/dashboards.js":
2250
+ /***/ "./frontend/src/dashboards/dashboards.js"
2174
2251
  /*!***********************************************!*\
2175
2252
  !*** ./frontend/src/dashboards/dashboards.js ***!
2176
2253
  \***********************************************/
2177
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2254
+ (module, __unused_webpack_exports, __webpack_require__) {
2178
2255
 
2179
2256
  "use strict";
2180
2257
 
@@ -2214,65 +2291,81 @@ module.exports = app => app.component('dashboards', {
2214
2291
  });
2215
2292
 
2216
2293
 
2217
- /***/ }),
2294
+ /***/ },
2218
2295
 
2219
- /***/ "./frontend/src/detail-array/detail-array.html":
2296
+ /***/ "./frontend/src/detail-array/detail-array.html"
2220
2297
  /*!*****************************************************!*\
2221
2298
  !*** ./frontend/src/detail-array/detail-array.html ***!
2222
2299
  \*****************************************************/
2223
- /***/ ((module) => {
2300
+ (module) {
2224
2301
 
2225
2302
  "use strict";
2226
- 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";
2227
2304
 
2228
- /***/ }),
2305
+ /***/ },
2229
2306
 
2230
- /***/ "./frontend/src/detail-array/detail-array.js":
2307
+ /***/ "./frontend/src/detail-array/detail-array.js"
2231
2308
  /*!***************************************************!*\
2232
2309
  !*** ./frontend/src/detail-array/detail-array.js ***!
2233
2310
  \***************************************************/
2234
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2311
+ (module, __unused_webpack_exports, __webpack_require__) {
2235
2312
 
2236
2313
  "use strict";
2237
2314
 
2238
2315
 
2239
2316
  const template = __webpack_require__(/*! ./detail-array.html */ "./frontend/src/detail-array/detail-array.html");
2240
- const { inspect } = __webpack_require__(/*! node-inspect-extracted */ "./node_modules/node-inspect-extracted/dist/inspect.js");
2241
2317
 
2242
2318
  module.exports = app => app.component('detail-array', {
2243
2319
  template: template,
2244
2320
  props: ['value'],
2245
- computed: {
2246
- displayValue() {
2321
+ data() {
2322
+ return {
2323
+ arrayValue: []
2324
+ };
2325
+ },
2326
+ methods: {
2327
+ initializeArray() {
2247
2328
  if (this.value == null) {
2248
- return this.value;
2329
+ this.arrayValue = [];
2330
+ } else if (Array.isArray(this.value)) {
2331
+ this.arrayValue = this.value;
2332
+ } else {
2333
+ this.arrayValue = [];
2249
2334
  }
2250
- return inspect(this.value, { maxArrayLength: 50 });
2251
2335
  }
2252
2336
  },
2253
2337
  mounted() {
2254
- 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
+ }
2255
2348
  }
2256
2349
  });
2257
2350
 
2258
- /***/ }),
2351
+ /***/ },
2259
2352
 
2260
- /***/ "./frontend/src/detail-default/detail-default.html":
2353
+ /***/ "./frontend/src/detail-default/detail-default.html"
2261
2354
  /*!*********************************************************!*\
2262
2355
  !*** ./frontend/src/detail-default/detail-default.html ***!
2263
2356
  \*********************************************************/
2264
- /***/ ((module) => {
2357
+ (module) {
2265
2358
 
2266
2359
  "use strict";
2267
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>";
2268
2361
 
2269
- /***/ }),
2362
+ /***/ },
2270
2363
 
2271
- /***/ "./frontend/src/detail-default/detail-default.js":
2364
+ /***/ "./frontend/src/detail-default/detail-default.js"
2272
2365
  /*!*******************************************************!*\
2273
2366
  !*** ./frontend/src/detail-default/detail-default.js ***!
2274
2367
  \*******************************************************/
2275
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2368
+ (module, __unused_webpack_exports, __webpack_require__) {
2276
2369
 
2277
2370
  "use strict";
2278
2371
 
@@ -2304,35 +2397,35 @@ module.exports = app => app.component('detail-default', {
2304
2397
  }
2305
2398
  });
2306
2399
 
2307
- /***/ }),
2400
+ /***/ },
2308
2401
 
2309
- /***/ "./frontend/src/document-details/document-details.css":
2402
+ /***/ "./frontend/src/document-details/document-details.css"
2310
2403
  /*!************************************************************!*\
2311
2404
  !*** ./frontend/src/document-details/document-details.css ***!
2312
2405
  \************************************************************/
2313
- /***/ ((module) => {
2406
+ (module) {
2314
2407
 
2315
2408
  "use strict";
2316
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}";
2317
2410
 
2318
- /***/ }),
2411
+ /***/ },
2319
2412
 
2320
- /***/ "./frontend/src/document-details/document-details.html":
2413
+ /***/ "./frontend/src/document-details/document-details.html"
2321
2414
  /*!*************************************************************!*\
2322
2415
  !*** ./frontend/src/document-details/document-details.html ***!
2323
2416
  \*************************************************************/
2324
- /***/ ((module) => {
2417
+ (module) {
2325
2418
 
2326
2419
  "use strict";
2327
- 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";
2328
2421
 
2329
- /***/ }),
2422
+ /***/ },
2330
2423
 
2331
- /***/ "./frontend/src/document-details/document-details.js":
2424
+ /***/ "./frontend/src/document-details/document-details.js"
2332
2425
  /*!***********************************************************!*\
2333
2426
  !*** ./frontend/src/document-details/document-details.js ***!
2334
2427
  \***********************************************************/
2335
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2428
+ (module, __unused_webpack_exports, __webpack_require__) {
2336
2429
 
2337
2430
  "use strict";
2338
2431
 
@@ -2482,6 +2575,20 @@ module.exports = app => app.component('document-details', {
2482
2575
 
2483
2576
  return matches.concat(nonMatches);
2484
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
+ },
2485
2592
  typeFilteredVirtuals() {
2486
2593
  let virtuals = this.virtuals;
2487
2594
 
@@ -2515,6 +2622,20 @@ module.exports = app => app.component('document-details', {
2515
2622
 
2516
2623
  return matches.concat(nonMatches);
2517
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
+ },
2518
2639
  schemaSearchMatchSet() {
2519
2640
  if (!this.searchQuery.trim()) {
2520
2641
  return new Set();
@@ -2762,35 +2883,35 @@ module.exports = app => app.component('document-details', {
2762
2883
  });
2763
2884
 
2764
2885
 
2765
- /***/ }),
2886
+ /***/ },
2766
2887
 
2767
- /***/ "./frontend/src/document-details/document-property/document-property.css":
2888
+ /***/ "./frontend/src/document-details/document-property/document-property.css"
2768
2889
  /*!*******************************************************************************!*\
2769
2890
  !*** ./frontend/src/document-details/document-property/document-property.css ***!
2770
2891
  \*******************************************************************************/
2771
- /***/ ((module) => {
2892
+ (module) {
2772
2893
 
2773
2894
  "use strict";
2774
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";
2775
2896
 
2776
- /***/ }),
2897
+ /***/ },
2777
2898
 
2778
- /***/ "./frontend/src/document-details/document-property/document-property.html":
2899
+ /***/ "./frontend/src/document-details/document-property/document-property.html"
2779
2900
  /*!********************************************************************************!*\
2780
2901
  !*** ./frontend/src/document-details/document-property/document-property.html ***!
2781
2902
  \********************************************************************************/
2782
- /***/ ((module) => {
2903
+ (module) {
2783
2904
 
2784
2905
  "use strict";
2785
- 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";
2786
2907
 
2787
- /***/ }),
2908
+ /***/ },
2788
2909
 
2789
- /***/ "./frontend/src/document-details/document-property/document-property.js":
2910
+ /***/ "./frontend/src/document-details/document-property/document-property.js"
2790
2911
  /*!******************************************************************************!*\
2791
2912
  !*** ./frontend/src/document-details/document-property/document-property.js ***!
2792
2913
  \******************************************************************************/
2793
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2914
+ (module, __unused_webpack_exports, __webpack_require__) {
2794
2915
 
2795
2916
  "use strict";
2796
2917
  /* global clearTimeout setTimeout */
@@ -2798,6 +2919,7 @@ module.exports = "<div class=\"border border-gray-200 rounded-lg mb-2\">\n <!--
2798
2919
 
2799
2920
 
2800
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");
2801
2923
  const template = __webpack_require__(/*! ./document-property.html */ "./frontend/src/document-details/document-property/document-property.html");
2802
2924
 
2803
2925
  const appendCSS = __webpack_require__(/*! ../../appendCSS */ "./frontend/src/appendCSS.js");
@@ -2833,10 +2955,32 @@ module.exports = app => app.component('document-property', {
2833
2955
  }
2834
2956
  return String(value);
2835
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
+ },
2836
2971
  needsTruncation() {
2837
- // 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
2838
2978
  return this.valueAsString.length > 200;
2839
2979
  },
2980
+ shouldShowTruncated() {
2981
+ // For other types, show truncated if needs truncation and not expanded
2982
+ return this.needsTruncation && !this.isValueExpanded;
2983
+ },
2840
2984
  displayValue() {
2841
2985
  if (!this.needsTruncation || this.isValueExpanded) {
2842
2986
  return this.getValueForPath(this.path.path);
@@ -2846,9 +2990,24 @@ module.exports = app => app.component('document-property', {
2846
2990
  },
2847
2991
  truncatedString() {
2848
2992
  if (this.needsTruncation && !this.isValueExpanded) {
2849
- 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
+ }
2850
2997
  }
2851
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;
2852
3011
  }
2853
3012
  },
2854
3013
  methods: {
@@ -2874,6 +3033,9 @@ module.exports = app => app.component('document-property', {
2874
3033
  if (path.instance === 'Embedded') {
2875
3034
  return 'edit-subdocument';
2876
3035
  }
3036
+ if (path.instance === 'Mixed') {
3037
+ return 'edit-subdocument';
3038
+ }
2877
3039
  if (path.instance === 'Boolean') {
2878
3040
  return 'edit-boolean';
2879
3041
  }
@@ -2886,6 +3048,10 @@ module.exports = app => app.component('document-property', {
2886
3048
  props.enumValues = path.enum;
2887
3049
  }
2888
3050
  }
3051
+ if (path.instance === 'Array') {
3052
+ props.path = path;
3053
+ props.schemaPaths = this.schemaPaths;
3054
+ }
2889
3055
  return props;
2890
3056
  },
2891
3057
  getValueForPath(path) {
@@ -2961,24 +3127,24 @@ module.exports = app => app.component('document-property', {
2961
3127
  });
2962
3128
 
2963
3129
 
2964
- /***/ }),
3130
+ /***/ },
2965
3131
 
2966
- /***/ "./frontend/src/document/confirm-changes/confirm-changes.html":
3132
+ /***/ "./frontend/src/document/confirm-changes/confirm-changes.html"
2967
3133
  /*!********************************************************************!*\
2968
3134
  !*** ./frontend/src/document/confirm-changes/confirm-changes.html ***!
2969
3135
  \********************************************************************/
2970
- /***/ ((module) => {
3136
+ (module) {
2971
3137
 
2972
3138
  "use strict";
2973
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>";
2974
3140
 
2975
- /***/ }),
3141
+ /***/ },
2976
3142
 
2977
- /***/ "./frontend/src/document/confirm-changes/confirm-changes.js":
3143
+ /***/ "./frontend/src/document/confirm-changes/confirm-changes.js"
2978
3144
  /*!******************************************************************!*\
2979
3145
  !*** ./frontend/src/document/confirm-changes/confirm-changes.js ***!
2980
3146
  \******************************************************************/
2981
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3147
+ (module, __unused_webpack_exports, __webpack_require__) {
2982
3148
 
2983
3149
  "use strict";
2984
3150
 
@@ -3006,24 +3172,24 @@ module.exports = app => app.component('confirm-changes', {
3006
3172
  }
3007
3173
  });
3008
3174
 
3009
- /***/ }),
3175
+ /***/ },
3010
3176
 
3011
- /***/ "./frontend/src/document/confirm-delete/confirm-delete.html":
3177
+ /***/ "./frontend/src/document/confirm-delete/confirm-delete.html"
3012
3178
  /*!******************************************************************!*\
3013
3179
  !*** ./frontend/src/document/confirm-delete/confirm-delete.html ***!
3014
3180
  \******************************************************************/
3015
- /***/ ((module) => {
3181
+ (module) {
3016
3182
 
3017
3183
  "use strict";
3018
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";
3019
3185
 
3020
- /***/ }),
3186
+ /***/ },
3021
3187
 
3022
- /***/ "./frontend/src/document/confirm-delete/confirm-delete.js":
3188
+ /***/ "./frontend/src/document/confirm-delete/confirm-delete.js"
3023
3189
  /*!****************************************************************!*\
3024
3190
  !*** ./frontend/src/document/confirm-delete/confirm-delete.js ***!
3025
3191
  \****************************************************************/
3026
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3192
+ (module, __unused_webpack_exports, __webpack_require__) {
3027
3193
 
3028
3194
  "use strict";
3029
3195
 
@@ -3051,35 +3217,35 @@ module.exports = app => app.component('confirm-delete', {
3051
3217
  }
3052
3218
  });
3053
3219
 
3054
- /***/ }),
3220
+ /***/ },
3055
3221
 
3056
- /***/ "./frontend/src/document/document.css":
3222
+ /***/ "./frontend/src/document/document.css"
3057
3223
  /*!********************************************!*\
3058
3224
  !*** ./frontend/src/document/document.css ***!
3059
3225
  \********************************************/
3060
- /***/ ((module) => {
3226
+ (module) {
3061
3227
 
3062
3228
  "use strict";
3063
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}";
3064
3230
 
3065
- /***/ }),
3231
+ /***/ },
3066
3232
 
3067
- /***/ "./frontend/src/document/document.html":
3233
+ /***/ "./frontend/src/document/document.html"
3068
3234
  /*!*********************************************!*\
3069
3235
  !*** ./frontend/src/document/document.html ***!
3070
3236
  \*********************************************/
3071
- /***/ ((module) => {
3237
+ (module) {
3072
3238
 
3073
3239
  "use strict";
3074
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";
3075
3241
 
3076
- /***/ }),
3242
+ /***/ },
3077
3243
 
3078
- /***/ "./frontend/src/document/document.js":
3244
+ /***/ "./frontend/src/document/document.js"
3079
3245
  /*!*******************************************!*\
3080
3246
  !*** ./frontend/src/document/document.js ***!
3081
3247
  \*******************************************/
3082
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3248
+ (module, __unused_webpack_exports, __webpack_require__) {
3083
3249
 
3084
3250
  "use strict";
3085
3251
 
@@ -3224,35 +3390,24 @@ module.exports = app => app.component('document', {
3224
3390
  });
3225
3391
 
3226
3392
 
3227
- /***/ }),
3393
+ /***/ },
3228
3394
 
3229
- /***/ "./frontend/src/edit-array/edit-array.css":
3230
- /*!************************************************!*\
3231
- !*** ./frontend/src/edit-array/edit-array.css ***!
3232
- \************************************************/
3233
- /***/ ((module) => {
3234
-
3235
- "use strict";
3236
- module.exports = ".edit-array button {\n margin-top: 0.5em;\n}";
3237
-
3238
- /***/ }),
3239
-
3240
- /***/ "./frontend/src/edit-array/edit-array.html":
3395
+ /***/ "./frontend/src/edit-array/edit-array.html"
3241
3396
  /*!*************************************************!*\
3242
3397
  !*** ./frontend/src/edit-array/edit-array.html ***!
3243
3398
  \*************************************************/
3244
- /***/ ((module) => {
3399
+ (module) {
3245
3400
 
3246
3401
  "use strict";
3247
- 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>";
3248
3403
 
3249
- /***/ }),
3404
+ /***/ },
3250
3405
 
3251
- /***/ "./frontend/src/edit-array/edit-array.js":
3406
+ /***/ "./frontend/src/edit-array/edit-array.js"
3252
3407
  /*!***********************************************!*\
3253
3408
  !*** ./frontend/src/edit-array/edit-array.js ***!
3254
3409
  \***********************************************/
3255
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3410
+ (module, __unused_webpack_exports, __webpack_require__) {
3256
3411
 
3257
3412
  "use strict";
3258
3413
 
@@ -3267,67 +3422,123 @@ const ObjectId = new Proxy(BSON.ObjectId, {
3267
3422
  }
3268
3423
  });
3269
3424
 
3270
- const appendCSS = __webpack_require__(/*! ../appendCSS */ "./frontend/src/appendCSS.js");
3271
- appendCSS(__webpack_require__(/*! ./edit-array.css */ "./frontend/src/edit-array/edit-array.css"));
3272
3425
 
3273
3426
  module.exports = app => app.component('edit-array', {
3274
3427
  template: template,
3275
3428
  props: ['value'],
3276
- data: () => ({ currentValue: -1 }),
3277
- mounted() {
3278
- this.currentValue = this.value == null
3279
- ? '' + this.value
3280
- : JSON.stringify(this.value, null, ' ').trim();
3281
- this.$refs.arrayEditor.value = this.currentValue;
3282
- this.editor = CodeMirror.fromTextArea(this.$refs.arrayEditor, {
3283
- mode: 'javascript',
3284
- lineNumbers: true
3285
- });
3286
- this.editor.on('change', ev => {
3287
- this.currentValue = this.editor.getValue();
3288
- });
3429
+ data() {
3430
+ return {
3431
+ arrayValue: [],
3432
+ arrayEditor: null
3433
+ };
3289
3434
  },
3290
- watch: {
3291
- currentValue(newValue, oldValue) {
3292
- // Hacky way of skipping initial trigger because `immediate: false` doesn't work in Vue 3
3293
- 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) {
3294
3472
  return;
3295
3473
  }
3296
3474
  try {
3297
- const array = eval(`(${this.currentValue})`);
3298
- 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);
3299
3489
  } catch (err) {
3300
3490
  this.$emit('error', err);
3301
3491
  }
3302
3492
  }
3303
3493
  },
3494
+ mounted() {
3495
+ this.initializeArray();
3496
+ this.initializeArrayEditor();
3497
+ },
3304
3498
  beforeDestroy() {
3305
- if (this.editor) {
3306
- 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
3307
3518
  }
3308
3519
  },
3309
3520
  emits: ['input', 'error']
3310
3521
  });
3311
3522
 
3312
3523
 
3313
- /***/ }),
3524
+ /***/ },
3314
3525
 
3315
- /***/ "./frontend/src/edit-boolean/edit-boolean.html":
3526
+ /***/ "./frontend/src/edit-boolean/edit-boolean.html"
3316
3527
  /*!*****************************************************!*\
3317
3528
  !*** ./frontend/src/edit-boolean/edit-boolean.html ***!
3318
3529
  \*****************************************************/
3319
- /***/ ((module) => {
3530
+ (module) {
3320
3531
 
3321
3532
  "use strict";
3322
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";
3323
3534
 
3324
- /***/ }),
3535
+ /***/ },
3325
3536
 
3326
- /***/ "./frontend/src/edit-boolean/edit-boolean.js":
3537
+ /***/ "./frontend/src/edit-boolean/edit-boolean.js"
3327
3538
  /*!***************************************************!*\
3328
3539
  !*** ./frontend/src/edit-boolean/edit-boolean.js ***!
3329
3540
  \***************************************************/
3330
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3541
+ (module, __unused_webpack_exports, __webpack_require__) {
3331
3542
 
3332
3543
  "use strict";
3333
3544
 
@@ -3370,24 +3581,24 @@ module.exports = app => app.component('edit-boolean', {
3370
3581
  });
3371
3582
 
3372
3583
 
3373
- /***/ }),
3584
+ /***/ },
3374
3585
 
3375
- /***/ "./frontend/src/edit-date/edit-date.html":
3586
+ /***/ "./frontend/src/edit-date/edit-date.html"
3376
3587
  /*!***********************************************!*\
3377
3588
  !*** ./frontend/src/edit-date/edit-date.html ***!
3378
3589
  \***********************************************/
3379
- /***/ ((module) => {
3590
+ (module) {
3380
3591
 
3381
3592
  "use strict";
3382
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>";
3383
3594
 
3384
- /***/ }),
3595
+ /***/ },
3385
3596
 
3386
- /***/ "./frontend/src/edit-date/edit-date.js":
3597
+ /***/ "./frontend/src/edit-date/edit-date.js"
3387
3598
  /*!*********************************************!*\
3388
3599
  !*** ./frontend/src/edit-date/edit-date.js ***!
3389
3600
  \*********************************************/
3390
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3601
+ (module, __unused_webpack_exports, __webpack_require__) {
3391
3602
 
3392
3603
  "use strict";
3393
3604
 
@@ -3451,24 +3662,24 @@ module.exports = app => app.component('edit-date', {
3451
3662
  });
3452
3663
 
3453
3664
 
3454
- /***/ }),
3665
+ /***/ },
3455
3666
 
3456
- /***/ "./frontend/src/edit-default/edit-default.html":
3667
+ /***/ "./frontend/src/edit-default/edit-default.html"
3457
3668
  /*!*****************************************************!*\
3458
3669
  !*** ./frontend/src/edit-default/edit-default.html ***!
3459
3670
  \*****************************************************/
3460
- /***/ ((module) => {
3671
+ (module) {
3461
3672
 
3462
3673
  "use strict";
3463
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>";
3464
3675
 
3465
- /***/ }),
3676
+ /***/ },
3466
3677
 
3467
- /***/ "./frontend/src/edit-default/edit-default.js":
3678
+ /***/ "./frontend/src/edit-default/edit-default.js"
3468
3679
  /*!***************************************************!*\
3469
3680
  !*** ./frontend/src/edit-default/edit-default.js ***!
3470
3681
  \***************************************************/
3471
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3682
+ (module, __unused_webpack_exports, __webpack_require__) {
3472
3683
 
3473
3684
  "use strict";
3474
3685
 
@@ -3492,24 +3703,24 @@ module.exports = app => app.component('edit-default', {
3492
3703
  }
3493
3704
  });
3494
3705
 
3495
- /***/ }),
3706
+ /***/ },
3496
3707
 
3497
- /***/ "./frontend/src/edit-number/edit-number.html":
3708
+ /***/ "./frontend/src/edit-number/edit-number.html"
3498
3709
  /*!***************************************************!*\
3499
3710
  !*** ./frontend/src/edit-number/edit-number.html ***!
3500
3711
  \***************************************************/
3501
- /***/ ((module) => {
3712
+ (module) {
3502
3713
 
3503
3714
  "use strict";
3504
3715
  module.exports = "<div>\n <input type=\"number\" :value=\"value\" @input=\"$emit('input', $event.target.value)\">\n</div>";
3505
3716
 
3506
- /***/ }),
3717
+ /***/ },
3507
3718
 
3508
- /***/ "./frontend/src/edit-number/edit-number.js":
3719
+ /***/ "./frontend/src/edit-number/edit-number.js"
3509
3720
  /*!*************************************************!*\
3510
3721
  !*** ./frontend/src/edit-number/edit-number.js ***!
3511
3722
  \*************************************************/
3512
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3723
+ (module, __unused_webpack_exports, __webpack_require__) {
3513
3724
 
3514
3725
  "use strict";
3515
3726
 
@@ -3533,24 +3744,24 @@ module.exports = app => app.component('edit-number', {
3533
3744
  }
3534
3745
  });
3535
3746
 
3536
- /***/ }),
3747
+ /***/ },
3537
3748
 
3538
- /***/ "./frontend/src/edit-string/edit-string.html":
3749
+ /***/ "./frontend/src/edit-string/edit-string.html"
3539
3750
  /*!***************************************************!*\
3540
3751
  !*** ./frontend/src/edit-string/edit-string.html ***!
3541
3752
  \***************************************************/
3542
- /***/ ((module) => {
3753
+ (module) {
3543
3754
 
3544
3755
  "use strict";
3545
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";
3546
3757
 
3547
- /***/ }),
3758
+ /***/ },
3548
3759
 
3549
- /***/ "./frontend/src/edit-string/edit-string.js":
3760
+ /***/ "./frontend/src/edit-string/edit-string.js"
3550
3761
  /*!*************************************************!*\
3551
3762
  !*** ./frontend/src/edit-string/edit-string.js ***!
3552
3763
  \*************************************************/
3553
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3764
+ (module, __unused_webpack_exports, __webpack_require__) {
3554
3765
 
3555
3766
  "use strict";
3556
3767
 
@@ -3703,24 +3914,24 @@ module.exports = app => app.component('edit-string', {
3703
3914
  });
3704
3915
 
3705
3916
 
3706
- /***/ }),
3917
+ /***/ },
3707
3918
 
3708
- /***/ "./frontend/src/edit-subdocument/edit-subdocument.html":
3919
+ /***/ "./frontend/src/edit-subdocument/edit-subdocument.html"
3709
3920
  /*!*************************************************************!*\
3710
3921
  !*** ./frontend/src/edit-subdocument/edit-subdocument.html ***!
3711
3922
  \*************************************************************/
3712
- /***/ ((module) => {
3923
+ (module) {
3713
3924
 
3714
3925
  "use strict";
3715
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>";
3716
3927
 
3717
- /***/ }),
3928
+ /***/ },
3718
3929
 
3719
- /***/ "./frontend/src/edit-subdocument/edit-subdocument.js":
3930
+ /***/ "./frontend/src/edit-subdocument/edit-subdocument.js"
3720
3931
  /*!***********************************************************!*\
3721
3932
  !*** ./frontend/src/edit-subdocument/edit-subdocument.js ***!
3722
3933
  \***********************************************************/
3723
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3934
+ (module, __unused_webpack_exports, __webpack_require__) {
3724
3935
 
3725
3936
  "use strict";
3726
3937
 
@@ -3775,35 +3986,35 @@ module.exports = app => app.component('edit-subdocument', {
3775
3986
  });
3776
3987
 
3777
3988
 
3778
- /***/ }),
3989
+ /***/ },
3779
3990
 
3780
- /***/ "./frontend/src/export-query-results/export-query-results.css":
3991
+ /***/ "./frontend/src/export-query-results/export-query-results.css"
3781
3992
  /*!********************************************************************!*\
3782
3993
  !*** ./frontend/src/export-query-results/export-query-results.css ***!
3783
3994
  \********************************************************************/
3784
- /***/ ((module) => {
3995
+ (module) {
3785
3996
 
3786
3997
  "use strict";
3787
3998
  module.exports = "";
3788
3999
 
3789
- /***/ }),
4000
+ /***/ },
3790
4001
 
3791
- /***/ "./frontend/src/export-query-results/export-query-results.html":
4002
+ /***/ "./frontend/src/export-query-results/export-query-results.html"
3792
4003
  /*!*********************************************************************!*\
3793
4004
  !*** ./frontend/src/export-query-results/export-query-results.html ***!
3794
4005
  \*********************************************************************/
3795
- /***/ ((module) => {
4006
+ (module) {
3796
4007
 
3797
4008
  "use strict";
3798
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>";
3799
4010
 
3800
- /***/ }),
4011
+ /***/ },
3801
4012
 
3802
- /***/ "./frontend/src/export-query-results/export-query-results.js":
4013
+ /***/ "./frontend/src/export-query-results/export-query-results.js"
3803
4014
  /*!*******************************************************************!*\
3804
4015
  !*** ./frontend/src/export-query-results/export-query-results.js ***!
3805
4016
  \*******************************************************************/
3806
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4017
+ (module, __unused_webpack_exports, __webpack_require__) {
3807
4018
 
3808
4019
  "use strict";
3809
4020
 
@@ -3844,13 +4055,13 @@ module.exports = app => app.component('export-query-results', {
3844
4055
  }
3845
4056
  });
3846
4057
 
3847
- /***/ }),
4058
+ /***/ },
3848
4059
 
3849
- /***/ "./frontend/src/format.js":
4060
+ /***/ "./frontend/src/format.js"
3850
4061
  /*!********************************!*\
3851
4062
  !*** ./frontend/src/format.js ***!
3852
4063
  \********************************/
3853
- /***/ ((__unused_webpack_module, exports) => {
4064
+ (__unused_webpack_module, exports) {
3854
4065
 
3855
4066
  "use strict";
3856
4067
 
@@ -3864,13 +4075,13 @@ exports.isoToLongDateTime = function isoToLongDateTime(str) {
3864
4075
  };
3865
4076
 
3866
4077
 
3867
- /***/ }),
4078
+ /***/ },
3868
4079
 
3869
- /***/ "./frontend/src/index.js":
4080
+ /***/ "./frontend/src/index.js"
3870
4081
  /*!*******************************!*\
3871
4082
  !*** ./frontend/src/index.js ***!
3872
4083
  \*******************************/
3873
- /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4084
+ (__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
3874
4085
 
3875
4086
  "use strict";
3876
4087
 
@@ -3884,6 +4095,7 @@ console.log(`Mongoose Studio Version ${version}`);
3884
4095
 
3885
4096
  const api = __webpack_require__(/*! ./api */ "./frontend/src/api.js");
3886
4097
  const format = __webpack_require__(/*! ./format */ "./frontend/src/format.js");
4098
+ const arrayUtils = __webpack_require__(/*! ./array-utils */ "./frontend/src/array-utils.js");
3887
4099
  const mothership = __webpack_require__(/*! ./mothership */ "./frontend/src/mothership.js");
3888
4100
  const { routes } = __webpack_require__(/*! ./routes */ "./frontend/src/routes.js");
3889
4101
  const vanillatoasts = __webpack_require__(/*! vanillatoasts */ "./node_modules/vanillatoasts/vanillatoasts.js");
@@ -4021,49 +4233,36 @@ router.beforeEach((to, from, next) => {
4021
4233
  }
4022
4234
  });
4023
4235
 
4024
- app.config.globalProperties = { format };
4236
+ app.config.globalProperties = { format, arrayUtils };
4025
4237
  app.use(router);
4026
4238
 
4027
4239
  app.mount('#content');
4028
4240
 
4029
4241
 
4030
- /***/ }),
4242
+ /***/ },
4031
4243
 
4032
- /***/ "./frontend/src/list-array/list-array.css":
4033
- /*!************************************************!*\
4034
- !*** ./frontend/src/list-array/list-array.css ***!
4035
- \************************************************/
4036
- /***/ ((module) => {
4037
-
4038
- "use strict";
4039
- 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";
4040
-
4041
- /***/ }),
4042
-
4043
- /***/ "./frontend/src/list-array/list-array.html":
4244
+ /***/ "./frontend/src/list-array/list-array.html"
4044
4245
  /*!*************************************************!*\
4045
4246
  !*** ./frontend/src/list-array/list-array.html ***!
4046
4247
  \*************************************************/
4047
- /***/ ((module) => {
4248
+ (module) {
4048
4249
 
4049
4250
  "use strict";
4050
- 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>";
4051
4252
 
4052
- /***/ }),
4253
+ /***/ },
4053
4254
 
4054
- /***/ "./frontend/src/list-array/list-array.js":
4255
+ /***/ "./frontend/src/list-array/list-array.js"
4055
4256
  /*!***********************************************!*\
4056
4257
  !*** ./frontend/src/list-array/list-array.js ***!
4057
4258
  \***********************************************/
4058
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4259
+ (module, __unused_webpack_exports, __webpack_require__) {
4059
4260
 
4060
4261
  "use strict";
4061
4262
 
4062
4263
 
4063
4264
  const template = __webpack_require__(/*! ./list-array.html */ "./frontend/src/list-array/list-array.html");
4064
4265
 
4065
- __webpack_require__(/*! ../appendCSS */ "./frontend/src/appendCSS.js")(__webpack_require__(/*! ./list-array.css */ "./frontend/src/list-array/list-array.css"));
4066
-
4067
4266
  module.exports = app => app.component('list-array', {
4068
4267
  template: template,
4069
4268
  props: ['value'],
@@ -4078,35 +4277,35 @@ module.exports = app => app.component('list-array', {
4078
4277
  });
4079
4278
 
4080
4279
 
4081
- /***/ }),
4280
+ /***/ },
4082
4281
 
4083
- /***/ "./frontend/src/list-default/list-default.css":
4282
+ /***/ "./frontend/src/list-default/list-default.css"
4084
4283
  /*!****************************************************!*\
4085
4284
  !*** ./frontend/src/list-default/list-default.css ***!
4086
4285
  \****************************************************/
4087
- /***/ ((module) => {
4286
+ (module) {
4088
4287
 
4089
4288
  "use strict";
4090
4289
  module.exports = ".list-default pre {\n max-height: 6.5em;\n max-width: 30em;\n}\n";
4091
4290
 
4092
- /***/ }),
4291
+ /***/ },
4093
4292
 
4094
- /***/ "./frontend/src/list-default/list-default.html":
4293
+ /***/ "./frontend/src/list-default/list-default.html"
4095
4294
  /*!*****************************************************!*\
4096
4295
  !*** ./frontend/src/list-default/list-default.html ***!
4097
4296
  \*****************************************************/
4098
- /***/ ((module) => {
4297
+ (module) {
4099
4298
 
4100
4299
  "use strict";
4101
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";
4102
4301
 
4103
- /***/ }),
4302
+ /***/ },
4104
4303
 
4105
- /***/ "./frontend/src/list-default/list-default.js":
4304
+ /***/ "./frontend/src/list-default/list-default.js"
4106
4305
  /*!***************************************************!*\
4107
4306
  !*** ./frontend/src/list-default/list-default.js ***!
4108
4307
  \***************************************************/
4109
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4308
+ (module, __unused_webpack_exports, __webpack_require__) {
4110
4309
 
4111
4310
  "use strict";
4112
4311
 
@@ -4161,35 +4360,35 @@ module.exports = app => app.component('list-default', {
4161
4360
  }
4162
4361
  });
4163
4362
 
4164
- /***/ }),
4363
+ /***/ },
4165
4364
 
4166
- /***/ "./frontend/src/list-json/json-node.html":
4365
+ /***/ "./frontend/src/list-json/json-node.html"
4167
4366
  /*!***********************************************!*\
4168
4367
  !*** ./frontend/src/list-json/json-node.html ***!
4169
4368
  \***********************************************/
4170
- /***/ ((module) => {
4369
+ (module) {
4171
4370
 
4172
4371
  "use strict";
4173
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";
4174
4373
 
4175
- /***/ }),
4374
+ /***/ },
4176
4375
 
4177
- /***/ "./frontend/src/list-json/list-json.html":
4376
+ /***/ "./frontend/src/list-json/list-json.html"
4178
4377
  /*!***********************************************!*\
4179
4378
  !*** ./frontend/src/list-json/list-json.html ***!
4180
4379
  \***********************************************/
4181
- /***/ ((module) => {
4380
+ (module) {
4182
4381
 
4183
4382
  "use strict";
4184
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";
4185
4384
 
4186
- /***/ }),
4385
+ /***/ },
4187
4386
 
4188
- /***/ "./frontend/src/list-json/list-json.js":
4387
+ /***/ "./frontend/src/list-json/list-json.js"
4189
4388
  /*!*********************************************!*\
4190
4389
  !*** ./frontend/src/list-json/list-json.js ***!
4191
4390
  \*********************************************/
4192
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4391
+ (module, __unused_webpack_exports, __webpack_require__) {
4193
4392
 
4194
4393
  "use strict";
4195
4394
 
@@ -4509,35 +4708,35 @@ module.exports = app => app.component('list-json', {
4509
4708
  });
4510
4709
 
4511
4710
 
4512
- /***/ }),
4711
+ /***/ },
4513
4712
 
4514
- /***/ "./frontend/src/list-mixed/list-mixed.css":
4713
+ /***/ "./frontend/src/list-mixed/list-mixed.css"
4515
4714
  /*!************************************************!*\
4516
4715
  !*** ./frontend/src/list-mixed/list-mixed.css ***!
4517
4716
  \************************************************/
4518
- /***/ ((module) => {
4717
+ (module) {
4519
4718
 
4520
4719
  "use strict";
4521
4720
  module.exports = ".list-mixed pre {\n max-height: 6.5em;\n max-width: 30em;\n}\n\n";
4522
4721
 
4523
- /***/ }),
4722
+ /***/ },
4524
4723
 
4525
- /***/ "./frontend/src/list-mixed/list-mixed.html":
4724
+ /***/ "./frontend/src/list-mixed/list-mixed.html"
4526
4725
  /*!*************************************************!*\
4527
4726
  !*** ./frontend/src/list-mixed/list-mixed.html ***!
4528
4727
  \*************************************************/
4529
- /***/ ((module) => {
4728
+ (module) {
4530
4729
 
4531
4730
  "use strict";
4532
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 ";
4533
4732
 
4534
- /***/ }),
4733
+ /***/ },
4535
4734
 
4536
- /***/ "./frontend/src/list-mixed/list-mixed.js":
4735
+ /***/ "./frontend/src/list-mixed/list-mixed.js"
4537
4736
  /*!***********************************************!*\
4538
4737
  !*** ./frontend/src/list-mixed/list-mixed.js ***!
4539
4738
  \***********************************************/
4540
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4739
+ (module, __unused_webpack_exports, __webpack_require__) {
4541
4740
 
4542
4741
  "use strict";
4543
4742
 
@@ -4583,35 +4782,35 @@ module.exports = app => app.component('list-mixed', {
4583
4782
 
4584
4783
 
4585
4784
 
4586
- /***/ }),
4785
+ /***/ },
4587
4786
 
4588
- /***/ "./frontend/src/list-string/list-string.css":
4787
+ /***/ "./frontend/src/list-string/list-string.css"
4589
4788
  /*!**************************************************!*\
4590
4789
  !*** ./frontend/src/list-string/list-string.css ***!
4591
4790
  \**************************************************/
4592
- /***/ ((module) => {
4791
+ (module) {
4593
4792
 
4594
4793
  "use strict";
4595
4794
  module.exports = ".list-string {\n display: inline;\n max-width: 300px;\n}";
4596
4795
 
4597
- /***/ }),
4796
+ /***/ },
4598
4797
 
4599
- /***/ "./frontend/src/list-string/list-string.html":
4798
+ /***/ "./frontend/src/list-string/list-string.html"
4600
4799
  /*!***************************************************!*\
4601
4800
  !*** ./frontend/src/list-string/list-string.html ***!
4602
4801
  \***************************************************/
4603
- /***/ ((module) => {
4802
+ (module) {
4604
4803
 
4605
4804
  "use strict";
4606
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>";
4607
4806
 
4608
- /***/ }),
4807
+ /***/ },
4609
4808
 
4610
- /***/ "./frontend/src/list-string/list-string.js":
4809
+ /***/ "./frontend/src/list-string/list-string.js"
4611
4810
  /*!*************************************************!*\
4612
4811
  !*** ./frontend/src/list-string/list-string.js ***!
4613
4812
  \*************************************************/
4614
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4813
+ (module, __unused_webpack_exports, __webpack_require__) {
4615
4814
 
4616
4815
  "use strict";
4617
4816
 
@@ -4658,35 +4857,35 @@ module.exports = app => app.component('list-string', {
4658
4857
  }
4659
4858
  });
4660
4859
 
4661
- /***/ }),
4860
+ /***/ },
4662
4861
 
4663
- /***/ "./frontend/src/list-subdocument/list-subdocument.css":
4862
+ /***/ "./frontend/src/list-subdocument/list-subdocument.css"
4664
4863
  /*!************************************************************!*\
4665
4864
  !*** ./frontend/src/list-subdocument/list-subdocument.css ***!
4666
4865
  \************************************************************/
4667
- /***/ ((module) => {
4866
+ (module) {
4668
4867
 
4669
4868
  "use strict";
4670
4869
  module.exports = ".list-subdocument pre {\n max-height: 6.5em;\n max-width: 30em;\n}\n";
4671
4870
 
4672
- /***/ }),
4871
+ /***/ },
4673
4872
 
4674
- /***/ "./frontend/src/list-subdocument/list-subdocument.html":
4873
+ /***/ "./frontend/src/list-subdocument/list-subdocument.html"
4675
4874
  /*!*************************************************************!*\
4676
4875
  !*** ./frontend/src/list-subdocument/list-subdocument.html ***!
4677
4876
  \*************************************************************/
4678
- /***/ ((module) => {
4877
+ (module) {
4679
4878
 
4680
4879
  "use strict";
4681
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";
4682
4881
 
4683
- /***/ }),
4882
+ /***/ },
4684
4883
 
4685
- /***/ "./frontend/src/list-subdocument/list-subdocument.js":
4884
+ /***/ "./frontend/src/list-subdocument/list-subdocument.js"
4686
4885
  /*!***********************************************************!*\
4687
4886
  !*** ./frontend/src/list-subdocument/list-subdocument.js ***!
4688
4887
  \***********************************************************/
4689
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4888
+ (module, __unused_webpack_exports, __webpack_require__) {
4690
4889
 
4691
4890
  "use strict";
4692
4891
 
@@ -4729,35 +4928,35 @@ module.exports = app => app.component('list-subdocument', {
4729
4928
  }
4730
4929
  });
4731
4930
 
4732
- /***/ }),
4931
+ /***/ },
4733
4932
 
4734
- /***/ "./frontend/src/modal/modal.css":
4933
+ /***/ "./frontend/src/modal/modal.css"
4735
4934
  /*!**************************************!*\
4736
4935
  !*** ./frontend/src/modal/modal.css ***!
4737
4936
  \**************************************/
4738
- /***/ ((module) => {
4937
+ (module) {
4739
4938
 
4740
4939
  "use strict";
4741
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";
4742
4941
 
4743
- /***/ }),
4942
+ /***/ },
4744
4943
 
4745
- /***/ "./frontend/src/modal/modal.html":
4944
+ /***/ "./frontend/src/modal/modal.html"
4746
4945
  /*!***************************************!*\
4747
4946
  !*** ./frontend/src/modal/modal.html ***!
4748
4947
  \***************************************/
4749
- /***/ ((module) => {
4948
+ (module) {
4750
4949
 
4751
4950
  "use strict";
4752
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";
4753
4952
 
4754
- /***/ }),
4953
+ /***/ },
4755
4954
 
4756
- /***/ "./frontend/src/modal/modal.js":
4955
+ /***/ "./frontend/src/modal/modal.js"
4757
4956
  /*!*************************************!*\
4758
4957
  !*** ./frontend/src/modal/modal.js ***!
4759
4958
  \*************************************/
4760
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4959
+ (module, __unused_webpack_exports, __webpack_require__) {
4761
4960
 
4762
4961
  "use strict";
4763
4962
 
@@ -4773,24 +4972,24 @@ module.exports = app => app.component('modal', {
4773
4972
  });
4774
4973
 
4775
4974
 
4776
- /***/ }),
4975
+ /***/ },
4777
4976
 
4778
- /***/ "./frontend/src/models/document-search/document-search.html":
4977
+ /***/ "./frontend/src/models/document-search/document-search.html"
4779
4978
  /*!******************************************************************!*\
4780
4979
  !*** ./frontend/src/models/document-search/document-search.html ***!
4781
4980
  \******************************************************************/
4782
- /***/ ((module) => {
4981
+ (module) {
4783
4982
 
4784
4983
  "use strict";
4785
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";
4786
4985
 
4787
- /***/ }),
4986
+ /***/ },
4788
4987
 
4789
- /***/ "./frontend/src/models/document-search/document-search.js":
4988
+ /***/ "./frontend/src/models/document-search/document-search.js"
4790
4989
  /*!****************************************************************!*\
4791
4990
  !*** ./frontend/src/models/document-search/document-search.js ***!
4792
4991
  \****************************************************************/
4793
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4992
+ (module, __unused_webpack_exports, __webpack_require__) {
4794
4993
 
4795
4994
  "use strict";
4796
4995
 
@@ -5022,35 +5221,35 @@ module.exports = app => app.component('document-search', {
5022
5221
  });
5023
5222
 
5024
5223
 
5025
- /***/ }),
5224
+ /***/ },
5026
5225
 
5027
- /***/ "./frontend/src/models/models.css":
5226
+ /***/ "./frontend/src/models/models.css"
5028
5227
  /*!****************************************!*\
5029
5228
  !*** ./frontend/src/models/models.css ***!
5030
5229
  \****************************************/
5031
- /***/ ((module) => {
5230
+ (module) {
5032
5231
 
5033
5232
  "use strict";
5034
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";
5035
5234
 
5036
- /***/ }),
5235
+ /***/ },
5037
5236
 
5038
- /***/ "./frontend/src/models/models.html":
5237
+ /***/ "./frontend/src/models/models.html"
5039
5238
  /*!*****************************************!*\
5040
5239
  !*** ./frontend/src/models/models.html ***!
5041
5240
  \*****************************************/
5042
- /***/ ((module) => {
5241
+ (module) {
5043
5242
 
5044
5243
  "use strict";
5045
- 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";
5046
5245
 
5047
- /***/ }),
5246
+ /***/ },
5048
5247
 
5049
- /***/ "./frontend/src/models/models.js":
5248
+ /***/ "./frontend/src/models/models.js"
5050
5249
  /*!***************************************!*\
5051
5250
  !*** ./frontend/src/models/models.js ***!
5052
5251
  \***************************************/
5053
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
5252
+ (module, __unused_webpack_exports, __webpack_require__) {
5054
5253
 
5055
5254
  "use strict";
5056
5255
 
@@ -5292,6 +5491,38 @@ module.exports = app => app.component('models', {
5292
5491
  this.mongoDBIndexes = mongoDBIndexes;
5293
5492
  this.schemaIndexes = schemaIndexes;
5294
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
+ },
5295
5526
  checkIndexLocation(indexName) {
5296
5527
  if (this.schemaIndexes.find(x => x.name == indexName) && this.mongoDBIndexes.find(x => x.name == indexName)) {
5297
5528
  return 'text-gray-500';
@@ -5548,13 +5779,13 @@ module.exports = app => app.component('models', {
5548
5779
  });
5549
5780
 
5550
5781
 
5551
- /***/ }),
5782
+ /***/ },
5552
5783
 
5553
- /***/ "./frontend/src/models/trie.js":
5784
+ /***/ "./frontend/src/models/trie.js"
5554
5785
  /*!*************************************!*\
5555
5786
  !*** ./frontend/src/models/trie.js ***!
5556
5787
  \*************************************/
5557
- /***/ ((module) => {
5788
+ (module) {
5558
5789
 
5559
5790
  "use strict";
5560
5791
 
@@ -5702,13 +5933,13 @@ module.exports = {
5702
5933
  };
5703
5934
 
5704
5935
 
5705
- /***/ }),
5936
+ /***/ },
5706
5937
 
5707
- /***/ "./frontend/src/mothership.js":
5938
+ /***/ "./frontend/src/mothership.js"
5708
5939
  /*!************************************!*\
5709
5940
  !*** ./frontend/src/mothership.js ***!
5710
5941
  \************************************/
5711
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5942
+ (__unused_webpack_module, exports, __webpack_require__) {
5712
5943
 
5713
5944
  "use strict";
5714
5945
 
@@ -5774,35 +6005,35 @@ exports.updateWorkspaceMember = function updateWorkspaceMember(params) {
5774
6005
  exports.hasAPIKey = client.hasAPIKey;
5775
6006
 
5776
6007
 
5777
- /***/ }),
6008
+ /***/ },
5778
6009
 
5779
- /***/ "./frontend/src/navbar/navbar.css":
6010
+ /***/ "./frontend/src/navbar/navbar.css"
5780
6011
  /*!****************************************!*\
5781
6012
  !*** ./frontend/src/navbar/navbar.css ***!
5782
6013
  \****************************************/
5783
- /***/ ((module) => {
6014
+ (module) {
5784
6015
 
5785
6016
  "use strict";
5786
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";
5787
6018
 
5788
- /***/ }),
6019
+ /***/ },
5789
6020
 
5790
- /***/ "./frontend/src/navbar/navbar.html":
6021
+ /***/ "./frontend/src/navbar/navbar.html"
5791
6022
  /*!*****************************************!*\
5792
6023
  !*** ./frontend/src/navbar/navbar.html ***!
5793
6024
  \*****************************************/
5794
- /***/ ((module) => {
6025
+ (module) {
5795
6026
 
5796
6027
  "use strict";
5797
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";
5798
6029
 
5799
- /***/ }),
6030
+ /***/ },
5800
6031
 
5801
- /***/ "./frontend/src/navbar/navbar.js":
6032
+ /***/ "./frontend/src/navbar/navbar.js"
5802
6033
  /*!***************************************!*\
5803
6034
  !*** ./frontend/src/navbar/navbar.js ***!
5804
6035
  \***************************************/
5805
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6036
+ (module, __unused_webpack_exports, __webpack_require__) {
5806
6037
 
5807
6038
  "use strict";
5808
6039
 
@@ -5902,13 +6133,13 @@ module.exports = app => app.component('navbar', {
5902
6133
  });
5903
6134
 
5904
6135
 
5905
- /***/ }),
6136
+ /***/ },
5906
6137
 
5907
- /***/ "./frontend/src/routes.js":
6138
+ /***/ "./frontend/src/routes.js"
5908
6139
  /*!********************************!*\
5909
6140
  !*** ./frontend/src/routes.js ***!
5910
6141
  \********************************/
5911
- /***/ ((module) => {
6142
+ (module) {
5912
6143
 
5913
6144
  "use strict";
5914
6145
 
@@ -6003,24 +6234,24 @@ module.exports = {
6003
6234
  };
6004
6235
 
6005
6236
 
6006
- /***/ }),
6237
+ /***/ },
6007
6238
 
6008
- /***/ "./frontend/src/splash/splash.html":
6239
+ /***/ "./frontend/src/splash/splash.html"
6009
6240
  /*!*****************************************!*\
6010
6241
  !*** ./frontend/src/splash/splash.html ***!
6011
6242
  \*****************************************/
6012
- /***/ ((module) => {
6243
+ (module) {
6013
6244
 
6014
6245
  "use strict";
6015
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";
6016
6247
 
6017
- /***/ }),
6248
+ /***/ },
6018
6249
 
6019
- /***/ "./frontend/src/splash/splash.js":
6250
+ /***/ "./frontend/src/splash/splash.js"
6020
6251
  /*!***************************************!*\
6021
6252
  !*** ./frontend/src/splash/splash.js ***!
6022
6253
  \***************************************/
6023
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6254
+ (module, __unused_webpack_exports, __webpack_require__) {
6024
6255
 
6025
6256
  "use strict";
6026
6257
 
@@ -6051,24 +6282,24 @@ module.exports = app => app.component('splash', {
6051
6282
  });
6052
6283
 
6053
6284
 
6054
- /***/ }),
6285
+ /***/ },
6055
6286
 
6056
- /***/ "./frontend/src/team/new-invitation/new-invitation.html":
6287
+ /***/ "./frontend/src/team/new-invitation/new-invitation.html"
6057
6288
  /*!**************************************************************!*\
6058
6289
  !*** ./frontend/src/team/new-invitation/new-invitation.html ***!
6059
6290
  \**************************************************************/
6060
- /***/ ((module) => {
6291
+ (module) {
6061
6292
 
6062
6293
  "use strict";
6063
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";
6064
6295
 
6065
- /***/ }),
6296
+ /***/ },
6066
6297
 
6067
- /***/ "./frontend/src/team/new-invitation/new-invitation.js":
6298
+ /***/ "./frontend/src/team/new-invitation/new-invitation.js"
6068
6299
  /*!************************************************************!*\
6069
6300
  !*** ./frontend/src/team/new-invitation/new-invitation.js ***!
6070
6301
  \************************************************************/
6071
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6302
+ (module, __unused_webpack_exports, __webpack_require__) {
6072
6303
 
6073
6304
  "use strict";
6074
6305
 
@@ -6100,24 +6331,24 @@ module.exports = app => app.component('new-invitation', {
6100
6331
  });
6101
6332
 
6102
6333
 
6103
- /***/ }),
6334
+ /***/ },
6104
6335
 
6105
- /***/ "./frontend/src/team/team.html":
6336
+ /***/ "./frontend/src/team/team.html"
6106
6337
  /*!*************************************!*\
6107
6338
  !*** ./frontend/src/team/team.html ***!
6108
6339
  \*************************************/
6109
- /***/ ((module) => {
6340
+ (module) {
6110
6341
 
6111
6342
  "use strict";
6112
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";
6113
6344
 
6114
- /***/ }),
6345
+ /***/ },
6115
6346
 
6116
- /***/ "./frontend/src/team/team.js":
6347
+ /***/ "./frontend/src/team/team.js"
6117
6348
  /*!***********************************!*\
6118
6349
  !*** ./frontend/src/team/team.js ***!
6119
6350
  \***********************************/
6120
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6351
+ (module, __unused_webpack_exports, __webpack_require__) {
6121
6352
 
6122
6353
  "use strict";
6123
6354
 
@@ -6214,35 +6445,35 @@ module.exports = app => app.component('team', {
6214
6445
  });
6215
6446
 
6216
6447
 
6217
- /***/ }),
6448
+ /***/ },
6218
6449
 
6219
- /***/ "./frontend/src/update-document/update-document.css":
6450
+ /***/ "./frontend/src/update-document/update-document.css"
6220
6451
  /*!**********************************************************!*\
6221
6452
  !*** ./frontend/src/update-document/update-document.css ***!
6222
6453
  \**********************************************************/
6223
- /***/ ((module) => {
6454
+ (module) {
6224
6455
 
6225
6456
  "use strict";
6226
6457
  module.exports = "";
6227
6458
 
6228
- /***/ }),
6459
+ /***/ },
6229
6460
 
6230
- /***/ "./frontend/src/update-document/update-document.html":
6461
+ /***/ "./frontend/src/update-document/update-document.html"
6231
6462
  /*!***********************************************************!*\
6232
6463
  !*** ./frontend/src/update-document/update-document.html ***!
6233
6464
  \***********************************************************/
6234
- /***/ ((module) => {
6465
+ (module) {
6235
6466
 
6236
6467
  "use strict";
6237
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>";
6238
6469
 
6239
- /***/ }),
6470
+ /***/ },
6240
6471
 
6241
- /***/ "./frontend/src/update-document/update-document.js":
6472
+ /***/ "./frontend/src/update-document/update-document.js"
6242
6473
  /*!*********************************************************!*\
6243
6474
  !*** ./frontend/src/update-document/update-document.js ***!
6244
6475
  \*********************************************************/
6245
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6476
+ (module, __unused_webpack_exports, __webpack_require__) {
6246
6477
 
6247
6478
  "use strict";
6248
6479
 
@@ -6317,13 +6548,13 @@ module.exports = app => app.component('update-document', {
6317
6548
  });
6318
6549
 
6319
6550
 
6320
- /***/ }),
6551
+ /***/ },
6321
6552
 
6322
- /***/ "./node_modules/axios/dist/browser/axios.cjs":
6553
+ /***/ "./node_modules/axios/dist/browser/axios.cjs"
6323
6554
  /*!***************************************************!*\
6324
6555
  !*** ./node_modules/axios/dist/browser/axios.cjs ***!
6325
6556
  \***************************************************/
6326
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
6557
+ (module, __unused_webpack_exports, __webpack_require__) {
6327
6558
 
6328
6559
  "use strict";
6329
6560
  // Axios v1.2.2 Copyright (c) 2022 Matt Zabriskie and contributors
@@ -9483,13 +9714,13 @@ module.exports = axios;
9483
9714
  //# sourceMappingURL=axios.cjs.map
9484
9715
 
9485
9716
 
9486
- /***/ }),
9717
+ /***/ },
9487
9718
 
9488
- /***/ "./node_modules/bson/lib/bson.mjs":
9719
+ /***/ "./node_modules/bson/lib/bson.mjs"
9489
9720
  /*!****************************************!*\
9490
9721
  !*** ./node_modules/bson/lib/bson.mjs ***!
9491
9722
  \****************************************/
9492
- /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
9723
+ (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
9493
9724
 
9494
9725
  "use strict";
9495
9726
  __webpack_require__.r(__webpack_exports__);
@@ -14166,13 +14397,13 @@ var bson = /*#__PURE__*/Object.freeze({
14166
14397
  //# sourceMappingURL=bson.mjs.map
14167
14398
 
14168
14399
 
14169
- /***/ }),
14400
+ /***/ },
14170
14401
 
14171
- /***/ "./node_modules/marked/lib/marked.cjs":
14402
+ /***/ "./node_modules/marked/lib/marked.cjs"
14172
14403
  /*!********************************************!*\
14173
14404
  !*** ./node_modules/marked/lib/marked.cjs ***!
14174
14405
  \********************************************/
14175
- /***/ ((module) => {
14406
+ (module) {
14176
14407
 
14177
14408
  "use strict";
14178
14409
  /**
@@ -16388,13 +16619,13 @@ var lexer = _Lexer.lex;
16388
16619
  //# sourceMappingURL=marked.cjs.map
16389
16620
 
16390
16621
 
16391
- /***/ }),
16622
+ /***/ },
16392
16623
 
16393
- /***/ "./node_modules/mongodb/lib/bson.js":
16624
+ /***/ "./node_modules/mongodb/lib/bson.js"
16394
16625
  /*!******************************************!*\
16395
16626
  !*** ./node_modules/mongodb/lib/bson.js ***!
16396
16627
  \******************************************/
16397
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
16628
+ (__unused_webpack_module, exports, __webpack_require__) {
16398
16629
 
16399
16630
  "use strict";
16400
16631
 
@@ -16482,13 +16713,13 @@ function parseUtf8ValidationOption(options) {
16482
16713
  }
16483
16714
  //# sourceMappingURL=bson.js.map
16484
16715
 
16485
- /***/ }),
16716
+ /***/ },
16486
16717
 
16487
- /***/ "./node_modules/mpath/index.js":
16718
+ /***/ "./node_modules/mpath/index.js"
16488
16719
  /*!*************************************!*\
16489
16720
  !*** ./node_modules/mpath/index.js ***!
16490
16721
  \*************************************/
16491
- /***/ ((module, exports, __webpack_require__) => {
16722
+ (module, exports, __webpack_require__) {
16492
16723
 
16493
16724
  "use strict";
16494
16725
 
@@ -16496,13 +16727,13 @@ function parseUtf8ValidationOption(options) {
16496
16727
  module.exports = exports = __webpack_require__(/*! ./lib */ "./node_modules/mpath/lib/index.js");
16497
16728
 
16498
16729
 
16499
- /***/ }),
16730
+ /***/ },
16500
16731
 
16501
- /***/ "./node_modules/mpath/lib/index.js":
16732
+ /***/ "./node_modules/mpath/lib/index.js"
16502
16733
  /*!*****************************************!*\
16503
16734
  !*** ./node_modules/mpath/lib/index.js ***!
16504
16735
  \*****************************************/
16505
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
16736
+ (__unused_webpack_module, exports, __webpack_require__) {
16506
16737
 
16507
16738
  /* eslint strict:off */
16508
16739
  /* eslint no-var: off */
@@ -16831,13 +17062,13 @@ function K(v) {
16831
17062
  return v;
16832
17063
  }
16833
17064
 
16834
- /***/ }),
17065
+ /***/ },
16835
17066
 
16836
- /***/ "./node_modules/mpath/lib/stringToParts.js":
17067
+ /***/ "./node_modules/mpath/lib/stringToParts.js"
16837
17068
  /*!*************************************************!*\
16838
17069
  !*** ./node_modules/mpath/lib/stringToParts.js ***!
16839
17070
  \*************************************************/
16840
- /***/ ((module) => {
17071
+ (module) {
16841
17072
 
16842
17073
  "use strict";
16843
17074
 
@@ -16889,13 +17120,13 @@ module.exports = function stringToParts(str) {
16889
17120
  return result;
16890
17121
  };
16891
17122
 
16892
- /***/ }),
17123
+ /***/ },
16893
17124
 
16894
- /***/ "./node_modules/node-inspect-extracted/dist/inspect.js":
17125
+ /***/ "./node_modules/node-inspect-extracted/dist/inspect.js"
16895
17126
  /*!*************************************************************!*\
16896
17127
  !*** ./node_modules/node-inspect-extracted/dist/inspect.js ***!
16897
17128
  \*************************************************************/
16898
- /***/ (function(module) {
17129
+ (module) {
16899
17130
 
16900
17131
  /*! For license information please see inspect.js.LICENSE.txt */
16901
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
@@ -16903,13 +17134,13 @@ module.exports = function stringToParts(str) {
16903
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
16904
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)})());
16905
17136
 
16906
- /***/ }),
17137
+ /***/ },
16907
17138
 
16908
- /***/ "./node_modules/vanillatoasts/vanillatoasts.js":
17139
+ /***/ "./node_modules/vanillatoasts/vanillatoasts.js"
16909
17140
  /*!*****************************************************!*\
16910
17141
  !*** ./node_modules/vanillatoasts/vanillatoasts.js ***!
16911
17142
  \*****************************************************/
16912
- /***/ (function(module) {
17143
+ (module) {
16913
17144
 
16914
17145
  (function (root, factory) {
16915
17146
  try {
@@ -17087,18 +17318,18 @@ module.exports = function stringToParts(str) {
17087
17318
  });
17088
17319
 
17089
17320
 
17090
- /***/ }),
17321
+ /***/ },
17091
17322
 
17092
- /***/ "./package.json":
17323
+ /***/ "./package.json"
17093
17324
  /*!**********************!*\
17094
17325
  !*** ./package.json ***!
17095
17326
  \**********************/
17096
- /***/ ((module) => {
17327
+ (module) {
17097
17328
 
17098
17329
  "use strict";
17099
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@mongoosejs/studio","version":"0.1.16","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"}}');
17100
17331
 
17101
- /***/ })
17332
+ /***/ }
17102
17333
 
17103
17334
  /******/ });
17104
17335
  /************************************************************************/
@@ -17112,6 +17343,12 @@ module.exports = /*#__PURE__*/JSON.parse('{"name":"@mongoosejs/studio","version"
17112
17343
  /******/ if (cachedModule !== undefined) {
17113
17344
  /******/ return cachedModule.exports;
17114
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
+ /******/ }
17115
17352
  /******/ // Create a new module (and put it into the cache)
17116
17353
  /******/ var module = __webpack_module_cache__[moduleId] = {
17117
17354
  /******/ // no module.id needed