diff --git a/packages/alpinejs/src/alpine.js b/packages/alpinejs/src/alpine.js index cf7081ef6..cd7648af2 100644 --- a/packages/alpinejs/src/alpine.js +++ b/packages/alpinejs/src/alpine.js @@ -8,6 +8,7 @@ import { transition } from './directives/x-transition' import { clone, cloneNode, skipDuringClone, onlyDuringClone, interceptClone } from './clone' import { interceptor } from './interceptor' import { getBinding as bound, extractProp } from './utils/bind' +import { setErrorHandler } from './utils/error' import { debounce } from './utils/debounce' import { throttle } from './utils/throttle' import { setStyles } from './utils/styles' @@ -39,6 +40,7 @@ let Alpine = { onlyDuringClone, addRootSelector, addInitSelector, + setErrorHandler, interceptClone, addScopeToNode, deferMutations, diff --git a/packages/alpinejs/src/utils/error.js b/packages/alpinejs/src/utils/error.js index 65a5e4509..bb21eb1b5 100644 --- a/packages/alpinejs/src/utils/error.js +++ b/packages/alpinejs/src/utils/error.js @@ -6,7 +6,17 @@ export function tryCatch(el, expression, callback, ...args) { } } -export function handleError(error , el, expression = undefined) { +export function handleError(...args) { + return errorHandler(...args) +} + +let errorHandler = normalErrorHandler + +export function setErrorHandler(handler) { + errorHandler = handler +} + +export function normalErrorHandler(error , el, expression = undefined) { error = Object.assign( error ?? { message: 'No error message given.' }, { el, expression } ) diff --git a/tests/cypress/integration/error-handling.spec.js b/tests/cypress/integration/error-handling.spec.js index 9e8360143..d0c090689 100644 --- a/tests/cypress/integration/error-handling.spec.js +++ b/tests/cypress/integration/error-handling.spec.js @@ -200,3 +200,20 @@ test('evaluation with syntax error', assertConsoleInterceptorHadErrorWithCorrectElement(), true ) + +test('custom error handler', + [html` +