adonisjs-server-stats 1.10.0 → 1.11.0

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.
Files changed (248) hide show
  1. package/README.md +23 -14
  2. package/dist/core/config-utils.d.ts +8 -0
  3. package/dist/core/constants.d.ts +4 -0
  4. package/dist/core/dashboard-data-controller.d.ts +16 -0
  5. package/dist/core/dashboard-data-helpers.d.ts +12 -0
  6. package/dist/core/debug-data-controller.d.ts +4 -0
  7. package/dist/core/define-config-helpers.d.ts +25 -0
  8. package/dist/core/feature-detect-helpers.d.ts +36 -0
  9. package/dist/core/field-resolvers.d.ts +64 -0
  10. package/dist/core/formatters-helpers.d.ts +23 -0
  11. package/dist/core/formatters.d.ts +15 -0
  12. package/dist/core/index.d.ts +1 -1
  13. package/dist/core/index.js +599 -509
  14. package/dist/core/log-utils-helpers.d.ts +13 -0
  15. package/dist/core/metrics.d.ts +3 -28
  16. package/dist/core/pagination.d.ts +0 -9
  17. package/dist/core/server-stats-controller.d.ts +6 -0
  18. package/dist/core/transmit-helpers.d.ts +7 -0
  19. package/dist/core/types-dashboard.d.ts +178 -0
  20. package/dist/core/types-diagnostics.d.ts +85 -0
  21. package/dist/core/types.d.ts +10 -442
  22. package/dist/react/CacheSection-BYN53kYO.js +135 -0
  23. package/dist/react/CacheStatsBar-CRodCOeP.js +27 -0
  24. package/dist/react/CacheTab-DOhuK05d.js +106 -0
  25. package/dist/react/{ConfigSection-DfFd-WRq.js → ConfigSection-B9EHh4Rp.js} +1 -1
  26. package/dist/react/{ConfigTab-Bdg8YMer.js → ConfigTab-C8kriE2b.js} +1 -1
  27. package/dist/react/CustomPaneTab-CvzQS_Wh.js +99 -0
  28. package/dist/react/EmailPreviewOverlay-BmXOAvqG.js +58 -0
  29. package/dist/react/EmailsSection-BJyFJf7A.js +226 -0
  30. package/dist/react/EmailsTab-Ch8jp10B.js +110 -0
  31. package/dist/react/{EventsSection-ByQ-9blq.js → EventsSection-DJPwHeT8.js} +28 -27
  32. package/dist/react/EventsTab-B-FoehXC.js +58 -0
  33. package/dist/react/{FilterBar-DQRXpWrb.js → FilterBar-CQ7bD669.js} +15 -15
  34. package/dist/react/{InternalsContent-DBzsI0CG.js → InternalsContent-O8ino9oM.js} +133 -109
  35. package/dist/react/InternalsSection-B6VlVx5f.js +22 -0
  36. package/dist/react/InternalsTab-CkEKpRMU.js +17 -0
  37. package/dist/react/JobStatsBar-C7RslAFE.js +30 -0
  38. package/dist/react/JobsSection-DWF4i1t_.js +167 -0
  39. package/dist/react/JobsTab-DqnifQXV.js +129 -0
  40. package/dist/react/LogEntryRow-CMMkqA9M.js +43 -0
  41. package/dist/react/LogsSection-C1xC5aP4.js +198 -0
  42. package/dist/react/LogsTab-CS4sLfLw.js +79 -0
  43. package/dist/react/{OverviewSection-C4T1ur51.js → OverviewSection-CxvfOR0v.js} +70 -80
  44. package/dist/react/QueriesSection-CrMdU5Ax.js +458 -0
  45. package/dist/react/{QueriesTab-osLUWd4L.js → QueriesTab-x85PjkyS.js} +38 -40
  46. package/dist/react/RequestsSection-DETN9oZb.js +321 -0
  47. package/dist/react/{RoutesSection-BUSkM6PY.js → RoutesSection-CmorkJeC.js} +2 -2
  48. package/dist/react/RoutesTab-CbzBOzpc.js +68 -0
  49. package/dist/react/SplitPaneWrapper-BiIgT4ND.js +49 -0
  50. package/dist/react/TimeAgoCell-o3KigGfM.js +8 -0
  51. package/dist/react/{TimelineTab-Covg5weo.js → TimelineTab-Ue9tUD_n.js} +76 -102
  52. package/dist/react/index-DwDK-4oX.js +1121 -0
  53. package/dist/react/index.js +6 -6
  54. package/dist/react/react/components/shared/CacheStatsBar.d.ts +13 -0
  55. package/dist/react/react/components/shared/EmailPreviewOverlay.d.ts +29 -0
  56. package/dist/react/react/components/{Dashboard/shared → shared}/FilterBar.d.ts +4 -3
  57. package/dist/react/react/components/shared/JobStatsBar.d.ts +12 -0
  58. package/dist/react/react/components/shared/LogEntryRow.d.ts +9 -0
  59. package/dist/react/react/components/shared/RelatedLogs.d.ts +2 -2
  60. package/dist/react/react/components/shared/SplitPaneWrapper.d.ts +7 -0
  61. package/dist/react/react/components/shared/TimeAgoCell.d.ts +17 -0
  62. package/dist/react/react/hooks/useDashboardData.d.ts +4 -8
  63. package/dist/react/react/hooks/useDiagnosticsData.d.ts +14 -0
  64. package/dist/react/style.css +1 -1
  65. package/dist/src/collectors/app_collector.d.ts +0 -8
  66. package/dist/src/collectors/app_collector.js +45 -52
  67. package/dist/src/collectors/auto_detect.d.ts +0 -23
  68. package/dist/src/collectors/auto_detect.js +33 -55
  69. package/dist/src/collectors/db_pool_collector.d.ts +14 -16
  70. package/dist/src/collectors/db_pool_collector.js +72 -57
  71. package/dist/src/collectors/log_collector.d.ts +0 -47
  72. package/dist/src/collectors/log_collector.js +36 -65
  73. package/dist/src/collectors/queue_collector.d.ts +0 -20
  74. package/dist/src/collectors/queue_collector.js +60 -76
  75. package/dist/src/collectors/redis_collector.d.ts +10 -10
  76. package/dist/src/collectors/redis_collector.js +69 -66
  77. package/dist/src/config/deprecation_migration.d.ts +7 -0
  78. package/dist/src/config/deprecation_migration.js +201 -0
  79. package/dist/src/controller/debug_controller.d.ts +1 -1
  80. package/dist/src/controller/debug_controller.js +87 -81
  81. package/dist/src/dashboard/cache_handlers.d.ts +14 -0
  82. package/dist/src/dashboard/cache_handlers.js +52 -0
  83. package/dist/src/dashboard/chart_aggregator.d.ts +0 -7
  84. package/dist/src/dashboard/chart_aggregator.js +68 -50
  85. package/dist/src/dashboard/coalesce_cache.d.ts +25 -0
  86. package/dist/src/dashboard/coalesce_cache.js +47 -0
  87. package/dist/src/dashboard/dashboard_controller.d.ts +11 -37
  88. package/dist/src/dashboard/dashboard_controller.js +51 -544
  89. package/dist/src/dashboard/dashboard_page_assets.d.ts +17 -0
  90. package/dist/src/dashboard/dashboard_page_assets.js +51 -0
  91. package/dist/src/dashboard/dashboard_store.d.ts +19 -218
  92. package/dist/src/dashboard/dashboard_store.js +115 -1116
  93. package/dist/src/dashboard/dashboard_types.d.ts +83 -0
  94. package/dist/src/dashboard/dashboard_types.js +4 -0
  95. package/dist/src/dashboard/detail_queries.d.ts +19 -0
  96. package/dist/src/dashboard/detail_queries.js +98 -0
  97. package/dist/src/dashboard/email_event_builder.d.ts +8 -0
  98. package/dist/src/dashboard/email_event_builder.js +65 -0
  99. package/dist/src/dashboard/explain_query.d.ts +8 -0
  100. package/dist/src/dashboard/explain_query.js +22 -0
  101. package/dist/src/dashboard/filter_handlers.d.ts +23 -0
  102. package/dist/src/dashboard/filter_handlers.js +56 -0
  103. package/dist/src/dashboard/filtered_queries.d.ts +15 -0
  104. package/dist/src/dashboard/filtered_queries.js +155 -0
  105. package/dist/src/dashboard/flush_manager.d.ts +25 -0
  106. package/dist/src/dashboard/flush_manager.js +107 -0
  107. package/dist/src/dashboard/format_helpers.d.ts +126 -0
  108. package/dist/src/dashboard/format_helpers.js +140 -0
  109. package/dist/src/dashboard/inspector_manager.d.ts +36 -0
  110. package/dist/src/dashboard/inspector_manager.js +102 -0
  111. package/dist/src/dashboard/integrations/config_inspector.js +11 -13
  112. package/dist/src/dashboard/integrations/queue_inspector.d.ts +3 -3
  113. package/dist/src/dashboard/integrations/queue_inspector.js +13 -10
  114. package/dist/src/dashboard/jobs_handlers.d.ts +14 -0
  115. package/dist/src/dashboard/jobs_handlers.js +61 -0
  116. package/dist/src/dashboard/knex_factory.d.ts +18 -0
  117. package/dist/src/dashboard/knex_factory.js +91 -0
  118. package/dist/src/dashboard/migrator.js +30 -159
  119. package/dist/src/dashboard/migrator_tables.d.ts +19 -0
  120. package/dist/src/dashboard/migrator_tables.js +153 -0
  121. package/dist/src/dashboard/overview_queries.d.ts +66 -0
  122. package/dist/src/dashboard/overview_queries.js +155 -0
  123. package/dist/src/dashboard/overview_query_runners.d.ts +25 -0
  124. package/dist/src/dashboard/overview_query_runners.js +84 -0
  125. package/dist/src/dashboard/overview_store_queries.d.ts +40 -0
  126. package/dist/src/dashboard/overview_store_queries.js +69 -0
  127. package/dist/src/dashboard/paginate_helper.d.ts +12 -0
  128. package/dist/src/dashboard/paginate_helper.js +33 -0
  129. package/dist/src/dashboard/query_explain_handler.d.ts +10 -0
  130. package/dist/src/dashboard/query_explain_handler.js +80 -0
  131. package/dist/src/dashboard/read_queries.d.ts +32 -0
  132. package/dist/src/dashboard/read_queries.js +107 -0
  133. package/dist/src/dashboard/saved_filter_queries.d.ts +10 -0
  134. package/dist/src/dashboard/saved_filter_queries.js +24 -0
  135. package/dist/src/dashboard/storage_stats.d.ts +41 -0
  136. package/dist/src/dashboard/storage_stats.js +81 -0
  137. package/dist/src/dashboard/write_queue.d.ts +106 -0
  138. package/dist/src/dashboard/write_queue.js +225 -0
  139. package/dist/src/data/data_access.d.ts +2 -39
  140. package/dist/src/data/data_access.js +17 -193
  141. package/dist/src/data/data_access_helpers.d.ts +130 -0
  142. package/dist/src/data/data_access_helpers.js +212 -0
  143. package/dist/src/debug/debug_store.js +37 -32
  144. package/dist/src/debug/email_collector.d.ts +1 -10
  145. package/dist/src/debug/email_collector.js +78 -81
  146. package/dist/src/debug/event_collector.d.ts +0 -9
  147. package/dist/src/debug/event_collector.js +79 -62
  148. package/dist/src/debug/query_collector.js +23 -19
  149. package/dist/src/debug/route_inspector.d.ts +1 -5
  150. package/dist/src/debug/route_inspector.js +50 -51
  151. package/dist/src/debug/trace_collector.d.ts +9 -1
  152. package/dist/src/debug/trace_collector.js +21 -15
  153. package/dist/src/debug/types.d.ts +1 -1
  154. package/dist/src/define_config.d.ts +0 -65
  155. package/dist/src/define_config.js +93 -333
  156. package/dist/src/edge/client/dashboard.js +2 -2
  157. package/dist/src/edge/client/debug-panel-deferred.js +1 -1
  158. package/dist/src/edge/client/stats-bar.js +1 -1
  159. package/dist/src/edge/client-vue/dashboard.js +5 -5
  160. package/dist/src/edge/client-vue/debug-panel-deferred.js +4 -4
  161. package/dist/src/edge/client-vue/stats-bar.js +3 -3
  162. package/dist/src/edge/plugin.d.ts +0 -16
  163. package/dist/src/edge/plugin.js +57 -64
  164. package/dist/src/engine/request_metrics.d.ts +1 -0
  165. package/dist/src/engine/request_metrics.js +32 -42
  166. package/dist/src/middleware/request_tracking_middleware.d.ts +2 -8
  167. package/dist/src/middleware/request_tracking_middleware.js +65 -93
  168. package/dist/src/provider/auth_middleware_detector.d.ts +16 -0
  169. package/dist/src/provider/auth_middleware_detector.js +97 -0
  170. package/dist/src/provider/boot_helpers.d.ts +20 -0
  171. package/dist/src/provider/boot_helpers.js +91 -0
  172. package/dist/src/provider/boot_initializer.d.ts +28 -0
  173. package/dist/src/provider/boot_initializer.js +35 -0
  174. package/dist/src/provider/dashboard_init.d.ts +30 -0
  175. package/dist/src/provider/dashboard_init.js +138 -0
  176. package/dist/src/provider/dashboard_setup.d.ts +25 -0
  177. package/dist/src/provider/dashboard_setup.js +78 -0
  178. package/dist/src/provider/diagnostics.d.ts +134 -0
  179. package/dist/src/provider/diagnostics.js +127 -0
  180. package/dist/src/provider/email_bridge.d.ts +43 -0
  181. package/dist/src/provider/email_bridge.js +80 -0
  182. package/dist/src/provider/email_helpers.d.ts +13 -0
  183. package/dist/src/provider/email_helpers.js +68 -0
  184. package/dist/src/provider/pino_hook.d.ts +17 -0
  185. package/dist/src/provider/pino_hook.js +35 -0
  186. package/dist/src/provider/provider_helpers_extra.d.ts +47 -0
  187. package/dist/src/provider/provider_helpers_extra.js +177 -0
  188. package/dist/src/provider/server_stats_provider.d.ts +39 -85
  189. package/dist/src/provider/server_stats_provider.js +132 -951
  190. package/dist/src/provider/shutdown_helpers.d.ts +43 -0
  191. package/dist/src/provider/shutdown_helpers.js +70 -0
  192. package/dist/src/provider/toolbar_setup.d.ts +57 -0
  193. package/dist/src/provider/toolbar_setup.js +141 -0
  194. package/dist/src/routes/dashboard_routes.d.ts +14 -0
  195. package/dist/src/routes/dashboard_routes.js +197 -0
  196. package/dist/src/routes/debug_routes.d.ts +14 -0
  197. package/dist/src/routes/debug_routes.js +101 -0
  198. package/dist/src/routes/register_routes.d.ts +0 -78
  199. package/dist/src/routes/register_routes.js +22 -352
  200. package/dist/src/routes/stats_routes.d.ts +5 -0
  201. package/dist/src/routes/stats_routes.js +14 -0
  202. package/dist/src/styles/components.css +163 -0
  203. package/dist/src/styles/dashboard.css +13 -105
  204. package/dist/src/styles/debug-panel.css +2 -53
  205. package/dist/src/styles/utilities.css +3 -1
  206. package/dist/src/types.d.ts +305 -14
  207. package/dist/vue/{CacheSection-oFAJL3mo.js → CacheSection-DT2Mwf_s.js} +1 -1
  208. package/dist/vue/{ConfigSection-BhfJ4KqL.js → ConfigSection-BwKwS9lh.js} +1 -1
  209. package/dist/vue/CustomPaneTab-Hr1IBHfz.js +172 -0
  210. package/dist/vue/{EmailsSection-BcNyhyHs.js → EmailsSection-B65g0FVS.js} +1 -1
  211. package/dist/vue/{EventsSection-r60Q5Lmu.js → EventsSection-CxqtVF-o.js} +1 -1
  212. package/dist/vue/{JobsSection-BHL-hkQw.js → JobsSection-rMIyMb-g.js} +1 -1
  213. package/dist/vue/{LogsSection-DRMGzJmg.js → LogsSection-DmmZVJ7D.js} +9 -3
  214. package/dist/vue/{LogsTab-Bg3o0Mm6.js → LogsTab-47zEK7jL.js} +4 -1
  215. package/dist/vue/{OverviewSection-CXh6Ja1B.js → OverviewSection-BMabyqw-.js} +49 -50
  216. package/dist/vue/{QueriesSection-IodIsCJ-.js → QueriesSection-BfDFwGqH.js} +44 -45
  217. package/dist/vue/{QueriesTab-C8_7oprC.js → QueriesTab-DuTG7cpC.js} +30 -31
  218. package/dist/vue/RelatedLogs.vue_vue_type_script_setup_true_lang-Py1iu9GU.js +77 -0
  219. package/dist/vue/{RequestsSection-BPuMdmMc.js → RequestsSection-CTu4jPZ_.js} +143 -147
  220. package/dist/vue/{RoutesSection-NKo3Rbq3.js → RoutesSection-zQZDedL7.js} +1 -1
  221. package/dist/vue/TimelineTab-DHfXsX7t.js +334 -0
  222. package/dist/vue/components/shared/RelatedLogs.vue.d.ts +1 -4
  223. package/dist/vue/composables/useDashboardData.d.ts +12 -23
  224. package/dist/vue/index-CM3yNVUR.js +1232 -0
  225. package/dist/vue/index.js +1 -1
  226. package/dist/vue/style.css +1 -1
  227. package/package.json +1 -1
  228. package/dist/react/CacheSection-UCMptWyn.js +0 -146
  229. package/dist/react/CacheTab-CA8LB1J5.js +0 -123
  230. package/dist/react/CustomPaneTab-Bxtv_8Rw.js +0 -104
  231. package/dist/react/EmailsSection-CM7stSyh.js +0 -262
  232. package/dist/react/EmailsTab-BDhEiomM.js +0 -153
  233. package/dist/react/EventsTab-CMfY98Rl.js +0 -63
  234. package/dist/react/InternalsSection-t7ihcWO-.js +0 -32
  235. package/dist/react/InternalsTab-Oij0A2fN.js +0 -30
  236. package/dist/react/JobsSection-DF3qEv9O.js +0 -187
  237. package/dist/react/JobsTab-BbrBWIOb.js +0 -141
  238. package/dist/react/LogsSection-DcFTZY7b.js +0 -227
  239. package/dist/react/LogsTab-CicucmVk.js +0 -103
  240. package/dist/react/QueriesSection-PswteoF9.js +0 -461
  241. package/dist/react/RelatedLogs-DFDOyUMr.js +0 -40
  242. package/dist/react/RequestsSection-Nag30rEA.js +0 -341
  243. package/dist/react/RoutesTab-DgVzd2PZ.js +0 -74
  244. package/dist/react/index-Cflz9Ebj.js +0 -1069
  245. package/dist/vue/CustomPaneTab-BJxT5Dp7.js +0 -172
  246. package/dist/vue/RelatedLogs.vue_vue_type_script_setup_true_lang-CB2_TzYW.js +0 -84
  247. package/dist/vue/TimelineTab-zj5Z5OdT.js +0 -338
  248. package/dist/vue/index-Dtgysd26.js +0 -1229
