diff --git a/resources/assets/javascripts/chunk-loader.js b/resources/assets/javascripts/chunk-loader.js index dcd95cc63df3934e4ebdf17736ba3fa31e249269..f3722866a867859fef38a7bdf646ee4fed1dc218 100644 --- a/resources/assets/javascripts/chunk-loader.js +++ b/resources/assets/javascripts/chunk-loader.js @@ -8,95 +8,100 @@ export const loadScript = function (script_name) { }); }; -export const loadChunk = (function () { - let mathjax_promise = null; +let mathjax_promise = null; - return function (chunk) { - let promise = null; - switch (chunk) { +/** This function dynamically loads JS features organized in chunks. + * + * @param {string} chunk The name of the chunk to load. + * @param {{ silent: boolean }} options Options for loading the chunk. + * Pass `{ silent: true }` to supress + * error messages. + * @return {Promise} + */ +export const loadChunk = function (chunk, { silent = false } = {}) { + let promise = null; + switch (chunk) { + case 'code-highlight': + promise = import( + /* webpackChunkName: "code-highlight" */ + './chunks/code-highlight' + ).then(({ default: hljs }) => { + return hljs; + }); + break; - case 'code-highlight': - promise = import( - /* webpackChunkName: "code-highlight" */ - './chunks/code-highlight' - ).then(({default: hljs}) => { - return hljs; - }); - break; + case 'courseware': + promise = Promise.all([ + STUDIP.loadChunk('vue'), + import( + /* webpackChunkName: "courseware" */ + './chunks/courseware' + ), + ]).then(([Vue]) => Vue); + break; - case 'courseware': - promise = Promise.all([ - STUDIP.loadChunk('vue'), - import( - /* webpackChunkName: "courseware" */ - './chunks/courseware' - ), - ]).then(([Vue]) => Vue); - break; + case 'chartist': + promise = import( + /* webpackChunkName: "chartist" */ + './chunks/chartist' + ).then(({ default: Chartist }) => Chartist); + break; - case 'chartist': - promise = import( - /* webpackChunkName: "chartist" */ - './chunks/chartist' - ).then(({ default: Chartist }) => Chartist); - break; + case 'fullcalendar': + promise = import( + /* webpackChunkName: "fullcalendar" */ + './chunks/fullcalendar' + ); + break; - case 'fullcalendar': - promise = import( - /* webpackChunkName: "fullcalendar" */ - './chunks/fullcalendar' - ); - break; + case 'tablesorter': + promise = import( + /* webpackChunkName: "tablesorter" */ + './chunks/tablesorter' + ); + break; - case 'tablesorter': - promise = import( - /* webpackChunkName: "tablesorter" */ - './chunks/tablesorter' - ); - break; - - case 'mathjax': - if (mathjax_promise === null) { - mathjax_promise = STUDIP.loadScript( - 'javascripts/mathjax/MathJax.js?config=TeX-AMS_HTML,default' - ).then(() => { + case 'mathjax': + if (mathjax_promise === null) { + mathjax_promise = STUDIP.loadScript('javascripts/mathjax/MathJax.js?config=TeX-AMS_HTML,default') + .then(() => { (function (origPrint) { window.print = function () { - window.MathJax.Hub.Queue( - ['Delay', window.MathJax.Callback, 700], - origPrint - ); + window.MathJax.Hub.Queue(['Delay', window.MathJax.Callback, 700], origPrint); }; })(window.print); return window.MathJax; - }).catch(() => { - console.log('Could not load mathjax') + }) + .catch(() => { + throw new Error('Could not load mathjax'); }); - } - promise = mathjax_promise; - break; + } + promise = mathjax_promise; + break; - case 'vue': - promise = import( - /* webpackChunkName: "vue.js" */ - './chunks/vue' - ); - break; + case 'vue': + promise = import( + /* webpackChunkName: "vue.js" */ + './chunks/vue' + ); + break; - case 'wysiwyg': - promise = import( - /* webpackChunkName: "wysiwyg.js" */ - './chunks/wysiwyg' - ); - break; + case 'wysiwyg': + promise = import( + /* webpackChunkName: "wysiwyg.js" */ + './chunks/wysiwyg' + ); + break; - default: - promise = Promise.reject(new Error(`Unknown chunk: ${chunk}`)); - } + default: + promise = Promise.reject(new Error(`Unknown chunk: ${chunk}`)); + } - return promise.catch((error) => { + return promise.catch((error) => { + if (!silent) { console.error(`Could not load chunk ${chunk}`, error); - }); - }; -}()); + } + throw error; + }); +};