@buoy-gg/impersonate 1.0.3-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/LICENSE +58 -0
  2. package/lib/commonjs/impersonate/components/DataNukeSettings.js +715 -0
  3. package/lib/commonjs/impersonate/components/ImpersonateBanner.js +217 -0
  4. package/lib/commonjs/impersonate/components/ImpersonateHistoryList.js +173 -0
  5. package/lib/commonjs/impersonate/components/ImpersonateModal.js +304 -0
  6. package/lib/commonjs/impersonate/components/ImpersonateStatusBar.js +130 -0
  7. package/lib/commonjs/impersonate/components/UserAvatar.js +146 -0
  8. package/lib/commonjs/impersonate/components/UserCard.js +200 -0
  9. package/lib/commonjs/impersonate/components/UserSearchView.js +227 -0
  10. package/lib/commonjs/impersonate/components/index.js +85 -0
  11. package/lib/commonjs/impersonate/hooks/index.js +64 -0
  12. package/lib/commonjs/impersonate/hooks/useAutoClearAsyncStorage.js +144 -0
  13. package/lib/commonjs/impersonate/hooks/useAutoClearReactQuery.js +155 -0
  14. package/lib/commonjs/impersonate/hooks/useAutoClearRedux.js +188 -0
  15. package/lib/commonjs/impersonate/hooks/useImpersonate.js +215 -0
  16. package/lib/commonjs/impersonate/hooks/useImpersonateHistory.js +56 -0
  17. package/lib/commonjs/impersonate/index.js +49 -0
  18. package/lib/commonjs/impersonate/types/index.js +16 -0
  19. package/lib/commonjs/impersonate/types/types.js +1 -0
  20. package/lib/commonjs/impersonate/utils/impersonateListener.js +280 -0
  21. package/lib/commonjs/impersonate/utils/impersonateStore.js +607 -0
  22. package/lib/commonjs/impersonate/utils/index.js +49 -0
  23. package/lib/commonjs/index.js +118 -0
  24. package/lib/commonjs/package.json +1 -0
  25. package/lib/commonjs/preset.js +214 -0
  26. package/lib/module/impersonate/components/DataNukeSettings.js +710 -0
  27. package/lib/module/impersonate/components/ImpersonateBanner.js +211 -0
  28. package/lib/module/impersonate/components/ImpersonateHistoryList.js +168 -0
  29. package/lib/module/impersonate/components/ImpersonateModal.js +300 -0
  30. package/lib/module/impersonate/components/ImpersonateStatusBar.js +125 -0
  31. package/lib/module/impersonate/components/UserAvatar.js +140 -0
  32. package/lib/module/impersonate/components/UserCard.js +195 -0
  33. package/lib/module/impersonate/components/UserSearchView.js +222 -0
  34. package/lib/module/impersonate/components/index.js +11 -0
  35. package/lib/module/impersonate/hooks/index.js +7 -0
  36. package/lib/module/impersonate/hooks/useAutoClearAsyncStorage.js +140 -0
  37. package/lib/module/impersonate/hooks/useAutoClearReactQuery.js +151 -0
  38. package/lib/module/impersonate/hooks/useAutoClearRedux.js +183 -0
  39. package/lib/module/impersonate/hooks/useImpersonate.js +212 -0
  40. package/lib/module/impersonate/hooks/useImpersonateHistory.js +52 -0
  41. package/lib/module/impersonate/index.js +13 -0
  42. package/lib/module/impersonate/types/index.js +3 -0
  43. package/lib/module/impersonate/types/types.js +1 -0
  44. package/lib/module/impersonate/utils/impersonateListener.js +271 -0
  45. package/lib/module/impersonate/utils/impersonateStore.js +604 -0
  46. package/lib/module/impersonate/utils/index.js +4 -0
  47. package/lib/module/index.js +103 -0
  48. package/lib/module/preset.js +209 -0
  49. package/lib/typescript/impersonate/components/DataNukeSettings.d.ts +37 -0
  50. package/lib/typescript/impersonate/components/DataNukeSettings.d.ts.map +1 -0
  51. package/lib/typescript/impersonate/components/ImpersonateBanner.d.ts +40 -0
  52. package/lib/typescript/impersonate/components/ImpersonateBanner.d.ts.map +1 -0
  53. package/lib/typescript/impersonate/components/ImpersonateHistoryList.d.ts +24 -0
  54. package/lib/typescript/impersonate/components/ImpersonateHistoryList.d.ts.map +1 -0
  55. package/lib/typescript/impersonate/components/ImpersonateModal.d.ts +10 -0
  56. package/lib/typescript/impersonate/components/ImpersonateModal.d.ts.map +1 -0
  57. package/lib/typescript/impersonate/components/ImpersonateStatusBar.d.ts +15 -0
  58. package/lib/typescript/impersonate/components/ImpersonateStatusBar.d.ts.map +1 -0
  59. package/lib/typescript/impersonate/components/UserAvatar.d.ts +32 -0
  60. package/lib/typescript/impersonate/components/UserAvatar.d.ts.map +1 -0
  61. package/lib/typescript/impersonate/components/UserCard.d.ts +28 -0
  62. package/lib/typescript/impersonate/components/UserCard.d.ts.map +1 -0
  63. package/lib/typescript/impersonate/components/UserSearchView.d.ts +31 -0
  64. package/lib/typescript/impersonate/components/UserSearchView.d.ts.map +1 -0
  65. package/lib/typescript/impersonate/components/index.d.ts +16 -0
  66. package/lib/typescript/impersonate/components/index.d.ts.map +1 -0
  67. package/lib/typescript/impersonate/hooks/index.d.ts +11 -0
  68. package/lib/typescript/impersonate/hooks/index.d.ts.map +1 -0
  69. package/lib/typescript/impersonate/hooks/useAutoClearAsyncStorage.d.ts +48 -0
  70. package/lib/typescript/impersonate/hooks/useAutoClearAsyncStorage.d.ts.map +1 -0
  71. package/lib/typescript/impersonate/hooks/useAutoClearReactQuery.d.ts +48 -0
  72. package/lib/typescript/impersonate/hooks/useAutoClearReactQuery.d.ts.map +1 -0
  73. package/lib/typescript/impersonate/hooks/useAutoClearRedux.d.ts +78 -0
  74. package/lib/typescript/impersonate/hooks/useAutoClearRedux.d.ts.map +1 -0
  75. package/lib/typescript/impersonate/hooks/useImpersonate.d.ts +76 -0
  76. package/lib/typescript/impersonate/hooks/useImpersonate.d.ts.map +1 -0
  77. package/lib/typescript/impersonate/hooks/useImpersonateHistory.d.ts +43 -0
  78. package/lib/typescript/impersonate/hooks/useImpersonateHistory.d.ts.map +1 -0
  79. package/lib/typescript/impersonate/index.d.ts +5 -0
  80. package/lib/typescript/impersonate/index.d.ts.map +1 -0
  81. package/lib/typescript/impersonate/types/index.d.ts +2 -0
  82. package/lib/typescript/impersonate/types/index.d.ts.map +1 -0
  83. package/lib/typescript/impersonate/types/types.d.ts +177 -0
  84. package/lib/typescript/impersonate/types/types.d.ts.map +1 -0
  85. package/lib/typescript/impersonate/utils/impersonateListener.d.ts +115 -0
  86. package/lib/typescript/impersonate/utils/impersonateListener.d.ts.map +1 -0
  87. package/lib/typescript/impersonate/utils/impersonateStore.d.ts +151 -0
  88. package/lib/typescript/impersonate/utils/impersonateStore.d.ts.map +1 -0
  89. package/lib/typescript/impersonate/utils/index.d.ts +3 -0
  90. package/lib/typescript/impersonate/utils/index.d.ts.map +1 -0
  91. package/lib/typescript/index.d.ts +80 -0
  92. package/lib/typescript/index.d.ts.map +1 -0
  93. package/lib/typescript/preset.d.ts +71 -0
  94. package/lib/typescript/preset.d.ts.map +1 -0
  95. package/package.json +78 -0
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "DataNukeSettingsComponent", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _DataNukeSettings.DataNukeSettings;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "ImpersonateBanner", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _ImpersonateBanner.ImpersonateBanner;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "ImpersonateBannerMinimal", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _ImpersonateBanner.ImpersonateBannerMinimal;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "ImpersonateHistoryList", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _ImpersonateHistoryList.ImpersonateHistoryList;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "ImpersonateModal", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _ImpersonateModal.ImpersonateModal;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "ImpersonateStatusBar", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _ImpersonateStatusBar.ImpersonateStatusBar;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "UserSearchView", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _UserSearchView.UserSearchView;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "createImpersonateTool", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _preset.createImpersonateTool;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "getImpersonatedUserId", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _impersonateListener.getImpersonatedUserId;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "impersonateListener", {
61
+ enumerable: true,
62
+ get: function () {
63
+ return _impersonateListener.impersonateListener;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "impersonateStore", {
67
+ enumerable: true,
68
+ get: function () {
69
+ return _impersonateStore.impersonateStore;
70
+ }
71
+ });
72
+ Object.defineProperty(exports, "isImpersonating", {
73
+ enumerable: true,
74
+ get: function () {
75
+ return _impersonateListener.isImpersonating;
76
+ }
77
+ });
78
+ Object.defineProperty(exports, "setImpersonateConfig", {
79
+ enumerable: true,
80
+ get: function () {
81
+ return _impersonateListener.setImpersonateConfig;
82
+ }
83
+ });
84
+ Object.defineProperty(exports, "startImpersonateListener", {
85
+ enumerable: true,
86
+ get: function () {
87
+ return _impersonateListener.startImpersonateListener;
88
+ }
89
+ });
90
+ Object.defineProperty(exports, "stopImpersonateListener", {
91
+ enumerable: true,
92
+ get: function () {
93
+ return _impersonateListener.stopImpersonateListener;
94
+ }
95
+ });
96
+ Object.defineProperty(exports, "useImpersonate", {
97
+ enumerable: true,
98
+ get: function () {
99
+ return _useImpersonate.useImpersonate;
100
+ }
101
+ });
102
+ Object.defineProperty(exports, "useImpersonateHistory", {
103
+ enumerable: true,
104
+ get: function () {
105
+ return _useImpersonateHistory.useImpersonateHistory;
106
+ }
107
+ });
108
+ var _preset = require("./preset");
109
+ var _ImpersonateModal = require("./impersonate/components/ImpersonateModal");
110
+ var _ImpersonateBanner = require("./impersonate/components/ImpersonateBanner");
111
+ var _UserSearchView = require("./impersonate/components/UserSearchView");
112
+ var _DataNukeSettings = require("./impersonate/components/DataNukeSettings");
113
+ var _ImpersonateHistoryList = require("./impersonate/components/ImpersonateHistoryList");
114
+ var _ImpersonateStatusBar = require("./impersonate/components/ImpersonateStatusBar");
115
+ var _useImpersonate = require("./impersonate/hooks/useImpersonate");
116
+ var _useImpersonateHistory = require("./impersonate/hooks/useImpersonateHistory");
117
+ var _impersonateStore = require("./impersonate/utils/impersonateStore");
118
+ var _impersonateListener = require("./impersonate/utils/impersonateListener");
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createImpersonateTool = createImpersonateTool;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _ImpersonateModal = require("./impersonate/components/ImpersonateModal");
10
+ var _ImpersonateBanner = require("./impersonate/components/ImpersonateBanner");
11
+ var _impersonateStore = require("./impersonate/utils/impersonateStore");
12
+ var _jsxRuntime = require("react/jsx-runtime");
13
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
+ /**
15
+ * Impersonate Tool Preset
16
+ *
17
+ * Factory function to create a configured impersonate tool for FloatingDevTools.
18
+ * No default preset is exported because configuration (onSearchUsers) is required.
19
+ */
20
+
21
+ // NOTE: The listener is started lazily when the modal opens (via useImpersonate hook)
22
+ // This ensures we patch AFTER @buoy-gg/network has patched fetch, so network
23
+ // can see our injected headers in its request capture.
24
+
25
+ // =============================================================================
26
+ // ICON COMPONENT
27
+ // =============================================================================
28
+
29
+ /**
30
+ * Impersonate tool icon - a mask/person symbol
31
+ */
32
+ function ImpersonateIcon({
33
+ size,
34
+ color = "#F59E0B"
35
+ }) {
36
+ const scale = size / 24;
37
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
38
+ style: [styles.iconContainer, {
39
+ width: size,
40
+ height: size
41
+ }],
42
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
43
+ style: [styles.iconText, {
44
+ fontSize: 14 * scale,
45
+ color
46
+ }],
47
+ children: "IMP"
48
+ })
49
+ });
50
+ }
51
+
52
+ // =============================================================================
53
+ // WRAPPER COMPONENT
54
+ // =============================================================================
55
+
56
+ /**
57
+ * Wrapper component that renders both the modal and the auto-banner.
58
+ * The banner handles its own visibility based on store state (isActive + showBanner).
59
+ * Clicking the banner opens the modal.
60
+ */
61
+ function ImpersonateToolWrapper(props) {
62
+ const [forceOpen, setForceOpen] = (0, _react.useState)(false);
63
+
64
+ // Reset force state when parent closes the modal
65
+ (0, _react.useEffect)(() => {
66
+ if (!props.visible) {
67
+ setForceOpen(false);
68
+ }
69
+ }, [props.visible]);
70
+ const handleBannerPress = () => {
71
+ setForceOpen(true);
72
+ };
73
+ const handleClose = () => {
74
+ setForceOpen(false);
75
+ // Only notify parent if they had the modal open
76
+ if (props.visible) {
77
+ props.onClose();
78
+ }
79
+ };
80
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
81
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ImpersonateModal.ImpersonateModal, {
82
+ ...props,
83
+ visible: props.visible || forceOpen,
84
+ onClose: handleClose
85
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ImpersonateBanner.ImpersonateBanner, {
86
+ position: "top",
87
+ offset: 50,
88
+ onPress: handleBannerPress
89
+ })]
90
+ });
91
+ }
92
+
93
+ // =============================================================================
94
+ // FACTORY FUNCTION
95
+ // =============================================================================
96
+
97
+ /**
98
+ * Create an impersonate tool with custom configuration
99
+ *
100
+ * The tool automatically displays a floating banner when impersonation is active.
101
+ * This can be toggled in the Settings tab or via developer defaults.
102
+ *
103
+ * @example
104
+ * ```tsx
105
+ * import { createImpersonateTool } from '@buoy-gg/impersonate';
106
+ * import { queryClient } from './queryClient';
107
+ *
108
+ * const impersonateTool = createImpersonateTool({
109
+ * onSearchUsers: async (query) => {
110
+ * const response = await api.searchUsers({ email: query });
111
+ * return response.users.map(u => ({
112
+ * id: u.id,
113
+ * displayName: u.name,
114
+ * email: u.email,
115
+ * metadata: { role: u.role, createdAt: u.createdAt }
116
+ * }));
117
+ * },
118
+ * onClearReactQuery: () => queryClient.clear(),
119
+ * onClearRedux: () => store.dispatch({ type: 'RESET' }),
120
+ *
121
+ * // Optional: Developer defaults (override hardcoded, overridden by persisted)
122
+ * defaults: {
123
+ * headerKey: 'x-admin-impersonate',
124
+ * showBanner: true, // Show floating banner when impersonating
125
+ * dataNukeSettings: {
126
+ * reactQuery: true,
127
+ * redux: false,
128
+ * },
129
+ * },
130
+ *
131
+ * // Optional: Hide settings tab for simple testing
132
+ * showSettingsTab: true,
133
+ * });
134
+ *
135
+ * // In your app - banner is automatic, no extra setup needed!
136
+ * <FloatingDevTools apps={[impersonateTool]} />
137
+ * ```
138
+ */
139
+ function createImpersonateTool(config) {
140
+ const {
141
+ id = "impersonate",
142
+ name = "IMPERSONATE",
143
+ description = "User impersonation for admin testing",
144
+ defaults,
145
+ showSettingsTab = true,
146
+ onSearchUsers,
147
+ onClearReactQuery,
148
+ onClearRedux,
149
+ onClearAsyncStorage,
150
+ onClearMMKV
151
+ } = config;
152
+
153
+ // Initialize store with developer defaults if provided
154
+ if (defaults) {
155
+ _impersonateStore.impersonateStore.setDeveloperDefaults(defaults);
156
+ }
157
+
158
+ // Create the tool configuration object
159
+ const tool = {
160
+ id,
161
+ name,
162
+ description,
163
+ slot: "both",
164
+ icon: ({
165
+ size
166
+ }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(ImpersonateIcon, {
167
+ size: size,
168
+ color: "#F59E0B"
169
+ }),
170
+ component: props => /*#__PURE__*/(0, _jsxRuntime.jsx)(ImpersonateToolWrapper, {
171
+ ...props,
172
+ onSearchUsers: onSearchUsers,
173
+ onClearReactQuery: onClearReactQuery,
174
+ onClearRedux: onClearRedux,
175
+ onClearAsyncStorage: onClearAsyncStorage,
176
+ onClearMMKV: onClearMMKV,
177
+ showSettingsTab: showSettingsTab
178
+ }),
179
+ props: {
180
+ enableSharedModalDimensions: false
181
+ },
182
+ // Export banner component for host app to use
183
+ Banner: _ImpersonateBanner.ImpersonateBanner
184
+ };
185
+ return tool;
186
+ }
187
+
188
+ // =============================================================================
189
+ // STYLES
190
+ // =============================================================================
191
+
192
+ const styles = _reactNative.StyleSheet.create({
193
+ iconContainer: {
194
+ alignItems: "center",
195
+ justifyContent: "center"
196
+ },
197
+ iconText: {
198
+ fontWeight: "700",
199
+ letterSpacing: -0.5
200
+ }
201
+ });
202
+
203
+ // =============================================================================
204
+ // NOTE: No default preset export
205
+ // =============================================================================
206
+ // Unlike other tools, the impersonate tool REQUIRES configuration
207
+ // (specifically the onSearchUsers callback). Therefore, we don't export
208
+ // a default preset. Users must call createImpersonateTool() with their config.
209
+ //
210
+ // If you want a basic preset for testing without search:
211
+ //
212
+ // export const impersonateToolPresetBasic = createImpersonateTool({
213
+ // onSearchUsers: async () => [],
214
+ // });