rn-backstage 1.0.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 (102) hide show
  1. package/README.md +80 -0
  2. package/lib/commonjs/Backstage.js +130 -0
  3. package/lib/commonjs/Backstage.js.map +1 -0
  4. package/lib/commonjs/components/BackstagePanel.js +192 -0
  5. package/lib/commonjs/components/BackstagePanel.js.map +1 -0
  6. package/lib/commonjs/components/FloatingPill.js +147 -0
  7. package/lib/commonjs/components/FloatingPill.js.map +1 -0
  8. package/lib/commonjs/components/InfoTab.js +260 -0
  9. package/lib/commonjs/components/InfoTab.js.map +1 -0
  10. package/lib/commonjs/components/JsonTreeView.js +245 -0
  11. package/lib/commonjs/components/JsonTreeView.js.map +1 -0
  12. package/lib/commonjs/components/LogItem.js +191 -0
  13. package/lib/commonjs/components/LogItem.js.map +1 -0
  14. package/lib/commonjs/components/LogsTab.js +235 -0
  15. package/lib/commonjs/components/LogsTab.js.map +1 -0
  16. package/lib/commonjs/components/TabBar.js +132 -0
  17. package/lib/commonjs/components/TabBar.js.map +1 -0
  18. package/lib/commonjs/constants.js +89 -0
  19. package/lib/commonjs/constants.js.map +1 -0
  20. package/lib/commonjs/index.js +20 -0
  21. package/lib/commonjs/index.js.map +1 -0
  22. package/lib/commonjs/log-interceptor.js +114 -0
  23. package/lib/commonjs/log-interceptor.js.map +1 -0
  24. package/lib/commonjs/package.json +1 -0
  25. package/lib/commonjs/types.js +21 -0
  26. package/lib/commonjs/types.js.map +1 -0
  27. package/lib/commonjs/utils/formatTimestamp.js +26 -0
  28. package/lib/commonjs/utils/formatTimestamp.js.map +1 -0
  29. package/lib/commonjs/utils/stringify.js +78 -0
  30. package/lib/commonjs/utils/stringify.js.map +1 -0
  31. package/lib/module/Backstage.js +125 -0
  32. package/lib/module/Backstage.js.map +1 -0
  33. package/lib/module/components/BackstagePanel.js +187 -0
  34. package/lib/module/components/BackstagePanel.js.map +1 -0
  35. package/lib/module/components/FloatingPill.js +142 -0
  36. package/lib/module/components/FloatingPill.js.map +1 -0
  37. package/lib/module/components/InfoTab.js +255 -0
  38. package/lib/module/components/InfoTab.js.map +1 -0
  39. package/lib/module/components/JsonTreeView.js +241 -0
  40. package/lib/module/components/JsonTreeView.js.map +1 -0
  41. package/lib/module/components/LogItem.js +186 -0
  42. package/lib/module/components/LogItem.js.map +1 -0
  43. package/lib/module/components/LogsTab.js +230 -0
  44. package/lib/module/components/LogsTab.js.map +1 -0
  45. package/lib/module/components/TabBar.js +127 -0
  46. package/lib/module/components/TabBar.js.map +1 -0
  47. package/lib/module/constants.js +85 -0
  48. package/lib/module/constants.js.map +1 -0
  49. package/lib/module/index.js +5 -0
  50. package/lib/module/index.js.map +1 -0
  51. package/lib/module/log-interceptor.js +108 -0
  52. package/lib/module/log-interceptor.js.map +1 -0
  53. package/lib/module/package.json +1 -0
  54. package/lib/module/types.js +25 -0
  55. package/lib/module/types.js.map +1 -0
  56. package/lib/module/utils/formatTimestamp.js +22 -0
  57. package/lib/module/utils/formatTimestamp.js.map +1 -0
  58. package/lib/module/utils/stringify.js +73 -0
  59. package/lib/module/utils/stringify.js.map +1 -0
  60. package/lib/typescript/Backstage.d.ts +4 -0
  61. package/lib/typescript/Backstage.d.ts.map +1 -0
  62. package/lib/typescript/components/BackstagePanel.d.ts +21 -0
  63. package/lib/typescript/components/BackstagePanel.d.ts.map +1 -0
  64. package/lib/typescript/components/FloatingPill.d.ts +13 -0
  65. package/lib/typescript/components/FloatingPill.d.ts.map +1 -0
  66. package/lib/typescript/components/InfoTab.d.ts +16 -0
  67. package/lib/typescript/components/InfoTab.d.ts.map +1 -0
  68. package/lib/typescript/components/JsonTreeView.d.ts +10 -0
  69. package/lib/typescript/components/JsonTreeView.d.ts.map +1 -0
  70. package/lib/typescript/components/LogItem.d.ts +10 -0
  71. package/lib/typescript/components/LogItem.d.ts.map +1 -0
  72. package/lib/typescript/components/LogsTab.d.ts +11 -0
  73. package/lib/typescript/components/LogsTab.d.ts.map +1 -0
  74. package/lib/typescript/components/TabBar.d.ts +14 -0
  75. package/lib/typescript/components/TabBar.d.ts.map +1 -0
  76. package/lib/typescript/constants.d.ts +43 -0
  77. package/lib/typescript/constants.d.ts.map +1 -0
  78. package/lib/typescript/index.d.ts +4 -0
  79. package/lib/typescript/index.d.ts.map +1 -0
  80. package/lib/typescript/log-interceptor.d.ts +16 -0
  81. package/lib/typescript/log-interceptor.d.ts.map +1 -0
  82. package/lib/typescript/types.d.ts +110 -0
  83. package/lib/typescript/types.d.ts.map +1 -0
  84. package/lib/typescript/utils/formatTimestamp.d.ts +7 -0
  85. package/lib/typescript/utils/formatTimestamp.d.ts.map +1 -0
  86. package/lib/typescript/utils/stringify.d.ts +9 -0
  87. package/lib/typescript/utils/stringify.d.ts.map +1 -0
  88. package/package.json +91 -0
  89. package/src/Backstage.tsx +145 -0
  90. package/src/components/BackstagePanel.tsx +208 -0
  91. package/src/components/FloatingPill.tsx +150 -0
  92. package/src/components/InfoTab.tsx +264 -0
  93. package/src/components/JsonTreeView.tsx +259 -0
  94. package/src/components/LogItem.tsx +189 -0
  95. package/src/components/LogsTab.tsx +239 -0
  96. package/src/components/TabBar.tsx +150 -0
  97. package/src/constants.ts +82 -0
  98. package/src/index.ts +14 -0
  99. package/src/log-interceptor.ts +137 -0
  100. package/src/types.ts +147 -0
  101. package/src/utils/formatTimestamp.ts +22 -0
  102. package/src/utils/stringify.ts +90 -0
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TestIDs = exports.MonospaceFont = exports.Metrics = exports.DarkTheme = exports.DEFAULT_MAX_LOGS = void 0;
7
+ var _reactNative = require("react-native");
8
+ // ─── Metrics ─────────────────────────────────────────────────────────────────
9
+
10
+ const {
11
+ width: screenWidth,
12
+ height: screenHeight
13
+ } = _reactNative.Dimensions.get('window');
14
+ const Metrics = exports.Metrics = {
15
+ screenWidth,
16
+ screenHeight,
17
+ isIOS: _reactNative.Platform.OS === 'ios',
18
+ pillWidth: 72,
19
+ pillHeight: 32,
20
+ panelBorderRadius: 20,
21
+ tabBarHeight: 48,
22
+ headerHeight: 52,
23
+ sectionSpacing: 16,
24
+ contentPadding: 16
25
+ };
26
+
27
+ // ─── Dark Theme ──────────────────────────────────────────────────────────────
28
+
29
+ const DarkTheme = exports.DarkTheme = {
30
+ background: '#0D0D12',
31
+ surface: '#16161E',
32
+ surfaceElevated: '#1E1E2A',
33
+ border: '#2A2A3A',
34
+ text: '#E8E8ED',
35
+ textSecondary: '#A0A0B0',
36
+ textMuted: '#606075',
37
+ accent: '#7C5CFC',
38
+ accentDim: 'rgba(124, 92, 252, 0.15)',
39
+ error: '#FF4D6A',
40
+ errorDim: 'rgba(255, 77, 106, 0.12)',
41
+ warning: '#FFB224',
42
+ warningDim: 'rgba(255, 178, 36, 0.12)',
43
+ success: '#34D399',
44
+ info: '#38BDF8',
45
+ infoDim: 'rgba(56, 189, 248, 0.12)',
46
+ debugColor: '#A78BFA',
47
+ debugDim: 'rgba(167, 139, 250, 0.12)'
48
+ };
49
+
50
+ // ─── Max Logs ────────────────────────────────────────────────────────────────
51
+
52
+ const DEFAULT_MAX_LOGS = exports.DEFAULT_MAX_LOGS = 500;
53
+
54
+ // ─── Monospace Font ──────────────────────────────────────────────────────────
55
+
56
+ const MonospaceFont = exports.MonospaceFont = _reactNative.Platform.select({
57
+ ios: 'Menlo',
58
+ default: 'monospace'
59
+ });
60
+
61
+ // ─── Test IDs ────────────────────────────────────────────────────────────────
62
+
63
+ const TestIDs = exports.TestIDs = {
64
+ floatingPill: 'backstage.floating-pill',
65
+ panel: 'backstage.panel',
66
+ header: {
67
+ container: 'backstage.header',
68
+ title: 'backstage.header.title',
69
+ closeButton: 'backstage.header.close'
70
+ },
71
+ tabBar: 'backstage.tab-bar',
72
+ tabs: {
73
+ info: 'backstage.tab.info',
74
+ logs: 'backstage.tab.logs'
75
+ },
76
+ infoTab: {
77
+ section: 'backstage.info',
78
+ deviceInfo: 'backstage.info.device',
79
+ stateTree: 'backstage.info.state-tree',
80
+ quickActions: 'backstage.info.quick-actions'
81
+ },
82
+ logsTab: {
83
+ section: 'backstage.logs',
84
+ searchInput: 'backstage.logs.search',
85
+ copyButton: 'backstage.logs.copy',
86
+ list: 'backstage.logs.list'
87
+ }
88
+ };
89
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","width","screenWidth","height","screenHeight","Dimensions","get","Metrics","exports","isIOS","Platform","OS","pillWidth","pillHeight","panelBorderRadius","tabBarHeight","headerHeight","sectionSpacing","contentPadding","DarkTheme","background","surface","surfaceElevated","border","text","textSecondary","textMuted","accent","accentDim","error","errorDim","warning","warningDim","success","info","infoDim","debugColor","debugDim","DEFAULT_MAX_LOGS","MonospaceFont","select","ios","default","TestIDs","floatingPill","panel","header","container","title","closeButton","tabBar","tabs","logs","infoTab","section","deviceInfo","stateTree","quickActions","logsTab","searchInput","copyButton","list"],"sourceRoot":"../../src","sources":["constants.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAGA;;AAEA,MAAM;EAAEC,KAAK,EAAEC,WAAW;EAAEC,MAAM,EAAEC;AAAa,CAAC,GAAGC,uBAAU,CAACC,GAAG,CAAC,QAAQ,CAAC;AAEtE,MAAMC,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG;EACrBL,WAAW;EACXE,YAAY;EACZK,KAAK,EAAEC,qBAAQ,CAACC,EAAE,KAAK,KAAK;EAC5BC,SAAS,EAAE,EAAE;EACbC,UAAU,EAAE,EAAE;EACdC,iBAAiB,EAAE,EAAE;EACrBC,YAAY,EAAE,EAAE;EAChBC,YAAY,EAAE,EAAE;EAChBC,cAAc,EAAE,EAAE;EAClBC,cAAc,EAAE;AAClB,CAAC;;AAED;;AAEO,MAAMC,SAAyB,GAAAX,OAAA,CAAAW,SAAA,GAAG;EACvCC,UAAU,EAAE,SAAS;EACrBC,OAAO,EAAE,SAAS;EAClBC,eAAe,EAAE,SAAS;EAC1BC,MAAM,EAAE,SAAS;EACjBC,IAAI,EAAE,SAAS;EACfC,aAAa,EAAE,SAAS;EACxBC,SAAS,EAAE,SAAS;EACpBC,MAAM,EAAE,SAAS;EACjBC,SAAS,EAAE,0BAA0B;EACrCC,KAAK,EAAE,SAAS;EAChBC,QAAQ,EAAE,0BAA0B;EACpCC,OAAO,EAAE,SAAS;EAClBC,UAAU,EAAE,0BAA0B;EACtCC,OAAO,EAAE,SAAS;EAClBC,IAAI,EAAE,SAAS;EACfC,OAAO,EAAE,0BAA0B;EACnCC,UAAU,EAAE,SAAS;EACrBC,QAAQ,EAAE;AACZ,CAAC;;AAED;;AAEO,MAAMC,gBAAgB,GAAA9B,OAAA,CAAA8B,gBAAA,GAAG,GAAG;;AAEnC;;AAEO,MAAMC,aAAa,GAAA/B,OAAA,CAAA+B,aAAA,GAAG7B,qBAAQ,CAAC8B,MAAM,CAAC;EAC3CC,GAAG,EAAE,OAAO;EACZC,OAAO,EAAE;AACX,CAAC,CAAC;;AAEF;;AAEO,MAAMC,OAAO,GAAAnC,OAAA,CAAAmC,OAAA,GAAG;EACrBC,YAAY,EAAE,yBAAyB;EACvCC,KAAK,EAAE,iBAAiB;EACxBC,MAAM,EAAE;IACNC,SAAS,EAAE,kBAAkB;IAC7BC,KAAK,EAAE,wBAAwB;IAC/BC,WAAW,EAAE;EACf,CAAC;EACDC,MAAM,EAAE,mBAAmB;EAC3BC,IAAI,EAAE;IACJjB,IAAI,EAAE,oBAAoB;IAC1BkB,IAAI,EAAE;EACR,CAAC;EACDC,OAAO,EAAE;IACPC,OAAO,EAAE,gBAAgB;IACzBC,UAAU,EAAE,uBAAuB;IACnCC,SAAS,EAAE,2BAA2B;IACtCC,YAAY,EAAE;EAChB,CAAC;EACDC,OAAO,EAAE;IACPJ,OAAO,EAAE,gBAAgB;IACzBK,WAAW,EAAE,uBAAuB;IACpCC,UAAU,EAAE,qBAAqB;IACjCC,IAAI,EAAE;EACR;AACF,CAAC","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "Backstage", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _Backstage.Backstage;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "LogLevel", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _types.LogLevel;
16
+ }
17
+ });
18
+ var _Backstage = require("./Backstage");
19
+ var _types = require("./types");
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_Backstage","require","_types"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAaA,IAAAC,MAAA,GAAAD,OAAA","ignoreList":[]}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LogBuffer = void 0;
7
+ exports.installInterceptor = installInterceptor;
8
+ exports.uninstallInterceptor = uninstallInterceptor;
9
+ var _types = require("./types");
10
+ var _stringify = require("./utils/stringify");
11
+ var _constants = require("./constants");
12
+ // ─── Original Console Methods ────────────────────────────────────────────────
13
+
14
+ const originalConsole = {
15
+ log: console.log,
16
+ debug: console.debug,
17
+ info: console.info,
18
+ warn: console.warn,
19
+ error: console.error
20
+ };
21
+ let activeCallback = null;
22
+ let isInstalled = false;
23
+
24
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
25
+
26
+ function generateId() {
27
+ return `${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
28
+ }
29
+ function createLogEntry(level, message, optionalParams) {
30
+ const formattedMessage = (0, _stringify.formatLogMessage)(message, optionalParams);
31
+ const hasObjectData = typeof message === 'object' && message !== null || optionalParams.some(p => typeof p === 'object' && p !== null);
32
+ return {
33
+ id: generateId(),
34
+ level,
35
+ message: formattedMessage,
36
+ data: hasObjectData ? {
37
+ message,
38
+ params: optionalParams
39
+ } : undefined,
40
+ timestamp: Date.now()
41
+ };
42
+ }
43
+ function shouldLog(message, filters) {
44
+ if (filters.length === 0) return true;
45
+ const messageStr = typeof message === 'string' ? message.toLowerCase() : typeof message === 'object' && message !== null ? JSON.stringify(message).toLowerCase() : String(message).toLowerCase();
46
+ return !filters.some(filter => messageStr.includes(filter.toLowerCase()));
47
+ }
48
+
49
+ // ─── Install / Uninstall ─────────────────────────────────────────────────────
50
+
51
+ function installInterceptor(callback, filters = []) {
52
+ if (isInstalled) {
53
+ // Just update callback if already installed
54
+ activeCallback = callback;
55
+ return;
56
+ }
57
+ activeCallback = callback;
58
+ isInstalled = true;
59
+ const levels = [[_types.LogLevel.log, 'log'], [_types.LogLevel.debug, 'debug'], [_types.LogLevel.info, 'info'], [_types.LogLevel.warn, 'warn'], [_types.LogLevel.error, 'error']];
60
+ for (const [level, method] of levels) {
61
+ console[method] = (message, ...optionalParams) => {
62
+ // Always forward to original console
63
+ originalConsole[method](message, ...optionalParams);
64
+
65
+ // Check filters
66
+ if (!shouldLog(message, filters)) return;
67
+
68
+ // Create log entry and notify
69
+ if (activeCallback) {
70
+ const entry = createLogEntry(level, message, optionalParams);
71
+ activeCallback(entry);
72
+ }
73
+ };
74
+ }
75
+ }
76
+ function uninstallInterceptor() {
77
+ if (!isInstalled) return;
78
+ console.log = originalConsole.log;
79
+ console.debug = originalConsole.debug;
80
+ console.info = originalConsole.info;
81
+ console.warn = originalConsole.warn;
82
+ console.error = originalConsole.error;
83
+ activeCallback = null;
84
+ isInstalled = false;
85
+ }
86
+
87
+ // ─── Log Buffer ──────────────────────────────────────────────────────────────
88
+
89
+ class LogBuffer {
90
+ logs = [];
91
+ constructor(maxSize = _constants.DEFAULT_MAX_LOGS) {
92
+ this.maxSize = maxSize;
93
+ }
94
+ push(entry) {
95
+ this.logs.unshift(entry);
96
+ if (this.logs.length > this.maxSize) {
97
+ this.logs = this.logs.slice(0, this.maxSize);
98
+ }
99
+ }
100
+ getAll() {
101
+ return [...this.logs];
102
+ }
103
+ clear() {
104
+ this.logs = [];
105
+ }
106
+ get hasErrors() {
107
+ return this.logs.some(log => log.level === _types.LogLevel.error);
108
+ }
109
+ get size() {
110
+ return this.logs.length;
111
+ }
112
+ }
113
+ exports.LogBuffer = LogBuffer;
114
+ //# sourceMappingURL=log-interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_types","require","_stringify","_constants","originalConsole","log","console","debug","info","warn","error","activeCallback","isInstalled","generateId","Date","now","Math","random","toString","substring","createLogEntry","level","message","optionalParams","formattedMessage","formatLogMessage","hasObjectData","some","p","id","data","params","undefined","timestamp","shouldLog","filters","length","messageStr","toLowerCase","JSON","stringify","String","filter","includes","installInterceptor","callback","levels","LogLevel","method","entry","uninstallInterceptor","LogBuffer","logs","constructor","maxSize","DEFAULT_MAX_LOGS","push","unshift","slice","getAll","clear","hasErrors","size","exports"],"sourceRoot":"../../src","sources":["log-interceptor.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LogLevel = void 0;
7
+ // ─── Log Types ───────────────────────────────────────────────────────────────
8
+ let LogLevel = exports.LogLevel = /*#__PURE__*/function (LogLevel) {
9
+ LogLevel["log"] = "log";
10
+ LogLevel["debug"] = "debug";
11
+ LogLevel["info"] = "info";
12
+ LogLevel["warn"] = "warn";
13
+ LogLevel["error"] = "error";
14
+ return LogLevel;
15
+ }({}); // ─── App Info ────────────────────────────────────────────────────────────────
16
+ // ─── Quick Actions ───────────────────────────────────────────────────────────
17
+ // ─── Extensible Tabs ─────────────────────────────────────────────────────────
18
+ // ─── Theme ───────────────────────────────────────────────────────────────────
19
+ // ─── Main Props ──────────────────────────────────────────────────────────────
20
+ // ─── Ref Methods ─────────────────────────────────────────────────────────────
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["LogLevel","exports"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;;;;;AAGA;AAAA,IAEYA,QAAQ,GAAAC,OAAA,CAAAD,QAAA,0BAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA,OAgBpB;AAOA;AAWA;AASA;AAuBA;AAkEA","ignoreList":[]}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.formatTimestamp = formatTimestamp;
7
+ /**
8
+ * Formats a timestamp (Date.now()) into a human-readable local time string.
9
+ * Format: "h:mm:ss.SSS AM/PM"
10
+ * No external dependencies — uses native Date API.
11
+ */
12
+ function formatTimestamp(timestamp) {
13
+ const date = new Date(timestamp);
14
+ let hours = date.getHours();
15
+ const minutes = date.getMinutes();
16
+ const seconds = date.getSeconds();
17
+ const milliseconds = date.getMilliseconds();
18
+ const ampm = hours >= 12 ? 'PM' : 'AM';
19
+ hours = hours % 12;
20
+ hours = hours || 12;
21
+ const mm = minutes.toString().padStart(2, '0');
22
+ const ss = seconds.toString().padStart(2, '0');
23
+ const ms = milliseconds.toString().padStart(3, '0');
24
+ return `${hours}:${mm}:${ss}.${ms} ${ampm}`;
25
+ }
26
+ //# sourceMappingURL=formatTimestamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["formatTimestamp","timestamp","date","Date","hours","getHours","minutes","getMinutes","seconds","getSeconds","milliseconds","getMilliseconds","ampm","mm","toString","padStart","ss","ms"],"sourceRoot":"../../../src","sources":["utils/formatTimestamp.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACO,SAASA,eAAeA,CAACC,SAAiB,EAAU;EACzD,MAAMC,IAAI,GAAG,IAAIC,IAAI,CAACF,SAAS,CAAC;EAChC,IAAIG,KAAK,GAAGF,IAAI,CAACG,QAAQ,CAAC,CAAC;EAC3B,MAAMC,OAAO,GAAGJ,IAAI,CAACK,UAAU,CAAC,CAAC;EACjC,MAAMC,OAAO,GAAGN,IAAI,CAACO,UAAU,CAAC,CAAC;EACjC,MAAMC,YAAY,GAAGR,IAAI,CAACS,eAAe,CAAC,CAAC;EAC3C,MAAMC,IAAI,GAAGR,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI;EAEtCA,KAAK,GAAGA,KAAK,GAAG,EAAE;EAClBA,KAAK,GAAGA,KAAK,IAAI,EAAE;EAEnB,MAAMS,EAAE,GAAGP,OAAO,CAACQ,QAAQ,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EAC9C,MAAMC,EAAE,GAAGR,OAAO,CAACM,QAAQ,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EAC9C,MAAME,EAAE,GAAGP,YAAY,CAACI,QAAQ,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EAEnD,OAAO,GAAGX,KAAK,IAAIS,EAAE,IAAIG,EAAE,IAAIC,EAAE,IAAIL,IAAI,EAAE;AAC7C","ignoreList":[]}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.formatLogMessage = formatLogMessage;
7
+ exports.safeStringify = safeStringify;
8
+ /**
9
+ * Safely stringifies a value, handling circular references and Error objects.
10
+ */
11
+ function safeStringify(value, indent = 2) {
12
+ if (value === undefined) return 'undefined';
13
+ if (value === null) return 'null';
14
+ if (value instanceof Error) {
15
+ return JSON.stringify({
16
+ name: value.name,
17
+ message: value.message,
18
+ stack: value.stack
19
+ }, null, indent);
20
+ }
21
+ const seen = new WeakSet();
22
+ try {
23
+ return JSON.stringify(value, (_key, val) => {
24
+ if (typeof val === 'object' && val !== null) {
25
+ if (seen.has(val)) {
26
+ return '[Circular]';
27
+ }
28
+ seen.add(val);
29
+ }
30
+ if (typeof val === 'bigint') {
31
+ return val.toString();
32
+ }
33
+ if (typeof val === 'function') {
34
+ return `[Function: ${val.name || 'anonymous'}]`;
35
+ }
36
+ if (typeof val === 'symbol') {
37
+ return val.toString();
38
+ }
39
+ return val;
40
+ }, indent);
41
+ } catch {
42
+ return String(value);
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Formats a console message and its optional params into a single string.
48
+ */
49
+ function formatLogMessage(message, optionalParams) {
50
+ const parts = [];
51
+ if (message instanceof Error) {
52
+ parts.push(`${message.name}: ${message.message}`);
53
+ } else if (typeof message === 'object' && message !== null) {
54
+ parts.push(safeStringify(message, 0));
55
+ } else if (typeof message === 'string') {
56
+ // Strip console color formatting (%c)
57
+ parts.push(message.replace(/%c/g, '').trim());
58
+ } else {
59
+ parts.push(String(message));
60
+ }
61
+ if (optionalParams && optionalParams.length > 0) {
62
+ for (const param of optionalParams) {
63
+ if (typeof param === 'string' && isColorString(param)) {
64
+ continue; // skip css color strings from console.log('%c ...', 'color: ...')
65
+ }
66
+ if (typeof param === 'object' && param !== null) {
67
+ parts.push(safeStringify(param, 0));
68
+ } else {
69
+ parts.push(String(param));
70
+ }
71
+ }
72
+ }
73
+ return parts.join(' ');
74
+ }
75
+ function isColorString(str) {
76
+ return str.includes('color:') || str.includes('background:') || str.includes('font-') || /^#[0-9A-Fa-f]{3,8}$/.test(str.trim());
77
+ }
78
+ //# sourceMappingURL=stringify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["safeStringify","value","indent","undefined","Error","JSON","stringify","name","message","stack","seen","WeakSet","_key","val","has","add","toString","String","formatLogMessage","optionalParams","parts","push","replace","trim","length","param","isColorString","join","str","includes","test"],"sourceRoot":"../../../src","sources":["utils/stringify.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+
3
+ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';
4
+ import { StyleSheet, View } from 'react-native';
5
+ import { DEFAULT_MAX_LOGS } from './constants';
6
+ import { installInterceptor, LogBuffer, uninstallInterceptor } from './log-interceptor';
7
+ import { FloatingPill } from './components/FloatingPill';
8
+ import { BackstagePanel } from './components/BackstagePanel';
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ // ─── Component ───────────────────────────────────────────────────────────────
11
+
12
+ export const Backstage = /*#__PURE__*/forwardRef(({
13
+ visible = true,
14
+ appVersion,
15
+ buildNumber,
16
+ bundleId,
17
+ deviceInfo,
18
+ state,
19
+ quickActions,
20
+ maxLogs = DEFAULT_MAX_LOGS,
21
+ logFilters,
22
+ onCopyLogs,
23
+ extraTabs,
24
+ children,
25
+ styles: propStyles,
26
+ initialX,
27
+ initialY,
28
+ pillText
29
+ }, ref) => {
30
+ const [panelVisible, setPanelVisible] = useState(false);
31
+ const [hasError, setHasError] = useState(false);
32
+ const [logs, setLogs] = useState([]);
33
+ const logBuffer = useRef(new LogBuffer(maxLogs));
34
+
35
+ // ── Panel controls ────────────────────────────────────────
36
+
37
+ const openPanel = useCallback(() => {
38
+ setPanelVisible(true);
39
+ // Sync logs when opening panel
40
+ setLogs(logBuffer.current.getAll());
41
+ }, []);
42
+ const closePanel = useCallback(() => {
43
+ setPanelVisible(false);
44
+ }, []);
45
+ const clearLogs = useCallback(() => {
46
+ logBuffer.current.clear();
47
+ setLogs([]);
48
+ setHasError(false);
49
+ }, []);
50
+
51
+ // ── Refresh logs ──────────────────────────────────────────
52
+
53
+ const refreshLogs = useCallback(() => {
54
+ setLogs(logBuffer.current.getAll());
55
+ }, []);
56
+
57
+ // ── Install console interceptor ───────────────────────────
58
+
59
+ useEffect(() => {
60
+ const handleLogEntry = entry => {
61
+ logBuffer.current.push(entry);
62
+
63
+ // Track error state for the floating pill
64
+ if (entry.level === 'error') {
65
+ setHasError(true);
66
+ }
67
+ };
68
+ installInterceptor(handleLogEntry, logFilters);
69
+ return () => {
70
+ uninstallInterceptor();
71
+ };
72
+ }, [logFilters]);
73
+
74
+ // ── Expose ref methods ────────────────────────────────────
75
+
76
+ useImperativeHandle(ref, () => ({
77
+ open: openPanel,
78
+ close: closePanel,
79
+ clearLogs
80
+ }));
81
+
82
+ // ── Render ────────────────────────────────────────────────
83
+
84
+ if (!visible) return null;
85
+ const displayText = pillText || (appVersion ? `v${appVersion}` : 'DEV');
86
+ return /*#__PURE__*/_jsxs(View, {
87
+ style: styles.container,
88
+ pointerEvents: "box-none",
89
+ children: [/*#__PURE__*/_jsx(FloatingPill, {
90
+ text: displayText,
91
+ hasError: hasError,
92
+ onPress: openPanel,
93
+ initialX: initialX,
94
+ initialY: initialY,
95
+ styles: propStyles
96
+ }), /*#__PURE__*/_jsx(BackstagePanel, {
97
+ visible: panelVisible,
98
+ onClose: closePanel,
99
+ appVersion: appVersion,
100
+ buildNumber: buildNumber,
101
+ bundleId: bundleId,
102
+ deviceInfo: deviceInfo,
103
+ state: state,
104
+ quickActions: quickActions,
105
+ logs: logs,
106
+ onRefreshLogs: refreshLogs,
107
+ onCopyLogs: onCopyLogs,
108
+ extraTabs: extraTabs,
109
+ styles: propStyles,
110
+ children: children
111
+ })]
112
+ });
113
+ });
114
+ Backstage.displayName = 'Backstage';
115
+
116
+ // ─── Styles ──────────────────────────────────────────────────────────────────
117
+
118
+ const styles = StyleSheet.create({
119
+ container: {
120
+ ...StyleSheet.absoluteFillObject,
121
+ zIndex: 99999,
122
+ elevation: 99999
123
+ }
124
+ });
125
+ //# sourceMappingURL=Backstage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","useState","StyleSheet","View","DEFAULT_MAX_LOGS","installInterceptor","LogBuffer","uninstallInterceptor","FloatingPill","BackstagePanel","jsx","_jsx","jsxs","_jsxs","Backstage","visible","appVersion","buildNumber","bundleId","deviceInfo","state","quickActions","maxLogs","logFilters","onCopyLogs","extraTabs","children","styles","propStyles","initialX","initialY","pillText","ref","panelVisible","setPanelVisible","hasError","setHasError","logs","setLogs","logBuffer","openPanel","current","getAll","closePanel","clearLogs","clear","refreshLogs","handleLogEntry","entry","push","level","open","close","displayText","style","container","pointerEvents","text","onPress","onClose","onRefreshLogs","displayName","create","absoluteFillObject","zIndex","elevation"],"sourceRoot":"../../src","sources":["Backstage.tsx"],"mappings":"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","ignoreList":[]}