npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@ztwx/utils

v1.13.1

Published

browser form validation

Downloads

77

Readme

URL

Usage

import {
  encodeQuery,
  decodeQuery,
  parseUrl,
  additionurl
} from "@ztwx/utils";
  • encodeQuery (obj:QueryType)
  • decodeQuery (url:string)
  • parseUrl
parseUrl=(url:string)=>{
  pureUrl:string;
  tag: string;
  query:QueryType;
}
  • additionUrl : (url:string, params?: QueryType)=> string;

concatenate url and parameters

Subject

简单的订阅

Usage

import {Subject} from "@ztwx/utils";
const s=Subject();
// 订阅
const order=s.subscribe(action=>console.log(action))
// 分发 
s.next(action);
//取消订阅
order.unsubscribe();

Queue

简单的队列等待

OneRun

同一时间节点,无论调用多少次,若执行方法未完成,则该方法的调用不会超过一次。

| method | type | desc | | -------- | ------------------------------------- | ---------------------- | | run | <T>(fn:()=>Promise<T>):Promise<T> | 同代码时间,执行一次 |

Example:

import {OneRun} from "@ztwx/utills";
const oneRun =new OneRun();

const run=async()=>{
  console.log("start run.");
  await oneRun.run(()=>new Promise((resolve)=>{
    console.log("run!");
    setTimeout(resolve,1000);
  }))
  console.log("end run.");
}
run();
run();
/**
 * print result:
 * start run
 * start run
 * run!
 * end run
 * end run
 */

QueueRun <T,R>

指定方法,在完成(end)后执行

| method | type | desc | | ------------------- | ------------------------------------------ | ------------------------ | | end | (r:T):void | 完成 | | err | (e:R):void | 错误 | | awaitPromise | ():Promise<T,R> | 等待完成(promise) | | awaitRun | (cb:(r:T)=>void,err?:(e:R)=>void):void | 等待完成 (callback) | | awaitUntilSuccess | ():Promise<T> | 等待直到成功 | | refresh | ():void | 刷新状态,清除等待队列 |

Example:

import {QueueRun} from "@ztwx/utils";
const queueRun=new QueueRun();

const run=async()=> {
  await queueRun.awaitPromise();
  console.log("task end!");
}

run();
run();
console.log("start~");
queueRun.end("success");
run();
/**
 * print result:
 * 
 * start~
 * task end!
 * task end!
 * task end!
 * 
 */

Except

错误类

| 类 | desc | | --------------------------------- | ----------------- | | VoyoError | 基础错误 | | NetWorkError(extends VoyoError) | 网络错误 | | TimeoutError(extends VoyoError) | 超时错误 | | ReqError(extends VoyoError) | request响应错误 | | EmptyError(extends VoyoError) | 空白错误 |

UniqueId

生成client唯一id.

Usage

import {getUniqueId} from "@ztwx/utils";

console.log(getUniqueId());
console.log(getUniqueId());
console.log(getUniqueId());

Object

| 工具函数 | type | desc | | ------------------- | ---------------------------------------------- | ------------------------------------------ | | isObject | (i:unknown):boolean | 是否为字典对象 | | getObjectFromList | (obj, keys:key[])=>Partial<obj> | 从指定数组里刷选出新对象 | | filterNullObj | (obj)=>Partial<obj> | 去除值为null或undefined的部分 | | filterEmptyObj | (obj)=>Partial<obj> | 去除值为null或undefined或""的部分 | | floatSimplify | (float:number,decimalCount:number)=>number | 浮点类数字,约束小数点(decimalCount)位 |

Usage

import {isObject} from "@ztwx/utils";

MD5

| method| type| |--- |--- | |strToMd5 | (content:string):string|

Usage

import {strToMd5} from "@ztwx/utils/lib/data/md5"

console.log(strToMd5("xxxx")); //获得md5 hash值

Web Env

web环境获取

| 工具常量 | desc | | ----------- | ---------------- | | isMobile | 是否为移动环境 | | isAndroid | 是否为安卓 | | isIOS | 是否为ios | | isWechat | 是否为微信 | | isAlipay | 是否为支付宝 |

Usage

import {isIOS} from "@ztwx/utils";
console.log(isIOS);

Web Compress Image

web图片压缩

| Method | type | desc | | ---------------------------------- | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | | FileCompress.compress | | 压缩图片,返回随机图片名和DataUrl,qualityresolution取0至1,不指定时会按默认算法自动调整 | | dataURLtoArrayBuffer | (dataUrl):Uint8Array | 转换dataUrl为ArrayBuffer | | dataURLtoBlob | (dataUrl):Promise<Blob> | 转换dataUrl为blob | | compressDataUrl | (dataUrl):Promise<dataUrl> | 压缩dataUrl |

Example

import {FileCompress ,dataURLtoArrayBuffer,dataURLtoBlob} from "@ztwx/utils";
const fileCompress=new FileCompress();

fileCompress.compressImgFromFile(file).then(async([filename,dataUrl])=>{
  console.log(dataUrl); //此处得到图片压缩后的dataUrl.
  
  const uinty8Arr=dataURLtoArrayBuffer(dataUrl); //如果需要arrayBuffer.
  
  const blob=await dataURLtoBlob(dataURLtoArrayBuffer); //如果需要blob.
})

fileCompress.compress(CompressOpts);

CompressOpts

|key|type|desc| |---|---|---| |file|File|图片文件| |md5?|boolean|是否返回图片md5| |turnLargePngKB?|number|转换大于设置值的png图片为jpg. 为空时不处理| |ignoreMimeType?|string[]|对指定mimeType不进行转换| |resultType?|blob dataUrl|指定返回的压缩图片数据形式,默认为blob| |qualityPercent?|number|图片品质压缩比例(0-1),为空时,自动计算该值| |resolutionPercent?|number|图片分辨率压缩比例(0-1),为空时,自动计算该值|

