chore: updated monaco and tools to update monaco
This commit is contained in:
35
assets/js/error_reporter.js
Normal file
35
assets/js/error_reporter.js
Normal file
@@ -0,0 +1,35 @@
|
||||
// App-wide error reporter — catches JS errors and displays them as an overlay.
|
||||
// Enables debugging in WKWebView where devtools are unavailable.
|
||||
(function () {
|
||||
const overlay = document.createElement("div");
|
||||
overlay.id = "error-reporter";
|
||||
overlay.style.cssText =
|
||||
"position:fixed;bottom:0;left:0;right:0;max-height:200px;overflow:auto;background:#1a1a2e;color:#f0f0f0;font:12px monospace;padding:8px 12px;border-top:2px solid #e74c3c;z-index:99999;display:none;";
|
||||
overlay.innerHTML = '<strong style="color:#e74c3c">⚠ JS Errors</strong><pre id="error-reporter-log"></pre>';
|
||||
document.body.appendChild(overlay);
|
||||
|
||||
const log = document.getElementById("error-reporter-log");
|
||||
|
||||
const append = (msg) => {
|
||||
overlay.style.display = "block";
|
||||
log.textContent += msg + "\n";
|
||||
overlay.scrollTop = overlay.scrollHeight;
|
||||
};
|
||||
|
||||
window.addEventListener("error", (e) => {
|
||||
const src = e.filename || "";
|
||||
const loc = e.lineno !== undefined ? `:${e.lineno}` : "";
|
||||
append(`[${new Date().toLocaleTimeString()}] ${e.message || e.error}\n at ${src}${loc}`);
|
||||
});
|
||||
|
||||
window.addEventListener("unhandledrejection", (e) => {
|
||||
append(`[${new Date().toLocaleTimeString()}] Unhandled rejection: ${e.reason}`);
|
||||
});
|
||||
|
||||
// Also wrap console.error to catch Monaco errors
|
||||
const origError = console.error;
|
||||
console.error = (...args) => {
|
||||
origError.apply(console, args);
|
||||
append(`[${new Date().toLocaleTimeString()}] ${args.join(" ")}`);
|
||||
};
|
||||
})();
|
||||
@@ -1,4 +1,3 @@
|
||||
import { loadScript } from "../utils/script_loader.js";
|
||||
import { ensureMonacoTheme } from "./theme.js";
|
||||
import { registerLiquidLanguage, registerMarkdownWithMacrosLanguage } from "./languages.js";
|
||||
|
||||
@@ -17,20 +16,17 @@ export const loadMonaco = () => {
|
||||
return monacoLoaderPromise;
|
||||
}
|
||||
|
||||
monacoLoaderPromise = loadScript("/monaco/vs/loader.js")
|
||||
.then(
|
||||
() =>
|
||||
new Promise((resolve, reject) => {
|
||||
window.require.config({ paths: { vs: "/monaco/vs" } });
|
||||
window.require(["vs/editor/editor.main"], () => {
|
||||
ensureMonacoTheme(window.monaco);
|
||||
registerLiquidLanguage(window.monaco);
|
||||
registerMarkdownWithMacrosLanguage(window.monaco);
|
||||
resolve(window.monaco);
|
||||
}, reject);
|
||||
})
|
||||
)
|
||||
monacoLoaderPromise = import("/assets/monaco.js")
|
||||
.then((monaco) => {
|
||||
window.monaco = monaco;
|
||||
if (!monaco.editor) throw new Error("Monaco loaded but monaco.editor is missing");
|
||||
ensureMonacoTheme(monaco);
|
||||
registerLiquidLanguage(monaco);
|
||||
registerMarkdownWithMacrosLanguage(monaco);
|
||||
return monaco;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Monaco load failed:", error);
|
||||
monacoLoaderPromise = null;
|
||||
throw error;
|
||||
});
|
||||
|
||||
3
assets/js/monaco_entry.js
Normal file
3
assets/js/monaco_entry.js
Normal file
@@ -0,0 +1,3 @@
|
||||
// ESM entry point for Monaco. Bundled by esbuild into priv/static/assets/monaco.js
|
||||
// editor.main.js loads the API AND registers all bundled languages (api.js only exposes the API)
|
||||
export * from "monaco-editor/esm/vs/editor/editor.main.js";
|
||||
@@ -1,33 +0,0 @@
|
||||
export const loadScript = (src) =>
|
||||
new Promise((resolve, reject) => {
|
||||
const existing = document.querySelector(`script[src="${src}"]`);
|
||||
|
||||
if (existing) {
|
||||
if (existing.dataset.loaded === "true") {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
existing.addEventListener("load", () => resolve(), { once: true });
|
||||
existing.addEventListener("error", () => reject(new Error(`Failed to load ${src}`)), {
|
||||
once: true
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const script = document.createElement("script");
|
||||
script.src = src;
|
||||
script.async = true;
|
||||
script.addEventListener(
|
||||
"load",
|
||||
() => {
|
||||
script.dataset.loaded = "true";
|
||||
resolve();
|
||||
},
|
||||
{ once: true }
|
||||
);
|
||||
script.addEventListener("error", () => reject(new Error(`Failed to load ${src}`)), {
|
||||
once: true
|
||||
});
|
||||
document.head.appendChild(script);
|
||||
});
|
||||
Reference in New Issue
Block a user