UNPKG

util-helpers

Version:

一个基于业务场景的工具方法库

93 lines (89 loc) 4.32 kB
'use strict'; var tslib = require('tslib'); var ut2 = require('ut2'); var dataURLToBlob = require('./dataURLToBlob.js'); var isUrl = require('./isUrl.js'); var ajax = require('./ajax.js'); var native = require('./utils/native.js'); function saver(blobUrl, fileName) { if (fileName === void 0) { fileName = ''; } var anchor = document.createElement('a'); anchor.href = blobUrl; anchor.style.display = 'none'; anchor.setAttribute('download', fileName); function handleClick(e) { e.stopPropagation(); anchor.removeEventListener('click', handleClick); } anchor.addEventListener('click', handleClick); document.body.appendChild(anchor); anchor.click(); document.body.removeChild(anchor); } function download(data, options) { return tslib.__awaiter(this, void 0, void 0, function () { var config, fileName, type, dataType, transformRequest, transformResponse, payload, asyncTransformRequest, asyncTransformResponse, ajaxOptions, ev, res, currentFileName, url; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: config = typeof options === 'object' ? options : {}; if (typeof options === 'string') { config.fileName = options; } fileName = config.fileName, type = config.type, dataType = config.dataType, transformRequest = config.transformRequest, transformResponse = config.transformResponse; if (!(typeof data === 'string')) return [3, 8]; if (!(!dataType && /^blob:.*?\/.*/.test(data))) return [3, 1]; saver(data, fileName); return [2, Promise.resolve()]; case 1: if (!(!dataType && /^data:([\w+-]+\/[\w+.-]+)?[,;]/.test(data))) return [3, 2]; payload = dataURLToBlob(data); return [3, 7]; case 2: if (!(dataType === 'url' || (!dataType && isUrl(data)))) return [3, 6]; asyncTransformRequest = function (opts) { var tempOptions = typeof transformRequest === 'function' ? transformRequest(opts) : opts; return ut2.isPromiseLike(tempOptions) ? tempOptions : Promise.resolve(tempOptions); }; asyncTransformResponse = function (res) { var tempRes = typeof transformResponse === 'function' ? transformResponse(res) : res; return ut2.isPromiseLike(tempRes) ? tempRes : Promise.resolve(tempRes); }; return [4, asyncTransformRequest({ responseType: 'blob' })]; case 3: ajaxOptions = _a.sent(); return [4, ajax(data, ajaxOptions)]; case 4: ev = _a.sent(); return [4, asyncTransformResponse(ev.target.response)]; case 5: res = _a.sent(); currentFileName = fileName || data.split('?')[0].split('#')[0].split('/').pop(); return [2, download(res, { fileName: currentFileName, type: type || (ut2.isBlob(res) ? res.type : native.nativeUndefined) })]; case 6: payload = new Blob([data], { type: type || 'text/plain' }); _a.label = 7; case 7: return [3, 9]; case 8: if (data instanceof Blob) { payload = data; } _a.label = 9; case 9: if (!payload) { payload = new Blob([data], { type: type }); } if (navigator.msSaveBlob) { navigator.msSaveBlob(payload, fileName || 'download'); } else { url = native.createObjectURL(payload); saver(url, fileName); native.revokeObjectURL(url); } return [2, Promise.resolve()]; } }); }); } module.exports = download;