1.1.7 • Published 3 years ago

igu v1.1.7

Weekly downloads
-
License
ISC
Repository
-
Last release
3 years ago

函数列表

函数名称描述
isInt(num)验证是否是整数
toLowerCase(str)全部转小写
toUpperCase(str)全部转大写
isType(data,type)验证数据类型
isBasicData(data)判断数据是否为基础数据类型
getType(data)获取数据类型
initialstoLowerCase(str)设置首字母小写不改变之后的字符串
initialsCase(str)设置首字母大写不改变之后的字符串
initialsCaseLowercase(str)设置首字母大写其他全部转为小写
toLowerCamelCase(str)将字符串转为小驼峰
toCamelCase(str)将字符串转为大驼峰
isJSONStr(str)检查字符串是否为json格式
isEqual(data1,data2)判断两条数据是否相等
isBase64(str)检查是否为Base64字符串
isOdd(num)检查是否为奇数
isPicture(str)检查字符串是否为图片url
isURL(url)检查URL是否有效
dateFmt(date,fmt)时间格式化
ConvertPinyin(l1,firstBoolen)汉字转拼音
fontSize(res,maxWidth)根据分辨率不同显示不同字体大小
hexToRgb(sColor,a)将hex表示方式转换为rgb表示方式
rgbToHex(rgb)将rgb表示方式转换为hex表示方式
getUrlQuery(url)从查询字符串中获取参数
getPathParams(path,pathMap,serializer)从查询字符串中获取参数
generatePathQuery(path,obj)使用查询字符串生成路径
generatePath(path,obj)使用参数生成路径
howLongAgo(date,type)距现在多少时间前
throttl(time)节流
lazyLoad(tags,node)图片懒加载
randomNum(min,max)生成区间随机数
setIcon(url)设置页面ICON
setTitle(title)设置页面标题
cloneDeep(data)数据深拷贝
merge(data1,data2)数组/对象数据合并
each(data,iteratee)数组/对象数据遍历
new event.Scheduler(limit)并行调度器
new event.Subscribe()发布订阅
request(type: string, url: string, params: AnyObject, headers: AnyObject)axios数据请求封装
useRequest(callback: Function)数据请求前处理
useResponse(callback: Function)数据请求后处理
useConfig(config: AnyObject)数据请求基本配置处理
isExistChild(data: any[] | AnyObject)验证对象/数组是否为空数据
push(data: any[] | AnyObject, key: any, value: any)对象/数组添加数据
flatter(arr: any[])数组扁平化处理(多维数组变成一维数组)
nextRegister(...fn)手动next
currying(fn: Function, ...args: any)柯里化处理
templateParser(template: string, data: AnyObject)template 解析器
listToTree(data: any[])列表转成树形结构
treeToList(data: any[])树形结构转成列表
setIntervalsetInterval 重置优化
copyjs复制当前节点内容到粘贴板
append添加dom节点
getChildNode获取dom子节点
setTransform设置dom节点transform样式
setStyle设置dom节点样式
setClass设置dom节点class
removeClass删除dom节点class
addListener添加节点事件
removeListener删除节点事件
remove删除节点
createTextNode创建文本节点
createDom创建虚拟dom节点
setAttr设置节点attrs
getAttr获取节点attr
htmlStringToVNodeHTMLString转虚拟dom节点
isDevice判断是android还是ios还是web还是WeChat
filterTag过滤html代码(把<>转换)
numberToChinese将阿拉伯数字翻译成中文的大写数字
h5ResizeH5软键盘缩回、弹起回调
setup设置localStorage Item
removeSub删除localStorage Item
getsub获取localStorage Item
clearAll清除所有localStorage Item

示例

isInt(num)

验证是否是整数 | 参数 | 描述 | | ------------- | ------------------------------ | | num | 需要验证的数据 |

let a = 1.23123,b = 12312;
console.log(isInt(a)); // false
console.log(isInt(b)); // true

toLowerCase(str)

全部转小写 | 参数 | 描述 | | ------------- | ------------------------------ | | str | 需要转换为小写的字符串 |

let a = "ADASDASD";
console.log(toLowerCase(a)); // adasdasd

toUpperCase(str)

全部转大写 | 参数 | 描述 | | ------------- | ------------------------------ | | str | 需要转换为大写的字符串 |

let a = "ADASDASD";
console.log(toUpperCase(a)); // adasdasd