Example

import {fileCompress} from "@ztwx/utils";
fileCompress.compress({
  file: ImgFile,
  md5: true //返回图片压缩后的md5值 ,
  
}).then(result=>{})

Web Utils

|Method| type | desc| | ---|---| ---| |copy|(content:str):void| 复制字符串到剪贴板| |getScrollParent|(node:HTMLElement):HTMLElement |获得父级滚动体| |checkAndSetOffsetNode|(node:HTMLElement):void| 如果node不为offsetNode,则赋值styleposition:relative| |getScrollDistanceFromNode|(target:HTMLElement,parent?:HTMLElement):number|获得targetNode top距目标offsetParent top的距离| |VisibleScroll|implements BaseIntersection|根据scroll管理dom visible| |VisibleIntersection|implements BaseIntersection|根据intersection管理dom visible| |createScrollIntersection|():BaseIntersection|如果不支持intersection则返回VisibleScroll| |loadJs|(urlAddress:string,id:string,remove?:boolean):Promise<void>|根据url加载js| |loadCss|(urlAddress:string,id:string):Promise<void>| 根据url加载css|

Usage

import {
  copy,
  getScrollParent,
  checkAndSetOffsetNode,
  getScrollDistanceFromNode,
  VisibleScroll,
  VisibleIntersection,
  createScrollIntersection
} from "@ztwx/utils/lib/web";

import {
  loadJs,
  loadCss
} from "@ztwx/utils/lib/load/loadJs";

TaskScheduler

任务调度器工具

每一次程序运行,进行一次任务遍历

API

TaskRule任务规则

| key| type|desc| |---|---|---| |id|string|任务id| |index|number|执行顺序order| |local?|boolean|是否保存本地| |localExpires?|number(seconds)|保存本地时,过期时间。为0或不设置时,local默认不过期|

TaskScheduler 将会按照定义的index顺序,按序执行已推入方法的任务

推入任务方法: taskScheduler.registryTaskRun(opts) 若index:2执行完后,再推入index:0的任务方法,则index:0的任务会后执行。

local为true时,该任务执行成功后将存入本地,未过期前,以后的任务遍历将不再检查该任务。

local不为true, 该任务在每次任务遍历开启后,都会检查该任务。

Method

| method| type| desc| |---|---|---| |constructor|(key:string,manager:StorageInterface):TaskScheduler| TaskScheduler的构造方法,传入自定义key值,和storage管理工具| |initTasksRule|(rules:TaskRule[]):void|初始化定义任务集| |registryTaskRun|(p:{id:string,run:({executeCount,lastExecuteTime}):Promise<void>}):void|注册任务方法,注意run一定返回Promise,代表该方法结束| |pauseCheck|():void|中断任务检查一条任务检查完后会自动进行下一条的检查,该方法可以中断此行为| |restoreCheck|():void|被中断后,必须先调用restoreCheck,才能继续check|

Usage

import {TaskScheduler} from "@ztwx/utils/lib/taskScheduler"
const taskScheduler=new TaskScheduler("task-storage-key",storageManger);
//注册任务
taskScheduler.initTasksRule([
  // TaskRule
  {
    id:"open-dialog1",
    index:0,
  },
  {
    id:"newbie-guide",
    index:2,
    local: true  //新手引导,每个本地只会执行一次
  },
  {
    id:"user-remind",
    index:3,
    local: true,
    localExpires: 60*60*24*12 //用户提醒,每12天执行一次
  }
]);

taskScheduler.registryTaskRun({
  id:"open-dialog1",
  run: ()=>openDialog('dialog content1').then(()=>{...})
})

taskScheduler.registryTaskRun({
  id:"newbie-guide",
  run: async()=>{
    // start 
    await startNewBieGuide();
    //end
  }
});

taskScheduler.registryTaskRun({
  id:"user-remind",
  /**
   * 
   * @param executeCount 已执行次数
   * @param lastExecuteTime 最后一次执行时间(seconds)
   * @returns {Promise<void>}
   */
  run: async({executeCount,lastExecuteTime})=>{
    //toDo...
  }
});

taskScheduler.check(); //开始检查任务

Complex Example 更复杂的案例:

import {TaskScheduler} from "@ztwx/utils/lib/taskScheduler"
const taskScheduler=new TaskScheduler("task-storage-key",storageManger);
taskScheduler.initTasksRule([
  {
    id:"a",
    index:0,
  },
  {
    id:"c",
    index:1,
    local: true,
  }
]);

class IndexPage{
  created(){
    taskScheduler.registryTaskRun({
      id:"a",
      run: async()=>{
        taskScheduler.pauseCheck();
        //离开当前页前,暂停任务检测
        //保证任务检测只会在index Page内执行。
        routeSkip("/xxx/otherPage");
      }
    });
    taskScheduler.registryTaskRun({
      id:"b",
      run:async()=>{...}
    })
  }
  onPageShow(){
    //当前页显示时,恢复检查
    taskScheduler.restoreCheck();
    //因任务未开始,或被中断,所以此处需手动调用开启任务检查
    taskScheduler.check();
  }
  onPageHide(){
    //其他原因当前页被隐藏时,暂停任务检测
    taskScheduler.pauseCheck();
  }
}
import {StorageInterface} from "@ztwx/utils/lib/taskScheduler"
//web
export class WebStorage implements StorageInterface{
  saveVal(key:string,val:Record<string, any>){
    localStorage[key]=JSON.stringify(val);
  }
  getVal(key:string){
    return localStorage[key]?JSON.parse(localStorage[key]): undefined;
  }
}