lynx-console 0.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 (60) hide show
  1. package/dist/assets/src/components/BottomSheet.css.ts.vanilla-D-1A77Ik.css +83 -0
  2. package/dist/assets/src/components/ConsolePanel.css.ts.vanilla-B3avfSlI.css +246 -0
  3. package/dist/assets/src/components/FloatingButton.css.ts.vanilla-rPj35oLW.css +55 -0
  4. package/dist/assets/src/components/NetworkPanel.css.ts.vanilla-DFMduT0T.css +247 -0
  5. package/dist/assets/src/components/PerformancePanel.css.ts.vanilla-D35LuXlW.css +216 -0
  6. package/dist/assets/src/components/Tabs.css.ts.vanilla-DD7L2oXt.css +50 -0
  7. package/dist/index.cjs +1058 -0
  8. package/dist/index.css +466 -0
  9. package/dist/index.css.map +1 -0
  10. package/dist/index.d.cts +17 -0
  11. package/dist/index.d.cts.map +1 -0
  12. package/dist/index.d.mts +17 -0
  13. package/dist/index.d.mts.map +1 -0
  14. package/dist/index.mjs +1059 -0
  15. package/dist/index.mjs.map +1 -0
  16. package/dist/setup.cjs +377 -0
  17. package/dist/setup.d.cts +15 -0
  18. package/dist/setup.d.cts.map +1 -0
  19. package/dist/setup.d.mts +15 -0
  20. package/dist/setup.d.mts.map +1 -0
  21. package/dist/setup.mjs +374 -0
  22. package/dist/setup.mjs.map +1 -0
  23. package/package.json +51 -0
  24. package/src/components/BottomSheet.css.ts +93 -0
  25. package/src/components/BottomSheet.tsx +142 -0
  26. package/src/components/ConsolePanel.css.ts +261 -0
  27. package/src/components/ConsolePanel.tsx +41 -0
  28. package/src/components/FloatingButton.css.ts +62 -0
  29. package/src/components/FloatingButton.tsx +37 -0
  30. package/src/components/LogPanel.tsx +241 -0
  31. package/src/components/NetworkDetailSection.tsx +42 -0
  32. package/src/components/NetworkPanel.css.ts +280 -0
  33. package/src/components/NetworkPanel.tsx +222 -0
  34. package/src/components/PerformancePanel.css.ts +224 -0
  35. package/src/components/PerformancePanel.tsx +209 -0
  36. package/src/components/Tabs.css.ts +66 -0
  37. package/src/components/Tabs.tsx +81 -0
  38. package/src/globals.d.ts +9 -0
  39. package/src/hooks/index.ts +3 -0
  40. package/src/hooks/useConsole.ts +35 -0
  41. package/src/hooks/useNetwork.ts +36 -0
  42. package/src/hooks/usePerformance.ts +39 -0
  43. package/src/index.tsx +110 -0
  44. package/src/setup/_setupMainThreadConsole.ts +80 -0
  45. package/src/setup/index.ts +4 -0
  46. package/src/setup/setupLogMonitor.ts +78 -0
  47. package/src/setup/setupMainThreadConsole.ts +34 -0
  48. package/src/setup/setupNetworkMonitor.ts +247 -0
  49. package/src/setup/setupPerformanceMonitor.ts +70 -0
  50. package/src/shared/ensureConsoleStructure.ts +20 -0
  51. package/src/styles/getDimensionValue.ts +7 -0
  52. package/src/styles/global.css.ts +10 -0
  53. package/src/styles/tokens.json +80 -0
  54. package/src/styles/typography.ts +25 -0
  55. package/src/styles/vars/color.ts +228 -0
  56. package/src/styles/vars/dimension.ts +79 -0
  57. package/src/styles/vars/index.css +463 -0
  58. package/src/styles/vars/index.ts +22 -0
  59. package/src/styles/vars/radius.ts +12 -0
  60. package/src/types.ts +96 -0