@@ -0,0 +1,27 @@
1
+ import { jsxs as a, jsx as s } from "react/jsx-runtime";
2
+ function i({ hitRate: c, hits: e, misses: l, keys: t }) {
3
+ return /* @__PURE__ */ a("div", { className: "ss-cache-stats", children: [
4
+ /* @__PURE__ */ a("div", { className: "ss-cache-stat", children: [
5
+ /* @__PURE__ */ s("span", { className: "ss-cache-stat-label", children: "Hit Rate:" }),
6
+ /* @__PURE__ */ a("span", { className: "ss-cache-stat-value", children: [
7
+ c.toFixed(1),
8
+ "%"
9
+ ] })
10
+ ] }),
11
+ /* @__PURE__ */ a("div", { className: "ss-cache-stat", children: [
12
+ /* @__PURE__ */ s("span", { className: "ss-cache-stat-label", children: "Hits:" }),
13
+ /* @__PURE__ */ s("span", { className: "ss-cache-stat-value", children: e })
14
+ ] }),
15
+ /* @__PURE__ */ a("div", { className: "ss-cache-stat", children: [
16
+ /* @__PURE__ */ s("span", { className: "ss-cache-stat-label", children: "Misses:" }),
17
+ /* @__PURE__ */ s("span", { className: "ss-cache-stat-value", children: l })
18
+ ] }),
19
+ /* @__PURE__ */ a("div", { className: "ss-cache-stat", children: [
20
+ /* @__PURE__ */ s("span", { className: "ss-cache-stat-label", children: "Keys:" }),
21
+ /* @__PURE__ */ s("span", { className: "ss-cache-stat-value", children: t })
22
+ ] })
23
+ ] });
24
+ }
25
+ export {
26
+ i as C
27
+ };
@@ -0,0 +1,106 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ import { useState as u, useMemo as T, useCallback as z } from "react";
3
+ import { formatTtl as K, formatCacheSize as L } from "adonisjs-server-stats/core";
4
+ import { u as R } from "./useDashboardApiBase-Bi36pJ2L.js";
5
+ import { u as $, J as j } from "./index-DwDK-4oX.js";
6
+ import { u as A } from "./useResizableTable-CNJmACdt.js";
7
+ import { C as F } from "./CacheStatsBar-CRodCOeP.js";
8
+ import { F as D } from "./FilterBar-CQ7bD669.js";
9
+ function G({ options: l, dashboardPath: y }) {
10
+ const { dashApiBase: p, resolvedOptions: k } = R(y, l), { data: a, isLoading: C, error: b } = $("cache", k), [r, N] = u(""), [i, n] = u(null), [f, h] = u(null), o = T(() => {
11
+ const s = a?.keys || [];
12
+ if (!r) return s;
13
+ const m = r.toLowerCase();
14
+ return s.filter((c) => c.key.toLowerCase().includes(m));
15
+ }, [a, r]), v = z(
16
+ async (s) => {
17
+ if (i === s) {
18
+ n(null), h(null);
19
+ return;
20
+ }
21
+ n(s);
22
+ try {
23
+ const { baseUrl: m = "", authToken: c } = l || {}, x = p || l?.debugEndpoint || "/admin/api/debug", B = `${m}${x}/cache/${encodeURIComponent(s)}`, g = { Accept: "application/json" };
24
+ c && (g.Authorization = `Bearer ${c}`);
25
+ const S = await (await fetch(B, {
26
+ headers: g,
27
+ credentials: c ? "omit" : "same-origin"
28
+ })).json();
29
+ h(S);
30
+ } catch {
31
+ h({ error: "Failed to fetch key value" });
32
+ }
33
+ },
34
+ [i, l, p]
35
+ ), w = A([o]);
36
+ if (C && !a)
37
+ return /* @__PURE__ */ e("div", { className: "ss-dbg-empty", children: "Loading cache data..." });
38
+ if (b)
39
+ return /* @__PURE__ */ t("div", { className: "ss-dbg-empty", children: [
40
+ "Error: ",
41
+ b.message
42
+ ] });
43
+ if (!a)
44
+ return /* @__PURE__ */ e("div", { className: "ss-dbg-empty", children: "Cache inspector not available" });
45
+ const d = a.stats || a;
46
+ return /* @__PURE__ */ t("div", { children: [
47
+ /* @__PURE__ */ e(
48
+ F,
49
+ {
50
+ hitRate: d.hitRate ?? 0,
51
+ hits: d.totalHits ?? 0,
52
+ misses: d.totalMisses ?? 0,
53
+ keys: d.keyCount ?? 0
54
+ }
55
+ ),
56
+ /* @__PURE__ */ e(
57
+ D,
58
+ {
59
+ search: r,
60
+ onSearchChange: N,
61
+ placeholder: "Filter keys...",
62
+ summary: `${o.length} keys`
63
+ }
64
+ ),
65
+ i && !!f && /* @__PURE__ */ t("div", { className: "ss-dbg-cache-detail", children: [
66
+ /* @__PURE__ */ e("strong", { children: i }),
67
+ /* @__PURE__ */ t("button", { type: "button", className: "ss-dbg-btn-clear", onClick: () => n(null), children: [
68
+ "←",
69
+ " Back"
70
+ ] }),
71
+ /* @__PURE__ */ e(j, { data: f, classPrefix: "ss-dbg" })
72
+ ] }),
73
+ o.length === 0 ? /* @__PURE__ */ e("div", { className: "ss-dbg-empty", children: "No cache keys found" }) : /* @__PURE__ */ t("table", { ref: w, className: "ss-dbg-table", children: [
74
+ /* @__PURE__ */ t("colgroup", { children: [
75
+ /* @__PURE__ */ e("col", {}),
76
+ /* @__PURE__ */ e("col", { style: { width: "80px" } }),
77
+ /* @__PURE__ */ e("col", { style: { width: "80px" } }),
78
+ /* @__PURE__ */ e("col", { style: { width: "80px" } })
79
+ ] }),
80
+ /* @__PURE__ */ e("thead", { children: /* @__PURE__ */ t("tr", { children: [
81
+ /* @__PURE__ */ e("th", { children: "Key" }),
82
+ /* @__PURE__ */ e("th", { children: "Type" }),
83
+ /* @__PURE__ */ e("th", { children: "TTL" }),
84
+ /* @__PURE__ */ e("th", { children: "Size" })
85
+ ] }) }),
86
+ /* @__PURE__ */ e("tbody", { children: o.map((s) => /* @__PURE__ */ t(
87
+ "tr",
88
+ {
89
+ className: "ss-dbg-email-row",
90
+ onClick: () => v(s.key),
91
+ children: [
92
+ /* @__PURE__ */ e("td", { className: "ss-dbg-c-sql", children: s.key }),
93
+ /* @__PURE__ */ e("td", { className: "ss-dbg-c-muted", children: s.type }),
94
+ /* @__PURE__ */ e("td", { className: "ss-dbg-c-muted", children: s.ttl > 0 ? K(s.ttl) : "-" }),
95
+ /* @__PURE__ */ e("td", { className: "ss-dbg-c-dim", children: s.size > 0 ? L(s.size) : "-" })
96
+ ]
97
+ },
98
+ s.key
99
+ )) })
100
+ ] })
101
+ ] });
102
+ }
103
+ export {
104
+ G as CacheTab,
105
+ G as default
106
+ };
@@ -1,5 +1,5 @@
1
1
  import { jsx as t } from "react/jsx-runtime";