isType(data,typeStr)

判断数据类型是否为指定数据类型 | 参数 | 描述 | | ------------- | ------------------------------ | | data | 数据源 | | typeStr | 指定数据类型字符串或者数据类型数组 |

let a = "ADASDASD";
console.log(isType(a,"string")); // true
console.log(isType(a,["string",'symbol'])); // true
console.log(isType(a,['symbol'])); // false

isBasicData(data)

判断数据是否为基础数据类型 | 参数 | 描述 | | ------------- | ------------------------------ | | data | 数据源 |

let a = "ADASDASD",b = {};
console.log(isType(a)); // true
console.log(isType(b)); // false

getType(data)

获取数据类型 | 参数 | 描述 | | ------------- | ------------------------------ | | data | 数据源 |

let a = "ADASDASD";
console.log(getType(a)); // string

initialsCase(str)

设置首字母大写不改变之后的字符串 | 参数 | 描述 | | ------------- | ------------------------------ | | str | 指定字符串 |

let a = "adaSDasd";
console.log(initialsCase(a)); // AdaSDasd

initialstoLowerCase(str)

设置首字母小写不改变之后的字符串 | 参数 | 描述 | | ------------- | ------------------------------ | | str | 指定字符串 |

let a = "AdaSDasd";
console.log(initialstoLowerCase(a)); // adaSDasd

toLowerCamelCase(str)

将字符串转为小驼峰 | 参数 | 描述 | | ------------- | ------------------------------ | | str | 指定字符串 |

let a = "Ada_sDasd";
console.log(toLowerCamelCase(a)); // adaSDasd

toCamelCase(str)

将字符串转为大驼峰 | 参数 | 描述 | | ------------- | ------------------------------ | | str | 指定字符串 |

let a = "ada_s_dasd";
console.log(toCamelCase(a)); // AdaSDasd

isJSONStr(str)

检查字符串是否为json格式 | 参数 | 描述 | | ------------- | ------------------------------ | | str | 指定字符串 |

let a = "{a:1,b:2}";
console.log(isJSONStr(a)); // true

isEqual(data1,data2)

判断两条数据是否相等 | 参数 | 描述 | | ------------- | ------------------------------ | | data1 | 数据源 | | data2 | 数据源 |

let a = {a:1,b:2},b={a:1,b:2},c=1;
console.log(isEqual(a,b)); // true
console.log(isEqual(a,c)); // false

isOdd(num)

检查是否为奇数 | 参数 | 描述 | | ------------- | ------------------------------ | | num | 需要检查的数字 |

let a = 1,b=2;
console.log(isOdd(a)); // true
console.log(isOdd(b)); // false

isBase64(str)

检查是否为Base64字符串 | 参数 | 描述 | | ------------- | ------------------------------ | | str | 需要验证的字符串 |

let a = "data:image/jpg;base64,/……";
console.log(isOdd(a)); // true

isNumber(data)

判断是否为数字 | 参数 | 描述 | | ------------- | ------------------------------ | | data | 数据源 |

let a = "12312.312";
console.log(isNumber(a)); // true
let b = "12312.312a";
console.log(isNumber(b)); // false

isPicture(picture)

判断是否为图片url | 参数 | 描述 | | ------------- | ------------------------------ | | picture | 数据源 |

let a = "xxx.jpng";
console.log(isPicture(a)); // true

isURL(url)

检查URL是否有效 | 参数 | 描述 | | ------------- | ------------------------------ | | picture | 数据源 |

console.log(isURL("https://baidu.com")); // true

dateFmt(date,fmt)

时间格式化 | 参数 | 描述 | | ------------- | ------------------------------ | | date | 需要转换格式的时间数据 | | fmt | 转换的格式 YYYY/mm/dd HH:MM:SS Y+:年、m+:月、d+:日、H+:时、M+:分、S+:秒、W+:周 |

console.log(dateFmt("2021年4月19日 14:16:28","YYYY/mm/dd HH:MM:SS")); // 2021/4/19 14:16:28

ConvertPinyin(l1,firstBoolen)

汉字转拼音 | 参数 | 描述 | | ------------- | ------------------------------ | | l1 | 指定中文字符串 | | firstBoolen | 首字母是否大写 |

console.log(ConvertPinyin("张三")); // Zhangsan

fontSize(res,maxWidth)

