@dudousxd/nestjs-telescope-ui 1.26.0 → 2.0.1
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.
- package/CHANGELOG.md +27 -0
- package/README.md +31 -0
- package/dist/client/console-url.d.ts +11 -0
- package/dist/client/console-url.d.ts.map +1 -0
- package/dist/client/console-url.js +21 -0
- package/dist/client/console-url.js.map +1 -0
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -3
- package/dist/client/index.js.map +1 -1
- package/dist/client/telescope-client.d.ts +1 -10
- package/dist/client/telescope-client.d.ts.map +1 -1
- package/dist/client/telescope-client.js +3 -63
- package/dist/client/telescope-client.js.map +1 -1
- package/dist/client/types.d.ts +0 -41
- package/dist/client/types.d.ts.map +1 -1
- package/dist/react/components/entries-table.d.ts.map +1 -1
- package/dist/react/components/entries-table.js +7 -0
- package/dist/react/components/entries-table.js.map +1 -1
- package/dist/react/components/entry-detail.d.ts.map +1 -1
- package/dist/react/components/entry-detail.js +2 -1
- package/dist/react/components/entry-detail.js.map +1 -1
- package/dist/react/components/entry-types.d.ts.map +1 -1
- package/dist/react/components/entry-types.js +4 -0
- package/dist/react/components/entry-types.js.map +1 -1
- package/dist/react/components/official-event.d.ts +16 -0
- package/dist/react/components/official-event.d.ts.map +1 -0
- package/dist/react/components/official-event.js +88 -0
- package/dist/react/components/official-event.js.map +1 -0
- package/dist/react/index.d.ts +0 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +0 -2
- package/dist/react/index.js.map +1 -1
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/telescope-ui.controller.d.ts +1 -20
- package/dist/server/telescope-ui.controller.d.ts.map +1 -1
- package/dist/server/telescope-ui.controller.js +10 -77
- package/dist/server/telescope-ui.controller.js.map +1 -1
- package/dist/server/telescope-ui.module.d.ts +13 -8
- package/dist/server/telescope-ui.module.d.ts.map +1 -1
- package/dist/server/telescope-ui.module.js +17 -37
- package/dist/server/telescope-ui.module.js.map +1 -1
- package/dist/server/telescope-ui.options.d.ts +35 -31
- package/dist/server/telescope-ui.options.d.ts.map +1 -1
- package/dist/server/telescope-ui.options.js.map +1 -1
- package/dist/spa/assets/index-BPSlup7m.js +159 -0
- package/dist/spa/assets/index-DmsmJrlA.css +1 -0
- package/dist/spa/index.html +2 -2
- package/package.json +4 -8
- package/skills/telescope-ui-dashboard/SKILL.md +23 -8
- package/dist/client/console-session.d.ts +0 -66
- package/dist/client/console-session.d.ts.map +0 -1
- package/dist/client/console-session.js +0 -110
- package/dist/client/console-session.js.map +0 -1
- package/dist/react/console.d.ts +0 -4
- package/dist/react/console.d.ts.map +0 -1
- package/dist/react/console.js +0 -14
- package/dist/react/console.js.map +0 -1
- package/dist/react/open-console-button.d.ts +0 -28
- package/dist/react/open-console-button.d.ts.map +0 -1
- package/dist/react/open-console-button.js +0 -28
- package/dist/react/open-console-button.js.map +0 -1
- package/dist/react/use-open-console.d.ts +0 -34
- package/dist/react/use-open-console.d.ts.map +0 -1
- package/dist/react/use-open-console.js +0 -69
- package/dist/react/use-open-console.js.map +0 -1
- package/dist/spa/assets/index-BENKgbaX.css +0 -1
- package/dist/spa/assets/index-DBO3LkDh.js +0 -159
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.left-0{left:0}.left-1\/2{left:50%}.right-0{right:0}.top-0{top:0}.top-1\/2{top:50%}.top-8{top:2rem}.top-\[12vh\]{top:12vh}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-6{height:1.5rem}.h-full{height:100%}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-\[28rem\]{max-height:28rem}.min-h-0{min-height:0px}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-40{width:10rem}.w-48{width:12rem}.w-56{width:14rem}.w-64{width:16rem}.w-\[min\(36rem\,92vw\)\]{width:min(36rem,92vw)}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[10rem\]{min-width:10rem}.min-w-\[640px\]{min-width:640px}.min-w-\[6rem\]{min-width:6rem}.min-w-\[760px\]{min-width:760px}.min-w-\[8rem\]{min-width:8rem}.max-w-\[12rem\]{max-width:12rem}.max-w-md{max-width:28rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-px{gap:1px}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-line-soft>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:color-mix(in srgb,var(--line-soft) calc(var(--tw-divide-opacity, 1) * 100%),transparent)}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-bad{--tw-border-opacity: 1;border-color:color-mix(in srgb,var(--bad) calc(var(--tw-border-opacity, 1) * 100%),transparent)}.border-brand{--tw-border-opacity: 1;border-color:color-mix(in srgb,var(--accent) calc(var(--tw-border-opacity, 1) * 100%),transparent)}.border-input,.border-line{--tw-border-opacity: 1;border-color:color-mix(in srgb,var(--line) calc(var(--tw-border-opacity, 1) * 100%),transparent)}.border-line-soft{--tw-border-opacity: 1;border-color:color-mix(in srgb,var(--line-soft) calc(var(--tw-border-opacity, 1) * 100%),transparent)}.border-line-soft\/60{border-color:color-mix(in srgb,var(--line-soft) 60%,transparent)}.border-line\/60{border-color:color-mix(in srgb,var(--line) 60%,transparent)}.border-transparent{border-color:transparent}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-background{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--bg) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-bad{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--bad) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-black\/60{background-color:#0009}.bg-brand{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--accent) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-cyan-400{--tw-bg-opacity: 1;background-color:rgb(34 211 238 / var(--tw-bg-opacity, 1))}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-fuchsia-400{--tw-bg-opacity: 1;background-color:rgb(232 121 249 / var(--tw-bg-opacity, 1))}.bg-good{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--good) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-indigo-400{--tw-bg-opacity: 1;background-color:rgb(129 140 248 / var(--tw-bg-opacity, 1))}.bg-indigo-500{--tw-bg-opacity: 1;background-color:rgb(99 102 241 / var(--tw-bg-opacity, 1))}.bg-lime-400{--tw-bg-opacity: 1;background-color:rgb(163 230 53 / var(--tw-bg-opacity, 1))}.bg-line{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--line) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-orange-400{--tw-bg-opacity: 1;background-color:rgb(251 146 60 / var(--tw-bg-opacity, 1))}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-panel{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--panel) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-panel-2{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--panel-2) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-panel-2\/60{background-color:color-mix(in srgb,var(--panel-2) 60%,transparent)}.bg-panel-2\/80{background-color:color-mix(in srgb,var(--panel-2) 80%,transparent)}.bg-panel\/20{background-color:color-mix(in srgb,var(--panel) 20%,transparent)}.bg-panel\/40{background-color:color-mix(in srgb,var(--panel) 40%,transparent)}.bg-pink-400{--tw-bg-opacity: 1;background-color:rgb(244 114 182 / var(--tw-bg-opacity, 1))}.bg-pink-500{--tw-bg-opacity: 1;background-color:rgb(236 72 153 / var(--tw-bg-opacity, 1))}.bg-popover{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--panel-2) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-primary{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--accent) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-purple-300{--tw-bg-opacity: 1;background-color:rgb(216 180 254 / var(--tw-bg-opacity, 1))}.bg-purple-400{--tw-bg-opacity: 1;background-color:rgb(192 132 252 / var(--tw-bg-opacity, 1))}.bg-red-300{--tw-bg-opacity: 1;background-color:rgb(252 165 165 / var(--tw-bg-opacity, 1))}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-rose-400{--tw-bg-opacity: 1;background-color:rgb(251 113 133 / var(--tw-bg-opacity, 1))}.bg-rose-500{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity, 1))}.bg-sky-400{--tw-bg-opacity: 1;background-color:rgb(56 189 248 / var(--tw-bg-opacity, 1))}.bg-sky-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))}.bg-sky-500\/10{background-color:#0ea5e91a}.bg-teal-400{--tw-bg-opacity: 1;background-color:rgb(45 212 191 / var(--tw-bg-opacity, 1))}.bg-teal-500{--tw-bg-opacity: 1;background-color:rgb(20 184 166 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-violet-400{--tw-bg-opacity: 1;background-color:rgb(167 139 250 / var(--tw-bg-opacity, 1))}.bg-violet-500{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.bg-violet-500\/15{background-color:#8b5cf626}.bg-warn{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--warn) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-zinc-400{--tw-bg-opacity: 1;background-color:rgb(161 161 170 / var(--tw-bg-opacity, 1))}.bg-zinc-500{--tw-bg-opacity: 1;background-color:rgb(113 113 122 / var(--tw-bg-opacity, 1))}.bg-zinc-600{--tw-bg-opacity: 1;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))}.fill-accent{fill:var(--panel-2)}.fill-amber-400{fill:#fbbf24}.fill-emerald-400{fill:#34d399}.fill-none{fill:none}.fill-pink-400{fill:#f472b6}.fill-red-400{fill:#f87171}.fill-sky-400{fill:#38bdf8}.fill-violet-400{fill:#a78bfa}.fill-zinc-500{fill:#71717a}.stroke-accent{stroke:var(--panel-2)}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pl-1\.5{padding-left:.375rem}.pr-2{padding-right:.5rem}.pt-1{padding-top:.25rem}.pt-3{padding-top:.75rem}.pt-\[40\%\]{padding-top:40%}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.tracking-normal{letter-spacing:0em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-bad{--tw-text-opacity: 1;color:color-mix(in srgb,var(--bad) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-black\/80{color:#000c}.text-brand{--tw-text-opacity: 1;color:color-mix(in srgb,var(--accent) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-foreground{--tw-text-opacity: 1;color:color-mix(in srgb,var(--text) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-fuchsia-300{--tw-text-opacity: 1;color:rgb(240 171 252 / var(--tw-text-opacity, 1))}.text-fuchsia-400{--tw-text-opacity: 1;color:rgb(232 121 249 / var(--tw-text-opacity, 1))}.text-good{--tw-text-opacity: 1;color:color-mix(in srgb,var(--good) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-indigo-300{--tw-text-opacity: 1;color:rgb(165 180 252 / var(--tw-text-opacity, 1))}.text-indigo-400{--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.text-inherit{color:inherit}.text-lime-400{--tw-text-opacity: 1;color:rgb(163 230 53 / var(--tw-text-opacity, 1))}.text-muted-foreground{--tw-text-opacity: 1;color:color-mix(in srgb,var(--muted) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-popover-foreground{--tw-text-opacity: 1;color:color-mix(in srgb,var(--text) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-primary-foreground{--tw-text-opacity: 1;color:color-mix(in srgb,var(--bg) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-sky-300{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.text-sky-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.text-teal-300{--tw-text-opacity: 1;color:rgb(94 234 212 / var(--tw-text-opacity, 1))}.text-violet-300{--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-warn{--tw-text-opacity: 1;color:color-mix(in srgb,var(--warn) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.opacity-10{opacity:.1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-line{--tw-ring-opacity: 1;--tw-ring-color: color-mix(in srgb, var(--line) calc(var(--tw-ring-opacity, 1) * 100%), transparent)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\[2px\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{--bg: #09090b;--panel: #0c0c0f;--panel-2: #101017;--line: #1c1c22;--line-soft: #16161a;--text: #e7e7ea;--muted: #76767f;--good: #34d399;--warn: #fbbf24;--bad: #f87171;--live: #60a5fa;--accent: #e879f9;color-scheme:dark}.light{--bg: #ffffff;--panel: #fafafa;--panel-2: #f4f4f5;--line: #e4e4e7;--line-soft: #efeff1;--text: #18181b;--muted: #71717a;--good: #047857;--warn: #b45309;--bad: #dc2626;--live: #1d4ed8;--accent: #a21caf;color-scheme:light}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased}.tnum{font-variant-numeric:tabular-nums}.tint-brand{background-color:color-mix(in srgb,var(--accent) 12%,transparent);border-color:color-mix(in srgb,var(--accent) 40%,transparent);color:var(--accent)}.tint-good{background-color:color-mix(in srgb,var(--good) 12%,transparent);border-color:color-mix(in srgb,var(--good) 40%,transparent);color:var(--good)}.tint-warn{background-color:color-mix(in srgb,var(--warn) 12%,transparent);border-color:color-mix(in srgb,var(--warn) 40%,transparent);color:var(--warn)}.tint-bad{background-color:color-mix(in srgb,var(--bad) 12%,transparent);border-color:color-mix(in srgb,var(--bad) 40%,transparent);color:var(--bad)}.tint-muted{background-color:var(--panel-2);border-color:var(--line);color:var(--muted)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--line);border:3px solid var(--bg);border-radius:999px}.light .bg-zinc-950{background-color:var(--bg)}.light .bg-zinc-900{background-color:var(--panel)}.light .bg-zinc-800{background-color:var(--panel-2)}.light .text-zinc-100,.light .text-zinc-200,.light .text-zinc-300{color:var(--text)}.light .text-zinc-400,.light .text-zinc-500,.light .text-zinc-600{color:var(--muted)}.light .border-zinc-800,.light .border-zinc-700,.light .border-zinc-900{border-color:var(--line)}.placeholder\:text-muted-foreground::-moz-placeholder{--tw-text-opacity: 1;color:color-mix(in srgb,var(--muted) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.placeholder\:text-muted-foreground::placeholder{--tw-text-opacity: 1;color:color-mix(in srgb,var(--muted) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.first\:border-0:first-child{border-width:0px}.first\:pt-0:first-child{padding-top:0}.last\:border-0:last-child{border-width:0px}.hover\:border-brand:hover{--tw-border-opacity: 1;border-color:color-mix(in srgb,var(--accent) calc(var(--tw-border-opacity, 1) * 100%),transparent)}.hover\:border-line:hover{--tw-border-opacity: 1;border-color:color-mix(in srgb,var(--line) calc(var(--tw-border-opacity, 1) * 100%),transparent)}.hover\:bg-panel:hover{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--panel) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.hover\:bg-panel-2:hover{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--panel-2) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.hover\:bg-panel\/40:hover{background-color:color-mix(in srgb,var(--panel) 40%,transparent)}.hover\:bg-panel\/70:hover{background-color:color-mix(in srgb,var(--panel) 70%,transparent)}.hover\:text-brand:hover{--tw-text-opacity: 1;color:color-mix(in srgb,var(--accent) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.hover\:text-foreground:hover{--tw-text-opacity: 1;color:color-mix(in srgb,var(--text) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:brightness-125:hover{--tw-brightness: brightness(1.25);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: color-mix(in srgb, var(--accent) calc(var(--tw-ring-opacity, 1) * 100%), transparent)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:cursor-not-allowed[data-disabled]{cursor:not-allowed}.data-\[active\]\:bg-panel-2[data-active]{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--panel-2) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.data-\[highlighted\]\:bg-panel[data-highlighted]{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--panel) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.data-\[active\]\:text-foreground[data-active]{--tw-text-opacity: 1;color:color-mix(in srgb,var(--text) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.data-\[selected\]\:text-brand[data-selected]{--tw-text-opacity: 1;color:color-mix(in srgb,var(--accent) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}@media (min-width: 640px){.sm\:col-span-4{grid-column:span 4 / span 4}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 768px){.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-\[280px_minmax\(0\,1fr\)\]{grid-template-columns:280px minmax(0,1fr)}}.\[\&_\.recharts-brush-texts_text\]\:fill-muted-foreground .recharts-brush-texts text{fill:var(--muted)}.\[\&_\.recharts-cartesian-axis-line\]\:stroke-line .recharts-cartesian-axis-line,.\[\&_\.recharts-cartesian-axis-tick-line\]\:stroke-line .recharts-cartesian-axis-tick-line{stroke:var(--line)}.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text{fill:var(--muted)}.\[\&_\.recharts-cartesian-grid_line\]\:stroke-line .recharts-cartesian-grid line{stroke:var(--line)}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer{outline:2px solid transparent;outline-offset:2px}.\[\&_\.recharts-radial-bar-background-sector\]\:fill-panel-2 .recharts-radial-bar-background-sector{fill:var(--panel-2)}.\[\&_\.recharts-reference-line_line\]\:stroke-line .recharts-reference-line line{stroke:var(--line)}.\[\&_\.recharts-sector\]\:outline-none .recharts-sector,.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{outline:2px solid transparent;outline-offset:2px}
|
package/dist/spa/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Telescope</title>
|
|
7
|
-
<script type="module" crossorigin src="/telescope/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/telescope/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/telescope/assets/index-BPSlup7m.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/telescope/assets/index-DmsmJrlA.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dudousxd/nestjs-telescope-ui",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Bundled dashboard + composable React components for @dudousxd/nestjs-telescope.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -40,11 +40,6 @@
|
|
|
40
40
|
"import": "./dist/react/index.js",
|
|
41
41
|
"default": "./dist/react/index.js"
|
|
42
42
|
},
|
|
43
|
-
"./react/console": {
|
|
44
|
-
"types": "./dist/react/console.d.ts",
|
|
45
|
-
"import": "./dist/react/console.js",
|
|
46
|
-
"default": "./dist/react/console.js"
|
|
47
|
-
},
|
|
48
43
|
"./client": {
|
|
49
44
|
"types": "./dist/client/index.d.ts",
|
|
50
45
|
"import": "./dist/client/index.js",
|
|
@@ -67,7 +62,7 @@
|
|
|
67
62
|
"react-router-dom": "^6.0.0 || ^7.0.0",
|
|
68
63
|
"recharts": "^2.0.0 || ^3.0.0",
|
|
69
64
|
"reflect-metadata": "^0.1.13 || ^0.2.0",
|
|
70
|
-
"@dudousxd/nestjs-telescope": "^
|
|
65
|
+
"@dudousxd/nestjs-telescope": "^2.0.1"
|
|
71
66
|
},
|
|
72
67
|
"peerDependenciesMeta": {
|
|
73
68
|
"react": {
|
|
@@ -99,6 +94,7 @@
|
|
|
99
94
|
"tailwind-merge": "2.6.1"
|
|
100
95
|
},
|
|
101
96
|
"devDependencies": {
|
|
97
|
+
"@nestjs/authorization": "0.1.3",
|
|
102
98
|
"@nestjs/common": "12.0.3",
|
|
103
99
|
"@nestjs/core": "12.0.3",
|
|
104
100
|
"@nestjs/platform-express": "12.0.3",
|
|
@@ -126,7 +122,7 @@
|
|
|
126
122
|
"typescript": "5.9.3",
|
|
127
123
|
"vite": "5.4.21",
|
|
128
124
|
"vitest": "3.2.7",
|
|
129
|
-
"@dudousxd/nestjs-telescope": "
|
|
125
|
+
"@dudousxd/nestjs-telescope": "2.0.1"
|
|
130
126
|
},
|
|
131
127
|
"engines": {
|
|
132
128
|
"node": ">=20"
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
name: telescope-ui-dashboard
|
|
3
3
|
description: >-
|
|
4
4
|
Serve and embed the nestjs-telescope dashboard with @dudousxd/nestjs-telescope-ui.
|
|
5
|
-
Mount the bundled React SPA via TelescopeUiModule.forRoot({ path?, assetsDir
|
|
6
|
-
forRootAsync (the path
|
|
5
|
+
Mount the bundled React SPA via TelescopeUiModule.forRoot({ path?, assetsDir?,
|
|
6
|
+
decorators?, routes? }) / forRootAsync (the path is static in the async form,
|
|
7
|
+
as are decorators and routes; the path must match TelescopeModule); with
|
|
8
|
+
NODE_ENV=production mounting the page with no decorators fails the boot
|
|
9
|
+
(routes:false always boots).
|
|
7
10
|
call the headless API from any frontend with createTelescopeClient({ baseUrl?,
|
|
8
11
|
fetch? }) from the /client subpath; build a custom console with the React
|
|
9
12
|
components, hooks (TelescopeProvider, useTelescopeClient, useEntries, usePulse,
|
|
@@ -30,19 +33,28 @@ Import the UI module alongside the core module. The `path` must match
|
|
|
30
33
|
`TelescopeModule` (default `telescope`):
|
|
31
34
|
|
|
32
35
|
```ts
|
|
33
|
-
import { Module } from '@nestjs/common';
|
|
36
|
+
import { Module, UseGuards } from '@nestjs/common';
|
|
37
|
+
import { AuthenticationGuard } from '@nestjs/authentication';
|
|
38
|
+
import { Can } from '@nestjs/authorization';
|
|
34
39
|
import { TelescopeModule } from '@dudousxd/nestjs-telescope';
|
|
35
40
|
import { TelescopeUiModule } from '@dudousxd/nestjs-telescope-ui';
|
|
36
41
|
|
|
42
|
+
const protect = [UseGuards(AuthenticationGuard), Can(ConsolePolicy, 'view')];
|
|
43
|
+
|
|
37
44
|
@Module({
|
|
38
45
|
imports: [
|
|
39
|
-
TelescopeModule.forRoot({ enabled: true,
|
|
40
|
-
TelescopeUiModule.forRoot(), // dashboard at /telescope
|
|
46
|
+
TelescopeModule.forRoot({ enabled: true, decorators: protect }),
|
|
47
|
+
TelescopeUiModule.forRoot({ decorators: protect }), // dashboard at /telescope
|
|
41
48
|
],
|
|
42
49
|
})
|
|
43
50
|
export class AppModule {}
|
|
44
51
|
```
|
|
45
52
|
|
|
53
|
+
With `NODE_ENV=production`, mounting the page with no `decorators` (an empty
|
|
54
|
+
array counts as none) fails the boot; `routes: false` always boots (serve the
|
|
55
|
+
page from your own subclass of the exported `TelescopeUiController`). Outside
|
|
56
|
+
production an undecorated page mounts open.
|
|
57
|
+
|
|
46
58
|
Source: `packages/ui/src/server/telescope-ui.module.ts`,
|
|
47
59
|
`packages/ui/src/server/telescope-ui.options.ts` (`TelescopeUiModuleOptions`).
|
|
48
60
|
|
|
@@ -54,7 +66,7 @@ Set the same `path` on BOTH modules. In `forRootAsync` the `path` is a static
|
|
|
54
66
|
sibling of `useFactory`, not returned from it.
|
|
55
67
|
|
|
56
68
|
```ts
|
|
57
|
-
TelescopeModule.forRoot({ path: 'observability', enabled: true
|
|
69
|
+
TelescopeModule.forRoot({ path: 'observability', enabled: true });
|
|
58
70
|
TelescopeUiModule.forRoot({ path: 'observability' }); // dashboard now at /observability
|
|
59
71
|
```
|
|
60
72
|
|
|
@@ -66,6 +78,9 @@ TelescopeUiModule.forRootAsync({
|
|
|
66
78
|
});
|
|
67
79
|
```
|
|
68
80
|
|
|
81
|
+
In production both modules still need `decorators` (or `routes: false`); the
|
|
82
|
+
Setup section shows the protection.
|
|
83
|
+
|
|
69
84
|
Source: `packages/ui/src/server/telescope-ui.module.ts`,
|
|
70
85
|
`packages/ui/src/server/telescope-ui.options.ts`.
|
|
71
86
|
|
|
@@ -125,13 +140,13 @@ Source: `packages/ui/src/react/telescope-context.tsx` (`TelescopeProvider`,
|
|
|
125
140
|
```ts
|
|
126
141
|
// Wrong — the SPA loads but its API calls 404: core API is at /observability/api,
|
|
127
142
|
// the dashboard probes /telescope/api.
|
|
128
|
-
TelescopeModule.forRoot({ path: 'observability', enabled: true
|
|
143
|
+
TelescopeModule.forRoot({ path: 'observability', enabled: true });
|
|
129
144
|
TelescopeUiModule.forRoot(); // defaults to 'telescope'
|
|
130
145
|
```
|
|
131
146
|
|
|
132
147
|
```ts
|
|
133
148
|
// Correct — both modules share the same path.
|
|
134
|
-
TelescopeModule.forRoot({ path: 'observability', enabled: true
|
|
149
|
+
TelescopeModule.forRoot({ path: 'observability', enabled: true });
|
|
135
150
|
TelescopeUiModule.forRoot({ path: 'observability' });
|
|
136
151
|
```
|
|
137
152
|
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Headless client for opening the console from YOUR app.
|
|
3
|
-
*
|
|
4
|
-
* The console SPA is served at a literal path and knows nothing about your app's auth, so a plain
|
|
5
|
-
* browser navigation to it carries no identity. Mode A closes that gap: an XHR from inside your app
|
|
6
|
-
* — which DOES carry your auth — posts to the console's session endpoint, the `session` hook
|
|
7
|
-
* decides, and the library answers with its own signed cookie. The navigation that follows rides it.
|
|
8
|
-
*
|
|
9
|
-
* Telescope's mount is configured as `path` (no leading slash, e.g. `'telescope'`); this accepts either
|
|
10
|
-
* form and normalizes it.
|
|
11
|
-
*
|
|
12
|
-
* No UI here on purpose: you own the button, the page and the copy. This module owns the two things
|
|
13
|
-
* a host would otherwise have to rediscover — where the session endpoint actually lives, and how to
|
|
14
|
-
* call it without the failure mode below.
|
|
15
|
-
*/
|
|
16
|
-
/**
|
|
17
|
-
* Where `POST` mints the console session cookie.
|
|
18
|
-
*
|
|
19
|
-
* Derived from `basePath` rather than hardcoded by the caller: this package owns the route (the auth
|
|
20
|
-
* controller lives under the configured mount), so a host that hardcodes it
|
|
21
|
-
* is guessing at something that can change under a version bump — with no compile error when it
|
|
22
|
-
* does, because the break only shows up as a 404 at runtime.
|
|
23
|
-
*/
|
|
24
|
-
export declare function telescopeConsoleSessionUrl(basePath?: string): string;
|
|
25
|
-
/** Where the console SPA itself is served. */
|
|
26
|
-
export declare function telescopeConsoleUrl(basePath?: string): string;
|
|
27
|
-
export interface OpenConsoleOptions {
|
|
28
|
-
/** Where the console is mounted. MUST match `TelescopeUiModule.forRoot({ path }) / TelescopeModule.forRoot({ path })`. */
|
|
29
|
-
basePath?: string;
|
|
30
|
-
/**
|
|
31
|
-
* Headers for the mint request — in practice your app's `Authorization` header. A function (sync
|
|
32
|
-
* or async) is accepted so a token can be read at call time rather than captured at wiring time,
|
|
33
|
-
* which is what a refreshing token needs.
|
|
34
|
-
*/
|
|
35
|
-
headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);
|
|
36
|
-
/** Injected for tests and non-browser callers. Defaults to the global `fetch`. */
|
|
37
|
-
fetch?: typeof globalThis.fetch;
|
|
38
|
-
signal?: AbortSignal;
|
|
39
|
-
/**
|
|
40
|
-
* Performs the navigation after a successful mint. Defaults to `location.assign`. Override to
|
|
41
|
-
* route through your own router, or to open in a new tab.
|
|
42
|
-
*/
|
|
43
|
-
navigate?: (url: string) => void;
|
|
44
|
-
}
|
|
45
|
-
/** Thrown when the session could not be minted. Never thrown after a successful mint. */
|
|
46
|
-
export declare class ConsoleSessionError extends Error {
|
|
47
|
-
readonly url: string;
|
|
48
|
-
/** The HTTP status, or `undefined` when the request never produced one (network error). */
|
|
49
|
-
readonly status?: number | undefined;
|
|
50
|
-
constructor(message: string, url: string,
|
|
51
|
-
/** The HTTP status, or `undefined` when the request never produced one (network error). */
|
|
52
|
-
status?: number | undefined);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Mint the console session cookie. Resolves on success; throws {@link ConsoleSessionError} on
|
|
56
|
-
* refusal. Use this directly when you want to mint without navigating (a pre-flight check, or a
|
|
57
|
-
* link the user opens later).
|
|
58
|
-
*/
|
|
59
|
-
export declare function mintTelescopeConsoleSession(options?: OpenConsoleOptions): Promise<void>;
|
|
60
|
-
/**
|
|
61
|
-
* Mint the session, then navigate to the console. Throws without navigating when the mint is
|
|
62
|
-
* refused, so a denied user gets a real error instead of landing on the console's
|
|
63
|
-
* "no session" page — which reads as a bug rather than a permission decision.
|
|
64
|
-
*/
|
|
65
|
-
export declare function openTelescopeConsole(options?: OpenConsoleOptions): Promise<void>;
|
|
66
|
-
//# sourceMappingURL=console-session.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"console-session.d.ts","sourceRoot":"","sources":["../../src/client/console-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,GAAE,MAA0B,GAAG,MAAM,CAEvF;AAED,8CAA8C;AAC9C,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,MAA0B,GAAG,MAAM,CAEhF;AAED,MAAM,WAAW,kBAAkB;IACjC,0HAA0H;IAC1H,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACnE,kFAAkF;IAClF,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,yFAAyF;AACzF,qBAAa,mBAAoB,SAAQ,KAAK;IAG1C,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;gBAHxB,OAAO,EAAE,MAAM,EACN,GAAG,EAAE,MAAM;IACpB,2FAA2F;IAClF,MAAM,CAAC,EAAE,MAAM,YAAA;CAK3B;AAOD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDjG;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1F"}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Headless client for opening the console from YOUR app.
|
|
3
|
-
*
|
|
4
|
-
* The console SPA is served at a literal path and knows nothing about your app's auth, so a plain
|
|
5
|
-
* browser navigation to it carries no identity. Mode A closes that gap: an XHR from inside your app
|
|
6
|
-
* — which DOES carry your auth — posts to the console's session endpoint, the `session` hook
|
|
7
|
-
* decides, and the library answers with its own signed cookie. The navigation that follows rides it.
|
|
8
|
-
*
|
|
9
|
-
* Telescope's mount is configured as `path` (no leading slash, e.g. `'telescope'`); this accepts either
|
|
10
|
-
* form and normalizes it.
|
|
11
|
-
*
|
|
12
|
-
* No UI here on purpose: you own the button, the page and the copy. This module owns the two things
|
|
13
|
-
* a host would otherwise have to rediscover — where the session endpoint actually lives, and how to
|
|
14
|
-
* call it without the failure mode below.
|
|
15
|
-
*/
|
|
16
|
-
/** The mount default; matches `TelescopeUiModule.forRoot()`'s own default. */
|
|
17
|
-
const DEFAULT_BASE_PATH = '/telescope';
|
|
18
|
-
function normalizeBasePath(basePath) {
|
|
19
|
-
const trimmed = basePath.trim().replace(/\/+$/, '');
|
|
20
|
-
if (trimmed === '')
|
|
21
|
-
return '';
|
|
22
|
-
return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Where `POST` mints the console session cookie.
|
|
26
|
-
*
|
|
27
|
-
* Derived from `basePath` rather than hardcoded by the caller: this package owns the route (the auth
|
|
28
|
-
* controller lives under the configured mount), so a host that hardcodes it
|
|
29
|
-
* is guessing at something that can change under a version bump — with no compile error when it
|
|
30
|
-
* does, because the break only shows up as a 404 at runtime.
|
|
31
|
-
*/
|
|
32
|
-
export function telescopeConsoleSessionUrl(basePath = DEFAULT_BASE_PATH) {
|
|
33
|
-
return `${normalizeBasePath(basePath)}/api/auth/session`;
|
|
34
|
-
}
|
|
35
|
-
/** Where the console SPA itself is served. */
|
|
36
|
-
export function telescopeConsoleUrl(basePath = DEFAULT_BASE_PATH) {
|
|
37
|
-
return normalizeBasePath(basePath) || '/';
|
|
38
|
-
}
|
|
39
|
-
/** Thrown when the session could not be minted. Never thrown after a successful mint. */
|
|
40
|
-
export class ConsoleSessionError extends Error {
|
|
41
|
-
url;
|
|
42
|
-
status;
|
|
43
|
-
constructor(message, url,
|
|
44
|
-
/** The HTTP status, or `undefined` when the request never produced one (network error). */
|
|
45
|
-
status) {
|
|
46
|
-
super(message);
|
|
47
|
-
this.url = url;
|
|
48
|
-
this.status = status;
|
|
49
|
-
this.name = 'ConsoleSessionError';
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
async function resolveHeaders(headers) {
|
|
53
|
-
if (headers === undefined)
|
|
54
|
-
return {};
|
|
55
|
-
return typeof headers === 'function' ? await headers() : headers;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Mint the console session cookie. Resolves on success; throws {@link ConsoleSessionError} on
|
|
59
|
-
* refusal. Use this directly when you want to mint without navigating (a pre-flight check, or a
|
|
60
|
-
* link the user opens later).
|
|
61
|
-
*/
|
|
62
|
-
export async function mintTelescopeConsoleSession(options = {}) {
|
|
63
|
-
const url = telescopeConsoleSessionUrl(options.basePath);
|
|
64
|
-
const doFetch = options.fetch ?? globalThis.fetch;
|
|
65
|
-
if (typeof doFetch !== 'function') {
|
|
66
|
-
throw new ConsoleSessionError('No `fetch` available; pass one via `options.fetch`.', url);
|
|
67
|
-
}
|
|
68
|
-
let response;
|
|
69
|
-
try {
|
|
70
|
-
response = await doFetch(url, {
|
|
71
|
-
method: 'POST',
|
|
72
|
-
// The whole point: the response's Set-Cookie must stick, and the cookie must ride the
|
|
73
|
-
// navigation that follows.
|
|
74
|
-
credentials: 'include',
|
|
75
|
-
headers: await resolveHeaders(options.headers),
|
|
76
|
-
// Load-bearing, and the reason this helper exists rather than three lines at the call site.
|
|
77
|
-
// `fetch` FOLLOWS redirects by default, so an app whose auth layer rewrites a 401 into a
|
|
78
|
-
// "go to /signin" redirect makes this request resolve 200 against the sign-in HTML —
|
|
79
|
-
// `response.ok` reads true, the caller navigates, and the user lands in a console with no
|
|
80
|
-
// session, which looks exactly like a permissions bug. Handling the redirect explicitly turns
|
|
81
|
-
// that into a clear error instead of a silent false success.
|
|
82
|
-
redirect: 'manual',
|
|
83
|
-
...(options.signal ? { signal: options.signal } : {}),
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
catch (cause) {
|
|
87
|
-
throw new ConsoleSessionError(`Could not reach the console session endpoint at ${url}: ${String(cause)}`, url);
|
|
88
|
-
}
|
|
89
|
-
// `redirect: 'manual'` surfaces differently per runtime: browsers give an opaque response
|
|
90
|
-
// (`type: 'opaqueredirect'`, status 0), Node/undici gives the real 3xx. Both mean the same thing.
|
|
91
|
-
const redirected = response.type === 'opaqueredirect' || (response.status >= 300 && response.status < 400);
|
|
92
|
-
if (redirected) {
|
|
93
|
-
throw new ConsoleSessionError(`The console session endpoint at ${url} answered with a redirect instead of minting a session. Something in front of it — usually an auth middleware or exception filter that rewrites 401s into a sign-in redirect — is intercepting the response. Exempt this path from that rewrite so the real status reaches this caller.`, url, response.status || undefined);
|
|
94
|
-
}
|
|
95
|
-
if (!response.ok) {
|
|
96
|
-
throw new ConsoleSessionError(`The console refused to open (HTTP ${response.status}).`, url, response.status);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Mint the session, then navigate to the console. Throws without navigating when the mint is
|
|
101
|
-
* refused, so a denied user gets a real error instead of landing on the console's
|
|
102
|
-
* "no session" page — which reads as a bug rather than a permission decision.
|
|
103
|
-
*/
|
|
104
|
-
export async function openTelescopeConsole(options = {}) {
|
|
105
|
-
await mintTelescopeConsoleSession(options);
|
|
106
|
-
const target = telescopeConsoleUrl(options.basePath);
|
|
107
|
-
const navigate = options.navigate ?? ((url) => globalThis.location?.assign(url));
|
|
108
|
-
navigate(target);
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=console-session.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"console-session.js","sourceRoot":"","sources":["../../src/client/console-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,8EAA8E;AAC9E,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAEvC,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CAAC,WAAmB,iBAAiB;IAC7E,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC;AAC3D,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,mBAAmB,CAAC,WAAmB,iBAAiB;IACtE,OAAO,iBAAiB,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;AAC5C,CAAC;AAqBD,yFAAyF;AACzF,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAGjC;IAEA;IAJX,YACE,OAAe,EACN,GAAW;IACpB,2FAA2F;IAClF,MAAe;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,QAAG,GAAH,GAAG,CAAQ;QAEX,WAAM,GAAN,MAAM,CAAS;QAGxB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,KAAK,UAAU,cAAc,CAAC,OAAsC;IAClE,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,UAA8B,EAAE;IAChF,MAAM,GAAG,GAAG,0BAA0B,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAClD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,IAAI,mBAAmB,CAAC,qDAAqD,EAAE,GAAG,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,MAAM;YACd,sFAAsF;YACtF,2BAA2B;YAC3B,WAAW,EAAE,SAAS;YACtB,OAAO,EAAE,MAAM,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;YAC9C,4FAA4F;YAC5F,yFAAyF;YACzF,qFAAqF;YACrF,0FAA0F;YAC1F,8FAA8F;YAC9F,6DAA6D;YAC7D,QAAQ,EAAE,QAAQ;YAClB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,mBAAmB,CAC3B,mDAAmD,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,EAC1E,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,0FAA0F;IAC1F,kGAAkG;IAClG,MAAM,UAAU,GACd,QAAQ,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC1F,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,mBAAmB,CAC3B,mCAAmC,GAAG,yRAAyR,EAC/T,GAAG,EACH,QAAQ,CAAC,MAAM,IAAI,SAAS,CAC7B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,mBAAmB,CAC3B,qCAAqC,QAAQ,CAAC,MAAM,IAAI,EACxD,GAAG,EACH,QAAQ,CAAC,MAAM,CAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAA8B,EAAE;IACzE,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzF,QAAQ,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC"}
|
package/dist/react/console.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export * from './use-open-console.js';
|
|
2
|
-
export * from './open-console-button.js';
|
|
3
|
-
export { ConsoleSessionError, telescopeConsoleSessionUrl, telescopeConsoleUrl, mintTelescopeConsoleSession, openTelescopeConsole, type OpenConsoleOptions, } from '../client/console-session.js';
|
|
4
|
-
//# sourceMappingURL=console.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../src/react/console.ts"],"names":[],"mappings":"AAUA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,EACpB,KAAK,kBAAkB,GACxB,MAAM,8BAA8B,CAAC"}
|
package/dist/react/console.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// The console launcher on its own subpath (`@dudousxd/nestjs-telescope-ui/react/console`).
|
|
2
|
-
//
|
|
3
|
-
// It is also exported from `./react`, but that barrel re-exports the whole dashboard component set,
|
|
4
|
-
// which pulls in `recharts` and `react-router-dom`. Those are not declared by this package, so a
|
|
5
|
-
// host that wants ONLY the launcher — the common case, a button on an admin page — cannot import
|
|
6
|
-
// from the barrel: a bundler resolves re-exported modules even when nothing uses them, and the
|
|
7
|
-
// build fails on the missing dependency rather than tree-shaking it away.
|
|
8
|
-
//
|
|
9
|
-
// This entry re-exports only the launcher and the headless primitives it wraps, so its entire
|
|
10
|
-
// dependency footprint is `react`.
|
|
11
|
-
export * from './use-open-console.js';
|
|
12
|
-
export * from './open-console-button.js';
|
|
13
|
-
export { ConsoleSessionError, telescopeConsoleSessionUrl, telescopeConsoleUrl, mintTelescopeConsoleSession, openTelescopeConsole, } from '../client/console-session.js';
|
|
14
|
-
//# sourceMappingURL=console.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/react/console.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,EAAE;AACF,oGAAoG;AACpG,iGAAiG;AACjG,iGAAiG;AACjG,+FAA+F;AAC/F,0EAA0E;AAC1E,EAAE;AACF,8FAA8F;AAC9F,mCAAmC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,GAErB,MAAM,8BAA8B,CAAC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { ButtonHTMLAttributes, ReactNode } from 'react';
|
|
2
|
-
import type { OpenConsoleOptions } from '../client/console-session.js';
|
|
3
|
-
export interface OpenTelescopeConsoleButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick' | 'children'>, OpenConsoleOptions {
|
|
4
|
-
/** Button label. Defaults to "Open Telescope". */
|
|
5
|
-
children?: ReactNode;
|
|
6
|
-
/** Shown while the session is being minted. Defaults to "Opening…". */
|
|
7
|
-
pendingLabel?: ReactNode;
|
|
8
|
-
/**
|
|
9
|
-
* Render the refusal yourself. Omit and the button renders a plain `<p role="alert">` under
|
|
10
|
-
* itself; pass `null` to render nothing and read the error from {@link useOpenTelescopeConsole}.
|
|
11
|
-
*/
|
|
12
|
-
renderError?: ((error: Error) => ReactNode) | null;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Drop-in launcher: the top tier, for a host that just wants a working button.
|
|
16
|
-
*
|
|
17
|
-
* Deliberately unstyled — it emits a bare `<button>` and forwards `className`/`style`/every other
|
|
18
|
-
* button prop, so it inherits whatever design system the host already has instead of importing CSS
|
|
19
|
-
* that would fight it. That matters more here than for the dashboard's own components: this one
|
|
20
|
-
* renders inside the HOST's app, not inside Telescope's Tailwind bundle. When it doesn't fit, drop
|
|
21
|
-
* to {@link useOpenTelescopeConsole} (same behaviour, your markup) or to `openTelescopeConsole` (no
|
|
22
|
-
* React at all).
|
|
23
|
-
*
|
|
24
|
-
* The error is rendered by default rather than swallowed: a refused mint is the case a launcher most
|
|
25
|
-
* needs to surface, and a button that silently does nothing reads as broken rather than forbidden.
|
|
26
|
-
*/
|
|
27
|
-
export declare function OpenTelescopeConsoleButton({ children, pendingLabel, renderError, basePath, headers, fetch: fetchImpl, signal, navigate, disabled, ...buttonProps }: OpenTelescopeConsoleButtonProps): JSX.Element;
|
|
28
|
-
//# sourceMappingURL=open-console-button.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"open-console-button.d.ts","sourceRoot":"","sources":["../../src/react/open-console-button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGvE,MAAM,WAAW,+BACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC,EAC3E,kBAAkB;IACpB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,uEAAuE;IACvE,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,GAAG,IAAI,CAAC;CACpD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,EACzC,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,OAAO,EACP,KAAK,EAAE,SAAS,EAChB,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,GAAG,WAAW,EACf,EAAE,+BAA+B,GAAG,GAAG,CAAC,OAAO,CAyB/C"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useOpenTelescopeConsole } from './use-open-console.js';
|
|
3
|
-
/**
|
|
4
|
-
* Drop-in launcher: the top tier, for a host that just wants a working button.
|
|
5
|
-
*
|
|
6
|
-
* Deliberately unstyled — it emits a bare `<button>` and forwards `className`/`style`/every other
|
|
7
|
-
* button prop, so it inherits whatever design system the host already has instead of importing CSS
|
|
8
|
-
* that would fight it. That matters more here than for the dashboard's own components: this one
|
|
9
|
-
* renders inside the HOST's app, not inside Telescope's Tailwind bundle. When it doesn't fit, drop
|
|
10
|
-
* to {@link useOpenTelescopeConsole} (same behaviour, your markup) or to `openTelescopeConsole` (no
|
|
11
|
-
* React at all).
|
|
12
|
-
*
|
|
13
|
-
* The error is rendered by default rather than swallowed: a refused mint is the case a launcher most
|
|
14
|
-
* needs to surface, and a button that silently does nothing reads as broken rather than forbidden.
|
|
15
|
-
*/
|
|
16
|
-
export function OpenTelescopeConsoleButton({ children, pendingLabel, renderError, basePath, headers, fetch: fetchImpl, signal, navigate, disabled, ...buttonProps }) {
|
|
17
|
-
const { open, isPending, error } = useOpenTelescopeConsole({
|
|
18
|
-
...(basePath !== undefined ? { basePath } : {}),
|
|
19
|
-
...(headers !== undefined ? { headers } : {}),
|
|
20
|
-
...(fetchImpl !== undefined ? { fetch: fetchImpl } : {}),
|
|
21
|
-
...(signal !== undefined ? { signal } : {}),
|
|
22
|
-
...(navigate !== undefined ? { navigate } : {}),
|
|
23
|
-
});
|
|
24
|
-
return (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", ...buttonProps, onClick: open, disabled: disabled || isPending, "aria-busy": isPending || undefined, children: isPending ? (pendingLabel ?? 'Opening…') : (children ?? 'Open Telescope') }), error &&
|
|
25
|
-
renderError !== null &&
|
|
26
|
-
(renderError?.(error) ?? _jsx("p", { role: "alert", children: error.message }))] }));
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=open-console-button.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"open-console-button.js","sourceRoot":"","sources":["../../src/react/open-console-button.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAgBhE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,0BAA0B,CAAC,EACzC,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,OAAO,EACP,KAAK,EAAE,SAAS,EAChB,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,GAAG,WAAW,EACkB;IAChC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,uBAAuB,CAAC;QACzD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC,CAAC;IAEH,OAAO,CACL,8BACE,iBACE,IAAI,EAAC,QAAQ,KACT,WAAW,EACf,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,QAAQ,IAAI,SAAS,eACpB,SAAS,IAAI,SAAS,YAEhC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,gBAAgB,CAAC,GACnE,EACR,KAAK;gBACJ,WAAW,KAAK,IAAI;gBACpB,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,YAAG,IAAI,EAAC,OAAO,YAAE,KAAK,CAAC,OAAO,GAAK,CAAC,IAC9D,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { ConsoleSessionError, type OpenConsoleOptions } from '../client/console-session.js';
|
|
2
|
-
/**
|
|
3
|
-
* React layer over `openTelescopeConsole` — the middle tier between the bare function
|
|
4
|
-
* (`../client/console-session.ts`) and the drop-in `<OpenTelescopeConsoleButton>`.
|
|
5
|
-
*
|
|
6
|
-
* You get the state a launcher UI actually needs (in-flight, error) and keep full control of the
|
|
7
|
-
* markup. Nothing here is Telescope-specific beyond the endpoint: it is a mint-then-navigate call
|
|
8
|
-
* with the two states that call can be in.
|
|
9
|
-
*/
|
|
10
|
-
export interface UseOpenConsoleResult {
|
|
11
|
-
/** Start the mint-then-navigate. Never rejects — read `error` instead. */
|
|
12
|
-
open: () => void;
|
|
13
|
-
/** True from the click until the navigation starts, or until it fails. */
|
|
14
|
-
isPending: boolean;
|
|
15
|
-
/** The last refusal, or `null`. Cleared when `open()` is called again. */
|
|
16
|
-
error: ConsoleSessionError | null;
|
|
17
|
-
/** Drop a stale error without retrying — e.g. when a dialog closes. */
|
|
18
|
-
reset: () => void;
|
|
19
|
-
}
|
|
20
|
-
export declare function useOpenTelescopeConsole(options?: OpenConsoleOptions): UseOpenConsoleResult;
|
|
21
|
-
/**
|
|
22
|
-
* TanStack Query integration WITHOUT a TanStack dependency: the returned object is the shape
|
|
23
|
-
* `useMutation` takes, so a host that already uses Query wires the launcher into its own cache,
|
|
24
|
-
* devtools and error handling with no extra adapter — and a host that doesn't never pays for it.
|
|
25
|
-
*
|
|
26
|
-
* ```ts
|
|
27
|
-
* const { mutate, isPending } = useMutation(openTelescopeConsoleMutationOptions({ headers }));
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export declare function openTelescopeConsoleMutationOptions(options?: OpenConsoleOptions): {
|
|
31
|
-
mutationKey: readonly unknown[];
|
|
32
|
-
mutationFn: () => Promise<void>;
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=use-open-console.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-open-console.d.ts","sourceRoot":"","sources":["../../src/react/use-open-console.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,KAAK,kBAAkB,EAGxB,MAAM,8BAA8B,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,0EAA0E;IAC1E,SAAS,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClC,uEAAuE;IACvE,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,kBAAuB,GAAG,oBAAoB,CA0D9F;AAED;;;;;;;;GAQG;AACH,wBAAgB,mCAAmC,CAAC,OAAO,GAAE,kBAAuB,GAAG;IACrF,WAAW,EAAE,SAAS,OAAO,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC,CAKA"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
-
import { ConsoleSessionError, openTelescopeConsole, telescopeConsoleSessionUrl, } from '../client/console-session.js';
|
|
3
|
-
export function useOpenTelescopeConsole(options = {}) {
|
|
4
|
-
const [isPending, setIsPending] = useState(false);
|
|
5
|
-
const [error, setError] = useState(null);
|
|
6
|
-
// Kept in a ref so a caller passing an inline object literal (the common case) doesn't change the
|
|
7
|
-
// identity of `open` on every render, which would defeat memoizing anything downstream.
|
|
8
|
-
const optionsRef = useRef(options);
|
|
9
|
-
optionsRef.current = options;
|
|
10
|
-
const open = useCallback(() => {
|
|
11
|
-
setIsPending(true);
|
|
12
|
-
setError(null);
|
|
13
|
-
void openTelescopeConsole(optionsRef.current)
|
|
14
|
-
.then(() => {
|
|
15
|
-
// Deliberately NOT clearing `isPending` on success: the navigation is already underway and
|
|
16
|
-
// this component is about to be torn down. Flipping the button back to idle first produces
|
|
17
|
-
// a visible flicker of "ready to click again" on a page that is leaving.
|
|
18
|
-
//
|
|
19
|
-
// "About to be torn down" is not guaranteed, though — see the `pageshow` effect below for
|
|
20
|
-
// the case where the page comes back instead of dying.
|
|
21
|
-
})
|
|
22
|
-
.catch((cause) => {
|
|
23
|
-
setError(cause instanceof ConsoleSessionError
|
|
24
|
-
? cause
|
|
25
|
-
: // A non-`ConsoleSessionError` can only come from the caller's own `navigate`, so name
|
|
26
|
-
// the endpoint this hook was pointed at rather than leaving `url` empty.
|
|
27
|
-
new ConsoleSessionError(String(cause), telescopeConsoleSessionUrl(optionsRef.current.basePath)));
|
|
28
|
-
setIsPending(false);
|
|
29
|
-
});
|
|
30
|
-
}, []);
|
|
31
|
-
// The success path above leaves `isPending` true on the assumption that the page is leaving for
|
|
32
|
-
// good. The back/forward cache breaks that assumption: instead of destroying the document, the
|
|
33
|
-
// browser freezes it and restores it — React state and all — when the user presses Back. Without
|
|
34
|
-
// this the user returns from the console to a spinner that never stops, on a button that is
|
|
35
|
-
// permanently disabled because nothing else ever clears the flag.
|
|
36
|
-
//
|
|
37
|
-
// `persisted === true` is the ONLY signal that distinguishes a restore from a fresh load, and the
|
|
38
|
-
// condition is load-bearing in both directions: a normal `pageshow` (`persisted: false`) fires on
|
|
39
|
-
// every page load and must not touch anything, and a mint that is genuinely still in flight must
|
|
40
|
-
// keep its spinner. Dropping the check to "simplify" reintroduces the flicker this hook avoids.
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
if (typeof window === 'undefined')
|
|
43
|
-
return;
|
|
44
|
-
const onPageShow = (event) => {
|
|
45
|
-
if (event.persisted)
|
|
46
|
-
setIsPending(false);
|
|
47
|
-
};
|
|
48
|
-
window.addEventListener('pageshow', onPageShow);
|
|
49
|
-
return () => window.removeEventListener('pageshow', onPageShow);
|
|
50
|
-
}, []);
|
|
51
|
-
const reset = useCallback(() => setError(null), []);
|
|
52
|
-
return { open, isPending, error, reset };
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* TanStack Query integration WITHOUT a TanStack dependency: the returned object is the shape
|
|
56
|
-
* `useMutation` takes, so a host that already uses Query wires the launcher into its own cache,
|
|
57
|
-
* devtools and error handling with no extra adapter — and a host that doesn't never pays for it.
|
|
58
|
-
*
|
|
59
|
-
* ```ts
|
|
60
|
-
* const { mutate, isPending } = useMutation(openTelescopeConsoleMutationOptions({ headers }));
|
|
61
|
-
* ```
|
|
62
|
-
*/
|
|
63
|
-
export function openTelescopeConsoleMutationOptions(options = {}) {
|
|
64
|
-
return {
|
|
65
|
-
mutationKey: ['telescope', 'console', 'open', options.basePath ?? null],
|
|
66
|
-
mutationFn: () => openTelescopeConsole(options),
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=use-open-console.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-open-console.js","sourceRoot":"","sources":["../../src/react/use-open-console.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EACL,mBAAmB,EAEnB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAqBtC,MAAM,UAAU,uBAAuB,CAAC,UAA8B,EAAE;IACtE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA6B,IAAI,CAAC,CAAC;IAErE,kGAAkG;IAClG,wFAAwF;IACxF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAE7B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC;aAC1C,IAAI,CAAC,GAAG,EAAE;YACT,2FAA2F;YAC3F,2FAA2F;YAC3F,yEAAyE;YACzE,EAAE;YACF,0FAA0F;YAC1F,uDAAuD;QACzD,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,QAAQ,CACN,KAAK,YAAY,mBAAmB;gBAClC,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,sFAAsF;oBACtF,yEAAyE;oBACzE,IAAI,mBAAmB,CACrB,MAAM,CAAC,KAAK,CAAC,EACb,0BAA0B,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CACxD,CACN,CAAC;YACF,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,gGAAgG;IAChG,+FAA+F;IAC/F,iGAAiG;IACjG,4FAA4F;IAC5F,kEAAkE;IAClE,EAAE;IACF,kGAAkG;IAClG,kGAAkG;IAClG,iGAAiG;IACjG,gGAAgG;IAChG,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,MAAM,UAAU,GAAG,CAAC,KAA0B,EAAQ,EAAE;YACtD,IAAI,KAAK,CAAC,SAAS;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAChD,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAClE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mCAAmC,CAAC,UAA8B,EAAE;IAIlF,OAAO;QACL,WAAW,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAU;QAChF,UAAU,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC;KAChD,CAAC;AACJ,CAAC"}
|