2
- import { a as i } from "./index-Cflz9Ebj.js";
2
+ import { a as i } from "./index-DwDK-4oX.js";
3
3
  import { C as n } from "./ConfigContent-CnsEI4j3.js";
4
4
  function m({ options: o = {} }) {
5
5
  const { data: a, isLoading: s } = i("config", o);
@@ -1,6 +1,6 @@
1
1
  import { jsxs as i, jsx as n } from "react/jsx-runtime";
2
2
  import { u as f } from "./useDashboardApiBase-Bi36pJ2L.js";
3
- import { u as m } from "./index-Cflz9Ebj.js";
3
+ import { u as m } from "./index-DwDK-4oX.js";
4
4
  import { C as d } from "./ConfigContent-CnsEI4j3.js";
5
5
  function b({ options: r, dashboardPath: o }) {
6
6
  const { resolvedOptions: a } = f(o, r), { data: e, isLoading: t, error: s } = m("config", a);
@@ -0,0 +1,99 @@
1
+ import { jsxs as l, jsx as r } from "react/jsx-runtime";
2
+ import { useState as w, useMemo as f } from "react";
3
+ import { compactPreview as k, formatDuration as x, durationClassName as M } from "adonisjs-server-stats/core";
4
+ import { u as L, B as A, M as B } from "./index-DwDK-4oX.js";
5
+ import { T as b } from "./TimeAgoCell-o3KigGfM.js";
6
+ import { u as D } from "./useResizableTable-CNJmACdt.js";
7
+ import { F as P } from "./FilterBar-CQ7bD669.js";
8
+ function z({ pane: t, options: g }) {
9
+ ({
10
+ ...g
11
+ });
12
+ const { data: o, isLoading: u, error: h, clearData: p } = L(
13
+ t.endpoint.replace(/^\//, ""),
14
+ {
15
+ ...g,
16
+ debugEndpoint: ""
17
+ // Use endpoint directly
18
+ }
19
+ ), [i, y] = w(""), c = f(() => {
20
+ if (!o) return [];
21
+ const e = t.dataKey || t.id;
22
+ let s = o;
23
+ for (const a of e.split("."))
24
+ s = s?.[a];
25
+ return Array.isArray(s) ? s : [];
26
+ }, [o, t.dataKey, t.id]), d = f(() => {
27
+ if (!i) return c;
28
+ const e = i.toLowerCase(), s = t.columns.filter((a) => a.searchable).map((a) => a.key);
29
+ return s.length === 0 ? c : c.filter(
30
+ (a) => s.some((n) => {
31
+ const m = a[n];
32
+ return m !== null && String(m).toLowerCase().includes(e);
33
+ })
34
+ );
35
+ }, [c, i, t.columns]), N = (e, s) => {
36
+ if (e == null)
37
+ return /* @__PURE__ */ r("span", { className: "ss-dbg-c-dim", children: "-" });
38
+ switch (s.format || "text") {
39
+ case "time":
40
+ return typeof e == "number" ? /* @__PURE__ */ r(b, { ts: e, className: "ss-dbg-event-time" }) : /* @__PURE__ */ r("span", { className: "ss-dbg-event-time", children: String(e) });
41
+ case "timeAgo":
42
+ return /* @__PURE__ */ r(b, { ts: e, className: "ss-dbg-event-time" });
43
+ case "duration": {
44
+ const n = typeof e == "number" ? e : parseFloat(String(e));
45
+ return isNaN(n) ? String(e) : /* @__PURE__ */ r(
46
+ "span",
47
+ {
48
+ className: `ss-dbg-duration ${M(n, "ss-dbg")}`,
49
+ children: x(n)
50
+ }
51
+ );
52
+ }
53
+ case "method":
54
+ return /* @__PURE__ */ r(B, { method: String(e), classPrefix: "ss-dbg" });
55
+ case "json": {
56
+ let n = e;
57
+ if (typeof e == "string")
58
+ try {
59
+ n = JSON.parse(e);
60
+ } catch {
61
+ }
62
+ return k(n, 80);
63
+ }
64
+ case "badge": {
65
+ const n = String(e).toLowerCase(), C = (s.badgeColorMap || {})[n] || "muted";
66
+ return /* @__PURE__ */ r(A, { color: C, classPrefix: "ss-dbg", children: String(e) });
67
+ }
68
+ default:
69
+ return String(e);
70
+ }
71
+ }, S = D([d]);
72
+ return u && !o ? /* @__PURE__ */ l("div", { className: "ss-dbg-empty", children: [
73
+ "Loading ",
74
+ t.label,
75
+ "..."
76
+ ] }) : h ? /* @__PURE__ */ l("div", { className: "ss-dbg-empty", children: [
77
+ "Error: ",
78
+ h.message
79
+ ] }) : /* @__PURE__ */ l("div", { children: [
80
+ t.search && /* @__PURE__ */ r(
81
+ P,
82
+ {
83
+ search: i,
84
+ onSearchChange: y,
85
+ placeholder: t.search.placeholder,
86
+ summary: `${d.length} items`,
87
+ children: t.clearable && /* @__PURE__ */ r("button", { type: "button", className: "ss-dbg-btn-clear", onClick: p, children: "Clear" })
88
+ }
89
+ ),
90
+ d.length === 0 ? /* @__PURE__ */ r("div", { className: "ss-dbg-empty", children: "No data" }) : /* @__PURE__ */ l("table", { ref: S, className: "ss-dbg-table", children: [
91
+ /* @__PURE__ */ r("thead", { children: /* @__PURE__ */ r("tr", { children: t.columns.map((e) => /* @__PURE__ */ r("th", { children: e.label }, e.key)) }) }),
92
+ /* @__PURE__ */ r("tbody", { children: d.map((e, s) => /* @__PURE__ */ r("tr", { children: t.columns.map((a) => /* @__PURE__ */ r("td", { children: N(e[a.key], a) }, a.key)) }, e.id ?? s)) })
93
+ ] })
94
+ ] });
95
+ }
96
+ export {
97
+ z as CustomPaneTab,
98
+ z as default
99
+ };
@@ -0,0 +1,58 @@
1
+ import { jsxs as r, jsx as e, Fragment as d } from "react/jsx-runtime";
2
+ function a({
3
+ email: s,
4
+ previewHtml: n,
5
+ isLoading: t = !1,
6
+ onClose: i,
7
+ className: c
8
+ }) {
9
+ return /* @__PURE__ */ r("div", { className: c || "ss-email-preview", children: [
10
+ /* @__PURE__ */ r("div", { className: "ss-email-preview-header", children: [
11
+ /* @__PURE__ */ e("div", { className: "ss-email-preview-meta", children: s && /* @__PURE__ */ r(d, { children: [
12
+ s.subject != null && /* @__PURE__ */ r("div", { children: [
13
+ /* @__PURE__ */ e("strong", { children: "Subject:" }),
14
+ " ",
15
+ s.subject
16
+ ] }),
17
+ s.from != null && /* @__PURE__ */ r("div", { children: [
18
+ /* @__PURE__ */ e("strong", { children: "From:" }),
19
+ " ",
20
+ s.from
21
+ ] }),
22
+ s.to != null && /* @__PURE__ */ r("div", { children: [
23
+ /* @__PURE__ */ e("strong", { children: "To:" }),
24
+ " ",
25
+ s.to
26
+ ] }),
27
+ s.cc && /* @__PURE__ */ r("div", { children: [
28
+ /* @__PURE__ */ e("strong", { children: "CC:" }),
29
+ " ",
30
+ s.cc
31
+ ] }),
32
+ s.status && /* @__PURE__ */ r("div", { children: [
33
+ /* @__PURE__ */ e("strong", { children: "Status:" }),
34
+ " ",
35
+ /* @__PURE__ */ e("span", { className: `ss-email-status ss-email-status-${s.status}`, children: s.status })
36
+ ] }),
37
+ s.mailer && /* @__PURE__ */ r("div", { children: [
38
+ /* @__PURE__ */ e("strong", { children: "Mailer:" }),
39
+ " ",
40
+ s.mailer
41
+ ] })
42
+ ] }) }),
43
+ /* @__PURE__ */ e("button", { className: "ss-dbg-btn-clear", onClick: i, type: "button", children: "×" })
44
+ ] }),
45
+ t ? /* @__PURE__ */ e("div", { className: "ss-empty", children: "Loading preview..." }) : n ? /* @__PURE__ */ e(
46
+ "iframe",
47
+ {
48
+ className: "ss-email-iframe",
49
+ srcDoc: n,
50
+ title: "Email preview",
51
+ sandbox: ""
52
+ }
53
+ ) : /* @__PURE__ */ e("div", { style: { padding: "12px", whiteSpace: "pre-wrap" }, children: s?.text || "No content" })
54
+ ] });
55
+ }
56
+ export {
57
+ a as E
58
+ };
@@ -0,0 +1,226 @@
1
+ import { jsx as s, jsxs as y, Fragment as P } from "react/jsx-runtime";
2
+ import { useState as l, useEffect as T, useCallback as j } from "react";
3
+ import { resolveCcAddr as N, resolveToAddr as f, resolveFromAddr as b, resolveAttachmentCount as F, resolveTimestamp as _ } from "adonisjs-server-stats/core";
4
+ import { T as $ } from "./TimeAgoCell-o3KigGfM.js";
5
+ import { a as D } from "./index-DwDK-4oX.js";
6
+ import { D as E } from "./DataTable-YyShr5B-.js";
7
+ import { F as O } from "./FilterBar-CQ7bD669.js";
8
+ import { E as B } from "./EmailPreviewOverlay-BmXOAvqG.js";
9
+ import { P as H } from "./Pagination-BkmzUDY8.js";
10
+ function Q({ options: o = {} }) {
11
+ const [x, d] = l(1), [i, g] = l(""), [m, n] = l(null), [p, c] = l(null), { data: h, meta: r, isLoading: k } = D("emails", { ...o, page: x, search: i }), u = h || [];
12
+ T(() => d(1), [i]);
13
+ const A = j(
14
+ async (e) => {
15
+ if (e.html) {
16
+ n(e.id), c(e.html);
17
+ return;
18
+ }
19
+ try {
20
+ const { baseUrl: t = "", dashboardEndpoint: a = "/__stats/api", authToken: w } = o, S = `${t}${a}/emails/${e.id}/preview`, v = { Accept: "text/html" };
21
+ w && (v.Authorization = `Bearer ${w}`);
22
+ const C = await (await fetch(S, { headers: v, credentials: "same-origin" })).text();
23
+ n(e.id), c(C);
24
+ } catch {
25
+ }
26
+ },
27
+ [o]
28
+ );
29
+ if (m && p) {
30
+ const e = u.find((a) => a.id === m), t = e ? {
31
+ subject: e.subject,
32
+ from: b(e),
33
+ to: f(e),
34
+ cc: N(e) || null,
35
+ status: e.status,
36
+ mailer: e.mailer
37
+ } : null;
38
+ return /* @__PURE__ */ s(
39
+ B,
40
+ {
41
+ email: t,
42
+ previewHtml: p,
43
+ onClose: () => {
44
+ n(null), c(null);
45
+ },
46
+ className: "ss-dash-email-preview"
47
+ }
48
+ );
49
+ }
50
+ return /* @__PURE__ */ y("div", { children: [
51
+ /* @__PURE__ */ s(
52
+ O,
53
+ {
54
+ search: i,
55
+ onSearchChange: g,
56
+ placeholder: "Filter emails...",
57
+ summary: `${r?.total ?? 0} emails`
58
+ }
59
+ ),
60
+ k && !h ? /* @__PURE__ */ s("div", { className: "ss-dash-empty", children: "Loading emails..." }) : /* @__PURE__ */ y(P, { children: [
61
+ /* @__PURE__ */ s("div", { className: "ss-dash-table-wrap", children: /* @__PURE__ */ s(
62
+ E,
63
+ {
64
+ columns: [
65
+ {
66
+ key: "id",
67
+ label: "#",
68
+ width: "40px",
69
+ render: (e) => /* @__PURE__ */ s("span", { style: { color: "var(--ss-dim)" }, children: e })
70
+ },
71
+ {
72
+ key: "from",
73
+ label: "From",
74
+ width: "150px",
75
+ render: (e, t) => {
76
+ const a = b(t);
77
+ return /* @__PURE__ */ s(
78
+ "span",
79
+ {
80
+ title: a,
81
+ style: {
82
+ color: "var(--ss-text-secondary)",
83
+ overflow: "hidden",
84
+ textOverflow: "ellipsis",
85
+ whiteSpace: "nowrap",
86
+ display: "block"
87
+ },
88
+ children: a
89
+ }
90
+ );
91
+ }
92
+ },
93
+ {
94
+ key: "to",
95
+ label: "To",
96
+ width: "150px",
97
+ render: (e, t) => {
98
+ const a = f(t);
99
+ return /* @__PURE__ */ s(
100
+ "span",
101
+ {
102
+ title: a,
103
+ style: {
104
+ color: "var(--ss-text-secondary)",
105
+ overflow: "hidden",
106
+ textOverflow: "ellipsis",
107
+ whiteSpace: "nowrap",
108
+ display: "block"
109
+ },
110
+ children: a
111
+ }
112
+ );
113
+ }
114
+ },
115
+ {
116
+ key: "subject",
117
+ label: "Subject",
118
+ render: (e) => {
119
+ const t = e || "";
120
+ return /* @__PURE__ */ s(
121
+ "span",
122
+ {
123
+ title: t,
124
+ style: {
125
+ color: "var(--ss-sql-color)",
126
+ overflow: "hidden",
127
+ textOverflow: "ellipsis",
128
+ whiteSpace: "nowrap",
129
+ display: "block"
130
+ },
131
+ children: t
132
+ }
133
+ );
134
+ }
135
+ },
136
+ {
137
+ key: "status",
138
+ label: "Status",
139
+ width: "80px",
140
+ render: (e) => {
141
+ const t = e || "";
142
+ return /* @__PURE__ */ s("span", { className: `ss-dash-badge ss-dash-email-status-${t}`, children: t });
143
+ }
144
+ },
145
+ {
146
+ key: "attachmentCount",
147
+ label: "ATT",
148
+ width: "40px",
149
+ render: (e, t) => {
150
+ const a = F(t);
151
+ return a > 0 ? /* @__PURE__ */ s(
152
+ "span",
153
+ {
154
+ style: { color: "var(--ss-dim)", textAlign: "center", display: "block" },
155
+ children: a
156
+ }
157
+ ) : /* @__PURE__ */ s(
158
+ "span",
159
+ {
160
+ style: { color: "var(--ss-dim)", textAlign: "center", display: "block" },
161
+ children: "-"
162
+ }
163
+ );
164
+ }
165
+ },
166
+ {
167
+ key: "mailer",
168
+ label: "Mailer",
169
+ width: "70px",
170
+ render: (e) => {
171
+ const t = e || "";
172
+ return /* @__PURE__ */ s(
173
+ "span",
174
+ {
175
+ title: t,
176
+ style: {
177
+ color: "var(--ss-muted)",
178
+ overflow: "hidden",
179
+ textOverflow: "ellipsis",
180
+ whiteSpace: "nowrap",
181
+ display: "block"
182
+ },
183
+ children: t
184
+ }
185
+ );
186
+ }
187
+ },
188
+ {
189
+ key: "createdAt",
190
+ label: "Time",
191
+ width: "80px",
192
+ render: (e, t) => {
193
+ const a = _(t);
194
+ return /* @__PURE__ */ s(
195
+ $,
196
+ {
197
+ ts: a,
198
+ className: "ss-dash-event-time",
199
+ style: { whiteSpace: "nowrap" }
200
+ }
201
+ );
202
+ }
203
+ }
204
+ ],
205
+ data: u,
206
+ onRowClick: A,
207
+ rowClassName: "ss-dash-email-row",
208
+ emptyMessage: "No emails captured yet"
209
+ }
210
+ ) }),
211
+ r && /* @__PURE__ */ s(
212
+ H,
213
+ {
214
+ page: r.page,
215
+ lastPage: r.lastPage,
216
+ total: r.total,
217
+ onPageChange: d
218
+ }
219
+ )
220
+ ] })
221
+ ] });
222
+ }
223
+ export {
224
+ Q as EmailsSection,
225
+ Q as default
226
+ };
@@ -0,0 +1,110 @@
1
+ import { jsx as e, jsxs as r } from "react/jsx-runtime";
2
+ import { useState as c, useMemo as f, useCallback as w } from "react";
3
+ import { resolveTimestamp as k } from "adonisjs-server-stats/core";
4
+ import { T as E } from "./TimeAgoCell-o3KigGfM.js";
5
+ import { u as S } from "./index-DwDK-4oX.js";
6
+ import { u as j } from "./useResizableTable-CNJmACdt.js";
7
+ import { F as q } from "./FilterBar-CQ7bD669.js";
8
+ import { E as $ } from "./EmailPreviewOverlay-BmXOAvqG.js";
9
+ function R({ options: l }) {
10
+ const { data: n, isLoading: y, error: h } = S("emails", l), [d, v] = c(""), [u, g] = c(null), [N, o] = c(null), [C, m] = c(!1), a = f(() => {
11
+ const s = n?.emails || [];
12
+ if (!d) return s;
13
+ const i = d.toLowerCase();
14
+ return s.filter(
15
+ (t) => (t.subject || "").toLowerCase().includes(i) || (t.to || "").toLowerCase().includes(i) || (t.from || "").toLowerCase().includes(i) || (t.mailer || "").toLowerCase().includes(i)
16
+ );
17
+ }, [n, d]), b = f(() => a.find((s) => s.id === u), [a, u]), x = w(
18
+ async (s) => {
19
+ if (g(s.id), o(s.html || null), !s.html && s.id) {
20
+ m(!0);
21
+ try {
22
+ const i = l?.debugEndpoint || "/admin/api/debug", t = {};
23
+ l?.authToken && (t.Authorization = `Bearer ${l.authToken}`);
24
+ const p = await fetch(`${i}/emails/${s.id}/preview`, {
25
+ headers: t,
26
+ credentials: l?.authToken ? "omit" : "include"
27
+ });
28
+ p.ok && o(await p.text());
29
+ } catch {
30
+ } finally {
31
+ m(!1);
32
+ }
33
+ }
34
+ },
35
+ [l]
36
+ ), T = w(() => {
37
+ g(null), o(null), m(!1);
38
+ }, []), L = {
39
+ sent: "ss-dbg-email-status-sent",
40
+ sending: "ss-dbg-email-status-sending",
41
+ queueing: "ss-dbg-email-status-queued",
42
+ queued: "ss-dbg-email-status-queued",
43
+ failed: "ss-dbg-email-status-failed"
44
+ }, P = j([a]);
45
+ return y && !n ? /* @__PURE__ */ e("div", { className: "ss-dbg-empty", children: "Loading emails..." }) : h ? /* @__PURE__ */ r("div", { className: "ss-dbg-empty", children: [
46
+ "Error: ",
47
+ h.message
48
+ ] }) : b ? /* @__PURE__ */ e(
49
+ $,
50
+ {
51
+ email: b,
52
+ previewHtml: N,
53
+ isLoading: C,
54
+ onClose: T,
55
+ className: "ss-dbg-email-preview"
56
+ }
57
+ ) : /* @__PURE__ */ r("div", { children: [
58
+ /* @__PURE__ */ e(
59
+ q,
60
+ {
61
+ search: d,
62
+ onSearchChange: v,
63
+ placeholder: "Filter emails...",
64
+ summary: `${a.length} emails`
65
+ }
66
+ ),
67
+ a.length === 0 ? /* @__PURE__ */ e("div", { className: "ss-dbg-empty", children: "No emails captured" }) : /* @__PURE__ */ r("table", { ref: P, className: "ss-dbg-table", children: [
68
+ /* @__PURE__ */ r("colgroup", { children: [
69
+ /* @__PURE__ */ e("col", { style: { width: "50px" } }),
70
+ /* @__PURE__ */ e("col", { style: { width: "140px" } }),
71
+ /* @__PURE__ */ e("col", { style: { width: "140px" } }),
72
+ /* @__PURE__ */ e("col", {}),
73
+ /* @__PURE__ */ e("col", { style: { width: "70px" } }),
74
+ /* @__PURE__ */ e("col", { style: { width: "80px" } }),
75
+ /* @__PURE__ */ e("col", { style: { width: "40px" } }),
76
+ /* @__PURE__ */ e("col", { style: { width: "80px" } })
77
+ ] }),
78
+ /* @__PURE__ */ e("thead", { children: /* @__PURE__ */ r("tr", { children: [
79
+ /* @__PURE__ */ e("th", { children: "#" }),
80
+ /* @__PURE__ */ e("th", { children: "From" }),
81
+ /* @__PURE__ */ e("th", { children: "To" }),
82
+ /* @__PURE__ */ e("th", { children: "Subject" }),
83
+ /* @__PURE__ */ e("th", { children: "Status" }),
84
+ /* @__PURE__ */ e("th", { children: "Mailer" }),
85
+ /* @__PURE__ */ e("th", { title: "Attachments", children: "📎" }),
86
+ /* @__PURE__ */ e("th", { children: "Time" })
87
+ ] }) }),
88
+ /* @__PURE__ */ e("tbody", { children: a.map((s) => /* @__PURE__ */ r("tr", { className: "ss-dbg-email-row", onClick: () => x(s), children: [
89
+ /* @__PURE__ */ e("td", { className: "ss-dbg-c-dim", style: { whiteSpace: "nowrap" }, children: s.id }),
90
+ /* @__PURE__ */ e("td", { className: "ss-dbg-c-secondary", title: s.from, children: s.from }),
91
+ /* @__PURE__ */ e("td", { className: "ss-dbg-c-secondary", title: s.to, children: s.to }),
92
+ /* @__PURE__ */ e("td", { className: "ss-dbg-c-sql", children: s.subject }),
93
+ /* @__PURE__ */ e("td", { children: /* @__PURE__ */ e("span", { className: `ss-dbg-email-status ${L[s.status] || ""}`, children: s.status }) }),
94
+ /* @__PURE__ */ e("td", { className: "ss-dbg-c-muted", children: s.mailer }),
95
+ /* @__PURE__ */ e("td", { className: "ss-dbg-c-dim", style: { textAlign: "center" }, children: s.attachmentCount > 0 ? s.attachmentCount : "-" }),
96
+ /* @__PURE__ */ e("td", { children: /* @__PURE__ */ e(
97
+ E,
98
+ {
99
+ ts: k(s),
100
+ className: "ss-dbg-event-time"
101
+ }
102
+ ) })
103
+ ] }, s.id)) })
104
+ ] })
105
+ ] });
106
+ }
107
+ export {
108
+ R as EmailsTab,
109
+ R as default
110
+ };