@buoy-gg/shared-ui 7.0.33 → 7.0.34
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/lib/commonjs/JsModal.js +57 -22
- package/lib/commonjs/hooks/index.js +26 -0
- package/lib/commonjs/hooks/safe-area-impl.js +1 -1
- package/lib/commonjs/hooks/useChangeLog.js +55 -0
- package/lib/commonjs/hooks/useEventStoreEvents.js +65 -0
- package/lib/commonjs/hooks/usePersistedState.js +45 -10
- package/lib/commonjs/index.js +143 -0
- package/lib/commonjs/storage/definePersistedSetting.js +67 -0
- package/lib/commonjs/storage/index.js +8 -1
- package/lib/commonjs/stores/ChangeLog.js +197 -0
- package/lib/commonjs/stores/createToolStore.js +175 -0
- package/lib/commonjs/stores/index.js +15 -1
- package/lib/commonjs/sync/toolSyncAdapter.js +63 -0
- package/lib/commonjs/sync/wireForm.js +172 -0
- package/lib/commonjs/tools/defineTool.js +79 -0
- package/lib/commonjs/ui/components/ChangeRow.js +110 -0
- package/lib/commonjs/ui/components/ChipStrip.js +94 -0
- package/lib/commonjs/ui/components/DetailViewToggle.js +130 -0
- package/lib/commonjs/ui/components/DevToolsCard.js +3 -1
- package/lib/commonjs/ui/components/EntityFilterView.js +354 -0
- package/lib/commonjs/ui/components/ExportPreview.js +174 -0
- package/lib/commonjs/ui/components/InfoRow.js +90 -0
- package/lib/commonjs/ui/components/ModalHeader.js +40 -7
- package/lib/commonjs/ui/components/Pill.js +114 -0
- package/lib/commonjs/ui/components/ToggleRow.js +116 -0
- package/lib/commonjs/ui/components/ToolFooter.js +204 -0
- package/lib/commonjs/ui/components/index.js +100 -1
- package/lib/commonjs/ui/index.js +24 -2
- package/lib/commonjs/ui/listPresets.js +43 -0
- package/lib/commonjs/ui/night/primitives.js +3 -1
- package/lib/commonjs/utils/snapshotProviderKit.js +167 -0
- package/lib/commonjs/utils/stateTools.js +160 -0
- package/lib/module/JsModal.js +57 -22
- package/lib/module/hooks/index.js +3 -1
- package/lib/module/hooks/safe-area-impl.js +1 -1
- package/lib/module/hooks/useChangeLog.js +50 -0
- package/lib/module/hooks/useEventStoreEvents.js +61 -0
- package/lib/module/hooks/usePersistedState.js +44 -10
- package/lib/module/index.js +11 -1
- package/lib/module/storage/definePersistedSetting.js +63 -0
- package/lib/module/storage/index.js +2 -1
- package/lib/module/stores/ChangeLog.js +192 -0
- package/lib/module/stores/createToolStore.js +171 -0
- package/lib/module/stores/index.js +3 -1
- package/lib/module/sync/toolSyncAdapter.js +58 -0
- package/lib/module/sync/wireForm.js +159 -0
- package/lib/module/tools/defineTool.js +74 -0
- package/lib/module/ui/components/ChangeRow.js +105 -0
- package/lib/module/ui/components/ChipStrip.js +91 -0
- package/lib/module/ui/components/DetailViewToggle.js +125 -0
- package/lib/module/ui/components/DevToolsCard.js +3 -1
- package/lib/module/ui/components/EntityFilterView.js +350 -0
- package/lib/module/ui/components/ExportPreview.js +169 -0
- package/lib/module/ui/components/InfoRow.js +86 -0
- package/lib/module/ui/components/ModalHeader.js +40 -7
- package/lib/module/ui/components/Pill.js +110 -0
- package/lib/module/ui/components/ToggleRow.js +112 -0
- package/lib/module/ui/components/ToolFooter.js +196 -0
- package/lib/module/ui/components/index.js +10 -1
- package/lib/module/ui/index.js +4 -1
- package/lib/module/ui/listPresets.js +39 -0
- package/lib/module/ui/night/primitives.js +3 -1
- package/lib/module/utils/snapshotProviderKit.js +156 -0
- package/lib/module/utils/stateTools.js +154 -0
- package/lib/typescript/commonjs/JsModal.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/index.d.ts +3 -1
- package/lib/typescript/commonjs/hooks/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
- package/lib/typescript/commonjs/hooks/useChangeLog.d.ts +38 -0
- package/lib/typescript/commonjs/hooks/useChangeLog.d.ts.map +1 -0
- package/lib/typescript/commonjs/hooks/useEventStoreEvents.d.ts +25 -0
- package/lib/typescript/commonjs/hooks/useEventStoreEvents.d.ts.map +1 -0
- package/lib/typescript/commonjs/hooks/usePersistedState.d.ts +34 -5
- package/lib/typescript/commonjs/hooks/usePersistedState.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +6 -1
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/storage/definePersistedSetting.d.ts +39 -0
- package/lib/typescript/commonjs/storage/definePersistedSetting.d.ts.map +1 -0
- package/lib/typescript/commonjs/storage/index.d.ts +1 -0
- package/lib/typescript/commonjs/storage/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/stores/ChangeLog.d.ts +100 -0
- package/lib/typescript/commonjs/stores/ChangeLog.d.ts.map +1 -0
- package/lib/typescript/commonjs/stores/createToolStore.d.ts +92 -0
- package/lib/typescript/commonjs/stores/createToolStore.d.ts.map +1 -0
- package/lib/typescript/commonjs/stores/index.d.ts +2 -0
- package/lib/typescript/commonjs/stores/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/sync/toolSyncAdapter.d.ts +66 -0
- package/lib/typescript/commonjs/sync/toolSyncAdapter.d.ts.map +1 -0
- package/lib/typescript/commonjs/sync/wireForm.d.ts +100 -0
- package/lib/typescript/commonjs/sync/wireForm.d.ts.map +1 -0
- package/lib/typescript/commonjs/tools/defineTool.d.ts +100 -0
- package/lib/typescript/commonjs/tools/defineTool.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/ChangeRow.d.ts +52 -0
- package/lib/typescript/commonjs/ui/components/ChangeRow.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/ChipStrip.d.ts +41 -0
- package/lib/typescript/commonjs/ui/components/ChipStrip.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/DetailViewToggle.d.ts +36 -0
- package/lib/typescript/commonjs/ui/components/DetailViewToggle.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/DevToolsCard.d.ts +8 -1
- package/lib/typescript/commonjs/ui/components/DevToolsCard.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/EntityFilterView.d.ts +51 -0
- package/lib/typescript/commonjs/ui/components/EntityFilterView.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/ExportPreview.d.ts +48 -0
- package/lib/typescript/commonjs/ui/components/ExportPreview.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/InfoRow.d.ts +33 -0
- package/lib/typescript/commonjs/ui/components/InfoRow.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/ModalHeader.d.ts +31 -1
- package/lib/typescript/commonjs/ui/components/ModalHeader.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/Pill.d.ts +38 -0
- package/lib/typescript/commonjs/ui/components/Pill.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/ToggleRow.d.ts +33 -0
- package/lib/typescript/commonjs/ui/components/ToggleRow.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/ToolFooter.d.ts +69 -0
- package/lib/typescript/commonjs/ui/components/ToolFooter.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/index.d.ts +9 -0
- package/lib/typescript/commonjs/ui/components/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/index.d.ts +1 -0
- package/lib/typescript/commonjs/ui/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/listPresets.d.ts +28 -0
- package/lib/typescript/commonjs/ui/listPresets.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/night/primitives.d.ts +3 -1
- package/lib/typescript/commonjs/ui/night/primitives.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/snapshotProviderKit.d.ts +81 -0
- package/lib/typescript/commonjs/utils/snapshotProviderKit.d.ts.map +1 -0
- package/lib/typescript/commonjs/utils/stateTools.d.ts +44 -0
- package/lib/typescript/commonjs/utils/stateTools.d.ts.map +1 -0
- package/lib/typescript/module/JsModal.d.ts.map +1 -1
- package/lib/typescript/module/hooks/index.d.ts +3 -1
- package/lib/typescript/module/hooks/index.d.ts.map +1 -1
- package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
- package/lib/typescript/module/hooks/useChangeLog.d.ts +38 -0
- package/lib/typescript/module/hooks/useChangeLog.d.ts.map +1 -0
- package/lib/typescript/module/hooks/useEventStoreEvents.d.ts +25 -0
- package/lib/typescript/module/hooks/useEventStoreEvents.d.ts.map +1 -0
- package/lib/typescript/module/hooks/usePersistedState.d.ts +34 -5
- package/lib/typescript/module/hooks/usePersistedState.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +6 -1
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/storage/definePersistedSetting.d.ts +39 -0
- package/lib/typescript/module/storage/definePersistedSetting.d.ts.map +1 -0
- package/lib/typescript/module/storage/index.d.ts +1 -0
- package/lib/typescript/module/storage/index.d.ts.map +1 -1
- package/lib/typescript/module/stores/ChangeLog.d.ts +100 -0
- package/lib/typescript/module/stores/ChangeLog.d.ts.map +1 -0
- package/lib/typescript/module/stores/createToolStore.d.ts +92 -0
- package/lib/typescript/module/stores/createToolStore.d.ts.map +1 -0
- package/lib/typescript/module/stores/index.d.ts +2 -0
- package/lib/typescript/module/stores/index.d.ts.map +1 -1
- package/lib/typescript/module/sync/toolSyncAdapter.d.ts +66 -0
- package/lib/typescript/module/sync/toolSyncAdapter.d.ts.map +1 -0
- package/lib/typescript/module/sync/wireForm.d.ts +100 -0
- package/lib/typescript/module/sync/wireForm.d.ts.map +1 -0
- package/lib/typescript/module/tools/defineTool.d.ts +100 -0
- package/lib/typescript/module/tools/defineTool.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/ChangeRow.d.ts +52 -0
- package/lib/typescript/module/ui/components/ChangeRow.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/ChipStrip.d.ts +41 -0
- package/lib/typescript/module/ui/components/ChipStrip.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/DetailViewToggle.d.ts +36 -0
- package/lib/typescript/module/ui/components/DetailViewToggle.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/DevToolsCard.d.ts +8 -1
- package/lib/typescript/module/ui/components/DevToolsCard.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/EntityFilterView.d.ts +51 -0
- package/lib/typescript/module/ui/components/EntityFilterView.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/ExportPreview.d.ts +48 -0
- package/lib/typescript/module/ui/components/ExportPreview.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/InfoRow.d.ts +33 -0
- package/lib/typescript/module/ui/components/InfoRow.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/ModalHeader.d.ts +31 -1
- package/lib/typescript/module/ui/components/ModalHeader.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/Pill.d.ts +38 -0
- package/lib/typescript/module/ui/components/Pill.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/ToggleRow.d.ts +33 -0
- package/lib/typescript/module/ui/components/ToggleRow.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/ToolFooter.d.ts +69 -0
- package/lib/typescript/module/ui/components/ToolFooter.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/index.d.ts +9 -0
- package/lib/typescript/module/ui/components/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/index.d.ts +1 -0
- package/lib/typescript/module/ui/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/listPresets.d.ts +28 -0
- package/lib/typescript/module/ui/listPresets.d.ts.map +1 -0
- package/lib/typescript/module/ui/night/primitives.d.ts +3 -1
- package/lib/typescript/module/ui/night/primitives.d.ts.map +1 -1
- package/lib/typescript/module/utils/snapshotProviderKit.d.ts +81 -0
- package/lib/typescript/module/utils/snapshotProviderKit.d.ts.map +1 -0
- package/lib/typescript/module/utils/stateTools.d.ts +44 -0
- package/lib/typescript/module/utils/stateTools.d.ts.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* stateTools — helpers the state tools (redux / zustand / jotai) each carried
|
|
5
|
+
* a private copy of. Pure functions; no React, no RN.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// ============================================
|
|
9
|
+
// Entity color
|
|
10
|
+
// ============================================
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Consistent color for a named entity (a zustand store, a jotai atom, a redux
|
|
14
|
+
* slice). Exact match on `known` wins, then a substring match, then a stable
|
|
15
|
+
* HSL hash of the name rendered as `#rrggbb` so the "color + alpha hex"
|
|
16
|
+
* pattern works everywhere.
|
|
17
|
+
*/
|
|
18
|
+
export function entityColor(name, known = {}) {
|
|
19
|
+
const lower = name.toLowerCase();
|
|
20
|
+
if (known[lower]) return known[lower];
|
|
21
|
+
for (const [key, color] of Object.entries(known)) {
|
|
22
|
+
if (lower.includes(key)) return color;
|
|
23
|
+
}
|
|
24
|
+
const hash = name.split("").reduce((acc, char) => acc + char.charCodeAt(0), 0);
|
|
25
|
+
const hue = hash * 137 % 360;
|
|
26
|
+
const s = 0.7;
|
|
27
|
+
const l = 0.6;
|
|
28
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
29
|
+
const x = c * (1 - Math.abs(hue / 60 % 2 - 1));
|
|
30
|
+
const m = l - c / 2;
|
|
31
|
+
let r = 0;
|
|
32
|
+
let g = 0;
|
|
33
|
+
let b = 0;
|
|
34
|
+
if (hue < 60) {
|
|
35
|
+
r = c;
|
|
36
|
+
g = x;
|
|
37
|
+
} else if (hue < 120) {
|
|
38
|
+
r = x;
|
|
39
|
+
g = c;
|
|
40
|
+
} else if (hue < 180) {
|
|
41
|
+
g = c;
|
|
42
|
+
b = x;
|
|
43
|
+
} else if (hue < 240) {
|
|
44
|
+
g = x;
|
|
45
|
+
b = c;
|
|
46
|
+
} else if (hue < 300) {
|
|
47
|
+
r = x;
|
|
48
|
+
b = c;
|
|
49
|
+
} else {
|
|
50
|
+
r = c;
|
|
51
|
+
b = x;
|
|
52
|
+
}
|
|
53
|
+
const toHex = v => Math.round((v + m) * 255).toString(16).padStart(2, "0");
|
|
54
|
+
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ============================================
|
|
58
|
+
// Value preview
|
|
59
|
+
// ============================================
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* One-line preview of an arbitrary value for a list row: strings quoted and
|
|
63
|
+
* truncated, arrays and objects stringified when short, otherwise collapsed
|
|
64
|
+
* to `[N items]` / `{ N keys }`. Never throws.
|
|
65
|
+
*/
|
|
66
|
+
export function formatValuePreview(value, options = {}) {
|
|
67
|
+
const maxLength = options.maxLength ?? 40;
|
|
68
|
+
if (value === undefined) return options.undefinedLabel ?? "undefined";
|
|
69
|
+
if (value === null) return "null";
|
|
70
|
+
try {
|
|
71
|
+
if (typeof value === "function") return options.functionLabel ?? "(fn)";
|
|
72
|
+
if (typeof value === "string") {
|
|
73
|
+
return value.length > maxLength ? `"${value.slice(0, maxLength - 3)}..."` : `"${value}"`;
|
|
74
|
+
}
|
|
75
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
76
|
+
return String(value);
|
|
77
|
+
}
|
|
78
|
+
if (Array.isArray(value)) {
|
|
79
|
+
if (value.length === 0) return "[]";
|
|
80
|
+
const preview = JSON.stringify(value);
|
|
81
|
+
return preview.length > maxLength ? `[${value.length} items]` : preview;
|
|
82
|
+
}
|
|
83
|
+
if (typeof value === "object") {
|
|
84
|
+
const keys = Object.keys(value);
|
|
85
|
+
if (keys.length === 0) return "{}";
|
|
86
|
+
const preview = JSON.stringify(value);
|
|
87
|
+
if (preview.length <= maxLength) return preview;
|
|
88
|
+
return `{ ${keys.length} keys }`;
|
|
89
|
+
}
|
|
90
|
+
return String(value).slice(0, maxLength);
|
|
91
|
+
} catch {
|
|
92
|
+
return "[complex]";
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ============================================
|
|
97
|
+
// Shallow diff summary
|
|
98
|
+
// ============================================
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Top-level, reference-equality diff between two states. Enough for a list
|
|
102
|
+
* row ("+1 ~2 keys"); the detail view runs the real tree diff.
|
|
103
|
+
*
|
|
104
|
+
* A state object that was REPLACED without any top-level value moving —
|
|
105
|
+
* exactly what zustand's persist middleware does when it rehydrates — is
|
|
106
|
+
* reported as `"nested change"` with no keys, never as one changed key with
|
|
107
|
+
* none named.
|
|
108
|
+
*/
|
|
109
|
+
export function shallowDiffSummary(prev, next) {
|
|
110
|
+
if (prev === next) {
|
|
111
|
+
return {
|
|
112
|
+
summary: "no change",
|
|
113
|
+
changedKeys: [],
|
|
114
|
+
changedCount: 0
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
if (typeof prev !== "object" || typeof next !== "object" || prev === null || next === null) {
|
|
118
|
+
return {
|
|
119
|
+
summary: "changed",
|
|
120
|
+
changedKeys: [],
|
|
121
|
+
changedCount: 0
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const prevRecord = prev;
|
|
125
|
+
const nextRecord = next;
|
|
126
|
+
const prevKeys = Object.keys(prevRecord);
|
|
127
|
+
const nextKeys = Object.keys(nextRecord);
|
|
128
|
+
const added = nextKeys.filter(k => !prevKeys.includes(k));
|
|
129
|
+
const removed = prevKeys.filter(k => !nextKeys.includes(k));
|
|
130
|
+
const changed = [];
|
|
131
|
+
for (const key of prevKeys) {
|
|
132
|
+
if (nextKeys.includes(key) && prevRecord[key] !== nextRecord[key]) {
|
|
133
|
+
changed.push(key);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const changedKeys = [...added, ...removed, ...changed];
|
|
137
|
+
const parts = [];
|
|
138
|
+
if (added.length > 0) parts.push(`+${added.length}`);
|
|
139
|
+
if (removed.length > 0) parts.push(`-${removed.length}`);
|
|
140
|
+
if (changed.length > 0) parts.push(`~${changed.length}`);
|
|
141
|
+
if (parts.length === 0) {
|
|
142
|
+
return {
|
|
143
|
+
summary: "nested change",
|
|
144
|
+
changedKeys: [],
|
|
145
|
+
changedCount: 0
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const total = changedKeys.length;
|
|
149
|
+
return {
|
|
150
|
+
summary: `${parts.join(" ")} ${total === 1 ? "key" : "keys"}`,
|
|
151
|
+
changedKeys,
|
|
152
|
+
changedCount: total
|
|
153
|
+
};
|
|
154
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsModal.d.ts","sourceRoot":"","sources":["../../../src/JsModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAUL,SAAS,EAEV,MAAM,OAAO,CAAC;AACf,OAAO,EAML,QAAQ,EAGR,SAAS,EAEV,MAAM,cAAc,CAAC;AAyHtB,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnD;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/C,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,kBAAkB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAChC;;;+BAG2B;IAC3B,WAAW,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,cAAc,GAAG,YAAY,CAAC;IACtE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uBAAuB,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAErD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,yFAAyF;IACzF,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gIAAgI;IAChI,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"JsModal.d.ts","sourceRoot":"","sources":["../../../src/JsModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAUL,SAAS,EAEV,MAAM,OAAO,CAAC;AACf,OAAO,EAML,QAAQ,EAGR,SAAS,EAEV,MAAM,cAAc,CAAC;AAyHtB,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnD;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/C,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,kBAAkB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAChC;;;+BAG2B;IAC3B,WAAW,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,cAAc,GAAG,YAAY,CAAC;IACtE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uBAAuB,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAErD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,yFAAyF;IACzF,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gIAAgI;IAChI,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAo0DD,eAAO,MAAM,OAAO,oDAAyB,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { useFilterManager } from "./useFilterManager";
|
|
2
|
-
export { usePersistedState } from "./usePersistedState";
|
|
2
|
+
export { usePersistedState, resetPersistedStateCache, type PersistedStateOptions, type PersistedStateStorage, } from "./usePersistedState";
|
|
3
|
+
export { useChangeLog, useSubscribedValue, type UseChangeLogOptions, type UseChangeLogResult, } from "./useChangeLog";
|
|
4
|
+
export { useEventStoreEvents, type UseEventStoreEventsOptions, type UseEventStoreEventsResult, } from "./useEventStoreEvents";
|
|
3
5
|
export { useSafeAreaInsets } from "./useSafeAreaInsets";
|
|
4
6
|
export { getSafeAreaInsets } from "./useSafeAreaInsets";
|
|
5
7
|
export { useDeviceInfo, getDeviceInfo, logDeviceInfo, type DeviceInfo, type PlatformInfo, type DisplayInfo, type AccessibilitySettings, type AppearanceInfo, type LocaleInfo, type StatusBarInfo, type KeyboardInfo, type AppStateInfo, type UniqueIdentifiers, type SettingsInfo, } from "./useDeviceInfo";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,GAC/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React bindings for `ChangeLog` — what useReduxActions, useZustandStateChanges
|
|
3
|
+
* and useJotaiAtomChanges each re-derived: seed state from the log, subscribe
|
|
4
|
+
* for the lifetime of the component, hold a filter, memoize the filtered
|
|
5
|
+
* list, and expose clear / pause / lookup.
|
|
6
|
+
*
|
|
7
|
+
* Tool-specific stats and registries (stores, atoms) compose on top — see
|
|
8
|
+
* `useSubscribedValue` for the registry half.
|
|
9
|
+
*/
|
|
10
|
+
import type { ChangeLog, Identified } from "../stores/ChangeLog";
|
|
11
|
+
export interface UseChangeLogOptions<T, F> {
|
|
12
|
+
/** Initial filter value. Default `{}`. */
|
|
13
|
+
initialFilter?: F;
|
|
14
|
+
/** Derive the filtered list. Default: identity (no filtering). */
|
|
15
|
+
filterItems?: (items: T[], filter: F) => T[];
|
|
16
|
+
}
|
|
17
|
+
export interface UseChangeLogResult<T, F> {
|
|
18
|
+
/** All recorded items, newest first. */
|
|
19
|
+
items: T[];
|
|
20
|
+
/** `items` after `filterItems`. */
|
|
21
|
+
filteredItems: T[];
|
|
22
|
+
filter: F;
|
|
23
|
+
setFilter: React.Dispatch<React.SetStateAction<F>>;
|
|
24
|
+
/** Whether recording is enabled (the pause button's state). */
|
|
25
|
+
isEnabled: boolean;
|
|
26
|
+
/** Flip recording on/off. */
|
|
27
|
+
toggleCapture: () => void;
|
|
28
|
+
/** Empty the log (fires the desktop mirror's clear forwarding). */
|
|
29
|
+
clear: () => void;
|
|
30
|
+
getById: (id: string) => T | undefined;
|
|
31
|
+
}
|
|
32
|
+
export declare function useChangeLog<T extends Identified, F extends object = Record<string, never>>(log: ChangeLog<T>, options?: UseChangeLogOptions<T, F>): UseChangeLogResult<T, F>;
|
|
33
|
+
/**
|
|
34
|
+
* Hold a value that a store pushes through a `(value) => void` listener —
|
|
35
|
+
* a registry of stores, atoms, sources. Seeded synchronously from `read`.
|
|
36
|
+
*/
|
|
37
|
+
export declare function useSubscribedValue<V>(read: () => V, subscribe: (listener: (value: V) => void) => () => void): V;
|
|
38
|
+
//# sourceMappingURL=useChangeLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChangeLog.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useChangeLog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,WAAW,mBAAmB,CAAC,CAAC,EAAE,CAAC;IACvC,0CAA0C;IAC1C,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,kEAAkE;IAClE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,EAAE,CAAC;IACtC,wCAAwC;IACxC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,mCAAmC;IACnC,aAAa,EAAE,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,mEAAmE;IACnE,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,CAAC;CACxC;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACzF,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EACjB,OAAO,GAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAM,GACtC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CA0B1B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,IAAI,EAAE,MAAM,CAAC,EACb,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,GACtD,CAAC,CAIH"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React bindings for a `BaseEventStore` — what useRouteEvents and
|
|
3
|
+
* useStorageEvents each hand-rolled: subscribe while enabled (which
|
|
4
|
+
* auto-starts the store's capture), coalesce bursts onto one animation
|
|
5
|
+
* frame so a storm of writes is one commit instead of one per emission,
|
|
6
|
+
* select/limit the list, and report whether capture is live.
|
|
7
|
+
*/
|
|
8
|
+
import type { BaseEventStore } from "../stores/BaseEventStore";
|
|
9
|
+
export interface UseEventStoreEventsOptions<T> {
|
|
10
|
+
/** Subscribe at all? `false` unsubscribes (and lets the store stop capturing). Default true. */
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
/** Cap the list handed to React. Default 500. */
|
|
13
|
+
maxEvents?: number;
|
|
14
|
+
/** Narrow the list before capping (a storage-type filter, say). */
|
|
15
|
+
select?: (events: T[]) => T[];
|
|
16
|
+
}
|
|
17
|
+
export interface UseEventStoreEventsResult<T> {
|
|
18
|
+
/** Newest first. */
|
|
19
|
+
events: T[];
|
|
20
|
+
clearEvents: () => void;
|
|
21
|
+
/** True while this hook holds a live subscription. */
|
|
22
|
+
isActive: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function useEventStoreEvents<T>(store: BaseEventStore<T>, options?: UseEventStoreEventsOptions<T>): UseEventStoreEventsResult<T>;
|
|
25
|
+
//# sourceMappingURL=useEventStoreEvents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEventStoreEvents.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useEventStoreEvents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,WAAW,0BAA0B,CAAC,CAAC;IAC3C,gGAAgG;IAChG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,yBAAyB,CAAC,CAAC;IAC1C,oBAAoB;IACpB,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,sDAAsD;IACtD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EACxB,OAAO,GAAE,0BAA0B,CAAC,CAAC,CAAM,GAC1C,yBAAyB,CAAC,CAAC,CAAC,CA8C9B"}
|
|
@@ -1,16 +1,45 @@
|
|
|
1
|
+
/** The two calls a backend needs. `persistentStorage` and AsyncStorage both fit. */
|
|
2
|
+
export interface PersistedStateStorage {
|
|
3
|
+
getItem(key: string): Promise<string | null>;
|
|
4
|
+
setItem(key: string, value: string): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export interface PersistedStateOptions<T> {
|
|
7
|
+
/**
|
|
8
|
+
* Turn the stored string into a value. Return `undefined` to reject it
|
|
9
|
+
* (corrupt, or a value the UI no longer offers) and keep the default.
|
|
10
|
+
* Default: `JSON.parse`.
|
|
11
|
+
*/
|
|
12
|
+
parse?: (raw: string) => T | undefined;
|
|
13
|
+
/** Turn a value into the stored string. Default: `JSON.stringify`. */
|
|
14
|
+
serialize?: (value: T) => string;
|
|
15
|
+
/**
|
|
16
|
+
* Where the value lives. Default: `persistentStorage` (FileSystem →
|
|
17
|
+
* AsyncStorage → memory). A tool whose keys were always written straight to
|
|
18
|
+
* AsyncStorage keeps reading them by passing AsyncStorage here.
|
|
19
|
+
*/
|
|
20
|
+
storage?: PersistedStateStorage;
|
|
21
|
+
}
|
|
1
22
|
/**
|
|
2
23
|
* `useState` persisted through `persistentStorage` (FileSystem → AsyncStorage
|
|
3
24
|
* → memory). Replaces the load-then-`hasLoaded`-guard `useEffect` pattern
|
|
4
25
|
* every tool used to hand-roll.
|
|
5
26
|
*
|
|
6
|
-
* Values are JSON-serialized; the default is returned until
|
|
7
|
-
* completes (subsequent mounts of the same key hydrate synchronously
|
|
8
|
-
* in-memory cache). The third tuple element reports hydration so
|
|
9
|
-
* defer writes that must not clobber a not-yet-loaded value.
|
|
27
|
+
* Values are JSON-serialized by default; the default is returned until
|
|
28
|
+
* hydration completes (subsequent mounts of the same key hydrate synchronously
|
|
29
|
+
* from an in-memory cache). The third tuple element reports hydration so
|
|
30
|
+
* callers can defer writes that must not clobber a not-yet-loaded value.
|
|
10
31
|
*
|
|
11
32
|
* ```tsx
|
|
12
33
|
* const [tab, setTab, tabHydrated] = usePersistedState("@react_buoy_custom_flags_tab", "flags");
|
|
34
|
+
*
|
|
35
|
+
* // A Set, stored as an array:
|
|
36
|
+
* const [pins, setPins] = usePersistedState(key, new Set<string>(), {
|
|
37
|
+
* parse: (raw) => new Set(JSON.parse(raw) as string[]),
|
|
38
|
+
* serialize: (set) => JSON.stringify([...set]),
|
|
39
|
+
* });
|
|
13
40
|
* ```
|
|
14
41
|
*/
|
|
15
|
-
export declare function usePersistedState<T>(key: string, defaultValue: T): [T, (next: T | ((prev: T) => T)) => void, boolean];
|
|
42
|
+
export declare function usePersistedState<T>(key: string, defaultValue: T, options?: PersistedStateOptions<T>): [T, (next: T | ((prev: T) => T)) => void, boolean];
|
|
43
|
+
/** Test seam: forget every hydrated value. */
|
|
44
|
+
export declare function resetPersistedStateCache(): void;
|
|
16
45
|
//# sourceMappingURL=usePersistedState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePersistedState.d.ts","sourceRoot":"","sources":["../../../../src/hooks/usePersistedState.ts"],"names":[],"mappings":"AAUA
|
|
1
|
+
{"version":3,"file":"usePersistedState.d.ts","sourceRoot":"","sources":["../../../../src/hooks/usePersistedState.ts"],"names":[],"mappings":"AAUA,oFAAoF;AACpF,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,CAAC;IACvC,sEAAsE;IACtE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;IACjC;;;;OAIG;IACH,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAUD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,CAAC,EACf,OAAO,GAAE,qBAAqB,CAAC,CAAC,CAAM,GACrC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,CA+DpD;AAED,8CAA8C;AAC9C,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
export * from "./ui";
|
|
2
2
|
export * from "./stores";
|
|
3
3
|
export * from "./sync/wireBudget";
|
|
4
|
+
export * from "./sync/wireForm";
|
|
5
|
+
export * from "./sync/toolSyncAdapter";
|
|
6
|
+
export * from "./tools/defineTool";
|
|
4
7
|
export * from "./sync/toolActionRegistry";
|
|
5
8
|
export * from "./sync/toolUiBridge";
|
|
6
9
|
export { absoluteFill, displayValue, parseDisplayValue, getSafeAreaInsets, persistentStorage, isUsingPersistentStorage, getStorageBackendType, safeStringify, getValueType, isPrimitive, isJsonSerializable, isValidJson, getConstructorName, isEmpty, getValueSize, parseValue, formatValue, getTypeColor, truncateText, flattenObject, formatPath, loadOptionalModule, getCachedOptionalModule, setRenderCaptureProvider, getRenderCaptureProvider, type RenderCaptureProvider, type RenderCaptureSummary, type RenderCaptureTopComponent, type RenderCauseCounts, registerStateSnapshotProvider, getStateSnapshotProviders, getStateSnapshotProvider, subscribeToStateSnapshotProviders, type StateSnapshotProvider, type StateSnapshotProviderStatus, type StateSnapshotCapture, type StateSnapshotRestoreResult, type StateSnapshotPreview, type StateSnapshotPreviewItem, type StateSnapshotPreviewVerdict, superJsonSerialize, superJsonDeserialize, type SuperJSONResult, reloadApp, scheduleReloadApp, resolveReloadStrategy, REMOTE_RELOAD_DELAY_MS, type ReloadStrategy, type ResolvedReloadStrategy, getDevServerOrigin, Subscribable, type SubscribableListener, subscriberCountNotifier, subscribeToSubscriberCountChanges, notifySubscriberCountChange, useSafeRouter, useSafePathname, useSafeSegments, useSafeGlobalSearchParams, getSafeRouter, getSafeCurrentPathname, getSafeCurrentRoute, isExpoRouterAvailable, } from "./utils";
|
|
7
10
|
export type { SafeRouteLocation } from "./utils";
|
|
11
|
+
export { PREVIEW_ITEM_RENDER_BYTE_LIMIT, createRestoreScope, emptyRestoreResult, failedRestore, skippedRestore, classifyPreviewItem, wontApply, unionKeys, type RestoreScope, type RestoreScopeOptions, type ClassifyOptions, type ClassifyInput, } from "./utils/snapshotProviderKit";
|
|
12
|
+
export { entityColor, formatValuePreview, shallowDiffSummary, type ValuePreviewOptions, type ShallowDiffSummary, } from "./utils/stateTools";
|
|
8
13
|
export * from "./utils/formatting";
|
|
9
14
|
export * from "./utils/time";
|
|
10
15
|
export { isPlainObject as isPlainObjectUtil } from "./utils/typeHelpers";
|
|
@@ -13,7 +18,7 @@ export * from "./clipboard";
|
|
|
13
18
|
export * from "./logger";
|
|
14
19
|
export * from "./settings";
|
|
15
20
|
export * from "./storage";
|
|
16
|
-
export { useSafeAreaInsets, useFilterManager, usePersistedState, useDeviceInfo, getDeviceInfo, logDeviceInfo, type DeviceInfo, type PlatformInfo, type DisplayInfo, type AccessibilitySettings, type AppearanceInfo, type LocaleInfo, type StatusBarInfo, type KeyboardInfo, type AppStateInfo, type UniqueIdentifiers, type SettingsInfo, } from "./hooks";
|
|
21
|
+
export { useSafeAreaInsets, useFilterManager, usePersistedState, resetPersistedStateCache, type PersistedStateOptions, type PersistedStateStorage, useChangeLog, useSubscribedValue, useEventStoreEvents, type UseChangeLogOptions, type UseChangeLogResult, type UseEventStoreEventsOptions, type UseEventStoreEventsResult, useDeviceInfo, getDeviceInfo, logDeviceInfo, type DeviceInfo, type PlatformInfo, type DisplayInfo, type AccessibilitySettings, type AppearanceInfo, type LocaleInfo, type StatusBarInfo, type KeyboardInfo, type AppStateInfo, type UniqueIdentifiers, type SettingsInfo, } from "./hooks";
|
|
17
22
|
export { JsModal } from "./JsModal";
|
|
18
23
|
export type { ModalMode, ModalState } from "./JsModal";
|
|
19
24
|
export { night, NIGHT_LABEL_TRACKING } from "./ui/night/nightTheme";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* definePersistedSetting — the `load / save / clear` triple every tool wrote
|
|
3
|
+
* for its module-level settings (copy settings, HUD prefs, JS TOP prefs, …).
|
|
4
|
+
*
|
|
5
|
+
* Contract, the same one all of them followed:
|
|
6
|
+
* - `load()` never throws and never returns a partial object: the stored
|
|
7
|
+
* value is merged OVER the defaults so fields added in a later release
|
|
8
|
+
* get their default instead of `undefined`, then `sanitize` gets the last
|
|
9
|
+
* word (drop values the UI no longer offers, coerce types).
|
|
10
|
+
* - `save()` and `clear()` are best-effort; persistence is optional.
|
|
11
|
+
* - `loadOrNull()` distinguishes "nothing saved yet" from the defaults, for
|
|
12
|
+
* callers that treat first launch differently.
|
|
13
|
+
*/
|
|
14
|
+
export interface PersistedSettingOptions<T> {
|
|
15
|
+
/** Merge-then-validate. Receives `{ ...defaults, ...stored }`; returns the value to use. */
|
|
16
|
+
sanitize?: (merged: T, stored: unknown) => T;
|
|
17
|
+
/** Default: `JSON.parse`. */
|
|
18
|
+
parse?: (raw: string) => unknown;
|
|
19
|
+
/** Default: `JSON.stringify`. */
|
|
20
|
+
serialize?: (value: T) => string;
|
|
21
|
+
/** Default: `persistentStorage`. */
|
|
22
|
+
storage?: {
|
|
23
|
+
getItem(key: string): Promise<string | null>;
|
|
24
|
+
setItem(key: string, value: string): Promise<void>;
|
|
25
|
+
removeItem(key: string): Promise<void>;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface PersistedSetting<T> {
|
|
29
|
+
readonly key: string;
|
|
30
|
+
readonly defaults: T;
|
|
31
|
+
/** The stored value merged over the defaults, or the defaults. Never throws. */
|
|
32
|
+
load(): Promise<T>;
|
|
33
|
+
/** Like `load()`, but `null` when nothing is stored (or it is unreadable). */
|
|
34
|
+
loadOrNull(): Promise<T | null>;
|
|
35
|
+
save(value: T): Promise<void>;
|
|
36
|
+
clear(): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
export declare function definePersistedSetting<T>(key: string, defaults: T, options?: PersistedSettingOptions<T>): PersistedSetting<T>;
|
|
39
|
+
//# sourceMappingURL=definePersistedSetting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definePersistedSetting.d.ts","sourceRoot":"","sources":["../../../../src/storage/definePersistedSetting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,WAAW,uBAAuB,CAAC,CAAC;IACxC,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC,CAAC;IAC7C,6BAA6B;IAC7B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACjC,iCAAiC;IACjC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;IACjC,oCAAoC;IACpC,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACxC,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrB,gFAAgF;IAChF,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,8EAA8E;IAC9E,UAAU,IAAI,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAMD,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,CAAC,EACX,OAAO,GAAE,uBAAuB,CAAC,CAAC,CAAM,GACvC,gBAAgB,CAAC,CAAC,CAAC,CA6CrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElF,OAAO,EACL,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChangeLog — the class-shaped event log the state tools share.
|
|
3
|
+
*
|
|
4
|
+
* redux (`ReduxActionStore`), zustand (`ZustandStateStore`), jotai
|
|
5
|
+
* (`JotaiStateStore`) and react-query (`ReactQueryEventStore`) each carried
|
|
6
|
+
* the same ~120 lines: a newest-first ring buffer, a `Set` of array listeners
|
|
7
|
+
* (`(items) => void`), a `Set` of clear listeners for the desktop's mirror
|
|
8
|
+
* mode, an `enabled` flag (the UI's pause button), a `captureSuppressed` flag
|
|
9
|
+
* (the dashboard must never record its own traffic), a monotonic id counter,
|
|
10
|
+
* `getById`, and hydrate-by-id for lazily fetched detail payloads.
|
|
11
|
+
*
|
|
12
|
+
* This is that core. Tool stores `extend` it and keep their public method
|
|
13
|
+
* names (`addStateChange`, `getActions`, `clearAtomChanges`, …) as thin
|
|
14
|
+
* wrappers, so no call site — including Buoy Desktop — has to change.
|
|
15
|
+
*
|
|
16
|
+
* Semantics preserved from the originals, deliberately:
|
|
17
|
+
* - `getAll()` returns a COPY (`[...items]`) — consumers seed React state
|
|
18
|
+
* from it and rely on a fresh identity per notification.
|
|
19
|
+
* - `clear()` always notifies, even when already empty, then fires the clear
|
|
20
|
+
* listeners (the dashboard forwards the clear to the device either way).
|
|
21
|
+
* - `replaceAll()` respects `enabled`: the pause button freezes a mirror.
|
|
22
|
+
* - `disableCapture()` is permanent for the store's lifetime.
|
|
23
|
+
*/
|
|
24
|
+
export type ChangeLogListener<T> = (items: T[]) => void;
|
|
25
|
+
export interface ChangeLogOptions {
|
|
26
|
+
/** Ring-buffer depth. Default 200 — what all four stores shipped with. */
|
|
27
|
+
max?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface Identified {
|
|
30
|
+
id: string;
|
|
31
|
+
}
|
|
32
|
+
export declare class ChangeLog<T extends Identified> {
|
|
33
|
+
/** Newest first. Subclasses may read; mutate only through the helpers. */
|
|
34
|
+
protected items: T[];
|
|
35
|
+
protected max: number;
|
|
36
|
+
private readonly itemListeners;
|
|
37
|
+
private readonly clearListeners;
|
|
38
|
+
private idCounter;
|
|
39
|
+
private enabled;
|
|
40
|
+
private captureSuppressed;
|
|
41
|
+
constructor(options?: ChangeLogOptions);
|
|
42
|
+
/** True when a new item should be recorded (not paused, not a mirror). */
|
|
43
|
+
protected canRecord(): boolean;
|
|
44
|
+
/** `${Date.now()}-${n}` — unique per store instance, sorts by time. */
|
|
45
|
+
protected nextId(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Prepend one item and trim to `max`. Does NOT notify — subclasses often
|
|
48
|
+
* touch companion state (per-entity counters, raw-state eviction) before
|
|
49
|
+
* they notify. Call `notifyListeners()` when done, or use `record()`.
|
|
50
|
+
*/
|
|
51
|
+
protected push(item: T): void;
|
|
52
|
+
/** `push()` + notify. The common case. */
|
|
53
|
+
protected record(item: T): void;
|
|
54
|
+
/** Replace the buffer wholesale (already merged/hydrated by the caller) and notify. */
|
|
55
|
+
protected setItems(next: T[]): void;
|
|
56
|
+
/** All items, newest first. Fresh array each call. */
|
|
57
|
+
getAll(): T[];
|
|
58
|
+
getById(id: string): T | undefined;
|
|
59
|
+
get size(): number;
|
|
60
|
+
/**
|
|
61
|
+
* Empty the buffer, notify, then fire clear listeners. Always notifies —
|
|
62
|
+
* a clear is a user action and the list must repaint even if nothing was
|
|
63
|
+
* in it. Subclasses that keep companion counters reset them first.
|
|
64
|
+
*/
|
|
65
|
+
clear(): void;
|
|
66
|
+
/**
|
|
67
|
+
* Listen for `clear()` calls. Used in remote mirror mode to forward a
|
|
68
|
+
* clear performed in the dashboard UI to the synced device.
|
|
69
|
+
*/
|
|
70
|
+
onClear(listener: () => void): () => void;
|
|
71
|
+
/**
|
|
72
|
+
* Permanently suppress local capture. Use when this store acts as a mirror
|
|
73
|
+
* of a remote device (the desktop dashboard): data arrives via
|
|
74
|
+
* `replaceAll()` / a subclass snapshot method and local instrumentation
|
|
75
|
+
* must never record.
|
|
76
|
+
*/
|
|
77
|
+
disableCapture(): void;
|
|
78
|
+
/** Whether the store is in remote mirror mode (capture suppressed). */
|
|
79
|
+
isCaptureSuppressed(): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Replace the whole list from a remote snapshot and notify. Respects the
|
|
82
|
+
* enabled flag so the UI's pause button freezes the mirror. Returns false
|
|
83
|
+
* when skipped. Subclasses with hydration-preserving merges compute the
|
|
84
|
+
* merged list themselves and call `setItems()`.
|
|
85
|
+
*/
|
|
86
|
+
replaceAll(next: T[]): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Patch one item in place (by id) and notify. Used to hydrate a mirrored
|
|
89
|
+
* item with detail payloads fetched on demand from the device.
|
|
90
|
+
*/
|
|
91
|
+
hydrateById(id: string, patch: Partial<T>): void;
|
|
92
|
+
setEnabled(enabled: boolean): void;
|
|
93
|
+
getEnabled(): boolean;
|
|
94
|
+
setMax(max: number): void;
|
|
95
|
+
getMax(): number;
|
|
96
|
+
subscribe(listener: ChangeLogListener<T>): () => void;
|
|
97
|
+
protected notifyListeners(): void;
|
|
98
|
+
protected get listenerCount(): number;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ChangeLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeLog.d.ts","sourceRoot":"","sources":["../../../../src/stores/ChangeLog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,qBAAa,SAAS,CAAC,CAAC,SAAS,UAAU;IACzC,0EAA0E;IAC1E,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAM;IAC1B,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,iBAAiB,CAAS;gBAEtB,OAAO,GAAE,gBAAqB;IAM1C,0EAA0E;IAC1E,SAAS,CAAC,SAAS,IAAI,OAAO;IAI9B,uEAAuE;IACvE,SAAS,CAAC,MAAM,IAAI,MAAM;IAI1B;;;;OAIG;IACH,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAI7B,0CAA0C;IAC1C,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAK/B,uFAAuF;IACvF,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI;IAOnC,sDAAsD;IACtD,MAAM,IAAI,CAAC,EAAE;IAIb,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIlC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAID;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAYb;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IASzC;;;;;OAKG;IACH,cAAc,IAAI,IAAI;IAItB,uEAAuE;IACvE,mBAAmB,IAAI,OAAO;IAI9B;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO;IAM9B;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAahD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,UAAU,IAAI,OAAO;IAIrB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQzB,MAAM,IAAI,MAAM;IAMhB,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAOrD,SAAS,CAAC,eAAe,IAAI,IAAI;IAKjC,SAAS,KAAK,aAAa,IAAI,MAAM,CAEpC;CACF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createToolStore — the one bounded, subscribable buffer every tool used to
|
|
3
|
+
* hand-roll.
|
|
4
|
+
*
|
|
5
|
+
* Before this existed, console, sentry, images, assets, focus-inspector,
|
|
6
|
+
* tv-remote, redux, zustand, jotai and react-query each carried their own copy
|
|
7
|
+
* of the same ~100 lines: a `Set` of listeners, a `Set` of clear listeners
|
|
8
|
+
* (so the desktop dashboard can forward a clear to the device in mirror
|
|
9
|
+
* mode), a ring buffer with a max, an optional frame-coalesced emit, and the
|
|
10
|
+
* `__buoyFlushToolSync` escape hatch that pushes a tool's snapshot to the
|
|
11
|
+
* dashboard NOW (a crash's last words must not wait on the sync throttle).
|
|
12
|
+
*
|
|
13
|
+
* This is a plain function, not a class, on purpose: every consumer exposes a
|
|
14
|
+
* module-level functional API (`subscribe`, `getSnapshot`, `clearX`) and
|
|
15
|
+
* feeds `useSyncExternalStore`, so the store is a value the module wraps
|
|
16
|
+
* rather than something it extends. `BaseEventStore` stays for the
|
|
17
|
+
* class-based, auto-start/stop capture stores (network, storage, routes).
|
|
18
|
+
*
|
|
19
|
+
* Contract:
|
|
20
|
+
* - `getSnapshot()` returns the SAME array reference until the next
|
|
21
|
+
* mutation, so `useSyncExternalStore` never re-renders for nothing.
|
|
22
|
+
* - `order: "append"` keeps the newest item LAST (console-style scrollback);
|
|
23
|
+
* `order: "prepend"` keeps it FIRST (event-log style). Trimming drops from
|
|
24
|
+
* the opposite end. Consumers never have to `.reverse()`.
|
|
25
|
+
* - `clear()` fires `onClear` listeners even when the buffer is already
|
|
26
|
+
* empty — the dashboard's forwarded clear must reach the device regardless.
|
|
27
|
+
* - `set()` (mirror mode) never fires clear listeners; it is a replacement.
|
|
28
|
+
*/
|
|
29
|
+
/** Listener signature: change-only, read the snapshot yourself. */
|
|
30
|
+
export type ToolStoreListener = () => void;
|
|
31
|
+
export type ToolStoreOrder = "append" | "prepend";
|
|
32
|
+
export interface ToolStoreOptions {
|
|
33
|
+
/** Tool id, as the sync layer knows it (`"console"`, `"sentry"`, …). Used by
|
|
34
|
+
* `flushSync()` so the dashboard pushes THIS tool's snapshot. */
|
|
35
|
+
id: string;
|
|
36
|
+
/** Ring-buffer depth. */
|
|
37
|
+
max: number;
|
|
38
|
+
/** Where new items land. Default `"append"` (newest last). */
|
|
39
|
+
order?: ToolStoreOrder;
|
|
40
|
+
/**
|
|
41
|
+
* `"frame"`: coalesce listener notifications onto one animation frame so a
|
|
42
|
+
* burst (a log loop, a navigation's several envelopes) is one React commit.
|
|
43
|
+
* `"sync"` (default): notify immediately.
|
|
44
|
+
*/
|
|
45
|
+
coalesce?: "frame" | "sync";
|
|
46
|
+
/** Floor between opportunistic (non-forced) `flushSync()` calls. Default 150 ms. */
|
|
47
|
+
flushMinIntervalMs?: number;
|
|
48
|
+
/** First id `allocId()` hands out. Default 1. */
|
|
49
|
+
firstId?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface ToolStore<T> {
|
|
52
|
+
/** Subscribe to any change (items, or a `notify()` from companion state). */
|
|
53
|
+
subscribe(listener: ToolStoreListener): () => void;
|
|
54
|
+
/** Current items. Stable reference between mutations. */
|
|
55
|
+
getSnapshot(): T[];
|
|
56
|
+
/** Number of items. */
|
|
57
|
+
size(): number;
|
|
58
|
+
/** Add one item at the configured end, trimming from the other. No-op while paused. */
|
|
59
|
+
add(item: T): void;
|
|
60
|
+
/** Replace all items (remote mirror mode, restore-from-disk). Trims to `max`. */
|
|
61
|
+
set(next: T[]): void;
|
|
62
|
+
/** Functional replace: `update(items => items.filter(...))`. Trims to `max`. */
|
|
63
|
+
update(fn: (items: T[]) => T[]): void;
|
|
64
|
+
/** Empty the buffer. Fires `onClear` listeners FIRST, always. */
|
|
65
|
+
clear(): void;
|
|
66
|
+
/** Listen for `clear()`. The dashboard uses this to forward a clear to the device. */
|
|
67
|
+
onClear(listener: ToolStoreListener): () => void;
|
|
68
|
+
/** Notify subscribers without touching items (companion state changed). */
|
|
69
|
+
notify(): void;
|
|
70
|
+
/**
|
|
71
|
+
* Push this tool's snapshot to any connected dashboard now, via the
|
|
72
|
+
* `__buoyFlushToolSync` global (@buoy-gg/external-sync `crashFlush`).
|
|
73
|
+
* Rate-limited unless `force` — a fatal is the app's last word and always goes out.
|
|
74
|
+
*/
|
|
75
|
+
flushSync(force?: boolean): void;
|
|
76
|
+
/** While paused, `add()` is dropped. `set`/`update`/`clear` still apply. */
|
|
77
|
+
setPaused(paused: boolean): void;
|
|
78
|
+
isPaused(): boolean;
|
|
79
|
+
/** Change the ring-buffer depth; trims immediately if shrinking. */
|
|
80
|
+
setMax(max: number): void;
|
|
81
|
+
getMax(): number;
|
|
82
|
+
/** Monotonic id counter for items that need one. */
|
|
83
|
+
allocId(): number;
|
|
84
|
+
/** Raise the id floor (after restoring persisted items that carry ids). */
|
|
85
|
+
bumpIdAbove(id: number): void;
|
|
86
|
+
/** How many `subscribe` listeners are attached. */
|
|
87
|
+
listenerCount(): number;
|
|
88
|
+
/** The tool id this store was created with. */
|
|
89
|
+
readonly id: string;
|
|
90
|
+
}
|
|
91
|
+
export declare function createToolStore<T>(options: ToolStoreOptions): ToolStore<T>;
|
|
92
|
+
//# sourceMappingURL=createToolStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createToolStore.d.ts","sourceRoot":"","sources":["../../../../src/stores/createToolStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,mEAAmE;AACnE,MAAM,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC/B;qEACiE;IACjE,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,oFAAoF;IACpF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,6EAA6E;IAC7E,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAAC;IACnD,yDAAyD;IACzD,WAAW,IAAI,CAAC,EAAE,CAAC;IACnB,uBAAuB;IACvB,IAAI,IAAI,MAAM,CAAC;IACf,uFAAuF;IACvF,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACnB,iFAAiF;IACjF,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IACrB,gFAAgF;IAChF,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;IACtC,iEAAiE;IACjE,KAAK,IAAI,IAAI,CAAC;IACd,sFAAsF;IACtF,OAAO,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAAC;IACjD,2EAA2E;IAC3E,MAAM,IAAI,IAAI,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,4EAA4E;IAC5E,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,QAAQ,IAAI,OAAO,CAAC;IACpB,oEAAoE;IACpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,IAAI,MAAM,CAAC;IACjB,oDAAoD;IACpD,OAAO,IAAI,MAAM,CAAC;IAClB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mDAAmD;IACnD,aAAa,IAAI,MAAM,CAAC;IACxB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAYD,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,CA6J1E"}
|
|
@@ -3,4 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { BaseEventStore, type ArrayListener, type EventCallback, type BaseEventStoreOptions, } from "./BaseEventStore";
|
|
5
5
|
export { ignoredPatternsStore, useIgnoredPatterns, urlMatchesIgnoredPattern, isUrlIgnored, type IgnoredPattern, type IgnoredPatternMatchMode, type UseIgnoredPatternsResult, } from "./ignoredPatternsStore";
|
|
6
|
+
export { createToolStore, type ToolStore, type ToolStoreOptions, type ToolStoreOrder, type ToolStoreListener, } from "./createToolStore";
|
|
7
|
+
export { ChangeLog, type ChangeLogListener, type ChangeLogOptions, type Identified, } from "./ChangeLog";
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|