根据分辨率不同显示不同大小 | 参数 | 描述 | | ------------- | ------------------------------ | | res | 初始大小 | | maxWidth | 最大分辨率宽 |

console.log(fontSize(12)); // 12

hexToRgb(sColor,a)

将hex表示方式转换为rgb表示方式 | 参数 | 描述 | | ------------- | ------------------------------ | | sColor | hex 色值 | | a | 转换结束的透明度,默认1 |

console.log(hexToRgb("#fff")); // rgba(255,255,255,1)

rgbToHex(rgb)

将rgb表示方式转换为hex表示方式 | 参数 | 描述 | | ------------- | ------------------------------ | | rgb | rgb 色值 |

console.log(rgbToHex("rgba(255,255,255,0.8)")); // #FFFFFFCC

getUrlQuery(url)

从查询字符串中获取参数 | 参数 | 描述 | | ------------- | ------------------------------ | | url | url 地址 |

console.log(getQueryParams("/user?name=Orkhan&age=30")); // { name: 'Orkhan', age: '30' }

getPathParams(path: string, pathMap: string, serializer: AnyObject | null | undefined = null)

从路径中获取参数 | 参数 | 描述 | | ------------- | ------------------------------ | | path | url路径符串 | | pathMap | 需要获取参数字符串 | | serializer | 序列对象 |

console.log(getPathParams("/items/2/id/8583212", "/items/:category/id/:id", {category: v => ['Car', 'Mobile', 'Home'][v],id: v => +v})); // { category: 'Home', id: 8583212 }

generatePathQuery(path: string, pathMap: string, serializer: AnyObject | null | undefined = null)

从路径中获取参数 | 参数 | 描述 | | ------------- | ------------------------------ | | path | url路径符串 | | pathMap | 需要获取参数字符串 | | serializer | 序列对象 |

console.log(generatePathQuery("/user", { name: "Orkhan", age: 30 })); // "/user?name=Orkhan&age=30"

generatePath(path: string, obj: AnyObject): string

使用参数生成路径 | 参数 | 描述 | | ------------- | ------------------------------ | | path | url路径符串 | | obj | 参数对象 |

console.log(generatePath("/app/:page/:id", { page: "products", id: 85, })); // "/app/products/85"

howLongAgo(date: Date|number|string, type: string = "cn"): string

距现在多少时间前 | 参数 | 描述 | | ------------- | ------------------------------ | | date | 时间 new Date(2021, 0, 5) | | type | 语言类型 cn|en |

console.log(howLongAgo('2021-4-19 14:2:33')); // 1 小时前

throttl(time: number = 500)

节流 | 参数 | 描述 | | ------------- | ------------------------------ | | time | 时间长度 |

let t = throttl();
t(()=>{
    console.log(111)
})
// 500毫秒之后打印111

lazyLoad(tags: string[], node: any = null)

图片懒加载 | 参数 | 描述 | | ------------- | ------------------------------ | | tags | 图片链接地址集合 | | node | 节点 |

lazyLoad(['xxx.png','xxx.png'],document.documentElement)

randomNum(min: number, max: number)

生成区间随机数 | 参数 | 描述 | | ------------- | ------------------------------ | | tags | 图片链接地址集合 | | node | 节点 |

console.log(randomNum(0,1)) // 0.234234

setIcon(url: string)

设置页面ICON | 参数 | 描述 | | ------------- | ------------------------------ | | url | 图片地址 |

setIcon("xxx.png")

setTitle(title: string)

设置页面标题 | 参数 | 描述 | | ------------- | ------------------------------ | | title | 页面标题 |

setTitle("png")

cloneDeep(data: any)merge

数据深拷贝 | 参数 | 描述 | | ------------- | ------------------------------ | | data | 数据源 |

let a = {a:1,b:{a:1}}
console.log(cloneDeep(a)) // {a:1,b:{a:1}}

merge(data1: any,data1: 2)

数组/对象数据合并 | 参数 | 描述 | | ------------- | ------------------------------ | | data1 | 数据源 | | data2 | 数据源 |

let a = {a:1,b:{a:1}},b = {a:1,b:{a:1}}
console.log(merge(a,b)) // {a:1,b:{a:1}}
let c = [1,2,3],c = [1,2,3]
console.log(merge(c,d)) // [1,2,3]

each(data: AnyObject | any[], iteratee: Function)

