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.
- package/README.md +80 -0
- package/lib/commonjs/Backstage.js +130 -0
- package/lib/commonjs/Backstage.js.map +1 -0
- package/lib/commonjs/components/BackstagePanel.js +192 -0
- package/lib/commonjs/components/BackstagePanel.js.map +1 -0
- package/lib/commonjs/components/FloatingPill.js +147 -0
- package/lib/commonjs/components/FloatingPill.js.map +1 -0
- package/lib/commonjs/components/InfoTab.js +260 -0
- package/lib/commonjs/components/InfoTab.js.map +1 -0
- package/lib/commonjs/components/JsonTreeView.js +245 -0
- package/lib/commonjs/components/JsonTreeView.js.map +1 -0
- package/lib/commonjs/components/LogItem.js +191 -0
- package/lib/commonjs/components/LogItem.js.map +1 -0
- package/lib/commonjs/components/LogsTab.js +235 -0
- package/lib/commonjs/components/LogsTab.js.map +1 -0
- package/lib/commonjs/components/TabBar.js +132 -0
- package/lib/commonjs/components/TabBar.js.map +1 -0
- package/lib/commonjs/constants.js +89 -0
- package/lib/commonjs/constants.js.map +1 -0
- package/lib/commonjs/index.js +20 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/log-interceptor.js +114 -0
- package/lib/commonjs/log-interceptor.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/types.js +21 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/utils/formatTimestamp.js +26 -0
- package/lib/commonjs/utils/formatTimestamp.js.map +1 -0
- package/lib/commonjs/utils/stringify.js +78 -0
- package/lib/commonjs/utils/stringify.js.map +1 -0
- package/lib/module/Backstage.js +125 -0
- package/lib/module/Backstage.js.map +1 -0
- package/lib/module/components/BackstagePanel.js +187 -0
- package/lib/module/components/BackstagePanel.js.map +1 -0
- package/lib/module/components/FloatingPill.js +142 -0
- package/lib/module/components/FloatingPill.js.map +1 -0
- package/lib/module/components/InfoTab.js +255 -0
- package/lib/module/components/InfoTab.js.map +1 -0
- package/lib/module/components/JsonTreeView.js +241 -0
- package/lib/module/components/JsonTreeView.js.map +1 -0
- package/lib/module/components/LogItem.js +186 -0
- package/lib/module/components/LogItem.js.map +1 -0
- package/lib/module/components/LogsTab.js +230 -0
- package/lib/module/components/LogsTab.js.map +1 -0
- package/lib/module/components/TabBar.js +127 -0
- package/lib/module/components/TabBar.js.map +1 -0
- package/lib/module/constants.js +85 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/log-interceptor.js +108 -0
- package/lib/module/log-interceptor.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/types.js +25 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/formatTimestamp.js +22 -0
- package/lib/module/utils/formatTimestamp.js.map +1 -0
- package/lib/module/utils/stringify.js +73 -0
- package/lib/module/utils/stringify.js.map +1 -0
- package/lib/typescript/Backstage.d.ts +4 -0
- package/lib/typescript/Backstage.d.ts.map +1 -0
- package/lib/typescript/components/BackstagePanel.d.ts +21 -0
- package/lib/typescript/components/BackstagePanel.d.ts.map +1 -0
- package/lib/typescript/components/FloatingPill.d.ts +13 -0
- package/lib/typescript/components/FloatingPill.d.ts.map +1 -0
- package/lib/typescript/components/InfoTab.d.ts +16 -0
- package/lib/typescript/components/InfoTab.d.ts.map +1 -0
- package/lib/typescript/components/JsonTreeView.d.ts +10 -0
- package/lib/typescript/components/JsonTreeView.d.ts.map +1 -0
- package/lib/typescript/components/LogItem.d.ts +10 -0
- package/lib/typescript/components/LogItem.d.ts.map +1 -0
- package/lib/typescript/components/LogsTab.d.ts +11 -0
- package/lib/typescript/components/LogsTab.d.ts.map +1 -0
- package/lib/typescript/components/TabBar.d.ts +14 -0
- package/lib/typescript/components/TabBar.d.ts.map +1 -0
- package/lib/typescript/constants.d.ts +43 -0
- package/lib/typescript/constants.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +4 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/log-interceptor.d.ts +16 -0
- package/lib/typescript/log-interceptor.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +110 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/lib/typescript/utils/formatTimestamp.d.ts +7 -0
- package/lib/typescript/utils/formatTimestamp.d.ts.map +1 -0
- package/lib/typescript/utils/stringify.d.ts +9 -0
- package/lib/typescript/utils/stringify.d.ts.map +1 -0
- package/package.json +91 -0
- package/src/Backstage.tsx +145 -0
- package/src/components/BackstagePanel.tsx +208 -0
- package/src/components/FloatingPill.tsx +150 -0
- package/src/components/InfoTab.tsx +264 -0
- package/src/components/JsonTreeView.tsx +259 -0
- package/src/components/LogItem.tsx +189 -0
- package/src/components/LogsTab.tsx +239 -0
- package/src/components/TabBar.tsx +150 -0
- package/src/constants.ts +82 -0
- package/src/index.ts +14 -0
- package/src/log-interceptor.ts +137 -0
- package/src/types.ts +147 -0
- package/src/utils/formatTimestamp.ts +22 -0
- 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":[]}
|