UNPKG

vtils

Version:

一个面向业务的 JavaScript/TypeScript 实用程序库。

158 lines (152 loc) 4.22 kB
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://';