vtils
Version:
一个面向业务的 JavaScript/TypeScript 实用程序库。
158 lines (152 loc) • 4.22 kB
JavaScript
import { isPlainObject } from 'lodash-uni';
/**
* 富链接,同普通链接相比,富链接可包含一些描述信息。
*
* 结构描述:
* ```text
* rich://{"url":"***","desc":"***"}
* ```
*/
export var RichUrl = /*#__PURE__*/function () {
function RichUrl() {}
/**
* 检查是否是富链接。
*
* @param value 要检查的值
* @returns 返回检查结果
* @example
* ```typescript
* RichUrl.check('http://www.google.com') // => false
* ```
*/
RichUrl.check = function check(value) {
return typeof value === 'string' && value.substr(0, RichUrl.identity.length) === RichUrl.identity;
}
/**
* 创建富链接。
*
* @param url 普通链接
* @param desc 描述信息
* @returns 返回创建的富链接
*/;
RichUrl.build = function build(url, desc) {
return "" + RichUrl.identity + JSON.stringify({
url: url,
desc: desc
});
}
/**
* 解析富链接。非富链接的会直接将其值作为 url 返回。
*
* @param richUrl 富链接
* @returns 返回解析结果
*/;
RichUrl.parse = function parse(richUrl) {
if (!RichUrl.check(richUrl)) {
return {
url: richUrl
};
}
try {
return JSON.parse(richUrl.substr(RichUrl.identity.length));
} catch (_unused) {
return {
url: richUrl
};
}
}
/**
* 转换数据中的富链接。
*
* @param data 数据
* @param callback 回调
* @returns 返回转换后的数据
*/;
RichUrl.transform = function transform(data, callback) {
return new Promise(function (resolve, reject) {
if (Array.isArray(data)) {
Promise.all(data.map(function (value, index) {
return RichUrl.transform(value, callback).then(function (res) {
;
data[index] = res;
});
})).then(function () {
return resolve(data);
}, reject);
} else if (isPlainObject(data)) {
Promise.all(Object.keys(data).map(function (key) {
return RichUrl.transform(data[key], callback).then(function (res) {
;
data[key] = res;
});
})).then(function () {
return resolve(data);
}, reject);
} else if (RichUrl.check(data)) {
callback(RichUrl.parse(data), data).then(resolve, reject);
} else {
resolve(data);
}
});
}
/**
* 将文件转换为文件富链接。
*
* @param file 要转换的文件
* @returns 返回转换后的文件富链接
*/;
RichUrl.fromFile = function fromFile(file) {
return RichUrl.build(URL.createObjectURL(file), {
name: file.name,
size: file.size,
type: file.type,
lastModified: file.lastModified
});
}
/**
* 将文件富链接转换为文件和普通链接。
*
* @param richUrl 要转换的文件富链接
* @returns 返回转换后的文件和普通链接
*/;
RichUrl.toFile = function toFile(richUrl) {
return new Promise(function (resolve, reject) {
var _ref = typeof richUrl === 'string' ? RichUrl.parse(richUrl) : richUrl,
url = _ref.url,
desc = _ref.desc;
if (!url || !desc || url.substr(0, 5) !== 'blob:' || typeof desc !== 'object') {
reject(new Error("richUrl \u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684\u6587\u4EF6\u5BCC\u94FE\u63A5: " + JSON.stringify(richUrl)));
} else {
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.onload = function () {
var file = new File([xhr.response], desc.name, desc);
resolve({
url: url,
file: file
});
};
xhr.onerror = reject;
xhr.send();
}
});
}
/**
* 转换数据中的文件富链接。
*
* @param data 数据
* @param callback 回调
* @returns 返回转换后的数据
*/;
RichUrl.transformFile = function transformFile(data, callback) {
return RichUrl.transform(data, function (parsedRichUrl) {
return RichUrl.toFile(parsedRichUrl).then(callback);
});
};
return RichUrl;
}();
/**
* 标识符。
*/
RichUrl.identity = 'rich://';