数组/对象数据遍历 | 参数 | 描述 | | ------------- | ------------------------------ | | data | 数据源 | | iteratee | 回调函数 (item,key/index,data) |

let a = {a:1,b:{a:1}},b = [1,2,3]
each(a,(item,key,data)=>console.log(item,key,data)) 
//  1 a  {a:1,b:{a:1}}
//  {a:1} b  {a:1,b:{a:1}}
each(b,(item,index,data)=>console.log(item,index,data)) 
//  1 0  [1,2,3]
//  2 1  [1,2,3]
//  3 2  [1,2,3]

new event.Scheduler(limit)

并行调度器 | 参数 | 描述 | | ------------- | ------------------------------ | | limit | 并行大小 |

import {event} from "igu";
const iScheduler = new event.Scheduler(2);
iScheduler.add(1000,(add)=>{
    console.log(1111);
    add('aaaa').then(res => { console.log(res)})
},).next();

new event.Subscribe()

发布订阅 | 参数 | 描述 | | ------------- | ------------------------------ |

import {event} from "igu";
const eventSubscribe = new event.Subscribe();
eventSubscribe.on("click", (...rest) => {
  console.log(rest);
});
eventSubscribe.emit("click", 1, 2, 3, 4);

eventSubscribe.once("dbClick", () => {
  console.log(123456);
});
eventSubscribe.emit("dbClick");

request(type: string, url: string, params: AnyObject, headers: AnyObject)

