v0.1.0-pre.046
This commit is contained in:
97
kb-app-demo-desktop/frontend/ts/frontend_log.ts
Normal file
97
kb-app-demo-desktop/frontend/ts/frontend_log.ts
Normal file
@@ -0,0 +1,97 @@
|
||||
// file: kb-app-demo-desktop/frontend/ts/frontend_log.ts
|
||||
// version: 1
|
||||
|
||||
//! Frontend logging helpers that preserve explicit tracing targets.
|
||||
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import type { FrontendLogPayload } from "./bindings/kb_app_demo_desktop/frontend_log/FrontendLogPayload.ts";
|
||||
|
||||
type FrontendLogLevel = "trace" | "debug" | "info" | "warn" | "error";
|
||||
|
||||
type ConsoleMethod = (...items: unknown[]) => void;
|
||||
|
||||
const originalConsole = {
|
||||
trace: console.trace.bind(console),
|
||||
debug: console.debug.bind(console),
|
||||
log: console.log.bind(console),
|
||||
info: console.info.bind(console),
|
||||
warn: console.warn.bind(console),
|
||||
error: console.error.bind(console),
|
||||
};
|
||||
|
||||
function stringifyItem(item: unknown): string {
|
||||
if (item instanceof Error) {
|
||||
return item.stack ?? item.message;
|
||||
}
|
||||
if (typeof item === "string") {
|
||||
return item;
|
||||
}
|
||||
try {
|
||||
return JSON.stringify(item);
|
||||
} catch (caughtError) {
|
||||
return String(item);
|
||||
}
|
||||
}
|
||||
|
||||
function formatMessage(items: unknown[]): string {
|
||||
return items.map(item => stringifyItem(item)).join(" ");
|
||||
}
|
||||
|
||||
async function sendFrontendLog(level: FrontendLogLevel, target: string, message: string): Promise<void> {
|
||||
const payload: FrontendLogPayload = {
|
||||
level,
|
||||
target,
|
||||
message,
|
||||
};
|
||||
try {
|
||||
await invoke("emit_frontend_log", { payload });
|
||||
} catch (caughtError) {
|
||||
originalConsole.error("frontend tracing bridge failed", caughtError);
|
||||
}
|
||||
}
|
||||
|
||||
export function frontendTrace(target: string, ...items: unknown[]): void {
|
||||
const message = formatMessage(items);
|
||||
originalConsole.trace(message);
|
||||
void sendFrontendLog("trace", target, message);
|
||||
}
|
||||
|
||||
export function frontendDebug(target: string, ...items: unknown[]): void {
|
||||
const message = formatMessage(items);
|
||||
originalConsole.debug(message);
|
||||
void sendFrontendLog("debug", target, message);
|
||||
}
|
||||
|
||||
export function frontendInfo(target: string, ...items: unknown[]): void {
|
||||
const message = formatMessage(items);
|
||||
originalConsole.info(message);
|
||||
void sendFrontendLog("info", target, message);
|
||||
}
|
||||
|
||||
export function frontendWarn(target: string, ...items: unknown[]): void {
|
||||
const message = formatMessage(items);
|
||||
originalConsole.warn(message);
|
||||
void sendFrontendLog("warn", target, message);
|
||||
}
|
||||
|
||||
export function frontendError(target: string, ...items: unknown[]): void {
|
||||
const message = formatMessage(items);
|
||||
originalConsole.error(message);
|
||||
void sendFrontendLog("error", target, message);
|
||||
}
|
||||
|
||||
function buildConsoleBridge(level: FrontendLogLevel, target: string, original: ConsoleMethod): ConsoleMethod {
|
||||
return (...items: unknown[]) => {
|
||||
original(...items);
|
||||
void sendFrontendLog(level, target, formatMessage(items));
|
||||
};
|
||||
}
|
||||
|
||||
export function installFrontendConsoleBridge(target: string): void {
|
||||
console.trace = buildConsoleBridge("trace", target, originalConsole.trace);
|
||||
console.debug = buildConsoleBridge("debug", target, originalConsole.debug);
|
||||
console.log = buildConsoleBridge("info", target, originalConsole.log);
|
||||
console.info = buildConsoleBridge("info", target, originalConsole.info);
|
||||
console.warn = buildConsoleBridge("warn", target, originalConsole.warn);
|
||||
console.error = buildConsoleBridge("error", target, originalConsole.error);
|
||||
}
|
||||
38
kb-app-demo-desktop/frontend/ts/main.ts
Normal file
38
kb-app-demo-desktop/frontend/ts/main.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
// file: kb-app-demo-desktop/frontend/ts/main.ts
|
||||
// version: 1
|
||||
|
||||
import * as bootstrap from "bootstrap";
|
||||
import MarkdownIt from "markdown-it";
|
||||
import ResizeObserver from "resize-observer-polyfill";
|
||||
import "simplebar";
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import { frontendDebug, frontendError, installFrontendConsoleBridge } from "./frontend_log.ts";
|
||||
|
||||
(window as Window & typeof globalThis & { bootstrap?: typeof bootstrap }).bootstrap = bootstrap;
|
||||
(window as Window & typeof globalThis & { ResizeObserver?: typeof ResizeObserver }).ResizeObserver = ResizeObserver;
|
||||
|
||||
const markdownRenderer = new MarkdownIt({
|
||||
html: false,
|
||||
linkify: true,
|
||||
typographer: true,
|
||||
});
|
||||
|
||||
async function loadReadme(readmeContent: HTMLElement): Promise<void> {
|
||||
try {
|
||||
const readme = await invoke<string>("load_project_readme");
|
||||
readmeContent.innerHTML = markdownRenderer.render(readme);
|
||||
} catch (caughtError) {
|
||||
const message = caughtError instanceof Error ? caughtError.message : String(caughtError);
|
||||
readmeContent.textContent = `Erreur pendant le chargement du README : ${message}`;
|
||||
frontendError("kb-app-demo-desktop.frontend.main", `README loading failed: ${message}`);
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", async () => {
|
||||
installFrontendConsoleBridge("kb-app-demo-desktop.frontend.main");
|
||||
frontendDebug("kb-app-demo-desktop.frontend.main", "main window loaded");
|
||||
const readmeContent = document.querySelector<HTMLElement>("#readmeContent");
|
||||
if (readmeContent) {
|
||||
await loadReadme(readmeContent);
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user