2022-03-30 13:52:24 +08:00
// DO NOT IMPORT window.config HERE!
2024-02-28 23:20:53 +01:00
// to make sure the error handler always works, we should never import `window.config`, because
// some user's custom template breaks it.
2026-03-29 12:24:30 +02:00
import { showGlobalErrorMessage , processWindowErrorEvent } from './modules/errors.ts' ;
2022-03-30 13:52:24 +08:00
2026-03-29 12:24:30 +02:00
// A module should not be imported twice, otherwise there will be bugs when a module has its internal states.
// A real example is "generateElemId" in "utils/dom.ts", if it is imported twice in different module scopes,
// It will generate duplicate IDs (ps: don't try to use "random" to fix, it is just a real example to show the importance of "do not import a module twice")
if ( ! window . _globalHandlerErrors ? . _inited ) {
2022-03-30 13:52:24 +08:00
if ( ! window . config ) {
showGlobalErrorMessage ( ` Gitea JavaScript code couldn't run correctly, please check your custom templates ` ) ;
}
2024-02-28 23:20:53 +01:00
// we added an event handler for window error at the very beginning of <script> of page head the
// handler calls `_globalHandlerErrors.push` (array method) to record all errors occur before
// this init then in this init, we can collect all error events and show them.
2026-02-02 01:00:34 +08:00
for ( const e of ( window . _globalHandlerErrors as Iterable < ErrorEvent & PromiseRejectionEvent > ) || [ ] ) {
2022-03-30 13:52:24 +08:00
processWindowErrorEvent ( e ) ;
}
2024-02-28 23:20:53 +01:00
// then, change _globalHandlerErrors to an object with push method, to process further error
// events directly
2026-02-02 01:00:34 +08:00
window . _globalHandlerErrors = { _inited : true , push : ( e : ErrorEvent & PromiseRejectionEvent ) = > processWindowErrorEvent ( e ) } as any ;
2022-03-30 13:52:24 +08:00
}