@buoy-gg/console 7.0.41 → 7.0.43

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 (108) hide show
  1. package/README.md +11 -69
  2. package/lib/commonjs/components/ConsoleIcon.js +1 -19
  3. package/lib/commonjs/components/ConsoleLogList.js +1 -152
  4. package/lib/commonjs/components/ConsoleModal.js +1 -48
  5. package/lib/commonjs/components/ConsoleRoot.js +1 -37
  6. package/lib/commonjs/devtools/ConsoleBody.js +1 -234
  7. package/lib/commonjs/devtools/ConsoleHeader.js +1 -114
  8. package/lib/commonjs/devtools/ConsoleMessageRow.js +1 -356
  9. package/lib/commonjs/devtools/ConsoleValue.js +1 -254
  10. package/lib/commonjs/devtools/ConsoleView.js +1 -54
  11. package/lib/commonjs/devtools/consoleFilter.js +1 -125
  12. package/lib/commonjs/devtools/consoleFormat.js +1 -313
  13. package/lib/commonjs/devtools/origin.js +1 -191
  14. package/lib/commonjs/devtools/theme.js +1 -152
  15. package/lib/commonjs/devtools/useConsoleController.js +1 -82
  16. package/lib/commonjs/devtools/useConsoleMessages.js +1 -241
  17. package/lib/commonjs/hooks/useConsoleLogs.js +1 -23
  18. package/lib/commonjs/index.js +1 -181
  19. package/lib/commonjs/preset.js +1 -63
  20. package/lib/commonjs/store/consoleLogStore.js +6 -589
  21. package/lib/commonjs/store/sanitize.js +1 -83
  22. package/lib/commonjs/sync/consoleSyncAdapter.js +1 -86
  23. package/lib/module/components/ConsoleIcon.js +1 -12
  24. package/lib/module/components/ConsoleLogList.js +1 -147
  25. package/lib/module/components/ConsoleModal.js +1 -44
  26. package/lib/module/components/ConsoleRoot.js +1 -33
  27. package/lib/module/devtools/ConsoleBody.js +1 -229
  28. package/lib/module/devtools/ConsoleHeader.js +1 -109
  29. package/lib/module/devtools/ConsoleMessageRow.js +1 -352
  30. package/lib/module/devtools/ConsoleValue.js +1 -249
  31. package/lib/module/devtools/ConsoleView.js +1 -49
  32. package/lib/module/devtools/consoleFilter.js +1 -119
  33. package/lib/module/devtools/consoleFormat.js +1 -309
  34. package/lib/module/devtools/origin.js +1 -183
  35. package/lib/module/devtools/theme.js +1 -143
  36. package/lib/module/devtools/useConsoleController.js +1 -79
  37. package/lib/module/devtools/useConsoleMessages.js +1 -238
  38. package/lib/module/hooks/useConsoleLogs.js +1 -19
  39. package/lib/module/index.js +1 -52
  40. package/lib/module/preset.js +1 -61
  41. package/lib/module/store/consoleLogStore.js +6 -575
  42. package/lib/module/store/sanitize.js +1 -77
  43. package/lib/module/sync/consoleSyncAdapter.js +1 -82
  44. package/lib/web/index.mjs +11 -12
  45. package/package.json +3 -6
  46. package/lib/commonjs/components/ConsoleIcon.js.map +0 -1
  47. package/lib/commonjs/components/ConsoleLogList.js.map +0 -1
  48. package/lib/commonjs/components/ConsoleModal.js.map +0 -1
  49. package/lib/commonjs/components/ConsoleRoot.js.map +0 -1
  50. package/lib/commonjs/devtools/ConsoleBody.js.map +0 -1
  51. package/lib/commonjs/devtools/ConsoleHeader.js.map +0 -1
  52. package/lib/commonjs/devtools/ConsoleMessageRow.js.map +0 -1
  53. package/lib/commonjs/devtools/ConsoleValue.js.map +0 -1
  54. package/lib/commonjs/devtools/ConsoleView.js.map +0 -1
  55. package/lib/commonjs/devtools/consoleFilter.js.map +0 -1
  56. package/lib/commonjs/devtools/consoleFormat.js.map +0 -1
  57. package/lib/commonjs/devtools/origin.js.map +0 -1
  58. package/lib/commonjs/devtools/theme.js.map +0 -1
  59. package/lib/commonjs/devtools/useConsoleController.js.map +0 -1
  60. package/lib/commonjs/devtools/useConsoleMessages.js.map +0 -1
  61. package/lib/commonjs/hooks/useConsoleLogs.js.map +0 -1
  62. package/lib/commonjs/index.js.map +0 -1
  63. package/lib/commonjs/preset.js.map +0 -1
  64. package/lib/commonjs/store/consoleLogStore.js.map +0 -1
  65. package/lib/commonjs/store/sanitize.js.map +0 -1
  66. package/lib/commonjs/sync/consoleSyncAdapter.js.map +0 -1
  67. package/lib/module/components/ConsoleIcon.js.map +0 -1
  68. package/lib/module/components/ConsoleLogList.js.map +0 -1
  69. package/lib/module/components/ConsoleModal.js.map +0 -1
  70. package/lib/module/components/ConsoleRoot.js.map +0 -1
  71. package/lib/module/devtools/ConsoleBody.js.map +0 -1
  72. package/lib/module/devtools/ConsoleHeader.js.map +0 -1
  73. package/lib/module/devtools/ConsoleMessageRow.js.map +0 -1
  74. package/lib/module/devtools/ConsoleValue.js.map +0 -1
  75. package/lib/module/devtools/ConsoleView.js.map +0 -1
  76. package/lib/module/devtools/consoleFilter.js.map +0 -1
  77. package/lib/module/devtools/consoleFormat.js.map +0 -1
  78. package/lib/module/devtools/origin.js.map +0 -1
  79. package/lib/module/devtools/theme.js.map +0 -1
  80. package/lib/module/devtools/useConsoleController.js.map +0 -1
  81. package/lib/module/devtools/useConsoleMessages.js.map +0 -1
  82. package/lib/module/hooks/useConsoleLogs.js.map +0 -1
  83. package/lib/module/index.js.map +0 -1
  84. package/lib/module/preset.js.map +0 -1
  85. package/lib/module/store/consoleLogStore.js.map +0 -1
  86. package/lib/module/store/sanitize.js.map +0 -1
  87. package/lib/module/sync/consoleSyncAdapter.js.map +0 -1
  88. package/lib/typescript/components/ConsoleIcon.d.ts.map +0 -1
  89. package/lib/typescript/components/ConsoleLogList.d.ts.map +0 -1
  90. package/lib/typescript/components/ConsoleModal.d.ts.map +0 -1
  91. package/lib/typescript/components/ConsoleRoot.d.ts.map +0 -1
  92. package/lib/typescript/devtools/ConsoleBody.d.ts.map +0 -1
  93. package/lib/typescript/devtools/ConsoleHeader.d.ts.map +0 -1
  94. package/lib/typescript/devtools/ConsoleMessageRow.d.ts.map +0 -1
  95. package/lib/typescript/devtools/ConsoleValue.d.ts.map +0 -1
  96. package/lib/typescript/devtools/ConsoleView.d.ts.map +0 -1
  97. package/lib/typescript/devtools/consoleFilter.d.ts.map +0 -1
  98. package/lib/typescript/devtools/consoleFormat.d.ts.map +0 -1
  99. package/lib/typescript/devtools/origin.d.ts.map +0 -1
  100. package/lib/typescript/devtools/theme.d.ts.map +0 -1
  101. package/lib/typescript/devtools/useConsoleController.d.ts.map +0 -1
  102. package/lib/typescript/devtools/useConsoleMessages.d.ts.map +0 -1
  103. package/lib/typescript/hooks/useConsoleLogs.d.ts.map +0 -1
  104. package/lib/typescript/index.d.ts.map +0 -1
  105. package/lib/typescript/preset.d.ts.map +0 -1
  106. package/lib/typescript/store/consoleLogStore.d.ts.map +0 -1
  107. package/lib/typescript/store/sanitize.d.ts.map +0 -1
  108. package/lib/typescript/sync/consoleSyncAdapter.d.ts.map +0 -1
