youtil 1.0.13 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -27,7 +27,7 @@ conssole.log(parseDate('2023-02-14', 'yyyy-MM-dd'));
27
27
 
28
28
  ## 模块开发
29
29
 
30
- 依赖`node@16`环境,执行`cnpm run dev`将自动打开本地预览。
30
+ 依赖`node@18`环境,执行`cnpm run dev`将自动打开本地预览。
31
31
 
32
32
  ### 目录结构介绍
33
33
 
@@ -0,0 +1 @@
1
+ function r(r,t){(null==t||t>r.length)&&(t=r.length);for(var e=0,n=Array(t);e<t;e++)n[e]=r[e];return n}function t(t,e){return function(r){if(Array.isArray(r))return r}(t)||function(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}(t)||function(t,e){if(t){if("string"==typeof t)return r(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if("Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(t,e)}}(t,e)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(r,t,e,n,o,a,u){try{var i=r[a](u),c=i.value}catch(r){e(r);return}i.done?t(c):Promise.resolve(c).then(n,o)}function n(r){return function(){var t=this,n=arguments;return new Promise(function(o,a){var u=r.apply(t,n);function i(r){e(u,o,a,i,c,"next",r)}function c(r){e(u,o,a,i,c,"throw",r)}i(void 0)})}}function o(r){for(var t=1;t<arguments.length;t++){var e=null!=arguments[t]?arguments[t]:{},n=Object.keys(e);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(e).filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),n.forEach(function(t){var n,o;n=r,o=e[t],t in n?Object.defineProperty(n,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):n[t]=o})}return r}function a(r,t){var e,n,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return u.next=i(0),u.throw=i(1),u.return=i(2),"function"==typeof Symbol&&(u[Symbol.iterator]=function(){return this}),u;function i(i){return function(c){return function(i){if(e)throw TypeError("Generator is already executing.");for(;u&&(u=0,i[0]&&(a=0)),a;)try{if(e=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(r,a)}catch(r){i=[6,r],n=0}finally{e=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}"function"==typeof SuppressedError&&SuppressedError;export{t as _,o as a,n as b,a as c};
@@ -1 +1 @@
1
- import{_ as n}from"./481bf7fa.esm.es5.production.js";var e={formatDate:function(n,e){var t=function(n){e=e.replace(RegExp("".concat(n,"+"),"g"),function(e){var t="".concat(o[n]);if("w"===n)return(e.length>2?"星期":"周")+a[t];for(var c=0,r=t.length;c<e.length-r;c++)t="0".concat(t);return 1===e.length?t:t.substring(t.length-e.length)})};if(!n)return"";if("number"==typeof n)n=new Date(n);else if("string"==typeof n){if(/^\d{12,13}$/g.test(n))n=new Date(parseInt(n));else{if(!/^.{10}T.{8,12}Z?$/g.test(n))return n;n=new Date(n)}}if(!(n instanceof Date))throw Error("formatDate error: not date.");if(isNaN(null==n?void 0:n.getFullYear()))throw Error("formatDate error: invalid date.");e=e||"yyyy-MM-dd HH:mm:ss";var o={y:n.getFullYear(),M:n.getMonth()+1,d:n.getDate(),q:Math.floor((n.getMonth()+3)/3),w:n.getDay(),H:n.getHours(),h:n.getHours()%12==0?12:n.getHours()%12,m:n.getMinutes(),s:n.getSeconds(),S:n.getMilliseconds()},a=["天","一","二","三","四","五","六"];for(var c in o)t(c);return e},parseDate:function(n,e){var t={y:0,M:1,d:0,H:0,h:0,m:0,s:0,S:0};(e=e||"yyyy-MM-dd").replace(/([^yMdHmsS]*?)(([yMdHmsS])\3*)([^yMdHmsS]*?)/g,function(e,o,a,c,r){return n=n.replace(RegExp("".concat(o,"(\\d{").concat(a.length,"})").concat(r)),function(n,e){return t[c]=parseInt(e),""}),""}),t.M--;var o=new Date(t.y,t.M,t.d,t.H,t.m,t.s);return 0!==t.S&&o.setMilliseconds(t.S),o},showLoading:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"请稍候",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=(o=Object.assign({},{hasMask:!0,maskColor:"transparent",onCancel:null,cancelInline:!1,id:"com_global_page_loading"},o)).id,c="_".concat(a,"_timeout");window[c]&&clearTimeout(window[c]);var r=document.getElementById(a);r||((r=document.createElement("div")).id=a,r.className=a,document.body.append(r));var i="".concat(a,"_style");if(!document.getElementById(i)){var l=document.createElement("style");l.id=i,l.innerHTML="\n .".concat(a," {\n position: fixed;\n top: calc(50vh - 60px);\n left: calc(50vw - 60px);\n width: 120px;\n height: 120px;\n z-index: 8000;\n background: rgba(0, 0, 0, 0.6);\n border-radius: 8px;\n text-align: center;\n color: white;\n padding-top: 20px;\n }\n .").concat(a," img {\n width: 50px;\n margin-bottom: 10px;\n }"),document.head.appendChild(l)}if(r.innerHTML="\n ".concat(o.hasMask?'<div class="mask-wrapper" style="background-color: '.concat(o.maskColor,'"></div>'):"",'\n <div class="loading-wrapper">\n <div class="loading-content">\n <img src="https://img.alicdn.com/tfs/TB1bnUsQBLoK1RjSZFuXXXn0XXa-32-32.svg" alt="加载中">\n <div>').concat(n).concat(o.cancelInline?" ":"</div>","\n ").concat(o.onCancel?'<a href="javascript:;" class="cancel">取消</a>':"","\n ").concat(o.cancelInline?"</div>":"","\n </div>\n </div>"),o.onCancel){var d=r.querySelector(".cancel");d&&d.addEventListener("click",function(){e.hideLoading(),o.onCancel()})}r.style.display="block",t>0&&(window[c]=setTimeout(function(){e.hideLoading()},1e3*t))},hideLoading:function(){var n=document.getElementById("com_global_page_loading");n&&(n.style.display="none")},getParam:function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.search;return(RegExp("(^|\\?|&)".concat(n,"=(.*?)(?=&|#|$)"),"g").exec(e)||[])[2]},getParamInt:function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.search;return parseInt(e.getParam(n,t)||"0",10)},getParams:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:location.search,t=((e||"").split("?").pop()||"").split("#")[0]||"",o={};return t.split("&").map(function(n){return n.split("=")}).forEach(function(e){var t=n(e,2),a=t[0],c=t[1];o[a]=c||""}),o},setParam:function(t,o,a){if(a=a||"".concat(location.pathname).concat(location.search),void 0!==e.getParam(t,a))return a.replace(RegExp("(^|\\?|&)".concat(t,"=(.*?)(?=&|#|$)"),"g"),"$1".concat(t,"=").concat(o));var c=n(a.split("#"),2),r=c[0],i=c[1];return"".concat(r).concat(0>r.indexOf("?")?"?":"&").concat(t,"=").concat(o).concat(i?"#":"").concat(i||"")},delParam:function(n,e){return(e=e||"".concat(location.pathname).concat(location.search)).replace(RegExp("(^|\\?|&)".concat(n,"=.*?(&|#|$)"),"g"),function(n,e,t){return"&"===t?e:t})},sleep:function(n){return new Promise(function(e){return setTimeout(e,n||0)})},deepCopy:function(n){return n&&"object"==typeof n?JSON.parse(JSON.stringify(n)):n},encodeHtml:function(n){if("string"==typeof n){var t=document.createElement("div");return t.innerText=n,t.innerHTML}if("object"==typeof n&&n)for(var o in n)n[o]=e.encodeHtml(n[o]);return n},decodeHtml:function(n){if("string"==typeof n){var t=document.createElement("div");return t.innerHTML=n,t.innerText}if("object"==typeof n&&n)for(var o in n)n[o]=e.decodeHtml(n[o]);return n},toUrlParams:function(n){return Object.keys(n||{}).filter(function(e){return void 0!==n[e]}).map(function(e){var t="object"==typeof n[e]?JSON.stringify(n[e]):n[e];return"".concat(encodeURIComponent(e),"=").concat(encodeURIComponent(t))}).join("&")},copyToClipboard:function(n,e,t){if(!n)throw Error("text can not be empty.");return(e=e||function(n){return console.error("复制到剪贴板失败:".concat(n||""))},navigator.clipboard&&!t)?navigator.clipboard.writeText(n).catch(function(n){throw e(n.message),n}):new Promise(function(t,o){var a=document.createElement("input");a.value=n,a.style.cssText="position:fixed;left:0;top:0;opacity:0;",document.body.appendChild(a),a.select();try{if(document.execCommand("copy"))t();else{var c="Failed to execute 'document.execCommand'.";e(c),o(Error(c))}}catch(n){e(n.message),o(n)}finally{document.body.removeChild(a)}})}};export{e as default};
1
+ import{_ as e,a as n,b as t,c as o}from"./53aa46fe.esm.es5.production.js";var r=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"请稍候",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=(t=Object.assign({},{hasMask:!0,maskColor:"transparent",onCancel:null,cancelInline:!1,id:"com_global_page_loading"},t)).id,r="_".concat(o,"_timeout");window[r]&&clearTimeout(window[r]);var c=document.getElementById(o);c||((c=document.createElement("div")).id=o,c.className=o,document.body.append(c));var i="".concat(o,"_style");if(!document.getElementById(i)){var s=document.createElement("style");s.id=i,s.innerHTML="\n .".concat(o," {\n position: fixed;\n top: calc(50vh - 60px);\n left: calc(50vw - 60px);\n width: 120px;\n height: 120px;\n z-index: 8000;\n background: rgba(0, 0, 0, 0.6);\n border-radius: 8px;\n text-align: center;\n color: white;\n padding-top: 20px;\n }\n .").concat(o," img {\n width: 50px;\n margin-bottom: 10px;\n }"),document.head.appendChild(s)}if(c.innerHTML="\n ".concat(t.hasMask?'<div class="mask-wrapper" style="background-color: '.concat(t.maskColor,'"></div>'):"",'\n <div class="loading-wrapper">\n <div class="loading-content">\n <img src="https://img.alicdn.com/tfs/TB1bnUsQBLoK1RjSZFuXXXn0XXa-32-32.svg" alt="加载中">\n <div>').concat(e).concat(t.cancelInline?" ":"</div>","\n ").concat(t.onCancel?'<a href="javascript:;" class="cancel">取消</a>':"","\n ").concat(t.cancelInline?"</div>":"","\n </div>\n </div>"),t.onCancel){var l=c.querySelector(".cancel");l&&l.addEventListener("click",function(){a(),t.onCancel()})}c.style.display="block",n>0&&(window[r]=setTimeout(function(){a()},1e3*n))},a=function(){var e=document.getElementById("com_global_page_loading");e&&(e.style.display="none")},c=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.search;return(RegExp("(^|\\?|&)".concat(e,"=(.*?)(?=&|#|$)"),"g").exec(n)||[])[2]},i=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.search;return parseInt(c(e,n)||"0",10)},s=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:location.search,t=((n||"").split("?").pop()||"").split("#")[0]||"",o={};return t.split("&").map(function(e){return e.split("=")}).forEach(function(n){var t=e(n,2),r=t[0],a=t[1];o[r]=a||""}),o},l=function(n,t,o){if(void 0!==c(n,o=o||"".concat(location.pathname).concat(location.search)))return o.replace(RegExp("(^|\\?|&)".concat(n,"=(.*?)(?=&|#|$)"),"g"),"$1".concat(n,"=").concat(t));var r=e(o.split("#"),2),a=r[0],i=r[1];return"".concat(a).concat(0>a.indexOf("?")?"?":"&").concat(n,"=").concat(t).concat(i?"#":"").concat(i||"")},u=function(e,n){return(n=n||"".concat(location.pathname).concat(location.search)).replace(RegExp("(^|\\?|&)".concat(e,"=.*?(&|#|$)"),"g"),function(e,n,t){return"&"===t?n:t})},d=function(e){return Object.keys(e||{}).filter(function(n){return void 0!==e[n]}).map(function(n){var t="object"==typeof e[n]?JSON.stringify(e[n]):e[n];return"".concat(encodeURIComponent(n),"=").concat(encodeURIComponent(t))}).join("&")},f=function(){var e=t(function(e,t){var r,a,c,i,s,l,u,f,p,m,g,h,v,y,b;return o(this,function(o){switch(o.label){case 0:a=(r=(t=Object.assign({},{errorMessage:"系统繁忙,请稍后再试",errorHandler:function(e){if(!(null==t?void 0:t.silent)){var n;null==t||null===(n=t.toastHandler)||void 0===n||n.call(t,e)}throw Error(e)},baseUrl:"",headers:{},fetchOptions:{credentials:"include"},checkSuccess:function(e){return(null==e?void 0:e.code)==0||(null==e?void 0:e.code)==200},toastHandler:function(e){return console.error("您还没有配置toastHandler,请根据您的UI组件库配置合适的提示方法。")}},t||{}))||{}).params,c=r.data,i=r.json,s=r.method,l=r.headers,u=r.baseUrl,f=r.fetchOptions,p=r.checkSuccess,m=r.afterRequest,g=r.errorHandler,h=r.errorMessage,v=r.responseConverter,a&&(f.method=s||"GET",e="".concat(e,"?").concat(d(a))),c?Object.assign(f,{method:s||"POST",body:d(c),headers:n({"Content-Type":"application/x-www-form-urlencoded;charset=utf-8"},l||{})}):i&&Object.assign(f,{method:s||"POST",body:JSON.stringify(i),headers:n({"Content-Type":"application/json;charset=utf-8"},l||{})}),y=null,o.label=1;case 1:return o.trys.push([1,3,,4]),[4,fetch("".concat(u||"").concat(e),f).then(function(e){return e.json()})];case 2:return y=o.sent(),[3,4];case 3:return console.error(b=o.sent()),null==m||m(!1,{message:null==b?void 0:b.message}),null==g||g(h||""),[2];case 4:if(y=v?v(y):y,null==p?void 0:p(y))return null==m||m(!0,y),[2,y.data];return null==m||m(!1,y),null==g||g(y.message||y.msg||h||"",y),[2]}})});return function(n,t){return e.apply(this,arguments)}}(),p=function(e){return function(t,o){return f(t,n({},e||{},o||{}))}},m=function(e,n){var t=function(e){n=n.replace(RegExp("".concat(e,"+"),"g"),function(n){var t="".concat(o[e]);if("w"===e)return(n.length>2?"星期":"周")+r[t];for(var a=0,c=t.length;a<n.length-c;a++)t="0".concat(t);return 1===n.length?t:t.substring(t.length-n.length)})};if(!e)return"";if("number"==typeof e)e=new Date(e);else if("string"==typeof e){if(/^\d{12,13}$/g.test(e))e=new Date(parseInt(e));else{if(!/^.{10}T.{8,12}Z?$/g.test(e))return e;e=new Date(e)}}if(!(e instanceof Date))throw Error("formatDate error: not date.");if(isNaN(null==e?void 0:e.getFullYear()))throw Error("formatDate error: invalid date.");n=n||"yyyy-MM-dd HH:mm:ss";var o={y:e.getFullYear(),M:e.getMonth()+1,d:e.getDate(),q:Math.floor((e.getMonth()+3)/3),w:e.getDay(),H:e.getHours(),h:e.getHours()%12==0?12:e.getHours()%12,m:e.getMinutes(),s:e.getSeconds(),S:e.getMilliseconds()},r=["天","一","二","三","四","五","六"];for(var a in o)t(a);return n},g=function(e,n){var t={y:0,M:1,d:0,H:0,h:0,m:0,s:0,S:0};(n=n||"yyyy-MM-dd").replace(/([^yMdHmsS]*?)(([yMdHmsS])\3*)([^yMdHmsS]*?)/g,function(n,o,r,a,c){return e=e.replace(RegExp("".concat(o,"(\\d{").concat(r.length,"})").concat(c)),function(e,n){return t[a]=parseInt(n),""}),""}),t.M--;var o=new Date(t.y,t.M,t.d,t.H,t.m,t.s);return 0!==t.S&&o.setMilliseconds(t.S),o},h=function(e){return new Promise(function(n){return setTimeout(n,e||0)})},v=function(e){return e&&"object"==typeof e?JSON.parse(JSON.stringify(e)):e},y=function(e){if("string"==typeof e){var n=document.createElement("div");return n.innerText=e,n.innerHTML}if("object"==typeof e&&e)for(var t in e)e[t]=y(e[t]);return e},b=function(e){if("string"==typeof e){var n=document.createElement("div");return n.innerHTML=e,n.innerText}if("object"==typeof e&&e)for(var t in e)e[t]=b(e[t]);return e},w=function(e,n,t){if(!e)throw Error("text can not be empty.");return(n=n||function(e){return console.error("复制到剪贴板失败:".concat(e||""))},navigator.clipboard&&!t)?navigator.clipboard.writeText(e).catch(function(e){throw n(e.message),e}):new Promise(function(t,o){var r=document.createElement("input");r.value=e,r.style.cssText="position:fixed;left:0;top:0;opacity:0;",document.body.appendChild(r),r.select();try{if(document.execCommand("copy"))t();else{var a="Failed to execute 'document.execCommand'.";n(a),o(Error(a))}}catch(e){n(e.message),o(e)}finally{document.body.removeChild(r)}})};export{p as Request,w as copyToClipboard,b as decodeHtml,v as deepCopy,u as delParam,y as encodeHtml,m as formatDate,c as getParam,i as getParamInt,s as getParams,a as hideLoading,g as parseDate,f as request,l as setParam,r as showLoading,h as sleep,d as toUrlParams};
@@ -1 +1 @@
1
- !function(n,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(n="undefined"!=typeof globalThis?globalThis:n||self).youtil=e()}(this,function(){"use strict";function n(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,o=Array(e);t<e;t++)o[t]=n[t];return o}function e(e,t){return function(n){if(Array.isArray(n))return n}(e)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(e)||function(e,t){if(e){if("string"==typeof e)return n(e,t);var o=Object.prototype.toString.call(e).slice(8,-1);if("Object"===o&&e.constructor&&(o=e.constructor.name),"Map"===o||"Set"===o)return Array.from(o);if("Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return n(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var t={formatDate:function(n,e){var t=function(n){e=e.replace(RegExp("".concat(n,"+"),"g"),function(e){var t="".concat(o[n]);if("w"===n)return(e.length>2?"星期":"周")+r[t];for(var a=0,c=t.length;a<e.length-c;a++)t="0".concat(t);return 1===e.length?t:t.substring(t.length-e.length)})};if(!n)return"";if("number"==typeof n)n=new Date(n);else if("string"==typeof n){if(/^\d{12,13}$/g.test(n))n=new Date(parseInt(n));else{if(!/^.{10}T.{8,12}Z?$/g.test(n))return n;n=new Date(n)}}if(!(n instanceof Date))throw Error("formatDate error: not date.");if(isNaN(null==n?void 0:n.getFullYear()))throw Error("formatDate error: invalid date.");e=e||"yyyy-MM-dd HH:mm:ss";var o={y:n.getFullYear(),M:n.getMonth()+1,d:n.getDate(),q:Math.floor((n.getMonth()+3)/3),w:n.getDay(),H:n.getHours(),h:n.getHours()%12==0?12:n.getHours()%12,m:n.getMinutes(),s:n.getSeconds(),S:n.getMilliseconds()},r=["天","一","二","三","四","五","六"];for(var a in o)t(a);return e},parseDate:function(n,e){var t={y:0,M:1,d:0,H:0,h:0,m:0,s:0,S:0};(e=e||"yyyy-MM-dd").replace(/([^yMdHmsS]*?)(([yMdHmsS])\3*)([^yMdHmsS]*?)/g,function(e,o,r,a,c){return n=n.replace(RegExp("".concat(o,"(\\d{").concat(r.length,"})").concat(c)),function(n,e){return t[a]=parseInt(e),""}),""}),t.M--;var o=new Date(t.y,t.M,t.d,t.H,t.m,t.s);return 0!==t.S&&o.setMilliseconds(t.S),o},showLoading:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"请稍候",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=(o=Object.assign({},{hasMask:!0,maskColor:"transparent",onCancel:null,cancelInline:!1,id:"com_global_page_loading"},o)).id,a="_".concat(r,"_timeout");window[a]&&clearTimeout(window[a]);var c=document.getElementById(r);c||((c=document.createElement("div")).id=r,c.className=r,document.body.append(c));var i="".concat(r,"_style");if(!document.getElementById(i)){var l=document.createElement("style");l.id=i,l.innerHTML="\n .".concat(r," {\n position: fixed;\n top: calc(50vh - 60px);\n left: calc(50vw - 60px);\n width: 120px;\n height: 120px;\n z-index: 8000;\n background: rgba(0, 0, 0, 0.6);\n border-radius: 8px;\n text-align: center;\n color: white;\n padding-top: 20px;\n }\n .").concat(r," img {\n width: 50px;\n margin-bottom: 10px;\n }"),document.head.appendChild(l)}if(c.innerHTML="\n ".concat(o.hasMask?'<div class="mask-wrapper" style="background-color: '.concat(o.maskColor,'"></div>'):"",'\n <div class="loading-wrapper">\n <div class="loading-content">\n <img src="https://img.alicdn.com/tfs/TB1bnUsQBLoK1RjSZFuXXXn0XXa-32-32.svg" alt="加载中">\n <div>').concat(n).concat(o.cancelInline?" ":"</div>","\n ").concat(o.onCancel?'<a href="javascript:;" class="cancel">取消</a>':"","\n ").concat(o.cancelInline?"</div>":"","\n </div>\n </div>"),o.onCancel){var d=c.querySelector(".cancel");d&&d.addEventListener("click",function(){t.hideLoading(),o.onCancel()})}c.style.display="block",e>0&&(window[a]=setTimeout(function(){t.hideLoading()},1e3*e))},hideLoading:function(){var n=document.getElementById("com_global_page_loading");n&&(n.style.display="none")},getParam:function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.search;return(RegExp("(^|\\?|&)".concat(n,"=(.*?)(?=&|#|$)"),"g").exec(e)||[])[2]},getParamInt:function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.search;return parseInt(t.getParam(n,e)||"0",10)},getParams:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:location.search,t=((n||"").split("?").pop()||"").split("#")[0]||"",o={};return t.split("&").map(function(n){return n.split("=")}).forEach(function(n){var t=e(n,2),r=t[0],a=t[1];o[r]=a||""}),o},setParam:function(n,o,r){if(r=r||"".concat(location.pathname).concat(location.search),void 0!==t.getParam(n,r))return r.replace(RegExp("(^|\\?|&)".concat(n,"=(.*?)(?=&|#|$)"),"g"),"$1".concat(n,"=").concat(o));var a=e(r.split("#"),2),c=a[0],i=a[1];return"".concat(c).concat(0>c.indexOf("?")?"?":"&").concat(n,"=").concat(o).concat(i?"#":"").concat(i||"")},delParam:function(n,e){return(e=e||"".concat(location.pathname).concat(location.search)).replace(RegExp("(^|\\?|&)".concat(n,"=.*?(&|#|$)"),"g"),function(n,e,t){return"&"===t?e:t})},sleep:function(n){return new Promise(function(e){return setTimeout(e,n||0)})},deepCopy:function(n){return n&&"object"==typeof n?JSON.parse(JSON.stringify(n)):n},encodeHtml:function(n){if("string"==typeof n){var e=document.createElement("div");return e.innerText=n,e.innerHTML}if("object"==typeof n&&n)for(var o in n)n[o]=t.encodeHtml(n[o]);return n},decodeHtml:function(n){if("string"==typeof n){var e=document.createElement("div");return e.innerHTML=n,e.innerText}if("object"==typeof n&&n)for(var o in n)n[o]=t.decodeHtml(n[o]);return n},toUrlParams:function(n){return Object.keys(n||{}).filter(function(e){return void 0!==n[e]}).map(function(e){var t="object"==typeof n[e]?JSON.stringify(n[e]):n[e];return"".concat(encodeURIComponent(e),"=").concat(encodeURIComponent(t))}).join("&")},copyToClipboard:function(n,e,t){if(!n)throw Error("text can not be empty.");return(e=e||function(n){return console.error("复制到剪贴板失败:".concat(n||""))},navigator.clipboard&&!t)?navigator.clipboard.writeText(n).catch(function(n){throw e(n.message),n}):new Promise(function(t,o){var r=document.createElement("input");r.value=n,r.style.cssText="position:fixed;left:0;top:0;opacity:0;",document.body.appendChild(r),r.select();try{if(document.execCommand("copy"))t();else{var a="Failed to execute 'document.execCommand'.";e(a),o(Error(a))}}catch(n){e(n.message),o(n)}finally{document.body.removeChild(r)}})}};return t});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).youtil={})}(this,function(e){"use strict";var n,t,r=function(){var e=document.getElementById("com_global_page_loading");e&&(e.style.display="none")};function o(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t<n;t++)r[t]=e[t];return r}function a(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(e){if("string"==typeof e)return o(e,n);var t=Object.prototype.toString.call(e).slice(8,-1);if("Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t)return Array.from(t);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return o(e,n)}}(e,n)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var c=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.search;return(RegExp("(^|\\?|&)".concat(e,"=(.*?)(?=&|#|$)"),"g").exec(n)||[])[2]},i=function(e){return Object.keys(e||{}).filter(function(n){return void 0!==e[n]}).map(function(n){var t="object"==typeof e[n]?JSON.stringify(e[n]):e[n];return"".concat(encodeURIComponent(n),"=").concat(encodeURIComponent(t))}).join("&")};function l(e,n,t,r,o,a,c){try{var i=e[a](c),l=i.value}catch(e){t(e);return}i.done?n(l):Promise.resolve(l).then(r,o)}function u(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{},r=Object.keys(t);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(t).filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.forEach(function(n){var r,o;r=e,o=t[n],n in r?Object.defineProperty(r,n,{value:o,enumerable:!0,configurable:!0,writable:!0}):r[n]=o})}return e}"function"==typeof SuppressedError&&SuppressedError;var s=(n=function(e,n){var t,r,o,a,c,l,s,d,f,p,m,g,y,h,v;return function(e,n){var t,r,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},c=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return c.next=i(0),c.throw=i(1),c.return=i(2),"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function i(i){return function(l){return function(i){if(t)throw TypeError("Generator is already executing.");for(;c&&(c=0,i[0]&&(a=0)),a;)try{if(t=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=n.call(e,a)}catch(e){i=[6,e],r=0}finally{t=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,l])}}}(this,function(b){switch(b.label){case 0:r=(t=(n=Object.assign({},{errorMessage:"系统繁忙,请稍后再试",errorHandler:function(e){if(!(null==n?void 0:n.silent)){var t;null==n||null===(t=n.toastHandler)||void 0===t||t.call(n,e)}throw Error(e)},baseUrl:"",headers:{},fetchOptions:{credentials:"include"},checkSuccess:function(e){return(null==e?void 0:e.code)==0||(null==e?void 0:e.code)==200},toastHandler:function(e){return console.error("您还没有配置toastHandler,请根据您的UI组件库配置合适的提示方法。")}},n||{}))||{}).params,o=t.data,a=t.json,c=t.method,l=t.headers,s=t.baseUrl,d=t.fetchOptions,f=t.checkSuccess,p=t.afterRequest,m=t.errorHandler,g=t.errorMessage,y=t.responseConverter,r&&(d.method=c||"GET",e="".concat(e,"?").concat(i(r))),o?Object.assign(d,{method:c||"POST",body:i(o),headers:u({"Content-Type":"application/x-www-form-urlencoded;charset=utf-8"},l||{})}):a&&Object.assign(d,{method:c||"POST",body:JSON.stringify(a),headers:u({"Content-Type":"application/json;charset=utf-8"},l||{})}),h=null,b.label=1;case 1:return b.trys.push([1,3,,4]),[4,fetch("".concat(s||"").concat(e),d).then(function(e){return e.json()})];case 2:return h=b.sent(),[3,4];case 3:return console.error(v=b.sent()),null==p||p(!1,{message:null==v?void 0:v.message}),null==m||m(g||""),[2];case 4:if(h=y?y(h):h,null==f?void 0:f(h))return null==p||p(!0,h),[2,h.data];return null==p||p(!1,h),null==m||m(h.message||h.msg||g||"",h),[2]}})},t=function(){var e=this,t=arguments;return new Promise(function(r,o){var a=n.apply(e,t);function c(e){l(a,r,o,c,i,"next",e)}function i(e){l(a,r,o,c,i,"throw",e)}c(void 0)})},function(e,n){return t.apply(this,arguments)}),d=function(e){if("string"==typeof e){var n=document.createElement("div");return n.innerText=e,n.innerHTML}if("object"==typeof e&&e)for(var t in e)e[t]=d(e[t]);return e},f=function(e){if("string"==typeof e){var n=document.createElement("div");return n.innerHTML=e,n.innerText}if("object"==typeof e&&e)for(var t in e)e[t]=f(e[t]);return e};e.Request=function(e){return function(n,t){return s(n,u({},e||{},t||{}))}},e.copyToClipboard=function(e,n,t){if(!e)throw Error("text can not be empty.");return(n=n||function(e){return console.error("复制到剪贴板失败:".concat(e||""))},navigator.clipboard&&!t)?navigator.clipboard.writeText(e).catch(function(e){throw n(e.message),e}):new Promise(function(t,r){var o=document.createElement("input");o.value=e,o.style.cssText="position:fixed;left:0;top:0;opacity:0;",document.body.appendChild(o),o.select();try{if(document.execCommand("copy"))t();else{var a="Failed to execute 'document.execCommand'.";n(a),r(Error(a))}}catch(e){n(e.message),r(e)}finally{document.body.removeChild(o)}})},e.decodeHtml=f,e.deepCopy=function(e){return e&&"object"==typeof e?JSON.parse(JSON.stringify(e)):e},e.delParam=function(e,n){return(n=n||"".concat(location.pathname).concat(location.search)).replace(RegExp("(^|\\?|&)".concat(e,"=.*?(&|#|$)"),"g"),function(e,n,t){return"&"===t?n:t})},e.encodeHtml=d,e.formatDate=function(e,n){var t=function(e){n=n.replace(RegExp("".concat(e,"+"),"g"),function(n){var t="".concat(r[e]);if("w"===e)return(n.length>2?"星期":"周")+o[t];for(var a=0,c=t.length;a<n.length-c;a++)t="0".concat(t);return 1===n.length?t:t.substring(t.length-n.length)})};if(!e)return"";if("number"==typeof e)e=new Date(e);else if("string"==typeof e){if(/^\d{12,13}$/g.test(e))e=new Date(parseInt(e));else{if(!/^.{10}T.{8,12}Z?$/g.test(e))return e;e=new Date(e)}}if(!(e instanceof Date))throw Error("formatDate error: not date.");if(isNaN(null==e?void 0:e.getFullYear()))throw Error("formatDate error: invalid date.");n=n||"yyyy-MM-dd HH:mm:ss";var r={y:e.getFullYear(),M:e.getMonth()+1,d:e.getDate(),q:Math.floor((e.getMonth()+3)/3),w:e.getDay(),H:e.getHours(),h:e.getHours()%12==0?12:e.getHours()%12,m:e.getMinutes(),s:e.getSeconds(),S:e.getMilliseconds()},o=["天","一","二","三","四","五","六"];for(var a in r)t(a);return n},e.getParam=c,e.getParamInt=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.search;return parseInt(c(e,n)||"0",10)},e.getParams=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:location.search,n=((e||"").split("?").pop()||"").split("#")[0]||"",t={};return n.split("&").map(function(e){return e.split("=")}).forEach(function(e){var n=a(e,2),r=n[0],o=n[1];t[r]=o||""}),t},e.hideLoading=r,e.parseDate=function(e,n){var t={y:0,M:1,d:0,H:0,h:0,m:0,s:0,S:0};(n=n||"yyyy-MM-dd").replace(/([^yMdHmsS]*?)(([yMdHmsS])\3*)([^yMdHmsS]*?)/g,function(n,r,o,a,c){return e=e.replace(RegExp("".concat(r,"(\\d{").concat(o.length,"})").concat(c)),function(e,n){return t[a]=parseInt(n),""}),""}),t.M--;var r=new Date(t.y,t.M,t.d,t.H,t.m,t.s);return 0!==t.S&&r.setMilliseconds(t.S),r},e.request=s,e.setParam=function(e,n,t){if(void 0!==c(e,t=t||"".concat(location.pathname).concat(location.search)))return t.replace(RegExp("(^|\\?|&)".concat(e,"=(.*?)(?=&|#|$)"),"g"),"$1".concat(e,"=").concat(n));var r=a(t.split("#"),2),o=r[0],i=r[1];return"".concat(o).concat(0>o.indexOf("?")?"?":"&").concat(e,"=").concat(n).concat(i?"#":"").concat(i||"")},e.showLoading=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"请稍候",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=(t=Object.assign({},{hasMask:!0,maskColor:"transparent",onCancel:null,cancelInline:!1,id:"com_global_page_loading"},t)).id,a="_".concat(o,"_timeout");window[a]&&clearTimeout(window[a]);var c=document.getElementById(o);c||((c=document.createElement("div")).id=o,c.className=o,document.body.append(c));var i="".concat(o,"_style");if(!document.getElementById(i)){var l=document.createElement("style");l.id=i,l.innerHTML="\n .".concat(o," {\n position: fixed;\n top: calc(50vh - 60px);\n left: calc(50vw - 60px);\n width: 120px;\n height: 120px;\n z-index: 8000;\n background: rgba(0, 0, 0, 0.6);\n border-radius: 8px;\n text-align: center;\n color: white;\n padding-top: 20px;\n }\n .").concat(o," img {\n width: 50px;\n margin-bottom: 10px;\n }"),document.head.appendChild(l)}if(c.innerHTML="\n ".concat(t.hasMask?'<div class="mask-wrapper" style="background-color: '.concat(t.maskColor,'"></div>'):"",'\n <div class="loading-wrapper">\n <div class="loading-content">\n <img src="https://img.alicdn.com/tfs/TB1bnUsQBLoK1RjSZFuXXXn0XXa-32-32.svg" alt="加载中">\n <div>').concat(e).concat(t.cancelInline?" ":"</div>","\n ").concat(t.onCancel?'<a href="javascript:;" class="cancel">取消</a>':"","\n ").concat(t.cancelInline?"</div>":"","\n </div>\n </div>"),t.onCancel){var u=c.querySelector(".cancel");u&&u.addEventListener("click",function(){r(),t.onCancel()})}c.style.display="block",n>0&&(window[a]=setTimeout(function(){r()},1e3*n))},e.sleep=function(e){return new Promise(function(n){return setTimeout(n,e||0)})},e.toUrlParams=i,Object.defineProperty(e,"__esModule",{value:!0})});
package/esm/index.d.ts CHANGED
@@ -1,115 +1,32 @@
1
- interface IShowLoadingConfig {
2
- hasMask?: boolean;
3
- maskColor?: string;
4
- cancelInline?: boolean;
5
- onCancel?: Function;
6
- id?: string;
7
- }
8
- declare const youtil: {
9
- /**
10
- * 将日期格式化成指定格式的字符串
11
- * @param date 要格式化的日期,不传时默认当前时间,也可以是一个时间戳等
12
- * @param fmt 目标字符串格式,支持的字符有:y,M,d,q,w,H,h,m,S,默认:yyyy-MM-dd HH:mm:ss
13
- * @returns 返回格式化后的日期字符串
14
- */
15
- formatDate(date?: Date | number | string, fmt?: string): string;
16
- /**
17
- * 将字符串解析成日期
18
- * @param str 输入的日期字符串,如'2014-09-13'
19
- * @param fmt 字符串格式,默认'yyyy-MM-dd',支持如下:y、M、d、H、m、s、S,不支持w和q
20
- * @returns 解析后的Date类型日期
21
- */
22
- parseDate(str: string, fmt?: string): Date;
23
- /**
24
- * 显示全局loading
25
- * @param {*} text
26
- * @param {*} seconds
27
- * @param {*} options
28
- */
29
- showLoading(text?: string, seconds?: number, config?: IShowLoadingConfig): void;
30
- hideLoading(): void;
31
- /**
32
- * 从URL中获取某个参数,如果不存在返回 undefined ,如果存在多个同名参数,返回第一个匹配值
33
- * getParam('a', '?a=1&b=&c=3&c=33#abc') // '1'
34
- * getParam('b', '?a=1&b=&c=3&c=33#abc') // ''
35
- * getParam('c', '?a=1&b=&c=3&c=33#abc') // 3
36
- * getParam('d', '?a=1&b=&c=3&c=33#abc') // undefined
37
- * @param {*} name 参数名
38
- * @param {*} url 要获取的URL,默认当前地址
39
- */
40
- getParam(name: string, url?: string): string;
41
- /**
42
- * 从URL中获取int参数
43
- * @param {*} name 参数名
44
- * @param {*} url 要获取的URL,默认当前地址
45
- */
46
- getParamInt(name: string, url?: string): number;
47
- /**
48
- * 获取某个URL的全部参数
49
- * getParams('?a=1&b=2#cc') // {a: '1', b: '2'}
50
- * @param url
51
- * @returns 参数对象
52
- */
53
- getParams(url?: string): any;
54
- /**
55
- * 给URL设置参数,如果已经存在,替换之,兼容hash存在的情况
56
- * setParam('a', '123', '?a=1&b=2&a=3#d') // '?a=123&b=2&a=123#d'
57
- * setParam('d', '444', '?a=1&b=2&a=3#d') // '?a=1&b=2&a=3&d=444#d'
58
- * @param {Object} name 参数名
59
- * @param {Object} value 参数值
60
- * @param {Object} url 如果不传默认当前页面URL
61
- */
62
- setParam(name: string, value: string | number, url?: string): string;
63
- /**
64
- * 删除URL中某个参数
65
- * delParam('a', '?a=1&b=2&a=3#d') // '?b=2#d'
66
- * delParam('b', '?a=1&b=2&a=3#d') // '?a=1&a=3#d'
67
- * delParam('a', '?a=1#d') // '#d'
68
- * @param name 参数名
69
- * @param url 要删除的URL,默认当前页面URL
70
- * @returns 处理完后的URL
71
- */
72
- delParam(name: string, url: string): string;
73
- /**
74
- * 休息一段时间,单位毫秒
75
- * 示例:await sleep(200); // 休息200毫秒
76
- * @param time 要休息的时间,单位毫秒,不传默认0
77
- * @returns
78
- */
79
- sleep: (time?: number) => Promise<unknown>;
80
- /**
81
- * 基于JSON的简单深拷贝
82
- * @param obj 要复制的对象,非对象格式会直接返回
83
- * @returns
84
- */
85
- deepCopy: (obj: any) => any;
86
- /**
87
- * HTML编码,例如将 【"】 变成 【&quot;】
88
- * @param {*} html 待编码的原始字符串,如果传入对象会遍历处理
89
- * @returns
90
- */
91
- encodeHtml(html: string | any): any;
92
- /**
93
- * HTML解码,例如将 【&quot;】 变成 【"】
94
- * @param {*} html 已经被HTML编码过的字符串,如果传入对象会遍历处理
95
- * @returns
96
- */
97
- decodeHtml(html: string | any): any;
98
- /**
99
- * 将一个普通对象转为 a=1&b=2 的URL格式,会自动过滤undefined的值
100
- * @param data 一个普通对象,如果对象嵌对象则会被自动转为JSON
101
- * @returns 返回类似 a=1&b=2 的字符串
102
- */
103
- toUrlParams(data: any): string;
104
- /**
105
- * 复制一段文本到剪贴板,如果失败会抛出异常,推荐使用姿势:
106
- * await copyTextToClipboard('要复制的文本', message => alert(`复制到剪贴板失败:${message}`));
107
- * alert('复制到剪贴板成功!');
108
- * @param {*} text 要复制的文本
109
- * @param {*} onFailure 失败回调,接受一个 message 参数
110
- * @param {*} supportSilent 是否支持后台静默复制,如果是则优先采用 execCommand
111
- * @returns
112
- */
113
- copyToClipboard(text: string, onFailure: (message: string) => void, supportSilent: boolean): Promise<void>;
114
- };
115
- export default youtil;
1
+ export * from './loading';
2
+ export * from './param';
3
+ export * from './request';
4
+ export * from './time';
5
+ /**
6
+ * 基于JSON的简单深拷贝
7
+ * @param obj 要复制的对象,非对象格式会直接返回
8
+ * @returns
9
+ */
10
+ export declare const deepCopy: (obj: any) => any;
11
+ /**
12
+ * HTML编码,例如将 【"】 变成 【&quot;】
13
+ * @param {*} html 待编码的原始字符串,如果传入对象会遍历处理
14
+ * @returns
15
+ */
16
+ export declare const encodeHtml: (html: string | any) => any;
17
+ /**
18
+ * HTML解码,例如将 【&quot;】 变成 【"】
19
+ * @param {*} html 已经被HTML编码过的字符串,如果传入对象会遍历处理
20
+ * @returns
21
+ */
22
+ export declare const decodeHtml: (html: string | any) => any;
23
+ /**
24
+ * 复制一段文本到剪贴板,如果失败会抛出异常,推荐使用姿势:
25
+ * await copyTextToClipboard('要复制的文本', message => alert(`复制到剪贴板失败:${message}`));
26
+ * alert('复制到剪贴板成功!');
27
+ * @param {*} text 要复制的文本
28
+ * @param {*} onFailure 失败回调,接受一个 message 参数
29
+ * @param {*} supportSilent 是否支持后台静默复制,如果是则优先采用 execCommand
30
+ * @returns
31
+ */
32
+ export declare const copyToClipboard: (text: string, onFailure: (message: string) => void, supportSilent: boolean) => Promise<void>;
package/esm/index.js CHANGED
@@ -1,297 +1,77 @@
1
- import _instanceof from "@swc/helpers/src/_instanceof.mjs";
2
- import _sliced_to_array from "@swc/helpers/src/_sliced_to_array.mjs";
3
- var youtil = {
4
- /**
5
- * 将日期格式化成指定格式的字符串
6
- * @param date 要格式化的日期,不传时默认当前时间,也可以是一个时间戳等
7
- * @param fmt 目标字符串格式,支持的字符有:y,M,d,q,w,H,h,m,S,默认:yyyy-MM-dd HH:mm:ss
8
- * @returns 返回格式化后的日期字符串
9
- */ formatDate: function formatDate(date, fmt) {
10
- var _loop = function(i) {
11
- fmt = fmt.replace(new RegExp("".concat(i, "+"), "g"), function(m) {
12
- var val = "".concat(obj[i]);
13
- if (i === "w") return (m.length > 2 ? "星期" : "周") + week[val];
14
- for(var j = 0, len = val.length; j < m.length - len; j++)val = "0".concat(val);
15
- return m.length === 1 ? val : val.substring(val.length - m.length);
16
- });
17
- };
18
- if (!date) return "";
19
- if (typeof date === "number") // 1687682453445
20
- date = new Date(date);
21
- else if (typeof date === "string") {
22
- if (/^\d{12,13}$/g.test(date)) // '1687682453445'
23
- date = new Date(parseInt(date));
24
- else if (/^.{10}T.{8,12}Z?$/g.test(date)) // '2019-01-01T00:00:00.000Z'
25
- date = new Date(date);
26
- else return date;
27
- }
28
- if (!_instanceof(date, Date)) throw new Error("formatDate error: not date.");
29
- if (isNaN(date === null || date === void 0 ? void 0 : date.getFullYear())) throw new Error("formatDate error: invalid date.");
30
- fmt = fmt || "yyyy-MM-dd HH:mm:ss";
31
- var obj = {
32
- y: date.getFullYear(),
33
- M: date.getMonth() + 1,
34
- d: date.getDate(),
35
- q: Math.floor((date.getMonth() + 3) / 3),
36
- w: date.getDay(),
37
- H: date.getHours(),
38
- h: date.getHours() % 12 === 0 ? 12 : date.getHours() % 12,
39
- m: date.getMinutes(),
40
- s: date.getSeconds(),
41
- S: date.getMilliseconds()
42
- };
43
- var week = [
44
- "天",
45
- "一",
46
- "",
47
- "三",
48
- "",
49
- "五",
50
- "六"
51
- ];
52
- // eslint-disable-next-line guard-for-in
53
- for(var i in obj)_loop(i);
54
- return fmt;
55
- },
56
- /**
57
- * 将字符串解析成日期
58
- * @param str 输入的日期字符串,如'2014-09-13'
59
- * @param fmt 字符串格式,默认'yyyy-MM-dd',支持如下:y、M、d、H、m、s、S,不支持w和q
60
- * @returns 解析后的Date类型日期
61
- */ parseDate: function parseDate(str, fmt) {
62
- fmt = fmt || "yyyy-MM-dd";
63
- var obj = {
64
- y: 0,
65
- M: 1,
66
- d: 0,
67
- H: 0,
68
- h: 0,
69
- m: 0,
70
- s: 0,
71
- S: 0
72
- };
73
- fmt.replace(/([^yMdHmsS]*?)(([yMdHmsS])\3*)([^yMdHmsS]*?)/g, function(m, $1, $2, $3, $4) {
74
- str = str.replace(new RegExp("".concat($1, "(\\d{").concat($2.length, "})").concat($4)), function(_m, _$1) {
75
- obj[$3] = parseInt(_$1);
76
- return "";
77
- });
78
- return "";
79
- });
80
- obj.M--; // 月份是从0开始的,所以要减去1
81
- var date = new Date(obj.y, obj.M, obj.d, obj.H, obj.m, obj.s);
82
- if (obj.S !== 0) date.setMilliseconds(obj.S); // 如果设置了毫秒
83
- return date;
84
- },
85
- /**
86
- * 显示全局loading
87
- * @param {*} text
88
- * @param {*} seconds
89
- * @param {*} options
90
- */ showLoading: function showLoading() {
91
- var text = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "请稍候", seconds = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 10, config = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
92
- var defaultConfig = {
93
- hasMask: true,
94
- maskColor: "transparent",
95
- onCancel: null,
96
- cancelInline: false,
97
- id: "com_global_page_loading"
98
- };
99
- config = Object.assign({}, defaultConfig, config);
100
- var id = config.id;
101
- var timeoutKey = "_".concat(id, "_timeout");
102
- if (window[timeoutKey]) clearTimeout(window[timeoutKey]);
103
- var dom = document.getElementById(id);
104
- if (!dom) {
105
- dom = document.createElement("div");
106
- dom.id = id;
107
- dom.className = id;
108
- document.body.append(dom);
109
- }
110
- var styleId = "".concat(id, "_style");
111
- if (!document.getElementById(styleId)) {
112
- var style = document.createElement("style");
113
- style.id = styleId;
114
- style.innerHTML = "\n .".concat(id, " {\n position: fixed;\n top: calc(50vh - 60px);\n left: calc(50vw - 60px);\n width: 120px;\n height: 120px;\n z-index: 8000;\n background: rgba(0, 0, 0, 0.6);\n border-radius: 8px;\n text-align: center;\n color: white;\n padding-top: 20px;\n }\n .").concat(id, " img {\n width: 50px;\n margin-bottom: 10px;\n }");
115
- document.head.appendChild(style);
116
- }
117
- dom.innerHTML = "\n ".concat(config.hasMask ? '<div class="mask-wrapper" style="background-color: '.concat(config.maskColor, '"></div>') : "", '\n <div class="loading-wrapper">\n <div class="loading-content">\n <img src="https://img.alicdn.com/tfs/TB1bnUsQBLoK1RjSZFuXXXn0XXa-32-32.svg" alt="加载中">\n <div>').concat(text).concat(config.cancelInline ? " " : "</div>", "\n ").concat(config.onCancel ? '<a href="javascript:;" class="cancel">取消</a>' : "", "\n ").concat(config.cancelInline ? "</div>" : "", "\n </div>\n </div>");
118
- if (config.onCancel) {
119
- var btn = dom.querySelector(".cancel");
120
- btn && btn.addEventListener("click", function() {
121
- youtil.hideLoading();
122
- config.onCancel();
123
- });
124
- }
125
- dom.style.display = "block";
126
- if (seconds > 0) window[timeoutKey] = setTimeout(function() {
127
- youtil.hideLoading();
128
- }, seconds * 1000);
129
- },
130
- // 隐藏全局loading
131
- hideLoading: function hideLoading() {
132
- var id = "com_global_page_loading";
133
- var loading = document.getElementById(id);
134
- if (loading) loading.style.display = "none";
135
- },
136
- /**
137
- * 从URL中获取某个参数,如果不存在返回 undefined ,如果存在多个同名参数,返回第一个匹配值
138
- * getParam('a', '?a=1&b=&c=3&c=33#abc') // '1'
139
- * getParam('b', '?a=1&b=&c=3&c=33#abc') // ''
140
- * getParam('c', '?a=1&b=&c=3&c=33#abc') // 3
141
- * getParam('d', '?a=1&b=&c=3&c=33#abc') // undefined
142
- * @param {*} name 参数名
143
- * @param {*} url 要获取的URL,默认当前地址
144
- */ getParam: function getParam(name) {
145
- var url = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : location.search;
146
- return (new RegExp("(^|\\?|&)".concat(name, "=(.*?)(?=&|#|$)"), "g").exec(url) || [])[2];
147
- },
148
- /**
149
- * 从URL中获取int参数
150
- * @param {*} name 参数名
151
- * @param {*} url 要获取的URL,默认当前地址
152
- */ getParamInt: function getParamInt(name) {
153
- var url = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : location.search;
154
- return parseInt(youtil.getParam(name, url) || "0", 10);
155
- },
156
- /**
157
- * 获取某个URL的全部参数
158
- * getParams('?a=1&b=2#cc') // {a: '1', b: '2'}
159
- * @param url
160
- * @returns 参数对象
161
- */ getParams: function getParams() {
162
- var url = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : location.search;
163
- var search = ((url || "").split("?").pop() || "").split("#")[0] || "";
164
- var params = {};
165
- search.split("&").map(function(item) {
166
- return item.split("=");
167
- }).forEach(function(param) {
168
- var _param = _sliced_to_array(param, 2), key = _param[0], value = _param[1];
169
- params[key] = value || "";
170
- });
171
- return params;
172
- },
173
- /**
174
- * 给URL设置参数,如果已经存在,替换之,兼容hash存在的情况
175
- * setParam('a', '123', '?a=1&b=2&a=3#d') // '?a=123&b=2&a=123#d'
176
- * setParam('d', '444', '?a=1&b=2&a=3#d') // '?a=1&b=2&a=3&d=444#d'
177
- * @param {Object} name 参数名
178
- * @param {Object} value 参数值
179
- * @param {Object} url 如果不传默认当前页面URL
180
- */ setParam: function setParam(name, value, url) {
181
- url = url || "".concat(location.pathname).concat(location.search);
182
- // 如果参数已经存在,替换之
183
- if (youtil.getParam(name, url) !== undefined) return url.replace(new RegExp("(^|\\?|&)".concat(name, "=(.*?)(?=&|#|$)"), "g"), "$1".concat(name, "=").concat(value));
184
- var _url_split = _sliced_to_array(url.split("#"), 2), pathname = _url_split[0], hash = _url_split[1]; // 处理存在hash的情况
185
- return "".concat(pathname).concat(pathname.indexOf("?") < 0 ? "?" : "&").concat(name, "=").concat(value).concat(hash ? "#" : "").concat(hash || "");
186
- },
187
- /**
188
- * 删除URL中某个参数
189
- * delParam('a', '?a=1&b=2&a=3#d') // '?b=2#d'
190
- * delParam('b', '?a=1&b=2&a=3#d') // '?a=1&a=3#d'
191
- * delParam('a', '?a=1#d') // '#d'
192
- * @param name 参数名
193
- * @param url 要删除的URL,默认当前页面URL
194
- * @returns 处理完后的URL
195
- */ delParam: function delParam(name, url) {
196
- url = url || "".concat(location.pathname).concat(location.search);
197
- return url.replace(new RegExp("(^|\\?|&)".concat(name, "=.*?(&|#|$)"), "g"), function(_m, $1, $2) {
198
- return $2 === "&" ? $1 : $2;
199
- });
200
- },
201
- /**
202
- * 休息一段时间,单位毫秒
203
- * 示例:await sleep(200); // 休息200毫秒
204
- * @param time 要休息的时间,单位毫秒,不传默认0
205
- * @returns
206
- */ sleep: function(time) {
207
- return new Promise(function(resolve) {
208
- return setTimeout(resolve, time || 0);
209
- });
210
- },
211
- /**
212
- * 基于JSON的简单深拷贝
213
- * @param obj 要复制的对象,非对象格式会直接返回
214
- * @returns
215
- */ deepCopy: function(obj) {
216
- if (!obj || typeof obj !== "object") return obj;
217
- return JSON.parse(JSON.stringify(obj));
218
- },
219
- /**
220
- * HTML编码,例如将 【"】 变成 【&quot;】
221
- * @param {*} html 待编码的原始字符串,如果传入对象会遍历处理
222
- * @returns
223
- */ encodeHtml: function encodeHtml(html) {
224
- if (typeof html === "string") {
225
- var div = document.createElement("div");
226
- div.innerText = html;
227
- return div.innerHTML;
228
- } else if (typeof html === "object" && html) for(var i in html)html[i] = youtil.encodeHtml(html[i]);
229
- return html;
230
- },
231
- /**
232
- * HTML解码,例如将 【&quot;】 变成 【"】
233
- * @param {*} html 已经被HTML编码过的字符串,如果传入对象会遍历处理
234
- * @returns
235
- */ decodeHtml: function decodeHtml(html) {
236
- if (typeof html === "string") {
237
- var div = document.createElement("div");
238
- div.innerHTML = html;
239
- return div.innerText;
240
- } else if (typeof html === "object" && html) for(var i in html)html[i] = youtil.decodeHtml(html[i]);
241
- return html;
242
- },
243
- /**
244
- * 将一个普通对象转为 a=1&b=2 的URL格式,会自动过滤undefined的值
245
- * @param data 一个普通对象,如果对象嵌对象则会被自动转为JSON
246
- * @returns 返回类似 a=1&b=2 的字符串
247
- */ toUrlParams: function toUrlParams(data) {
248
- return Object.keys(data || {}).filter(function(key) {
249
- return data[key] !== undefined;
250
- }).map(function(key) {
251
- var value = typeof data[key] === "object" ? JSON.stringify(data[key]) : data[key];
252
- return "".concat(encodeURIComponent(key), "=").concat(encodeURIComponent(value));
253
- }).join("&");
254
- },
255
- /**
256
- * 复制一段文本到剪贴板,如果失败会抛出异常,推荐使用姿势:
257
- * await copyTextToClipboard('要复制的文本', message => alert(`复制到剪贴板失败:${message}`));
258
- * alert('复制到剪贴板成功!');
259
- * @param {*} text 要复制的文本
260
- * @param {*} onFailure 失败回调,接受一个 message 参数
261
- * @param {*} supportSilent 是否支持后台静默复制,如果是则优先采用 execCommand
262
- * @returns
263
- */ copyToClipboard: function copyToClipboard(text, onFailure, supportSilent) {
264
- if (!text) throw new Error("text can not be empty.");
265
- onFailure = onFailure || function(msg) {
266
- return console.error("复制到剪贴板失败:".concat(msg || ""));
267
- };
268
- // 优先采用现代化API
269
- if (navigator.clipboard && !supportSilent) // 注意 writeText API 要求:文档被激活 & 页面已启用HTTPS
270
- return navigator.clipboard.writeText(text).catch(function(e) {
271
- onFailure(e.message);
272
- throw e;
273
- });
274
- // execCommand 原本是一个同步API,这里为了和 writeText 保持一致统一包成proimse
275
- return new Promise(function(resolve, reject) {
276
- var input = document.createElement("input");
277
- input.value = text;
278
- input.style.cssText = "position:fixed;left:0;top:0;opacity:0;";
279
- document.body.appendChild(input);
280
- input.select();
281
- try {
282
- if (document.execCommand("copy")) resolve();
283
- else {
284
- var message = "Failed to execute 'document.execCommand'.";
285
- onFailure(message);
286
- reject(new Error(message));
287
- }
288
- } catch (e) {
289
- onFailure(e.message);
290
- reject(e);
291
- } finally{
292
- document.body.removeChild(input);
1
+ export * from "./loading";
2
+ export * from "./param";
3
+ export * from "./request";
4
+ export * from "./time";
5
+ /**
6
+ * 基于JSON的简单深拷贝
7
+ * @param obj 要复制的对象,非对象格式会直接返回
8
+ * @returns
9
+ */ export var deepCopy = function(obj) {
10
+ if (!obj || typeof obj !== "object") return obj;
11
+ return JSON.parse(JSON.stringify(obj));
12
+ };
13
+ /**
14
+ * HTML编码,例如将 【"】 变成 【&quot;】
15
+ * @param {*} html 待编码的原始字符串,如果传入对象会遍历处理
16
+ * @returns
17
+ */ export var encodeHtml = function(html) {
18
+ if (typeof html === "string") {
19
+ var div = document.createElement("div");
20
+ div.innerText = html;
21
+ return div.innerHTML;
22
+ } else if (typeof html === "object" && html) for(var i in html)html[i] = encodeHtml(html[i]);
23
+ return html;
24
+ };
25
+ /**
26
+ * HTML解码,例如将 【&quot;】 变成 【"】
27
+ * @param {*} html 已经被HTML编码过的字符串,如果传入对象会遍历处理
28
+ * @returns
29
+ */ export var decodeHtml = function(html) {
30
+ if (typeof html === "string") {
31
+ var div = document.createElement("div");
32
+ div.innerHTML = html;
33
+ return div.innerText;
34
+ } else if (typeof html === "object" && html) for(var i in html)html[i] = decodeHtml(html[i]);
35
+ return html;
36
+ };
37
+ /**
38
+ * 复制一段文本到剪贴板,如果失败会抛出异常,推荐使用姿势:
39
+ * await copyTextToClipboard('要复制的文本', message => alert(`复制到剪贴板失败:${message}`));
40
+ * alert('复制到剪贴板成功!');
41
+ * @param {*} text 要复制的文本
42
+ * @param {*} onFailure 失败回调,接受一个 message 参数
43
+ * @param {*} supportSilent 是否支持后台静默复制,如果是则优先采用 execCommand
44
+ * @returns
45
+ */ export var copyToClipboard = function(text, onFailure, supportSilent) {
46
+ if (!text) throw new Error("text can not be empty.");
47
+ onFailure = onFailure || function(msg) {
48
+ return console.error("复制到剪贴板失败:".concat(msg || ""));
49
+ };
50
+ // 优先采用现代化API
51
+ if (navigator.clipboard && !supportSilent) // 注意 writeText API 要求:文档被激活 & 页面已启用HTTPS
52
+ return navigator.clipboard.writeText(text).catch(function(e) {
53
+ onFailure(e.message);
54
+ throw e;
55
+ });
56
+ // execCommand 原本是一个同步API,这里为了和 writeText 保持一致统一包成proimse
57
+ return new Promise(function(resolve, reject) {
58
+ var input = document.createElement("input");
59
+ input.value = text;
60
+ input.style.cssText = "position:fixed;left:0;top:0;opacity:0;";
61
+ document.body.appendChild(input);
62
+ input.select();
63
+ try {
64
+ if (document.execCommand("copy")) resolve();
65
+ else {
66
+ var message = "Failed to execute 'document.execCommand'.";
67
+ onFailure(message);
68
+ reject(new Error(message));
293
69
  }
294
- });
295
- }
70
+ } catch (e) {
71
+ onFailure(e.message);
72
+ reject(e);
73
+ } finally{
74
+ document.body.removeChild(input);
75
+ }
76
+ });
296
77
  };
297
- export default youtil;
@@ -0,0 +1,19 @@
1
+ /** showLoading配置 */
2
+ export interface IShowLoadingConfig {
3
+ hasMask?: boolean;
4
+ maskColor?: string;
5
+ cancelInline?: boolean;
6
+ onCancel?: Function;
7
+ id?: string;
8
+ }
9
+ /**
10
+ * 显示全局loading,不依赖任何框架
11
+ * @param {*} text 提示文案
12
+ * @param {*} seconds 超时自动关闭时间,单位秒
13
+ * @param {*} options 可选配置
14
+ */
15
+ export declare const showLoading: (text?: string, seconds?: number, config?: IShowLoadingConfig) => void;
16
+ /**
17
+ * 主动关闭loading提示
18
+ */
19
+ export declare const hideLoading: () => void;
package/esm/loading.js ADDED
@@ -0,0 +1,52 @@
1
+ /** showLoading配置 */ /**
2
+ * 显示全局loading,不依赖任何框架
3
+ * @param {*} text 提示文案
4
+ * @param {*} seconds 超时自动关闭时间,单位秒
5
+ * @param {*} options 可选配置
6
+ */ export var showLoading = function() {
7
+ var text = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "请稍候", seconds = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 10, config = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
8
+ var defaultConfig = {
9
+ hasMask: true,
10
+ maskColor: "transparent",
11
+ onCancel: null,
12
+ cancelInline: false,
13
+ id: "com_global_page_loading"
14
+ };
15
+ config = Object.assign({}, defaultConfig, config);
16
+ var id = config.id;
17
+ var timeoutKey = "_".concat(id, "_timeout");
18
+ if (window[timeoutKey]) clearTimeout(window[timeoutKey]);
19
+ var dom = document.getElementById(id);
20
+ if (!dom) {
21
+ dom = document.createElement("div");
22
+ dom.id = id;
23
+ dom.className = id;
24
+ document.body.append(dom);
25
+ }
26
+ var styleId = "".concat(id, "_style");
27
+ if (!document.getElementById(styleId)) {
28
+ var style = document.createElement("style");
29
+ style.id = styleId;
30
+ style.innerHTML = "\n .".concat(id, " {\n position: fixed;\n top: calc(50vh - 60px);\n left: calc(50vw - 60px);\n width: 120px;\n height: 120px;\n z-index: 8000;\n background: rgba(0, 0, 0, 0.6);\n border-radius: 8px;\n text-align: center;\n color: white;\n padding-top: 20px;\n }\n .").concat(id, " img {\n width: 50px;\n margin-bottom: 10px;\n }");
31
+ document.head.appendChild(style);
32
+ }
33
+ dom.innerHTML = "\n ".concat(config.hasMask ? '<div class="mask-wrapper" style="background-color: '.concat(config.maskColor, '"></div>') : "", '\n <div class="loading-wrapper">\n <div class="loading-content">\n <img src="https://img.alicdn.com/tfs/TB1bnUsQBLoK1RjSZFuXXXn0XXa-32-32.svg" alt="加载中">\n <div>').concat(text).concat(config.cancelInline ? " " : "</div>", "\n ").concat(config.onCancel ? '<a href="javascript:;" class="cancel">取消</a>' : "", "\n ").concat(config.cancelInline ? "</div>" : "", "\n </div>\n </div>");
34
+ if (config.onCancel) {
35
+ var btn = dom.querySelector(".cancel");
36
+ btn && btn.addEventListener("click", function() {
37
+ hideLoading();
38
+ config.onCancel();
39
+ });
40
+ }
41
+ dom.style.display = "block";
42
+ if (seconds > 0) window[timeoutKey] = setTimeout(function() {
43
+ hideLoading();
44
+ }, seconds * 1000);
45
+ };
46
+ /**
47
+ * 主动关闭loading提示
48
+ */ export var hideLoading = function() {
49
+ var id = "com_global_page_loading";
50
+ var loading = document.getElementById(id);
51
+ if (loading) loading.style.display = "none";
52
+ };
package/esm/param.d.ts ADDED
@@ -0,0 +1,48 @@
1
+ /**
2
+ * 从URL中获取某个参数,如果不存在返回 undefined ,如果存在多个同名参数,返回第一个匹配值
3
+ * getParam('a', '?a=1&b=&c=3&c=33#abc') // '1'
4
+ * getParam('b', '?a=1&b=&c=3&c=33#abc') // ''
5
+ * getParam('c', '?a=1&b=&c=3&c=33#abc') // 3
6
+ * getParam('d', '?a=1&b=&c=3&c=33#abc') // undefined
7
+ * @param {*} name 参数名
8
+ * @param {*} url 要获取的URL,默认当前地址
9
+ */
10
+ export declare const getParam: (name: string, url?: string) => string;
11
+ /**
12
+ * 从URL中获取int参数
13
+ * @param {*} name 参数名
14
+ * @param {*} url 要获取的URL,默认当前地址
15
+ */
16
+ export declare const getParamInt: (name: string, url?: string) => number;
17
+ /**
18
+ * 获取某个URL的全部参数
19
+ * getParams('?a=1&b=2#cc') // {a: '1', b: '2'}
20
+ * @param url
21
+ * @returns 参数对象
22
+ */
23
+ export declare const getParams: (url?: string) => any;
24
+ /**
25
+ * 给URL设置参数,如果已经存在,替换之,兼容hash存在的情况
26
+ * setParam('a', '123', '?a=1&b=2&a=3#d') // '?a=123&b=2&a=123#d'
27
+ * setParam('d', '444', '?a=1&b=2&a=3#d') // '?a=1&b=2&a=3&d=444#d'
28
+ * @param {Object} name 参数名
29
+ * @param {Object} value 参数值
30
+ * @param {Object} url 如果不传默认当前页面URL
31
+ */
32
+ export declare const setParam: (name: string, value: string | number, url?: string) => string;
33
+ /**
34
+ * 删除URL中某个参数
35
+ * delParam('a', '?a=1&b=2&a=3#d') // '?b=2#d'
36
+ * delParam('b', '?a=1&b=2&a=3#d') // '?a=1&a=3#d'
37
+ * delParam('a', '?a=1#d') // '#d'
38
+ * @param name 参数名
39
+ * @param url 要删除的URL,默认当前页面URL
40
+ * @returns 处理完后的URL
41
+ */
42
+ export declare const delParam: (name: string, url: string) => string;
43
+ /**
44
+ * 将一个普通对象转为 a=1&b=2 的URL格式,会自动过滤undefined的值
45
+ * @param data 一个普通对象,如果对象嵌对象则会被自动转为JSON
46
+ * @returns 返回类似 a=1&b=2 的字符串
47
+ */
48
+ export declare const toUrlParams: (data: any) => string;
package/esm/param.js ADDED
@@ -0,0 +1,78 @@
1
+ /**
2
+ * 从URL中获取某个参数,如果不存在返回 undefined ,如果存在多个同名参数,返回第一个匹配值
3
+ * getParam('a', '?a=1&b=&c=3&c=33#abc') // '1'
4
+ * getParam('b', '?a=1&b=&c=3&c=33#abc') // ''
5
+ * getParam('c', '?a=1&b=&c=3&c=33#abc') // 3
6
+ * getParam('d', '?a=1&b=&c=3&c=33#abc') // undefined
7
+ * @param {*} name 参数名
8
+ * @param {*} url 要获取的URL,默认当前地址
9
+ */ import _sliced_to_array from "@swc/helpers/src/_sliced_to_array.mjs";
10
+ export var getParam = function(name) {
11
+ var url = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : location.search;
12
+ return (new RegExp("(^|\\?|&)".concat(name, "=(.*?)(?=&|#|$)"), "g").exec(url) || [])[2];
13
+ };
14
+ /**
15
+ * 从URL中获取int参数
16
+ * @param {*} name 参数名
17
+ * @param {*} url 要获取的URL,默认当前地址
18
+ */ export var getParamInt = function(name) {
19
+ var url = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : location.search;
20
+ return parseInt(getParam(name, url) || "0", 10);
21
+ };
22
+ /**
23
+ * 获取某个URL的全部参数
24
+ * getParams('?a=1&b=2#cc') // {a: '1', b: '2'}
25
+ * @param url
26
+ * @returns 参数对象
27
+ */ export var getParams = function() {
28
+ var url = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : location.search;
29
+ var search = ((url || "").split("?").pop() || "").split("#")[0] || "";
30
+ var params = {};
31
+ search.split("&").map(function(item) {
32
+ return item.split("=");
33
+ }).forEach(function(param) {
34
+ var _param = _sliced_to_array(param, 2), key = _param[0], value = _param[1];
35
+ params[key] = value || "";
36
+ });
37
+ return params;
38
+ };
39
+ /**
40
+ * 给URL设置参数,如果已经存在,替换之,兼容hash存在的情况
41
+ * setParam('a', '123', '?a=1&b=2&a=3#d') // '?a=123&b=2&a=123#d'
42
+ * setParam('d', '444', '?a=1&b=2&a=3#d') // '?a=1&b=2&a=3&d=444#d'
43
+ * @param {Object} name 参数名
44
+ * @param {Object} value 参数值
45
+ * @param {Object} url 如果不传默认当前页面URL
46
+ */ export var setParam = function(name, value, url) {
47
+ url = url || "".concat(location.pathname).concat(location.search);
48
+ // 如果参数已经存在,替换之
49
+ if (getParam(name, url) !== undefined) return url.replace(new RegExp("(^|\\?|&)".concat(name, "=(.*?)(?=&|#|$)"), "g"), "$1".concat(name, "=").concat(value));
50
+ var _url_split = _sliced_to_array(url.split("#"), 2), pathname = _url_split[0], hash = _url_split[1]; // 处理存在hash的情况
51
+ return "".concat(pathname).concat(pathname.indexOf("?") < 0 ? "?" : "&").concat(name, "=").concat(value).concat(hash ? "#" : "").concat(hash || "");
52
+ };
53
+ /**
54
+ * 删除URL中某个参数
55
+ * delParam('a', '?a=1&b=2&a=3#d') // '?b=2#d'
56
+ * delParam('b', '?a=1&b=2&a=3#d') // '?a=1&a=3#d'
57
+ * delParam('a', '?a=1#d') // '#d'
58
+ * @param name 参数名
59
+ * @param url 要删除的URL,默认当前页面URL
60
+ * @returns 处理完后的URL
61
+ */ export var delParam = function(name, url) {
62
+ url = url || "".concat(location.pathname).concat(location.search);
63
+ return url.replace(new RegExp("(^|\\?|&)".concat(name, "=.*?(&|#|$)"), "g"), function(_m, $1, $2) {
64
+ return $2 === "&" ? $1 : $2;
65
+ });
66
+ };
67
+ /**
68
+ * 将一个普通对象转为 a=1&b=2 的URL格式,会自动过滤undefined的值
69
+ * @param data 一个普通对象,如果对象嵌对象则会被自动转为JSON
70
+ * @returns 返回类似 a=1&b=2 的字符串
71
+ */ export var toUrlParams = function(data) {
72
+ return Object.keys(data || {}).filter(function(key) {
73
+ return data[key] !== undefined;
74
+ }).map(function(key) {
75
+ var value = typeof data[key] === "object" ? JSON.stringify(data[key]) : data[key];
76
+ return "".concat(encodeURIComponent(key), "=").concat(encodeURIComponent(value));
77
+ }).join("&");
78
+ };
@@ -0,0 +1,46 @@
1
+ /** requestAPI的第二个参数类型 */
2
+ export interface IRequestOptions {
3
+ /** GET请求时传递的参数 */
4
+ params?: Record<string, any>;
5
+ /** POST请求时传递的参数 */
6
+ data?: Record<string, any>;
7
+ /** postJson请求时传递的参数 */
8
+ json?: Record<string, any>;
9
+ /** API前缀,不传默认为空 */
10
+ baseUrl?: string;
11
+ /** 请求方法,一般情况下会自动处理无需手动传 */
12
+ method?: string;
13
+ /** headers */
14
+ headers?: Record<string, any>;
15
+ /** 其它自定义fetchOptions */
16
+ fetchOptions?: RequestInit;
17
+ /** 请求完成之后触发的钩子,无论成功与否均会触发 */
18
+ afterRequest?: (success: boolean, resp?: any) => void;
19
+ /** 对响应进行自定义格式化处理 */
20
+ responseConverter?: (resp: any) => any;
21
+ /** 后端未返回 message 时的默认异常文案 */
22
+ errorMessage?: string;
23
+ /** 发生异常时的处理方法,一般不太建议重写此方法 */
24
+ errorHandler?: (message: string, resp?: any) => void;
25
+ /** 自定义toast实现,为了和UI解耦,方法默认不包含UI处理代码 */
26
+ toastHandler?: (message: string) => void;
27
+ /** 判断接口是否调用成功,默认规则 resp => resp.code == 0 || resp.code == 200 */
28
+ checkSuccess?: (resp: any) => boolean;
29
+ /** 是否关闭默认的异常toast */
30
+ silent?: boolean;
31
+ }
32
+ /**
33
+ * 通用的API请求方法
34
+ * @param url
35
+ * @param options
36
+ * @returns
37
+ */
38
+ export declare const request: <T>(url: string, options?: IRequestOptions) => Promise<void | T>;
39
+ interface RequestConstructor {
40
+ new (overrideDefaultOptions: IRequestOptions): typeof request;
41
+ }
42
+ /**
43
+ * 支持实例化一个新的request方法,覆盖默认的部分配置项
44
+ */
45
+ export declare const Request: RequestConstructor;
46
+ export {};
package/esm/request.js ADDED
@@ -0,0 +1,115 @@
1
+ import _async_to_generator from "@swc/helpers/src/_async_to_generator.mjs";
2
+ import _object_spread from "@swc/helpers/src/_object_spread.mjs";
3
+ import _ts_generator from "@swc/helpers/src/_ts_generator.mjs";
4
+ import { toUrlParams } from "./index";
5
+ /**
6
+ * 通用的API请求方法
7
+ * @param url
8
+ * @param options
9
+ * @returns
10
+ */ export var request = function() {
11
+ var _ref = _async_to_generator(function(url, options) {
12
+ var defaultOptions, _ref, params, data, json, method, headers, baseUrl, fetchOptions, checkSuccess, afterRequest, errorHandler, errorMessage, responseConverter, resp, e;
13
+ return _ts_generator(this, function(_state) {
14
+ switch(_state.label){
15
+ case 0:
16
+ defaultOptions = {
17
+ errorMessage: "系统繁忙,请稍后再试",
18
+ errorHandler: function(msg) {
19
+ var _options_toastHandler;
20
+ if (!(options === null || options === void 0 ? void 0 : options.silent)) options === null || options === void 0 ? void 0 : (_options_toastHandler = options.toastHandler) === null || _options_toastHandler === void 0 ? void 0 : _options_toastHandler.call(options, msg);
21
+ // 抛出异常,阻止执行之后的操作
22
+ throw new Error(msg);
23
+ },
24
+ baseUrl: "",
25
+ headers: {},
26
+ fetchOptions: {
27
+ credentials: "include"
28
+ },
29
+ checkSuccess: function(resp) {
30
+ return (resp === null || resp === void 0 ? void 0 : resp.code) == 0 || (resp === null || resp === void 0 ? void 0 : resp.code) == 200;
31
+ },
32
+ toastHandler: function(msg) {
33
+ return console.error("您还没有配置toastHandler,请根据您的UI组件库配置合适的提示方法。");
34
+ }
35
+ };
36
+ options = Object.assign({}, defaultOptions, options || {});
37
+ _ref = options || {}, params = _ref.params, data = _ref.data, json = _ref.json, method = _ref.method, headers = _ref.headers, baseUrl = _ref.baseUrl, fetchOptions = _ref.fetchOptions, checkSuccess = _ref.checkSuccess, afterRequest = _ref.afterRequest, errorHandler = _ref.errorHandler, errorMessage = _ref.errorMessage, responseConverter = _ref.responseConverter;
38
+ if (params) {
39
+ fetchOptions.method = method || "GET";
40
+ url = "".concat(url, "?").concat(toUrlParams(params));
41
+ }
42
+ if (data) Object.assign(fetchOptions, {
43
+ method: method || "POST",
44
+ body: toUrlParams(data),
45
+ headers: _object_spread({
46
+ "Content-Type": "application/x-www-form-urlencoded;charset=utf-8"
47
+ }, headers || {})
48
+ });
49
+ else if (json) Object.assign(fetchOptions, {
50
+ method: method || "POST",
51
+ body: JSON.stringify(json),
52
+ headers: _object_spread({
53
+ "Content-Type": "application/json;charset=utf-8"
54
+ }, headers || {})
55
+ });
56
+ resp = null;
57
+ _state.label = 1;
58
+ case 1:
59
+ _state.trys.push([
60
+ 1,
61
+ 3,
62
+ ,
63
+ 4
64
+ ]);
65
+ return [
66
+ 4,
67
+ fetch("".concat(baseUrl || "").concat(url), fetchOptions).then(function(resp) {
68
+ return resp.json();
69
+ })
70
+ ];
71
+ case 2:
72
+ resp = _state.sent();
73
+ return [
74
+ 3,
75
+ 4
76
+ ];
77
+ case 3:
78
+ e = _state.sent();
79
+ console.error(e);
80
+ afterRequest === null || afterRequest === void 0 ? void 0 : afterRequest(false, {
81
+ message: e === null || e === void 0 ? void 0 : e.message
82
+ });
83
+ errorHandler === null || errorHandler === void 0 ? void 0 : errorHandler(errorMessage || "");
84
+ return [
85
+ 2
86
+ ];
87
+ case 4:
88
+ resp = responseConverter ? responseConverter(resp) : resp;
89
+ if (checkSuccess === null || checkSuccess === void 0 ? void 0 : checkSuccess(resp)) {
90
+ afterRequest === null || afterRequest === void 0 ? void 0 : afterRequest(true, resp);
91
+ return [
92
+ 2,
93
+ resp.data
94
+ ];
95
+ } else {
96
+ afterRequest === null || afterRequest === void 0 ? void 0 : afterRequest(false, resp);
97
+ errorHandler === null || errorHandler === void 0 ? void 0 : errorHandler(resp.message || resp.msg || errorMessage || "", resp);
98
+ }
99
+ return [
100
+ 2
101
+ ];
102
+ }
103
+ });
104
+ });
105
+ return function request(url, options) {
106
+ return _ref.apply(this, arguments);
107
+ };
108
+ }();
109
+ /**
110
+ * 支持实例化一个新的request方法,覆盖默认的部分配置项
111
+ */ export var Request = function Request(overrideDefaultOptions) {
112
+ return function(url, options) {
113
+ return request(url, _object_spread({}, overrideDefaultOptions || {}, options || {}));
114
+ };
115
+ };
package/esm/time.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 将日期格式化成指定格式的字符串
3
+ * @param date 要格式化的日期,不传时默认当前时间,也可以是一个时间戳等
4
+ * @param fmt 目标字符串格式,支持的字符有:y,M,d,q,w,H,h,m,S,默认:yyyy-MM-dd HH:mm:ss
5
+ * @returns 返回格式化后的日期字符串
6
+ */
7
+ export declare const formatDate: (date?: Date | number | string, fmt?: string) => string;
8
+ /**
9
+ * 将字符串解析成日期
10
+ * @param str 输入的日期字符串,如'2014-09-13'
11
+ * @param fmt 字符串格式,默认'yyyy-MM-dd',支持如下:y、M、d、H、m、s、S,不支持w和q
12
+ * @returns 解析后的Date类型日期
13
+ */
14
+ export declare const parseDate: (str: string, fmt?: string) => Date;
15
+ /**
16
+ * 休息一段时间,单位毫秒
17
+ * 示例:await sleep(200); // 休息200毫秒
18
+ * @param ms 要休息的时间,单位毫秒,不传默认0
19
+ * @returns
20
+ */
21
+ export declare const sleep: (ms?: number) => Promise<unknown>;
package/esm/time.js ADDED
@@ -0,0 +1,92 @@
1
+ /**
2
+ * 将日期格式化成指定格式的字符串
3
+ * @param date 要格式化的日期,不传时默认当前时间,也可以是一个时间戳等
4
+ * @param fmt 目标字符串格式,支持的字符有:y,M,d,q,w,H,h,m,S,默认:yyyy-MM-dd HH:mm:ss
5
+ * @returns 返回格式化后的日期字符串
6
+ */ import _instanceof from "@swc/helpers/src/_instanceof.mjs";
7
+ export var formatDate = function(date, fmt) {
8
+ var _loop = function(i) {
9
+ fmt = fmt.replace(new RegExp("".concat(i, "+"), "g"), function(m) {
10
+ var val = "".concat(obj[i]);
11
+ if (i === "w") return (m.length > 2 ? "星期" : "周") + week[val];
12
+ for(var j = 0, len = val.length; j < m.length - len; j++)val = "0".concat(val);
13
+ return m.length === 1 ? val : val.substring(val.length - m.length);
14
+ });
15
+ };
16
+ if (!date) return "";
17
+ if (typeof date === "number") // 1687682453445
18
+ date = new Date(date);
19
+ else if (typeof date === "string") {
20
+ if (/^\d{12,13}$/g.test(date)) // '1687682453445'
21
+ date = new Date(parseInt(date));
22
+ else if (/^.{10}T.{8,12}Z?$/g.test(date)) // '2019-01-01T00:00:00.000Z'
23
+ date = new Date(date);
24
+ else return date;
25
+ }
26
+ if (!_instanceof(date, Date)) throw new Error("formatDate error: not date.");
27
+ if (isNaN(date === null || date === void 0 ? void 0 : date.getFullYear())) throw new Error("formatDate error: invalid date.");
28
+ fmt = fmt || "yyyy-MM-dd HH:mm:ss";
29
+ var obj = {
30
+ y: date.getFullYear(),
31
+ M: date.getMonth() + 1,
32
+ d: date.getDate(),
33
+ q: Math.floor((date.getMonth() + 3) / 3),
34
+ w: date.getDay(),
35
+ H: date.getHours(),
36
+ h: date.getHours() % 12 === 0 ? 12 : date.getHours() % 12,
37
+ m: date.getMinutes(),
38
+ s: date.getSeconds(),
39
+ S: date.getMilliseconds()
40
+ };
41
+ var week = [
42
+ "天",
43
+ "一",
44
+ "二",
45
+ "三",
46
+ "四",
47
+ "五",
48
+ "六"
49
+ ];
50
+ // eslint-disable-next-line guard-for-in
51
+ for(var i in obj)_loop(i);
52
+ return fmt;
53
+ };
54
+ /**
55
+ * 将字符串解析成日期
56
+ * @param str 输入的日期字符串,如'2014-09-13'
57
+ * @param fmt 字符串格式,默认'yyyy-MM-dd',支持如下:y、M、d、H、m、s、S,不支持w和q
58
+ * @returns 解析后的Date类型日期
59
+ */ export var parseDate = function(str, fmt) {
60
+ fmt = fmt || "yyyy-MM-dd";
61
+ var obj = {
62
+ y: 0,
63
+ M: 1,
64
+ d: 0,
65
+ H: 0,
66
+ h: 0,
67
+ m: 0,
68
+ s: 0,
69
+ S: 0
70
+ };
71
+ fmt.replace(/([^yMdHmsS]*?)(([yMdHmsS])\3*)([^yMdHmsS]*?)/g, function(m, $1, $2, $3, $4) {
72
+ str = str.replace(new RegExp("".concat($1, "(\\d{").concat($2.length, "})").concat($4)), function(_m, _$1) {
73
+ obj[$3] = parseInt(_$1);
74
+ return "";
75
+ });
76
+ return "";
77
+ });
78
+ obj.M--; // 月份是从0开始的,所以要减去1
79
+ var date = new Date(obj.y, obj.M, obj.d, obj.H, obj.m, obj.s);
80
+ if (obj.S !== 0) date.setMilliseconds(obj.S); // 如果设置了毫秒
81
+ return date;
82
+ };
83
+ /**
84
+ * 休息一段时间,单位毫秒
85
+ * 示例:await sleep(200); // 休息200毫秒
86
+ * @param ms 要休息的时间,单位毫秒,不传默认0
87
+ * @returns
88
+ */ export var sleep = function(ms) {
89
+ return new Promise(function(resolve) {
90
+ return setTimeout(resolve, ms || 0);
91
+ });
92
+ };
package/package.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "name": "youtil",
3
- "version": "1.0.13",
3
+ "version": "2.0.0",
4
4
  "description": "油梯,一个与框架、环境无关的小巧、精简、实用的JavaScript工具库",
5
5
  "files": [
6
6
  "esm",
7
- "es2017",
8
7
  "cjs",
9
8
  "dist"
10
9
  ],
@@ -13,10 +12,6 @@
13
12
  "types": "esm/index.d.ts",
14
13
  "exports": {
15
14
  ".": {
16
- "es2017": {
17
- "types": "./es2017/index.d.ts",
18
- "default": "./es2017/index.js"
19
- },
20
15
  "default": {
21
16
  "types": "./esm/index.d.ts",
22
17
  "default": "./esm/index.js"
@@ -28,10 +23,9 @@
28
23
  "dist/*"
29
24
  ],
30
25
  "scripts": {
31
- "dev": "ice-pkg start",
32
- "start": "ice-pkg start",
33
- "build": "ice-pkg build",
34
- "2prepublishOnly22": "npm run build",
26
+ "dev": "concurrently \"typedoc --watch\" \"ice-pkg start\"",
27
+ "build": "typedoc && ice-pkg build",
28
+ "prepublishOnly": "npm run build",
35
29
  "test": "jest",
36
30
  "eslint": "eslint --cache --ext .js,.jsx,.ts,.tsx ./",
37
31
  "eslint:fix": "npm run eslint -- --fix",
@@ -42,7 +36,8 @@
42
36
  "youtil"
43
37
  ],
44
38
  "dependencies": {
45
- "@swc/helpers": "0.4.14"
39
+ "@swc/helpers": "0.4.14",
40
+ "concurrently": "^9.1.2"
46
41
  },
47
42
  "devDependencies": {
48
43
  "@ice/jsx-runtime": "^0.2.0",
@@ -54,7 +49,9 @@
54
49
  "react": "^16",
55
50
  "react-dom": "^16",
56
51
  "stylelint": "^13.7.2",
57
- "ts-jest": "^29.0.5"
52
+ "ts-jest": "^29.0.5",
53
+ "typedoc": "^0.28.1",
54
+ "typedoc-plugin-markdown": "^4.6.0"
58
55
  },
59
56
  "publishConfig": {
60
57
  "access": "public"
@@ -1 +0,0 @@
1
- function r(r,t){(null==t||t>r.length)&&(t=r.length);for(var n=0,e=Array(t);n<t;n++)e[n]=r[n];return e}function t(t,n){return function(r){if(Array.isArray(r))return r}(t)||function(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}(t)||function(t,n){if(t){if("string"==typeof t)return r(t,n);var e=Object.prototype.toString.call(t).slice(8,-1);if("Object"===e&&t.constructor&&(e=t.constructor.name),"Map"===e||"Set"===e)return Array.from(e);if("Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e))return r(t,n)}}(t,n)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}export{t as _};