axios数据请求封装 | 参数 | 描述 | | ------------- | ------------------------------ | | type | 请求类型 ('put', 'post', 'get', 'delete', 'head', 'patch','formData','upload','getBlob' | | url | 请求地址 | | params | 请求条件 | | headers | 请求头 | | other | 其他请求配置 |

import request from "igu";
request.post(
	`http://192.168.238.145:8077/bq/web/region`,
	{ region: "巴青县" },
	{
		"Content-Type": "applicationx-www-form-urlencoded",
	}
).then((res) => {
	console.log(res);
});

useRequest(callback: Function)

数据请求前处理 | 参数 | 描述 | | ------------- | ------------------------------ | | callback | 回调函数必须输出 config |

import {useRequest} from "igu";
useRequest((config) => {
	console.log(config);
	return config;
});

useResponse(callback: Function)

数据请求后处理 | 参数 | 描述 | | ------------- | ------------------------------ | | callback | 回调函数必须输出 res |

import {useResponse} from "igu";
useRequest((res) => {
	return res.data||res;
});

useConfig(config: AnyObject)

数据请求基本配置处理 | 参数 | 描述 | | ------------- | ------------------------------ | | config | 配置信息 |

import {useConfig} from "igu";
useConfig({
	defaults: {
		timeout: 0,
		withCredentials: false,
	},
});

isExistChild(data: any[] | AnyObject)

验证对象/数组是否为空数据 | 参数 | 描述 | | ------------- | ------------------------------ | | data | 数组/对象数据源 |

import {isExistChild} from "igu";
console.log(isExistChild([])) // false
console.log(isExistChild({})) // false

push(data: any[] | AnyObject, key: any, value: any)

对象/数组添加数据 | 参数 | 描述 | | ------------- | ------------------------------ | | data | 数组/对象数据源 | | key | 数组: 需要添加的参数。对象:需要添加的Key | | value | 对象:需要添加的参数 |

import {push} from "igu";
let a = {},b=[]
console.log(push(a,"key1",1)) // {key1:2}
console.log(push(b,"key1")) // ['key1']

flatter(arr: any[])

数组扁平化处理(多维数组变成一维数组) | 参数 | 描述 | | ------------- | ------------------------------ | | arr | 数组数据源 |

import {flatter} from "igu";
console.log(flatter([1,[1,[2]]])) // [1,2]

nextRegister(...fn)

手动next | 参数 | 描述 | | ------------- | ------------------------------ | | fn | 需要next的函数 |

import {nextRegister} from "igu";
function a(next){ next() }
function b(next){ next() }
function c(next){console.log(111) }
nextRegister(a,b,c) // 111

currying(fn: Function, ...args: any)

手动next | 参数 | 描述 | | ------------- | ------------------------------ | | fn | 函数 |

import {currying} from "igu";
const add = (a, b, c) => a + b + c;
const a = currying(add, 1);
console.log(a(2,3))

templateParser(template: string, data: AnyObject)

template 解析器 | 参数 | 描述 | | ------------- | ------------------------------ | | template | 模板字符串 | | data | 转换数据源 |

import {templateParser} from "igu";
console.log(templateParser('{{aa}} Word',{aa:'Hallo'}))

listToTree(data: any[])

列表转成树形结构 | 参数 | 描述 | | ------------- | ------------------------------ | | data | 数据源 |

import {listToTree} from "igu";
console.log(listToTree([
    {
        id: 1,
        text: '节点1',
        parentId: 0 //这里用0表示为顶级节点
    },
    {
        id: 2,
        text: '节点1_1',
        parentId: 1 //通过这个字段来确定子父级
    }
]))
// [
//     {
//         id: 1,
//         text: '节点1',
//         parentId: 0,
//         children: [
//             {
//                 id:2,
//                 text: '节点1_1',
//                 parentId:1
//             }
//         ]
//     }
// ]

treeToList(data: any[])

树形结构转成列表 | 参数 | 描述 | | ------------- | ------------------------------ | | data | 数据源 |

import {treeToList} from "igu";
console.log(treeToList([
    {
        id: 1,
        text: '节点1',
        parentId: 0,
        children: [
            {
                id:2,
                text: '节点1_1',
                parentId:1
            }
        ]
    }
]))
// [
//     {
//         id: 1,
//         text: '节点1',
//         parentId: 0 //这里用0表示为顶级节点
//     },
//     {
//         id: 2,
//         text: '节点1_1',
//         parentId: 1 //通过这个字段来确定子父级
//     }
// ]

setInterval(fn: Function, t: number)

setInterval 重置优化 | 参数 | 描述 | | ------------- | ------------------------------ | | fn | 回调执行方法 | | t | 时间值 |

import {setInterval} from "igu";
let iTime = setInterval(()=>{
    console.log(111111)
},1000);
iTime();

copyjs(dom:Element)

copyjs 复制当前节点内容到粘贴板 | 参数 | 描述 | | ------------- | ------------------------------ | | dom | 需要复制的节点 |

import {copyjs} from "igu";
copyjs(document.body)

append(dom: AnyObject | HTMLElement | Node, child: any[] | VNode[]): HTMLElement | Node | AnyObject

向dom节点添加子节点 | 参数 | 描述 | | ------------- | ------------------------------ | | dom | 主节点 | | child | 需要添加的节点 |

import {append} from "igu";
append(document.body,{
    tag:'div',
    attrs:{
        style:'color:red',
        innerHTML:'child'
    }
})

getChildNode(dom: AnyObject | HTMLElement | Node, child?: string | string[] | null): Node[] | HTMLElement[] | any[]

获取节点下的所有子节点 | 参数 | 描述 | | ------------- | ------------------------------ | | dom | 主节点 | | child | 子节点 |

import {getChildNode} from "igu";
getChildNode(document.body)

setTransform(el: HTMLElement, value: string): void

设置dom节点transform样式 | 参数 | 描述 | | ------------- | ------------------------------ | | el | 主节点 | | value | 样式 |

import {setTransform} from "igu";
setTransform(document.body,"")

setStyle(dom: HTMLElement | Node | any, style: string | AnyObject | any): HTMLElement | Node

设置dom节点样式 | 参数 | 描述 | | ------------- | ------------------------------ | | dom | 主节点 | | style | 样式 |

import {setStyle} from "igu";
setStyle(document.body,"color:red")

setClass(dom: AnyObject, clas: string | AnyObject | string[]): HTMLElement | Node | AnyObject

设置dom节点class | 参数 | 描述 | | ------------- | ------------------------------ | | dom | 主节点 | | clas | 样式 |

import {setClass} from "igu";
setClass(document.body,{
    color:true
})

removeClass(dom: AnyObject | HTMLElement | Node | any, clas: string | AnyObject | string[]): HTMLElement | Node | AnyObject

删除dom节点class | 参数 | 描述 | | ------------- | ------------------------------ | | dom | 主节点 | | clas | 样式 |

import {removeClass} from "igu";
removeClass(document.body,{
    color:false
})

addListener(target: any, type: string, callback: Function, options?: { passive?: boolean; capture?: boolean; }): void

添加节点事件 | 参数 | 描述 | | ------------- | ------------------------------ | | target | 节点 | | type | 事件类型 | | callback | 执行函数 | | options | 参数 |

import {addListener} from "igu";
addListener(document.body,'click',()=>{console.log('yes')})

removeListener(target: any, type: string, callback: Function, options?: { passive?: boolean; capture?: boolean; }): void

删除节点事件 | 参数 | 描述 | | ------------- | ------------------------------ | | target | 节点 | | type | 事件类型 | | callback | 执行函数 | | options | 参数 |

import {removeListener} from "igu";
removeListener(document.body,'click',()=>{console.log('yes')})

remove(node: HTMLElement): void

删除节点 | 参数 | 描述 | | ------------- | ------------------------------ | | node | 节点 |

import {remove} from "igu";
remove(document.body)

createTextNode(text: string): Text

创建文本节点 | 参数 | 描述 | | ------------- | ------------------------------ | | node | 节点 |

import {createTextNode} from "igu";
createTextNode('document.body')

createDom(vnode: VNode | any, container?: AnyObject | HTMLElement | Node): HTMLElement | Node

创建虚拟dom节点 | 参数 | 描述 | | ------------- | ------------------------------ | | vnode | 节点 | | container | 添加到父节点 |

import {createDom} from "igu";
createDom({
    tag:'div',
    attrs:{
        style:{
            color:'red',
            border:'1px solid #333'
        },
        innerHTML:'createDom document.body'
    }
},document.body)

setAttr(node: HTMLElement, attrs?: AnyObject): void

设置节点attrs | 参数 | 描述 | | ------------- | ------------------------------ | | node | 节点 | | attrs | attrs |

import {setAttr} from "igu";
setAttr(document.body,{
    style:{
        color:'red',
        border:'1px solid #333'
    },
    innerHTML:'createDom document.body'
})

getAttr(node: HTMLElement, attrName: string[] | string | any): any

获取节点attr | 参数 | 描述 | | ------------- | ------------------------------ | | node | 节点 | | attrName | attrs名称 |

import {getAttr} from "igu";
getAttr(document.body,['style','innerHTML'])

htmlStringToVNode(html: string | any): VNode

HTMLString转虚拟dom节点 | 参数 | 描述 | | ------------- | ------------------------------ | | html | HTML片段 |

import {htmlStringToVNode} from "igu";
htmlStringToVNode('<div class="test">test</div>')

isDevice(): string

判断是android还是ios还是web还是WeChat

import {isDevice} from "igu";
isDevice()

filterTag(str: string): string

过滤html代码(把<>转换) | 参数 | 描述 | | ------------- | ------------------------------ | | html | HTML片段 |

import {filterTag} from "igu";
filterTag('<div class="test">test</div>')

numberToChinese(num: number): string

将阿拉伯数字翻译成中文的大写数字 | 参数 | 描述 | | ------------- | ------------------------------ | | html | HTML片段 |

import {numberToChinese} from "igu";
numberToChinese(123456)

h5Resize(downCallback?: Function, upCallback?: Function): void

H5软键盘缩回、弹起回调 | 参数 | 描述 | | ------------- | ------------------------------ | | downCallback | 键盘缩回 | | upCallback | 弹起回调 |

import {h5Resize} from "igu";
h5Resize()

setup(name: string, params: any, expires?: string | number): any

设置localStorage Item | 参数 | 描述 | | ------------- | ------------------------------ | | name | 存储的名称 | | params | 存储的内容 | | expires | 存储的时间,不填默认永久 |

import {setup} from "igu";
setup('token','setupsetupsetupsetup',1000)

removeSub(name: string | string[]): any

删除localStorage Item | 参数 | 描述 | | ------------- | ------------------------------ | | name | 存储的名称 |

import {removeSub} from "igu";
removeSub('token')

getsub(name: string | string[]): any

获取localStorage Item | 参数 | 描述 | | ------------- | ------------------------------ | | name | 存储的名称 |

import {getsub} from "igu";
getsub('token')

clearAll(): any

清除所有localStorage Item

import {clearAll} from "igu";
clearAll()
1.1.7

3 years ago

1.1.6

3 years ago

1.1.5

3 years ago

1.1.4

3 years ago

1.1.3

3 years ago

1.1.2

3 years ago

1.1.1

3 years ago

1.1.0

3 years ago

1.0.9

3 years ago

1.0.8

3 years ago

1.0.7

3 years ago

1.0.6

3 years ago

1.0.5

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago

1.0.3

3 years ago

1.0.0

3 years ago