@@ -1,82 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useConsoleController = useConsoleController;
7
- var _react = require("react");
8
- var _useConsoleMessages = require("./useConsoleMessages");
9
- var _consoleFilter = require("./consoleFilter");
10
- var _consoleLogStore = require("../store/consoleLogStore");
11
- /**
12
- * useConsoleController — owns all Console view state so the header and the body
13
- * can be composed separately (the shared ModalHeader pattern: controls live in
14
- * the modal header's `customContent`, the list/sub-views live in the body).
15
- */
16
-
17
- /** Which screen the modal body shows (list, or the back-navigable filters page). */
18
-
19
- function useConsoleController() {
20
- const [query, setQuery] = (0, _react.useState)("");
21
- const [searchActive, setSearchActive] = (0, _react.useState)(false);
22
- const [levelsMask, setLevelsMask] = (0, _react.useState)({
23
- ..._consoleFilter.DEFAULT_LEVELS
24
- });
25
- const [showTimestamps, setShowTimestamps] = (0, _react.useState)(false);
26
- const [collapsedOverrides, setCollapsedOverrides] = (0, _react.useState)({});
27
- const [layoutMode, setLayoutMode] = (0, _react.useState)("chrono");
28
- const [view, setView] = (0, _react.useState)("list");
29
- const [clusterExpanded, setClusterExpanded] = (0, _react.useState)({});
30
- const {
31
- rows,
32
- hiddenCount
33
- } = (0, _useConsoleMessages.useConsoleMessages)({
34
- levelsMask,
35
- query,
36
- showTimestamps,
37
- collapsedOverrides,
38
- groupDimension: "function",
39
- layoutMode,
40
- clusterExpanded
41
- });
42
- const onToggleGroup = (0, _react.useCallback)((groupId, currentlyCollapsed) => {
43
- setCollapsedOverrides(prev => ({
44
- ...prev,
45
- [groupId]: !currentlyCollapsed
46
- }));
47
- }, []);
48
- const onToggleCluster = (0, _react.useCallback)(key => {
49
- setClusterExpanded(prev => ({
50
- ...prev,
51
- [key]: !(prev[key] ?? false)
52
- }));
53
- }, []);
54
- const clear = (0, _react.useCallback)(() => {
55
- (0, _consoleLogStore.clearEntries)();
56
- setCollapsedOverrides({});
57
- }, []);
58
- const levelSummary = (0, _consoleFilter.levelMenuSummary)(levelsMask);
59
- const isLevelCustom = levelSummary !== "All levels" && levelSummary !== "Default levels";
60
- return {
61
- query,
62
- setQuery,
63
- searchActive,
64
- setSearchActive,
65
- levelsMask,
66
- setLevelsMask,
67
- showTimestamps,
68
- setShowTimestamps,
69
- layoutMode,
70
- setLayoutMode,
71
- view,
72
- setView,
73
- rows,
74
- hiddenCount,
75
- onToggleGroup,
76
- onToggleCluster,
77
- clear,
78
- levelSummary,
79
- isLevelCustom
80
- };
81
- }
82
- //# sourceMappingURL=useConsoleController.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useConsoleController=useConsoleController;var _react=require("react");var _useConsoleMessages=require("./useConsoleMessages");var _consoleFilter=require("./consoleFilter");var _consoleLogStore=require("../store/consoleLogStore");function useConsoleController(){const[l,u]=(0,_react.useState)("");const[c,i]=(0,_react.useState)(false);const[t,v]=(0,_react.useState)({..._consoleFilter.DEFAULT_LEVELS});const[r,C]=(0,_react.useState)(false);const[S,a]=(0,_react.useState)({});const[n,d]=(0,_react.useState)("chrono");const[g,m]=(0,_react.useState)("list");const[p,M]=(0,_react.useState)({});const{rows:L,hiddenCount:f}=(0,_useConsoleMessages.useConsoleMessages)({levelsMask:t,query:l,showTimestamps:r,collapsedOverrides:S,groupDimension:"function",layoutMode:n,clusterExpanded:p});const _=(0,_react.useCallback)((e,s)=>{a(q=>({...q,[e]:!s}))},[]);const h=(0,_react.useCallback)(e=>{M(s=>({...s,[e]:!(s[e]??false)}))},[]);const y=(0,_react.useCallback)(()=>{(0,_consoleLogStore.clearEntries)();a({})},[]);const o=(0,_consoleFilter.levelMenuSummary)(t);const E=o!=="All levels"&&o!=="Default levels";return{query:l,setQuery:u,searchActive:c,setSearchActive:i,levelsMask:t,setLevelsMask:v,showTimestamps:r,setShowTimestamps:C,layoutMode:n,setLayoutMode:d,view:g,setView:m,rows:L,hiddenCount:f,onToggleGroup:_,onToggleCluster:h,clear:y,levelSummary:o,isLevelCustom:E}}
@@ -1,241 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useConsoleMessages = useConsoleMessages;
7
- var _react = require("react");
8
- var _consoleLogStore = require("../store/consoleLogStore");
9
- var _consoleFilter = require("./consoleFilter");
10
- var _origin = require("./origin");
11
- /**
12
- * useConsoleMessages — derives the displayed row model from raw captured
13
- * entries, mirroring DevTools `ConsoleView.updateMessageList`:
14
- *
15
- * - level + text filtering (consoleFilter)
16
- * - consecutive-identical collapse into a repeat-count badge (when timestamps
17
- * are off, matching `tryToCollapseMessages`)
18
- * - console.group / groupCollapsed nesting + collapse/expand
19
- *
20
- * Returns the visible rows plus the count of messages hidden by filters
21
- * ("N hidden"), and per-level totals for the toolbar.
22
- */
23
-
24
- /** How the origin gutter is laid out. */
25
-
26
- /** One swimlane gutter cell. */
27
-
28
- const MAX_LANES = 5;
29
-
30
- /** Grouped mode collapses any source cluster larger than this into a header. */
31
- const CLUSTER_THRESHOLD = 5;
32
-
33
- /** First pass: tag each row with its origin source key, color, and label. */
34
- function computeSourceInfo(rows, dim) {
35
- for (const row of rows) {
36
- const key = (0, _origin.sourceKey)(row.entry.origin, dim);
37
- row.sourceKey = key;
38
- row.originColor = key ? (0, _origin.colorForKey)(key) : undefined;
39
- row.originLabel = dim === "off" ? undefined : (0, _origin.sourceLabel)(row.entry.origin, dim);
40
- }
41
- }
42
-
43
- /** lnav single-column gutter: bracket consecutive same-source runs. */
44
- function attachContiguousBrackets(rows) {
45
- for (let i = 0; i < rows.length; i++) {
46
- const key = rows[i].sourceKey;
47
- if (key == null) {
48
- rows[i].bracketGlyph = undefined;
49
- continue;
50
- }
51
- const sameAsPrev = i > 0 && rows[i - 1].sourceKey === key;
52
- const sameAsNext = i < rows.length - 1 && rows[i + 1].sourceKey === key;
53
- const bracket = !sameAsPrev && !sameAsNext ? "single" : !sameAsPrev ? "top" : !sameAsNext ? "bottom" : "mid";
54
- rows[i].bracketGlyph = (0, _origin.bracketGlyph)(bracket);
55
- }
56
- }
57
-
58
- /**
59
- * Re-order rows so all rows of one source are contiguous (groups ordered by
60
- * first appearance, chronological within each). Clusters larger than
61
- * CLUSTER_THRESHOLD collapse into a single expandable header (Chrome-style),
62
- * unless the user has expanded that cluster.
63
- */
64
- function clusterRows(rows, expanded) {
65
- const order = [];
66
- const groups = new Map();
67
- for (const r of rows) {
68
- const k = r.sourceKey ?? "—";
69
- let g = groups.get(k);
70
- if (!g) {
71
- g = [];
72
- groups.set(k, g);
73
- order.push(k);
74
- }
75
- g.push(r);
76
- }
77
- const out = [];
78
- for (const k of order) {
79
- const group = groups.get(k);
80
- for (const r of group) r.depth = 0; // clustering ignores console.group nesting
81
-
82
- const isLarge = group.length > CLUSTER_THRESHOLD;
83
- const isExpanded = expanded[k] ?? false;
84
- if (isLarge) {
85
- out.push({
86
- key: `cluster:${k}`,
87
- entry: group[0].entry,
88
- depth: 0,
89
- repeatCount: 1,
90
- isGroupHeader: false,
91
- sourceKey: k,
92
- originColor: group[0].originColor,
93
- originLabel: group[0].originLabel,
94
- clusterHeader: {
95
- key: k,
96
- count: group.length,
97
- expanded: isExpanded
98
- }
99
- });
100
- if (!isExpanded) continue;
101
- }
102
- group.forEach((r, i) => {
103
- const single = group.length === 1;
104
- const bracket = single ? "single" : i === 0 ? "top" : i === group.length - 1 ? "bottom" : "mid";
105
- r.bracketGlyph = (0, _origin.bracketGlyph)(bracket);
106
- out.push(r);
107
- });
108
- }
109
- return out;
110
- }
111
-
112
- /** Git-graph swimlanes: each source gets a continuous vertical track so its
113
- * line stays unbroken when other sources interrupt it. */
114
- function attachSwimlanes(rows) {
115
- const first = new Map();
116
- const last = new Map();
117
- rows.forEach((r, i) => {
118
- const k = r.sourceKey;
119
- if (k == null) return;
120
- if (!first.has(k)) first.set(k, i);
121
- last.set(k, i);
122
- });
123
-
124
- // Assign each source a lane, reusing a lane once its occupant's run ended.
125
- const sources = [...first.keys()].sort((a, b) => first.get(a) - first.get(b));
126
- const laneOf = new Map();
127
- const laneEnd = [];
128
- for (const s of sources) {
129
- let lane = laneEnd.findIndex(end => end < first.get(s));
130
- if (lane === -1) {
131
- lane = laneEnd.length < MAX_LANES ? laneEnd.length : MAX_LANES - 1;
132
- if (lane >= laneEnd.length) laneEnd.push(0);
133
- }
134
- laneOf.set(s, lane);
135
- laneEnd[lane] = Math.max(laneEnd[lane] ?? 0, last.get(s));
136
- }
137
- const laneCount = Math.max(1, Math.min(laneEnd.length, MAX_LANES));
138
- rows.forEach((r, i) => {
139
- const cells = Array.from({
140
- length: laneCount
141
- }, () => ({
142
- glyph: " "
143
- }));
144
- for (const s of sources) {
145
- const lane = laneOf.get(s);
146
- if (lane >= laneCount) continue;
147
- if (i >= first.get(s) && i <= last.get(s)) {
148
- cells[lane] = {
149
- glyph: r.sourceKey === s ? "●" : "│",
150
- color: (0, _origin.colorForKey)(s)
151
- };
152
- }
153
- }
154
- r.lanes = cells;
155
- });
156
- }
157
- const GROUP_STARTS = new Set(["group", "groupCollapsed"]);
158
- function buildDisplayRows(entries, opts) {
159
- const {
160
- levelsMask,
161
- query,
162
- showTimestamps,
163
- collapsedOverrides
164
- } = opts;
165
- const parsed = (0, _consoleFilter.parseFilterQuery)(query.trim());
166
- const rows = [];
167
- const levelCounts = {
168
- verbose: 0,
169
- info: 0,
170
- warning: 0,
171
- error: 0
172
- };
173
- let hiddenCount = 0;
174
- const stack = [];
175
- const anyAncestorCollapsed = () => stack.some(g => g.collapsed);
176
- for (const entry of entries) {
177
- levelCounts[entry.level]++;
178
- if (entry.method === "groupEnd") {
179
- stack.pop();
180
- continue;
181
- }
182
- const isHeader = GROUP_STARTS.has(entry.method);
183
- const hiddenByGroup = anyAncestorCollapsed();
184
- const passesFilter = (0, _consoleFilter.shouldBeVisible)(entry, levelsMask, parsed);
185
- if (!passesFilter) {
186
- hiddenCount++;
187
- } else if (!hiddenByGroup) {
188
- // Repeat-count collapse: only when timestamps are hidden and the previous
189
- // visible row is an identical, non-header message at the same depth.
190
- const prev = rows[rows.length - 1];
191
- if (!showTimestamps && !isHeader && prev && !prev.isGroupHeader && prev.depth === stack.length && prev.entry.method === entry.method && prev.entry.message === entry.message) {
192
- prev.repeatCount++;
193
- } else {
194
- rows.push({
195
- key: String(entry.id),
196
- entry,
197
- depth: stack.length,
198
- repeatCount: 1,
199
- isGroupHeader: isHeader,
200
- groupId: isHeader ? entry.id : undefined,
201
- groupCollapsed: undefined
202
- });
203
- }
204
- }
205
- if (isHeader) {
206
- const defaultCollapsed = entry.method === "groupCollapsed";
207
- const collapsed = collapsedOverrides[entry.id] ?? defaultCollapsed;
208
- // Record the collapse state on the just-pushed header row (if visible).
209
- const headerRow = rows[rows.length - 1];
210
- if (headerRow && headerRow.groupId === entry.id) {
211
- headerRow.groupCollapsed = collapsed;
212
- }
213
- stack.push({
214
- id: entry.id,
215
- collapsed: collapsed || hiddenByGroup
216
- });
217
- }
218
- }
219
- computeSourceInfo(rows, opts.groupDimension);
220
- let finalRows = rows;
221
- if (opts.groupDimension !== "off") {
222
- if (opts.layoutMode === "cluster") {
223
- finalRows = clusterRows(rows, opts.clusterExpanded);
224
- } else if (opts.layoutMode === "swimlane") {
225
- attachSwimlanes(rows);
226
- } else {
227
- attachContiguousBrackets(rows);
228
- }
229
- }
230
- return {
231
- rows: finalRows,
232
- hiddenCount,
233
- levelCounts,
234
- totalCount: entries.length
235
- };
236
- }
237
- function useConsoleMessages(opts) {
238
- const entries = (0, _react.useSyncExternalStore)(_consoleLogStore.subscribe, _consoleLogStore.getEntries, _consoleLogStore.getEntries);
239
- return (0, _react.useMemo)(() => buildDisplayRows(entries, opts), [entries, opts.levelsMask, opts.query, opts.showTimestamps, opts.collapsedOverrides, opts.groupDimension, opts.layoutMode, opts.clusterExpanded]);
240
- }
241
- //# sourceMappingURL=useConsoleMessages.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useConsoleMessages=useConsoleMessages;var _react=require("react");var _consoleLogStore=require("../store/consoleLogStore");var _consoleFilter=require("./consoleFilter");var _origin=require("./origin");const MAX_LANES=5;const CLUSTER_THRESHOLD=5;function computeSourceInfo(t,e){for(const r of t){const i=(0,_origin.sourceKey)(r.entry.origin,e);r.sourceKey=i;r.originColor=i?(0,_origin.colorForKey)(i):void 0;r.originLabel=e==="off"?void 0:(0,_origin.sourceLabel)(r.entry.origin,e)}}function attachContiguousBrackets(t){for(let e=0;e<t.length;e++){const r=t[e].sourceKey;if(r==null){t[e].bracketGlyph=void 0;continue}const i=e>0&&t[e-1].sourceKey===r;const d=e<t.length-1&&t[e+1].sourceKey===r;const n=!i&&!d?"single":!i?"top":!d?"bottom":"mid";t[e].bracketGlyph=(0,_origin.bracketGlyph)(n)}}function clusterRows(t,e){const r=[];const i=new Map;for(const n of t){const l=n.sourceKey??"\u2014";let o=i.get(l);if(!o){o=[];i.set(l,o);r.push(l)}o.push(n)}const d=[];for(const n of r){const l=i.get(n);for(const c of l)c.depth=0;const o=l.length>CLUSTER_THRESHOLD;const s=e[n]??false;if(o){d.push({key:`cluster:${n}`,entry:l[0].entry,depth:0,repeatCount:1,isGroupHeader:false,sourceKey:n,originColor:l[0].originColor,originLabel:l[0].originLabel,clusterHeader:{key:n,count:l.length,expanded:s}});if(!s)continue}l.forEach((c,u)=>{const f=l.length===1;const p=f?"single":u===0?"top":u===l.length-1?"bottom":"mid";c.bracketGlyph=(0,_origin.bracketGlyph)(p);d.push(c)})}return d}function attachSwimlanes(t){const e=new Map;const r=new Map;t.forEach((o,s)=>{const c=o.sourceKey;if(c==null)return;if(!e.has(c))e.set(c,s);r.set(c,s)});const i=[...e.keys()].sort((o,s)=>e.get(o)-e.get(s));const d=new Map;const n=[];for(const o of i){let s=n.findIndex(c=>c<e.get(o));if(s===-1){s=n.length<MAX_LANES?n.length:MAX_LANES-1;if(s>=n.length)n.push(0)}d.set(o,s);n[s]=Math.max(n[s]??0,r.get(o))}const l=Math.max(1,Math.min(n.length,MAX_LANES));t.forEach((o,s)=>{const c=Array.from({length:l},()=>({glyph:" "}));for(const u of i){const f=d.get(u);if(f>=l)continue;if(s>=e.get(u)&&s<=r.get(u)){c[f]={glyph:o.sourceKey===u?"\u25CF":"\u2502",color:(0,_origin.colorForKey)(u)}}}o.lanes=c})}const GROUP_STARTS=new Set(["group","groupCollapsed"]);function buildDisplayRows(t,e){const{levelsMask:r,query:i,showTimestamps:d,collapsedOverrides:n}=e;const l=(0,_consoleFilter.parseFilterQuery)(i.trim());const o=[];const s={verbose:0,info:0,warning:0,error:0};let c=0;const u=[];const f=()=>u.some(a=>a.collapsed);for(const a of t){s[a.level]++;if(a.method==="groupEnd"){u.pop();continue}const h=GROUP_STARTS.has(a.method);const m=f();const C=(0,_consoleFilter.shouldBeVisible)(a,r,l);if(!C){c++}else if(!m){const g=o[o.length-1];if(!d&&!h&&g&&!g.isGroupHeader&&g.depth===u.length&&g.entry.method===a.method&&g.entry.message===a.message){g.repeatCount++}else{o.push({key:String(a.id),entry:a,depth:u.length,repeatCount:1,isGroupHeader:h,groupId:h?a.id:void 0,groupCollapsed:void 0})}}if(h){const g=a.method==="groupCollapsed";const k=n[a.id]??g;const y=o[o.length-1];if(y&&y.groupId===a.id){y.groupCollapsed=k}u.push({id:a.id,collapsed:k||m})}}computeSourceInfo(o,e.groupDimension);let p=o;if(e.groupDimension!=="off"){if(e.layoutMode==="cluster"){p=clusterRows(o,e.clusterExpanded)}else if(e.layoutMode==="swimlane"){attachSwimlanes(o)}else{attachContiguousBrackets(o)}}return{rows:p,hiddenCount:c,levelCounts:s,totalCount:t.length}}function useConsoleMessages(t){const e=(0,_react.useSyncExternalStore)(_consoleLogStore.subscribe,_consoleLogStore.getEntries,_consoleLogStore.getEntries);return(0,_react.useMemo)(()=>buildDisplayRows(e,t),[e,t.levelsMask,t.query,t.showTimestamps,t.collapsedOverrides,t.groupDimension,t.layoutMode,t.clusterExpanded])}
@@ -1,23 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useConsoleLogs = useConsoleLogs;
7
- var _react = require("react");
8
- var _consoleLogStore = require("../store/consoleLogStore");
9
- /**
10
- * Subscribe to captured console logs. Installs the console interceptor on mount
11
- * (idempotent) and re-renders whenever a new entry is captured or the buffer is
12
- * cleared.
13
- */
14
- function useConsoleLogs() {
15
- (0, _react.useEffect)(() => {
16
- (0, _consoleLogStore.installConsoleCapture)();
17
- }, []);
18
- const logs = (0, _react.useSyncExternalStore)(_consoleLogStore.subscribe, _consoleLogStore.getEntries, _consoleLogStore.getEntries);
19
- return {
20
- logs
21
- };
22
- }
23
- //# sourceMappingURL=useConsoleLogs.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useConsoleLogs=useConsoleLogs;var _react=require("react");var _consoleLogStore=require("../store/consoleLogStore");function useConsoleLogs(){(0,_react.useEffect)(()=>{(0,_consoleLogStore.installConsoleCapture)()},[]);const e=(0,_react.useSyncExternalStore)(_consoleLogStore.subscribe,_consoleLogStore.getEntries,_consoleLogStore.getEntries);return{logs:e}}
@@ -1,181 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "CONSOLE_ICON_COLOR", {
7
- enumerable: true,
8
- get: function () {
9
- return _ConsoleIcon.CONSOLE_ICON_COLOR;
10
- }
11
- });
12
- Object.defineProperty(exports, "ConsoleIcon", {
13
- enumerable: true,
14
- get: function () {
15
- return _ConsoleIcon.ConsoleIcon;
16
- }
17
- });
18
- Object.defineProperty(exports, "ConsoleLogList", {
19
- enumerable: true,
20
- get: function () {
21
- return _ConsoleLogList.ConsoleLogList;
22
- }
23
- });
24
- Object.defineProperty(exports, "ConsoleMessageRow", {
25
- enumerable: true,
26
- get: function () {
27
- return _ConsoleMessageRow.ConsoleMessageRow;
28
- }
29
- });
30
- Object.defineProperty(exports, "ConsoleModal", {
31
- enumerable: true,
32
- get: function () {
33
- return _ConsoleModal.ConsoleModal;
34
- }
35
- });
36
- Object.defineProperty(exports, "ConsoleRoot", {
37
- enumerable: true,
38
- get: function () {
39
- return _ConsoleRoot.ConsoleRoot;
40
- }
41
- });
42
- Object.defineProperty(exports, "ConsoleValue", {
43
- enumerable: true,
44
- get: function () {
45
- return _ConsoleValue.ConsoleValue;
46
- }
47
- });
48
- Object.defineProperty(exports, "ConsoleView", {
49
- enumerable: true,
50
- get: function () {
51
- return _ConsoleView.ConsoleView;
52
- }
53
- });
54
- Object.defineProperty(exports, "clearEntries", {
55
- enumerable: true,
56
- get: function () {
57
- return _consoleLogStore.clearEntries;
58
- }
59
- });
60
- Object.defineProperty(exports, "consoleSyncAdapter", {
61
- enumerable: true,
62
- get: function () {
63
- return _consoleSyncAdapter.consoleSyncAdapter;
64
- }
65
- });
66
- Object.defineProperty(exports, "consoleTheme", {
67
- enumerable: true,
68
- get: function () {
69
- return _theme.consoleTheme;
70
- }
71
- });
72
- Object.defineProperty(exports, "consoleToolPreset", {
73
- enumerable: true,
74
- get: function () {
75
- return _preset.consoleToolPreset;
76
- }
77
- });
78
- Object.defineProperty(exports, "createConsoleTool", {
79
- enumerable: true,
80
- get: function () {
81
- return _preset.createConsoleTool;
82
- }
83
- });
84
- Object.defineProperty(exports, "getEntries", {
85
- enumerable: true,
86
- get: function () {
87
- return _consoleLogStore.getEntries;
88
- }
89
- });
90
- Object.defineProperty(exports, "getPreserveLog", {
91
- enumerable: true,
92
- get: function () {
93
- return _consoleLogStore.getPreserveLog;
94
- }
95
- });
96
- Object.defineProperty(exports, "initConsolePersistence", {
97
- enumerable: true,
98
- get: function () {
99
- return _consoleLogStore.initConsolePersistence;
100
- }
101
- });
102
- Object.defineProperty(exports, "installConsoleCapture", {
103
- enumerable: true,
104
- get: function () {
105
- return _consoleLogStore.installConsoleCapture;
106
- }
107
- });
108
- Object.defineProperty(exports, "installFatalErrorCapture", {
109
- enumerable: true,
110
- get: function () {
111
- return _consoleLogStore.installFatalErrorCapture;
112
- }
113
- });
114
- Object.defineProperty(exports, "levelStyles", {
115
- enumerable: true,
116
- get: function () {
117
- return _theme.levelStyles;
118
- }
119
- });
120
- Object.defineProperty(exports, "onClear", {
121
- enumerable: true,
122
- get: function () {
123
- return _consoleLogStore.onClear;
124
- }
125
- });
126
- Object.defineProperty(exports, "replaceEntries", {
127
- enumerable: true,
128
- get: function () {
129
- return _consoleLogStore.replaceEntries;
130
- }
131
- });
132
- Object.defineProperty(exports, "setPreserveLog", {
133
- enumerable: true,
134
- get: function () {
135
- return _consoleLogStore.setPreserveLog;
136
- }
137
- });
138
- Object.defineProperty(exports, "subscribe", {
139
- enumerable: true,
140
- get: function () {
141
- return _consoleLogStore.subscribe;
142
- }
143
- });
144
- Object.defineProperty(exports, "subscribePreserveLog", {
145
- enumerable: true,
146
- get: function () {
147
- return _consoleLogStore.subscribePreserveLog;
148
- }
149
- });
150
- Object.defineProperty(exports, "uninstallConsoleCapture", {
151
- enumerable: true,
152
- get: function () {
153
- return _consoleLogStore.uninstallConsoleCapture;
154
- }
155
- });
156
- Object.defineProperty(exports, "useConsoleLogs", {
157
- enumerable: true,
158
- get: function () {
159
- return _useConsoleLogs.useConsoleLogs;
160
- }
161
- });
162
- Object.defineProperty(exports, "useConsoleMessages", {
163
- enumerable: true,
164
- get: function () {
165
- return _useConsoleMessages.useConsoleMessages;
166
- }
167
- });
168
- var _preset = require("./preset");
169
- var _ConsoleRoot = require("./components/ConsoleRoot");
170
- var _ConsoleModal = require("./components/ConsoleModal");
171
- var _ConsoleIcon = require("./components/ConsoleIcon");
172
- var _ConsoleView = require("./devtools/ConsoleView");
173
- var _ConsoleMessageRow = require("./devtools/ConsoleMessageRow");
174
- var _ConsoleValue = require("./devtools/ConsoleValue");
175
- var _useConsoleMessages = require("./devtools/useConsoleMessages");
176
- var _theme = require("./devtools/theme");
177
- var _ConsoleLogList = require("./components/ConsoleLogList");
178
- var _useConsoleLogs = require("./hooks/useConsoleLogs");
179
- var _consoleSyncAdapter = require("./sync/consoleSyncAdapter");
180
- var _consoleLogStore = require("./store/consoleLogStore");
181
- //# sourceMappingURL=index.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"CONSOLE_ICON_COLOR",{enumerable:true,get:function(){return _ConsoleIcon.CONSOLE_ICON_COLOR}});Object.defineProperty(exports,"ConsoleIcon",{enumerable:true,get:function(){return _ConsoleIcon.ConsoleIcon}});Object.defineProperty(exports,"ConsoleLogList",{enumerable:true,get:function(){return _ConsoleLogList.ConsoleLogList}});Object.defineProperty(exports,"ConsoleMessageRow",{enumerable:true,get:function(){return _ConsoleMessageRow.ConsoleMessageRow}});Object.defineProperty(exports,"ConsoleModal",{enumerable:true,get:function(){return _ConsoleModal.ConsoleModal}});Object.defineProperty(exports,"ConsoleRoot",{enumerable:true,get:function(){return _ConsoleRoot.ConsoleRoot}});Object.defineProperty(exports,"ConsoleValue",{enumerable:true,get:function(){return _ConsoleValue.ConsoleValue}});Object.defineProperty(exports,"ConsoleView",{enumerable:true,get:function(){return _ConsoleView.ConsoleView}});Object.defineProperty(exports,"clearEntries",{enumerable:true,get:function(){return _consoleLogStore.clearEntries}});Object.defineProperty(exports,"consoleSyncAdapter",{enumerable:true,get:function(){return _consoleSyncAdapter.consoleSyncAdapter}});Object.defineProperty(exports,"consoleTheme",{enumerable:true,get:function(){return _theme.consoleTheme}});Object.defineProperty(exports,"consoleToolPreset",{enumerable:true,get:function(){return _preset.consoleToolPreset}});Object.defineProperty(exports,"createConsoleTool",{enumerable:true,get:function(){return _preset.createConsoleTool}});Object.defineProperty(exports,"getEntries",{enumerable:true,get:function(){return _consoleLogStore.getEntries}});Object.defineProperty(exports,"getPreserveLog",{enumerable:true,get:function(){return _consoleLogStore.getPreserveLog}});Object.defineProperty(exports,"initConsolePersistence",{enumerable:true,get:function(){return _consoleLogStore.initConsolePersistence}});Object.defineProperty(exports,"installConsoleCapture",{enumerable:true,get:function(){return _consoleLogStore.installConsoleCapture}});Object.defineProperty(exports,"installFatalErrorCapture",{enumerable:true,get:function(){return _consoleLogStore.installFatalErrorCapture}});Object.defineProperty(exports,"levelStyles",{enumerable:true,get:function(){return _theme.levelStyles}});Object.defineProperty(exports,"onClear",{enumerable:true,get:function(){return _consoleLogStore.onClear}});Object.defineProperty(exports,"replaceEntries",{enumerable:true,get:function(){return _consoleLogStore.replaceEntries}});Object.defineProperty(exports,"setPreserveLog",{enumerable:true,get:function(){return _consoleLogStore.setPreserveLog}});Object.defineProperty(exports,"subscribe",{enumerable:true,get:function(){return _consoleLogStore.subscribe}});Object.defineProperty(exports,"subscribePreserveLog",{enumerable:true,get:function(){return _consoleLogStore.subscribePreserveLog}});Object.defineProperty(exports,"uninstallConsoleCapture",{enumerable:true,get:function(){return _consoleLogStore.uninstallConsoleCapture}});Object.defineProperty(exports,"useConsoleLogs",{enumerable:true,get:function(){return _useConsoleLogs.useConsoleLogs}});Object.defineProperty(exports,"useConsoleMessages",{enumerable:true,get:function(){return _useConsoleMessages.useConsoleMessages}});var _preset=require("./preset");var _ConsoleRoot=require("./components/ConsoleRoot");var _ConsoleModal=require("./components/ConsoleModal");var _ConsoleIcon=require("./components/ConsoleIcon");var _ConsoleView=require("./devtools/ConsoleView");var _ConsoleMessageRow=require("./devtools/ConsoleMessageRow");var _ConsoleValue=require("./devtools/ConsoleValue");var _useConsoleMessages=require("./devtools/useConsoleMessages");var _theme=require("./devtools/theme");var _ConsoleLogList=require("./components/ConsoleLogList");var _useConsoleLogs=require("./hooks/useConsoleLogs");var _consoleSyncAdapter=require("./sync/consoleSyncAdapter");var _consoleLogStore=require("./store/consoleLogStore");
@@ -1,63 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.createConsoleTool = exports.consoleToolPreset = void 0;
7
- var _ConsoleIcon = require("./components/ConsoleIcon");
8
- var _ConsoleModal = require("./components/ConsoleModal");
9
- var _consoleLogStore = require("./store/consoleLogStore");
10
- var _sharedUi = require("@buoy-gg/shared-ui");
11
- var _jsxRuntime = require("react/jsx-runtime");
12
- /**
13
- * Pre-configured Console tool for FloatingDevTools.
14
- *
15
- * @example
16
- * ```tsx
17
- * import { consoleToolPreset } from '@buoy-gg/console';
18
- *
19
- * <FloatingDevTools apps={[consoleToolPreset]} />
20
- * ```
21
- */
22
-
23
- /**
24
- * Install console + fatal-error capture at IMPORT time, not first UI mount.
25
- *
26
- * Deliberately a module side effect (same pattern as @buoy-gg/network's
27
- * override hydration): a fatal error thrown during the app's FIRST render
28
- * kills the tree before FloatingDevTools' effects ever run, so mount-time
29
- * install (`ConsoleRoot`) captured nothing for exactly the crashes that most
30
- * need capturing. Importing the preset happens at bundle-eval, before any
31
- * rendering, so the `console.*` patch and both fatal-error hooks (`ErrorUtils`
32
- * and RN's native exception listener) are live from the first line of app code.
33
- *
34
- * Guards:
35
- * - `ErrorUtils` OR `RN$registerExceptionListener` present = a real React Native
36
- * runtime. The desktop dashboard and web mirrors import this package too, and
37
- * must never patch their OWN console (they mirror device entries via
38
- * `replaceEntries`).
39
- * - Dev-only. In production the existing mount-time path still applies (the
40
- * tools only mount there for licensed users), so end-user builds are never
41
- * patched at import.
42
- */const rnGlobals = globalThis;
43
- const isReactNativeRuntime = typeof rnGlobals.ErrorUtils?.setGlobalHandler === "function" || typeof rnGlobals.RN$registerExceptionListener === "function";
44
- if (isReactNativeRuntime && typeof __DEV__ !== "undefined" && __DEV__) {
45
- (0, _consoleLogStore.installConsoleCapture)();
46
- }
47
- const consoleToolPreset = exports.consoleToolPreset = (0, _sharedUi.defineToolPreset)({
48
- id: "console",
49
- name: "CONSOLE",
50
- description: "Captured console.* output",
51
- slot: "both",
52
- color: _ConsoleIcon.CONSOLE_ICON_COLOR,
53
- icon: ({
54
- size
55
- }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_ConsoleIcon.ConsoleIcon, {
56
- size: size
57
- }),
58
- component: _ConsoleModal.ConsoleModal
59
- });
60
-
61
- /** Create a custom Console tool configuration. */
62
- const createConsoleTool = exports.createConsoleTool = (0, _sharedUi.createToolFactory)(consoleToolPreset);
63
- //# sourceMappingURL=preset.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.createConsoleTool=exports.consoleToolPreset=void 0;var _ConsoleIcon=require("./components/ConsoleIcon");var _ConsoleModal=require("./components/ConsoleModal");var _consoleLogStore=require("./store/consoleLogStore");var _sharedUi=require("@buoy-gg/shared-ui");var _jsxRuntime=require("react/jsx-runtime");const rnGlobals=globalThis;const isReactNativeRuntime=typeof rnGlobals.ErrorUtils?.setGlobalHandler==="function"||typeof rnGlobals.RN$registerExceptionListener==="function";if(isReactNativeRuntime&&typeof __DEV__!=="undefined"&&__DEV__){(0,_consoleLogStore.installConsoleCapture)()}const consoleToolPreset=exports.consoleToolPreset=(0,_sharedUi.defineToolPreset)({id:"console",name:"CONSOLE",description:"Captured console.* output",slot:"both",color:_ConsoleIcon.CONSOLE_ICON_COLOR,icon:({size:o})=>(0,_jsxRuntime.jsx)(_ConsoleIcon.ConsoleIcon,{size:o}),component:_ConsoleModal.ConsoleModal});const createConsoleTool=exports.createConsoleTool=(0,_sharedUi.createToolFactory)(consoleToolPreset);