| import { store } from './store'; |
| import { SCRIPT_URLS } from './config'; |
| import { compressToBase64, decompressFromBase64 } from 'lz-string'; |
| |
| const promisesCache = {}; |
| |
| export function loadScriptsAsync(scripts) { |
| return Promise.all( |
| scripts.map(function (scriptUrl) { |
| if (typeof scriptUrl === 'string') { |
| scriptUrl = { |
| url: scriptUrl, |
| // TODO Not supported type |
| type: scriptUrl.match(/\.css$/) ? 'css' : 'js' |
| }; |
| } |
| if (promisesCache[scriptUrl.url]) { |
| return promisesCache[scriptUrl.url]; |
| } |
| const promise = new Promise((resolve, reject) => { |
| if (scriptUrl.type === 'js') { |
| const script = document.createElement('script'); |
| script.src = scriptUrl.url; |
| script.async = false; |
| script.onload = function () { |
| resolve(); |
| }; |
| script.onerror = function () { |
| reject(); |
| }; |
| document.body.appendChild(script); |
| } else if (scriptUrl.type === 'css') { |
| const link = document.createElement('link'); |
| link.rel = 'stylesheet'; |
| link.href = scriptUrl.url; |
| link.onload = function () { |
| resolve(); |
| }; |
| link.onerror = function () { |
| reject(); |
| }; |
| document.body.appendChild(link); |
| } |
| }); |
| promisesCache[scriptUrl.url] = promise; |
| return promise; |
| }) |
| ); |
| } |
| |
| export function downloadBlob(blob, fileName) { |
| // for IE |
| if (typeof window.navigator.msSaveBlob === 'function') { |
| window.navigator.msSaveOrOpenBlob(blob, fileName); |
| } else { |
| const a = document.createElement('a'); |
| a.href = URL.createObjectURL(blob); |
| a.download = fileName; |
| a.click(); |
| // should revoke the blob url after the download |
| URL.revokeObjectURL(a.href); |
| } |
| } |
| |
| function ensurePrettier() { |
| if ( |
| typeof prettier === 'undefined' || |
| typeof prettierPlugins === 'undefined' |
| ) { |
| return loadScriptsAsync([ |
| SCRIPT_URLS.prettierDir + '/standalone.js', |
| SCRIPT_URLS.prettierDir + |
| (store.typeCheck ? '/parser-typescript.js' : '/parser-babel.js') |
| ]); |
| } |
| return Promise.resolve(); |
| } |
| |
| export function formatCode(code) { |
| return ensurePrettier().then(() => { |
| return prettier.format(code, { |
| singleQuote: true, |
| tabWidth: 2, |
| printWidth: 80, |
| semi: true, |
| trailingComma: 'none', |
| // tabWidth: +this.formatCodeSettings.tabSize, |
| // printWidth: +this.formatCodeSettings.maxLineWidth, |
| parser: store.typeCheck ? 'typescript' : 'babel', |
| plugins: prettierPlugins |
| }); |
| }); |
| } |
| |
| export function compressStr(str) { |
| if (!str || !(str = str.trim())) { |
| return; |
| } |
| return compressToBase64(str) |
| .replace(/\+/g, '-') // Convert '+' to '-' |
| .replace(/\//g, '_') // Convert '/' to '_' |
| .replace(/=+$/, ''); // Remove ending '=' |
| } |
| |
| export function decompressStr(str) { |
| if (!str || !(str = str.trim())) { |
| return; |
| } |
| return decompressFromBase64( |
| str |
| .replace(/\-/g, '+') // Convert '-' to '+' |
| .replace(/_/g, '/') // Convert '_' to '/' |
| ); |
| } |
| |
| export function isTrustedOpener() { |
| try { |
| return ( |
| window.opener && window.opener.origin === 'https://echarts.apache.org' |
| ); |
| } catch {} |
| } |
| |
| export function decodeBase64(str) { |
| return decodeURIComponent(escape(window.atob(str))); |
| } |