Files
crank/apps/ui/js/diagnostics.js
github-ops ba29ac7b94
Deploy / deploy (push) Successful in 2m44s
CI / Rust Checks (push) Successful in 5m31s
CI / UI Checks (push) Successful in 5s
CI / Deployment Manifests (push) Successful in 2s
CI / Frontend E2E (push) Successful in 4m24s
chore: publish clean community baseline
2026-06-19 16:45:51 +00:00

112 lines
3.2 KiB
JavaScript

(function() {
var currentPage = '';
function messageFor(error) {
if (!error) {
return 'unknown error';
}
if (error.message) {
return error.message;
}
return String(error);
}
function setPage(pageName) {
currentPage = pageName || '';
document.documentElement.setAttribute('data-crank-page', currentPage || 'unknown');
}
function markBootstrapState(pageName, status, details) {
document.documentElement.setAttribute('data-crank-bootstrap-page', pageName || currentPage || 'unknown');
document.documentElement.setAttribute('data-crank-bootstrap-state', status);
if (status === 'error' && details) {
document.documentElement.setAttribute('data-crank-bootstrap-error', details);
return;
}
document.documentElement.removeAttribute('data-crank-bootstrap-error');
}
function report(stage, error, pageName) {
var resolvedPage = pageName || currentPage || 'unknown';
console.error('[CrankUI][' + resolvedPage + '][' + stage + ']', error);
window.dispatchEvent(new CustomEvent('crank:ui-error', {
detail: {
page: resolvedPage,
stage: stage,
message: messageFor(error),
},
}));
}
function bootstrap(pageName, init) {
function run() {
setPage(pageName);
markBootstrapState(pageName, 'pending');
try {
var result = init();
if (result && typeof result.then === 'function') {
result.then(function() {
markBootstrapState(pageName, 'ready');
}).catch(function(error) {
markBootstrapState(pageName, 'error', messageFor(error));
report('bootstrap', error, pageName);
});
return;
}
markBootstrapState(pageName, 'ready');
} catch (error) {
markBootstrapState(pageName, 'error', messageFor(error));
report('bootstrap', error, pageName);
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', run, { once: true });
return;
}
run();
}
function ensureTestId(element, value) {
if (!element || !value) {
return;
}
element.setAttribute('data-testid', value);
}
function ensureShellTestIds() {
document.querySelectorAll('.nav-avatar').forEach(function(element) {
ensureTestId(element, 'shell-avatar');
});
document.querySelectorAll('.user-dropdown-name').forEach(function(element) {
ensureTestId(element, 'shell-user-name');
});
document.querySelectorAll('.user-dropdown-role').forEach(function(element) {
ensureTestId(element, 'shell-user-role');
});
ensureTestId(document.getElementById('ws-current-name'), 'shell-workspace-name');
}
window.addEventListener('error', function(event) {
if (!currentPage) {
return;
}
report('runtime', event.error || new Error(event.message || 'window error'));
});
window.addEventListener('unhandledrejection', function(event) {
if (!currentPage) {
return;
}
report('unhandledrejection', event.reason || new Error('unhandled rejection'));
});
window.CrankDiagnostics = {
bootstrap: bootstrap,
ensureTestId: ensureTestId,
ensureShellTestIds: ensureShellTestIds,
report: report,
setPage: setPage,
};
}());