+
+// ---------------------------------------------------------------------------
+
+async function dynamicImport (url: string) {
+ try {
+ // eslint-disable-next-line no-new-func
+ return new Function(`return import('${url}')`)()
+ } catch {
+ logger.info('Fallback to import polyfill')
+
+ return new Promise((resolve, reject) => {
+ const vector = '$importModule$' + Math.random().toString(32).slice(2)
+ const script = document.createElement('script')
+
+ const destructor = () => {
+ delete window[vector]
+ script.onerror = null
+ script.onload = null
+ script.remove()
+ URL.revokeObjectURL(script.src)
+ script.src = ''
+ }
+
+ script.defer = true
+ script.type = 'module'
+
+ script.onerror = () => {
+ reject(new Error(`Failed to import: ${url}`))
+ destructor()
+ }
+ script.onload = () => {
+ resolve(window[vector])
+ destructor()
+ }
+ const loader = `import * as m from "${url}"; window.${vector} = m;` // export Module
+ const blob = new Blob([ loader ], { type: 'text/javascript' })
+ script.src = URL.createObjectURL(blob)
+
+ document.head.appendChild(script)
+ })
+ }
+}