package/dist/setup.mjs ADDED
@@ -0,0 +1,374 @@
1
+ import "./index.css";
2
+ import { runOnBackground, runOnMainThread } from "@lynx-js/react";
3
+ import { stringify } from "javascript-stringify";
4
+
5
+ //#region src/shared/ensureConsoleStructure.ts
6
+ const ensureConsoleStructure = () => {
7
+ if (!globalThis.__LYNX_CONSOLE__) globalThis.__LYNX_CONSOLE__ = {};
8
+ if (!globalThis.__LYNX_CONSOLE__.state) globalThis.__LYNX_CONSOLE__.state = {};
9
+ return {
10
+ lynxConsole: globalThis.__LYNX_CONSOLE__,
11
+ state: globalThis.__LYNX_CONSOLE__.state
12
+ };
13
+ };
14
+
15
+ //#endregion
16
+ //#region src/setup/setupLogMonitor.ts
17
+ const LOG_METHODS = [
18
+ "log",
19
+ "warn",
20
+ "error",
21
+ "info"
22
+ ];
23
+ const LOG_ID_PREFIX = "background-thread";
24
+ const generateLogId = () => {
25
+ return `${LOG_ID_PREFIX}-${Date.now()}-${Math.random()}`;
26
+ };
27
+ const createLogEntry = (method, args) => {
28
+ return {
29
+ id: generateLogId(),
30
+ level: method,
31
+ message: "",
32
+ timestamp: Date.now(),
33
+ args
34
+ };
35
+ };
36
+ const addLogEntry = (entry) => {
37
+ const state = globalThis.__LYNX_CONSOLE__?.state;
38
+ if (!state?.logs || !state?.logListeners) {
39
+ console.error("[LynxConsole] Cannot add log entry: Log monitor not initialized. Call initLogMonitor() first.");
40
+ return;
41
+ }
42
+ state.logs.push(entry);
43
+ state.logListeners.forEach((listener) => {
44
+ listener(entry);
45
+ });
46
+ };
47
+ const initLogMonitor = () => {
48
+ "background only";
49
+ const { lynxConsole, state } = ensureConsoleStructure();
50
+ if (lynxConsole.originalConsole) {
51
+ console.warn("[LynxConsole] Log monitor already initialized");
52
+ return;
53
+ }
54
+ const originalConsole = globalThis.console;
55
+ lynxConsole.originalConsole = {
56
+ log: originalConsole.log.bind(originalConsole),
57
+ warn: originalConsole.warn.bind(originalConsole),
58
+ error: originalConsole.error.bind(originalConsole),
59
+ info: originalConsole.info.bind(originalConsole)
60
+ };
61
+ state.logs = [];
62
+ state.logListeners = /* @__PURE__ */ new Set();
63
+ state.logSubscribe = (listener) => {
64
+ state.logListeners?.add(listener);
65
+ return () => {
66
+ state.logListeners?.delete(listener);
67
+ };
68
+ };
69
+ LOG_METHODS.forEach((method) => {
70
+ globalThis.console[method] = ((...args) => {
71
+ lynxConsole.originalConsole?.[method](...args);
72
+ addLogEntry(createLogEntry(method, args));
73
+ }).bind(globalThis.console);
74
+ });
75
+ lynxConsole.originalConsole?.log("[LynxConsole] ✅ Log monitoring initialized");
76
+ };
77
+
78
+ //#endregion
79
+ //#region src/setup/_setupMainThreadConsole.ts
80
+ const _setupMainThreadConsole = () => {
81
+ "main thread";
82
+ if (!globalThis.__LYNX_CONSOLE__) globalThis.__LYNX_CONSOLE__ = {};
83
+ const lynxConsole = globalThis.__LYNX_CONSOLE__;
84
+ if (lynxConsole.mainThreadInitialized) {
85
+ console.warn("[LynxConsole] Main thread console already initialized");
86
+ return;
87
+ }
88
+ const LOG_METHODS = [
89
+ "log",
90
+ "warn",
91
+ "error",
92
+ "info"
93
+ ];
94
+ const LOG_ID_PREFIX = "main-thread";
95
+ const serializeArgs = (args) => {
96
+ return args.map((arg) => {
97
+ try {
98
+ JSON.stringify(arg);
99
+ return arg;
100
+ } catch {
101
+ return String(arg);
102
+ }
103
+ });
104
+ };
105
+ const generateLogId = () => {
106
+ return `${LOG_ID_PREFIX}-${Date.now()}-${Math.random()}`;
107
+ };
108
+ const sendLogToBackground = runOnBackground((entry) => {
109
+ const state = globalThis.__LYNX_CONSOLE__?.state;
110
+ if (!state) return;
111
+ state.logs?.push(entry);
112
+ state.logListeners?.forEach((listener) => {
113
+ listener(entry);
114
+ });
115
+ });
116
+ const originalConsole = globalThis.console;
117
+ const originalMethods = {
118
+ log: originalConsole.log.bind(originalConsole),
119
+ warn: originalConsole.warn.bind(originalConsole),
120
+ error: originalConsole.error.bind(originalConsole),
121
+ info: originalConsole.info.bind(originalConsole)
122
+ };
123
+ LOG_METHODS.forEach((method) => {
124
+ const original = originalMethods[method];
125
+ originalConsole[method] = ((...args) => {
126
+ original(...args);
127
+ const serializedArgs = serializeArgs(args);
128
+ const timestamp = Date.now();
129
+ sendLogToBackground({
130
+ id: generateLogId(),
131
+ level: method,
132
+ message: "",
133
+ timestamp,
134
+ args: serializedArgs
135
+ });
136
+ }).bind(originalConsole);
137
+ });
138
+ lynxConsole.mainThreadInitialized = true;
139
+ originalConsole.log("[LynxConsole] ✅ Main thread console initialized");
140
+ };
141
+
142
+ //#endregion
143
+ //#region src/setup/setupMainThreadConsole.ts
144
+ const initMainThreadConsole = async () => {
145
+ "background only";
146
+ const { lynxConsole, state } = ensureConsoleStructure();
147
+ if (lynxConsole.mainThreadInitialized) {
148
+ console.error("[LynxConsole] Main thread console already initialized");
149
+ return;
150
+ }
151
+ if (!state.logs) {
152
+ console.error("[LynxConsole] Background thread console not initialized");
153
+ return;
154
+ }
155
+ try {
156
+ await runOnMainThread(_setupMainThreadConsole)();
157
+ } catch (error) {
158
+ console.error("[LynxConsole] Failed to initialize main thread console:", error);
159
+ }
160
+ };
161
+
162
+ //#endregion
163
+ //#region src/setup/setupNetworkMonitor.ts
164
+ const generateNetworkId = () => {
165
+ return `network-${Date.now()}-${Math.random()}`;
166
+ };
167
+ const extractUrl = (input) => {
168
+ if (typeof input === "string") return input;
169
+ if (input instanceof URL) return input.href;
170
+ return input.url;
171
+ };
172
+ const extractMethod = (input, init) => {
173
+ if (init?.method) return init.method;
174
+ if (typeof input === "object" && "method" in input) return input.method;
175
+ return "GET";
176
+ };
177
+ const extractHeaders = (headers) => {
178
+ const result = {};
179
+ if (!headers) return result;
180
+ try {
181
+ if (headers instanceof Headers) headers.forEach((value, key) => {
182
+ result[key] = value;
183
+ });
184
+ else if (Array.isArray(headers)) headers.forEach(([key, value]) => {
185
+ result[key] = value;
186
+ });
187
+ else Object.entries(headers).forEach(([key, value]) => {
188
+ result[key] = value;
189
+ });
190
+ } catch (error) {
191
+ console.error("[LynxConsole] Failed to extract headers:", error);
192
+ }
193
+ return result;
194
+ };
195
+ const mergeRequestHeaders = (input, init) => {
196
+ const merged = {};
197
+ if (typeof input === "object" && "headers" in input) Object.assign(merged, extractHeaders(input.headers));
198
+ if (init?.headers) Object.assign(merged, extractHeaders(init.headers));
199
+ return merged;
200
+ };
201
+ const addNetworkEntry = (entry) => {
202
+ const state = globalThis.__LYNX_CONSOLE__?.state;
203
+ if (!state?.networks || !state?.networksMap || !state?.networkListeners) {
204
+ console.error("[LynxConsole] Cannot add network entry: Network monitor not initialized. Call initNetworkMonitor() first.");
205
+ return;
206
+ }
207
+ state.networks.push(entry);
208
+ state.networksMap.set(entry.id, entry);
209
+ state.networkListeners.forEach((listener) => {
210
+ listener(entry);
211
+ });
212
+ };
213
+ const updateNetworkEntry = (id, updates) => {
214
+ const state = globalThis.__LYNX_CONSOLE__?.state;
215
+ if (!state?.networks || !state?.networksMap || !state?.networkListeners) {
216
+ console.error("[LynxConsole] Cannot update network entry: Network monitor not initialized. Call initNetworkMonitor() first.");
217
+ return;
218
+ }
219
+ const existingEntry = state.networksMap.get(id);
220
+ if (!existingEntry) {
221
+ console.error(`[LynxConsole] Cannot update network entry: Entry with id '${id}' not found.`);
222
+ return;
223
+ }
224
+ const updatedEntry = {
225
+ ...existingEntry,
226
+ ...updates
227
+ };
228
+ const index = state.networks.findIndex((entry) => entry.id === id);
229
+ if (index !== -1) state.networks[index] = updatedEntry;
230
+ state.networksMap.set(id, updatedEntry);
231
+ state.networkListeners.forEach((listener) => {
232
+ listener(updatedEntry);
233
+ });
234
+ };
235
+ const initNetworkMonitor = () => {
236
+ if (!lynx.fetch) {
237
+ console.warn("[LynxConsole] lynx.fetch not available, skipping network monitor");
238
+ return;
239
+ }
240
+ const { state } = ensureConsoleStructure();
241
+ if (state.networks !== void 0) {
242
+ console.warn("[LynxConsole] Network monitor already initialized");
243
+ return;
244
+ }
245
+ state.networks = [];
246
+ state.networksMap = /* @__PURE__ */ new Map();
247
+ state.networkListeners = /* @__PURE__ */ new Set();
248
+ state.subscribeNetwork = (listener) => {
249
+ state.networkListeners?.add(listener);
250
+ return () => {
251
+ state.networkListeners?.delete(listener);
252
+ };
253
+ };
254
+ const originalFetch = fetch.bind(lynx);
255
+ const monitoredFetch = async (input, init) => {
256
+ const id = generateNetworkId();
257
+ const startTime = Date.now();
258
+ const url = extractUrl(input);
259
+ const method = extractMethod(input, init);
260
+ const requestHeaders = mergeRequestHeaders(input, init);
261
+ let requestBody;
262
+ if (init?.body) if (typeof init.body === "string") requestBody = init.body;
263
+ else if (init.body instanceof URLSearchParams) requestBody = init.body.toString();
264
+ else requestBody = String(init.body);
265
+ addNetworkEntry({
266
+ id,
267
+ url,
268
+ method: method || "default",
269
+ status: "pending",
270
+ startTime,
271
+ requestHeaders,
272
+ requestBody: requestBody ?? ""
273
+ });
274
+ try {
275
+ const response = await originalFetch(input, init);
276
+ const endTime = Date.now();
277
+ const responseHeaders = {};
278
+ response.headers.forEach((value, key) => {
279
+ responseHeaders[key] = value;
280
+ });
281
+ const clonedResponse = response.clone();
282
+ let responseBody;
283
+ try {
284
+ const headerMap = {};
285
+ response.headers.forEach((value, key) => {
286
+ headerMap[key.toLowerCase()] = value;
287
+ });
288
+ const contentType = headerMap["content-type"];
289
+ if (contentType?.includes("application/json")) responseBody = stringify(await clonedResponse.json(), null, 2, { references: true }) ?? "";
290
+ else if (contentType?.includes("text")) responseBody = await clonedResponse.text();
291
+ } catch (error) {
292
+ responseBody = `[Unable to read response body] ${error}`;
293
+ console.error("[LynxConsole] Error reading response body:", error);
294
+ }
295
+ updateNetworkEntry(id, {
296
+ status: "success",
297
+ statusCode: response.status,
298
+ statusText: response.statusText,
299
+ endTime,
300
+ duration: endTime - startTime,
301
+ responseHeaders,
302
+ responseBody: responseBody ?? ""
303
+ });
304
+ return response;
305
+ } catch (error) {
306
+ const endTime = Date.now();
307
+ updateNetworkEntry(id, {
308
+ status: "error",
309
+ endTime,
310
+ duration: endTime - startTime,
311
+ error: error instanceof Error ? error.message : String(error)
312
+ });
313
+ throw error;
314
+ }
315
+ };
316
+ fetch = monitoredFetch;
317
+ lynx.fetch = monitoredFetch;
318
+ console.log("[LynxConsole] ✅ Network monitoring initialized");
319
+ };
320
+
321
+ //#endregion
322
+ //#region src/setup/setupPerformanceMonitor.ts
323
+ const generatePerformanceId = () => {
324
+ return `performance-${Date.now()}-${Math.random()}`;
325
+ };
326
+ const addPerformanceEntry = (entry) => {
327
+ const state = globalThis.__LYNX_CONSOLE__?.state;
328
+ if (!state?.performances || !state?.performanceListeners) {
329
+ console.error("[LynxConsole] Cannot add performance entry: Performance monitor not initialized. Call initPerformanceMonitor() first.");
330
+ return;
331
+ }
332
+ state.performances.push(entry);
333
+ state.performanceListeners.forEach((listener) => {
334
+ listener(entry);
335
+ });
336
+ };
337
+ const initPerformanceMonitor = () => {
338
+ "background only";
339
+ if (!lynx.performance) {
340
+ console.warn("[LynxConsole] lynx.performance not available, skipping performance monitor");
341
+ return;
342
+ }
343
+ const { state } = ensureConsoleStructure();
344
+ if (state.performances !== void 0) {
345
+ console.warn("[LynxConsole] Performance monitor already initialized");
346
+ return;
347
+ }
348
+ state.performances = [];
349
+ state.performanceListeners = /* @__PURE__ */ new Set();
350
+ state.subscribePerformance = (listener) => {
351
+ state.performanceListeners?.add(listener);
352
+ return () => {
353
+ state.performanceListeners?.delete(listener);
354
+ };
355
+ };
356
+ lynx.performance.createObserver((entry) => {
357
+ addPerformanceEntry({
358
+ id: generatePerformanceId(),
359
+ entryType: entry.entryType,
360
+ name: entry.name,
361
+ timestamp: Date.now(),
362
+ rawEntry: entry
363
+ });
364
+ }).observe([
365
+ "pipeline",
366
+ "init",
367
+ "metric"
368
+ ]);
369
+ console.log("[LynxConsole] ✅ Performance monitoring initialized");
370
+ };
371
+
372
+ //#endregion
373
+ export { initLogMonitor, initMainThreadConsole, initNetworkMonitor, initPerformanceMonitor };
374
+ //# sourceMappingURL=setup.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.mjs","names":[],"sources":["../src/shared/ensureConsoleStructure.ts","../src/setup/setupLogMonitor.ts","../src/setup/_setupMainThreadConsole.ts","../src/setup/setupMainThreadConsole.ts","../src/setup/setupNetworkMonitor.ts","../src/setup/setupPerformanceMonitor.ts"],"sourcesContent":["type LynxConsole = NonNullable<typeof globalThis.__LYNX_CONSOLE__>;\ntype ConsoleState = NonNullable<LynxConsole[\"state\"]>;\n\nexport const ensureConsoleStructure = (): {\n lynxConsole: LynxConsole;\n state: ConsoleState;\n} => {\n if (!globalThis.__LYNX_CONSOLE__) {\n globalThis.__LYNX_CONSOLE__ = {};\n }\n\n if (!globalThis.__LYNX_CONSOLE__.state) {\n globalThis.__LYNX_CONSOLE__.state = {};\n }\n\n return {\n lynxConsole: globalThis.__LYNX_CONSOLE__,\n state: globalThis.__LYNX_CONSOLE__.state,\n };\n};\n","import { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport type { LogEntry, LogLevel } from \"../types\";\n\ntype LogListener = (entry: LogEntry) => void;\n\nconst LOG_METHODS: LogLevel[] = [\"log\", \"warn\", \"error\", \"info\"];\nconst LOG_ID_PREFIX = \"background-thread\";\n\nconst generateLogId = (): string => {\n return `${LOG_ID_PREFIX}-${Date.now()}-${Math.random()}`;\n};\n\nconst createLogEntry = (method: LogLevel, args: unknown[]): LogEntry => {\n return {\n id: generateLogId(),\n level: method,\n message: \"\",\n timestamp: Date.now(),\n args,\n };\n};\n\nconst addLogEntry = (entry: LogEntry): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.logs || !state?.logListeners) {\n console.error(\n \"[LynxConsole] Cannot add log entry: Log monitor not initialized. Call initLogMonitor() first.\",\n );\n return;\n }\n\n state.logs.push(entry);\n state.logListeners.forEach((listener) => {\n listener(entry);\n });\n};\n\n// Background Thread: Log monitoring 초기화\nexport const initLogMonitor = () => {\n \"background only\";\n\n const { lynxConsole, state } = ensureConsoleStructure();\n\n if (lynxConsole.originalConsole) {\n console.warn(\"[LynxConsole] Log monitor already initialized\");\n return;\n }\n\n const originalConsole = globalThis.console;\n lynxConsole.originalConsole = {\n log: originalConsole.log.bind(originalConsole),\n warn: originalConsole.warn.bind(originalConsole),\n error: originalConsole.error.bind(originalConsole),\n info: originalConsole.info.bind(originalConsole),\n };\n\n state.logs = [];\n state.logListeners = new Set();\n state.logSubscribe = (listener: LogListener) => {\n state.logListeners?.add(listener);\n return () => {\n state.logListeners?.delete(listener);\n };\n };\n\n // Background Thread console 오버라이드\n LOG_METHODS.forEach((method) => {\n globalThis.console[method] = ((...args: unknown[]) => {\n lynxConsole.originalConsole?.[method](...args);\n const entry = createLogEntry(method, args);\n addLogEntry(entry);\n }).bind(globalThis.console);\n });\n\n lynxConsole.originalConsole?.log(\n \"[LynxConsole] ✅ Log monitoring initialized\",\n );\n};\n","import { runOnBackground } from \"@lynx-js/react\";\nimport type { LogEntry, LogLevel } from \"../types\";\n\nconst _setupMainThreadConsole = (): void => {\n \"main thread\";\n\n //IMPORTANT: do not use external functions in main thread\n if (!globalThis.__LYNX_CONSOLE__) globalThis.__LYNX_CONSOLE__ = {};\n const lynxConsole = globalThis.__LYNX_CONSOLE__;\n\n if (lynxConsole.mainThreadInitialized) {\n console.warn(\"[LynxConsole] Main thread console already initialized\");\n return;\n }\n\n const LOG_METHODS: LogLevel[] = [\"log\", \"warn\", \"error\", \"info\"];\n const LOG_ID_PREFIX = \"main-thread\";\n\n const serializeArgs = (args: unknown[]): unknown[] => {\n return args.map((arg) => {\n try {\n JSON.stringify(arg);\n return arg;\n } catch {\n return String(arg);\n }\n });\n };\n\n const generateLogId = (): string => {\n return `${LOG_ID_PREFIX}-${Date.now()}-${Math.random()}`;\n };\n\n // Main Thread에서 Background Thread로 로그 전송하는 함수\n const sendLogToBackground = runOnBackground((entry: LogEntry): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state) return;\n\n state.logs?.push(entry);\n state.logListeners?.forEach((listener) => {\n listener(entry);\n });\n });\n\n const originalConsole = globalThis.console;\n\n const originalMethods = {\n log: originalConsole.log.bind(originalConsole),\n warn: originalConsole.warn.bind(originalConsole),\n error: originalConsole.error.bind(originalConsole),\n info: originalConsole.info.bind(originalConsole),\n };\n\n // Main Thread console 오버라이드\n LOG_METHODS.forEach((method) => {\n const original = originalMethods[method];\n originalConsole[method] = ((...args: unknown[]) => {\n // 원본 console 호출\n original(...args);\n\n const serializedArgs = serializeArgs(args);\n const timestamp = Date.now();\n const id = generateLogId();\n\n sendLogToBackground({\n id,\n level: method,\n message: \"\",\n timestamp,\n args: serializedArgs,\n });\n }).bind(originalConsole);\n });\n\n lynxConsole.mainThreadInitialized = true;\n\n originalConsole.log(\"[LynxConsole] ✅ Main thread console initialized\");\n};\n\nexport default _setupMainThreadConsole;\n","// both thread;\nimport \"./_setupMainThreadConsole\";\n\nimport { runOnMainThread } from \"@lynx-js/react\";\nimport { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport _setupMainThreadConsole from \"./_setupMainThreadConsole\";\n\n// Main Thread: Console 초기화\n\nexport const initMainThreadConsole = async (): Promise<void> => {\n \"background only\";\n\n const { lynxConsole, state } = ensureConsoleStructure();\n\n if (lynxConsole.mainThreadInitialized) {\n console.error(\"[LynxConsole] Main thread console already initialized\");\n return;\n }\n\n if (!state.logs) {\n console.error(\"[LynxConsole] Background thread console not initialized\");\n return;\n }\n\n try {\n const setupOnMainThread = runOnMainThread(_setupMainThreadConsole);\n await setupOnMainThread();\n } catch (error) {\n console.error(\n \"[LynxConsole] Failed to initialize main thread console:\",\n error,\n );\n }\n};\n","import { stringify } from \"javascript-stringify\";\nimport { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport type { NetworkEntry } from \"../types\";\n\nconst generateNetworkId = (): string => {\n return `network-${Date.now()}-${Math.random()}`;\n};\n\nconst extractUrl = (input: RequestInfo | URL): string => {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.href;\n return (input as Request).url;\n};\n\nconst extractMethod = (\n input: RequestInfo | URL,\n init?: RequestInit,\n): string | undefined => {\n if (init?.method) return init.method;\n if (typeof input === \"object\" && \"method\" in input) {\n return (input as Request).method;\n }\n return \"GET\";\n};\n\nconst extractHeaders = (\n headers: HeadersInit | undefined,\n): Record<string, string> => {\n const result: Record<string, string> = {};\n if (!headers) return result;\n\n try {\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n result[key] = value;\n });\n } else if (Array.isArray(headers)) {\n headers.forEach(([key, value]) => {\n result[key] = value;\n });\n } else {\n Object.entries(headers).forEach(([key, value]) => {\n result[key] = value;\n });\n }\n } catch (error) {\n console.error(\"[LynxConsole] Failed to extract headers:\", error);\n }\n\n return result;\n};\n\nconst mergeRequestHeaders = (\n input: RequestInfo | URL,\n init?: RequestInit,\n): Record<string, string> => {\n const merged: Record<string, string> = {};\n\n // Request 객체나 URL 객체에서 헤더 추출\n if (typeof input === \"object\" && \"headers\" in input) {\n Object.assign(merged, extractHeaders(input.headers as HeadersInit));\n }\n\n // RequestInit에서 헤더 추출 (나중 값이 우선)\n if (init?.headers) {\n Object.assign(merged, extractHeaders(init.headers));\n }\n\n return merged;\n};\n\nconst addNetworkEntry = (entry: NetworkEntry): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.networks || !state?.networksMap || !state?.networkListeners) {\n console.error(\n \"[LynxConsole] Cannot add network entry: Network monitor not initialized. Call initNetworkMonitor() first.\",\n );\n return;\n }\n\n state.networks.push(entry);\n state.networksMap.set(entry.id, entry);\n\n state.networkListeners.forEach((listener) => {\n listener(entry);\n });\n};\n\nconst updateNetworkEntry = (\n id: string,\n updates: Partial<NetworkEntry>,\n): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.networks || !state?.networksMap || !state?.networkListeners) {\n console.error(\n \"[LynxConsole] Cannot update network entry: Network monitor not initialized. Call initNetworkMonitor() first.\",\n );\n return;\n }\n\n const existingEntry = state.networksMap.get(id);\n if (!existingEntry) {\n console.error(\n `[LynxConsole] Cannot update network entry: Entry with id '${id}' not found.`,\n );\n return;\n }\n\n const updatedEntry = { ...existingEntry, ...updates };\n\n const index = state.networks.findIndex((entry) => entry.id === id);\n if (index !== -1) {\n state.networks[index] = updatedEntry;\n }\n\n state.networksMap.set(id, updatedEntry);\n\n state.networkListeners.forEach((listener) => {\n listener(updatedEntry);\n });\n};\n\nexport const initNetworkMonitor = () => {\n if (!lynx.fetch) {\n console.warn(\n \"[LynxConsole] lynx.fetch not available, skipping network monitor\",\n );\n return;\n }\n\n const { state } = ensureConsoleStructure();\n\n if (state.networks !== undefined) {\n console.warn(\"[LynxConsole] Network monitor already initialized\");\n return;\n }\n\n type NetworkListener = (entry: NetworkEntry) => void;\n state.networks = [];\n state.networksMap = new Map();\n state.networkListeners = new Set();\n state.subscribeNetwork = (listener: NetworkListener) => {\n state.networkListeners?.add(listener);\n return () => {\n state.networkListeners?.delete(listener);\n };\n };\n\n const originalFetch = fetch.bind(lynx);\n\n const monitoredFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const id = generateNetworkId();\n const startTime = Date.now();\n const url = extractUrl(input);\n const method = extractMethod(input, init);\n\n const requestHeaders = mergeRequestHeaders(input, init);\n\n // Request body 처리\n let requestBody: string | undefined;\n if (init?.body) {\n if (typeof init.body === \"string\") {\n requestBody = init.body;\n } else if (init.body instanceof URLSearchParams) {\n requestBody = init.body.toString();\n } else {\n // Lynx가 지원하지 않는 타입이거나 알 수 없는 타입\n requestBody = String(init.body);\n }\n }\n\n addNetworkEntry({\n id,\n url,\n method: method || \"default\",\n status: \"pending\",\n startTime,\n requestHeaders,\n requestBody: requestBody ?? \"\",\n });\n\n try {\n const response = await originalFetch(input, init);\n const endTime = Date.now();\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const clonedResponse = response.clone();\n let responseBody: string | undefined;\n\n try {\n const headerMap: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headerMap[key.toLowerCase()] = value;\n });\n\n const contentType = headerMap[\"content-type\"];\n if (contentType?.includes(\"application/json\")) {\n const json = await clonedResponse.json();\n responseBody = stringify(json, null, 2, { references: true }) ?? \"\";\n } else if (contentType?.includes(\"text\")) {\n responseBody = await clonedResponse.text();\n }\n } catch (error) {\n responseBody = `[Unable to read response body] ${error}`;\n console.error(\"[LynxConsole] Error reading response body:\", error);\n }\n\n updateNetworkEntry(id, {\n status: \"success\",\n statusCode: response.status,\n statusText: response.statusText,\n endTime,\n duration: endTime - startTime,\n responseHeaders,\n responseBody: responseBody ?? \"\",\n });\n\n return response;\n } catch (error) {\n const endTime = Date.now();\n updateNetworkEntry(id, {\n status: \"error\",\n endTime,\n duration: endTime - startTime,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n };\n\n // biome-ignore lint/suspicious/noTsIgnore: to assign fetch to global functionfetch\n // @ts-ignore\n // biome-ignore lint/suspicious/noGlobalAssign: to assign fetch to global functionfetch fetch\n fetch = monitoredFetch as typeof fetch;\n\n //fetch 대신 lynx.fetch를 사용하는 경우에도 모니터링 되도록 설정\n lynx.fetch = monitoredFetch as typeof lynx.fetch;\n\n console.log(\"[LynxConsole] ✅ Network monitoring initialized\");\n};\n","import { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport type { PerformanceEntryData, PerformanceEntryType } from \"../types\";\n\ntype PerformanceListener = (entry: PerformanceEntryData) => void;\n\nconst generatePerformanceId = (): string => {\n return `performance-${Date.now()}-${Math.random()}`;\n};\n\nconst addPerformanceEntry = (entry: PerformanceEntryData): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.performances || !state?.performanceListeners) {\n console.error(\n \"[LynxConsole] Cannot add performance entry: Performance monitor not initialized. Call initPerformanceMonitor() first.\",\n );\n return;\n }\n\n state.performances.push(entry);\n state.performanceListeners.forEach((listener) => {\n listener(entry);\n });\n};\n\nexport const initPerformanceMonitor = () => {\n \"background only\";\n\n if (!lynx.performance) {\n console.warn(\n \"[LynxConsole] lynx.performance not available, skipping performance monitor\",\n );\n return;\n }\n\n const { state } = ensureConsoleStructure();\n\n if (state.performances !== undefined) {\n console.warn(\"[LynxConsole] Performance monitor already initialized\");\n return;\n }\n\n state.performances = [];\n state.performanceListeners = new Set();\n state.subscribePerformance = (listener: PerformanceListener) => {\n state.performanceListeners?.add(listener);\n return () => {\n state.performanceListeners?.delete(listener);\n };\n };\n\n const observer = lynx.performance.createObserver((entry) => {\n const performanceEntry: PerformanceEntryData = {\n id: generatePerformanceId(),\n entryType: entry.entryType as PerformanceEntryType,\n name: entry.name,\n timestamp: Date.now(),\n rawEntry: entry,\n };\n\n addPerformanceEntry(performanceEntry);\n });\n\n observer.observe([\n \"pipeline\", // LoadBundleEntry\n \"init\", // InitLynxviewEntry\n \"metric\", // MetricEntry\n ]);\n\n console.log(\"[LynxConsole] ✅ Performance monitoring initialized\");\n};\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "lynx-console",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "sideEffects": [
6
+ "**/*.css",
7
+ "dist/index.css"
8
+ ],
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.mts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./setup": {
16
+ "types": "./dist/setup.d.mts",
17
+ "import": "./dist/setup.mjs",
18
+ "require": "./dist/setup.cjs"
19
+ },
20
+ "./style.css": "./dist/index.css"
21
+ },
22
+ "main": "dist/index.mjs",
23
+ "types": "dist/index.d.mts",
24
+ "files": [
25
+ "dist",
26
+ "src"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsdown",
30
+ "dev": "tsdown --watch"
31
+ },
32
+ "devDependencies": {
33
+ "@lynx-js/react": "^0.114.3",
34
+ "@lynx-js/types": "^3.6.0",
35
+ "@types/react": "^18.3.28",
36
+ "@vanilla-extract/css": "^1.18.0",
37
+ "@vanilla-extract/recipes": "^0.5.7",
38
+ "@vanilla-extract/rollup-plugin": "^1.5.1",
39
+ "react": "^18.3.1",
40
+ "tsdown": "^0.20.1",
41
+ "typescript": "^5.9.3"
42
+ },
43
+ "peerDependencies": {
44
+ "@lynx-js/react": "^0.114.3",
45
+ "@lynx-js/types": "^3.6.0",
46
+ "@types/react": "^18"
47
+ },
48
+ "dependencies": {
49
+ "javascript-stringify": "^2.1.0"
50
+ }
51
+ }
@@ -0,0 +1,93 @@
1
+ import { style } from "@vanilla-extract/css";
2
+ import { typography } from "../styles/typography";
3
+ import { vars } from "../styles/vars";
4
+
5
+ export const overlay = style({
6
+ position: "fixed",
7
+ top: 0,
8
+ right: 0,
9
+ bottom: 0,
10
+ left: 0,
11
+ display: "flex",
12
+ justifyContent: "center",
13
+ alignItems: "flex-end",
14
+ zIndex: 3,
15
+ });
16
+
17
+ export const backdrop = style({
18
+ position: "fixed",
19
+ top: 0,
20
+ right: 0,
21
+ bottom: 0,
22
+ left: 0,
23
+ zIndex: 2,
24
+ background: vars.$color.bg.overlay,
25
+ transition: `opacity ${vars.$duration.d6} cubic-bezier(0.4, 0, 0.2, 1)`,
26
+ });
27
+
28
+ export const content = style({
29
+ position: "relative",
30
+ display: "flex",
31
+ flex: 1,
32
+ flexDirection: "column",
33
+ boxSizing: "border-box",
34
+ wordBreak: "break-all",
35
+ background: vars.$color.bg.layerFloating,
36
+ borderTopLeftRadius: vars.$radius.r6,
37
+ borderTopRightRadius: vars.$radius.r6,
38
+ transition: `transform ${vars.$duration.d6} cubic-bezier(0.4, 0, 0.2, 1)`,
39
+ height: "500px",
40
+ overflow: "hidden",
41
+ });
42
+
43
+ export const handleContainer = style({
44
+ position: "absolute",
45
+ top: 0,
46
+ left: 0,
47
+ right: 0,
48
+ height: "48px",
49
+ display: "flex",
50
+ justifyContent: "center",
51
+ zIndex: 10,
52
+ });
53
+
54
+ export const handle = style({
55
+ width: "36px",
56
+ height: 4,
57
+ backgroundColor: vars.$color.palette.gray400,
58
+ borderRadius: "9999px",
59
+ marginTop: "12px",
60
+ });
61
+
62
+ export const header = style({
63
+ display: "flex",
64
+ flexDirection: "column",
65
+ gap: vars.$dimension.x2,
66
+ paddingTop: vars.$dimension.x6,
67
+ paddingBottom: vars.$dimension.x4,
68
+ justifyContent: "flex-start",
69
+ paddingLeft: vars.$dimension.spacingX.globalGutter,
70
+ paddingRight: "50px",
71
+ });
72
+
73
+ export const title = style({
74
+ ...typography("t7", "bold"),
75
+ color: vars.$color.fg.neutral,
76
+ });
77
+
78
+ export const body = style({
79
+ display: "flex",
80
+ flexDirection: "column",
81
+ flex: 1,
82
+ padding: `0 ${vars.$dimension.x4}`,
83
+ overflow: "hidden",
84
+ });
85
+
86
+ export const footer = style({
87
+ display: "flex",
88
+ flexDirection: "column",
89
+ paddingLeft: vars.$dimension.spacingX.globalGutter,
90
+ paddingRight: vars.$dimension.spacingX.globalGutter,
91
+ paddingTop: vars.$dimension.x3,
92
+ paddingBottom: vars.$dimension.x4,
93
+ });