util-helpers
Version:
93 lines (89 loc) • 4.32 kB
JavaScript
;
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;