# amos-tool

  by ilex.h

docs: [docs](https://unpkg.com/amos-tool@latest/docs/index.html)

## useage

npm install --save amos-tool

## keywords

* amos ui
* amos tool

## infos

[![install size](https://packagephobia.now.sh/badge?p=amos-tool)](https://packagephobia.now.sh/result?p=amos-tool)

## api

|name|link|description|
|------|------|------|
|Base64|[Base64](#base64)|`base64加密解密`|
|MD5|[MD5](#md5)|`md5加密解密`|
|DES|[DES](#des)|`des加密解密`|
|Browser|[Browser](#browser)|`获取浏览器类型`|
|deepCopy|[deepCopy](#deepCopy)|`深度复制`|
|deepEqual|[deepEqual](#deepEqual)|`深度比较(stringify方式)`|
|fastDeepEqual|[fastDeepEqual](#fastDeepEqual)|`深度比较(循环)`|
|parseText|[parseText](#parseText)|`替换或者补全url`|
|List|[List](#list)|`List集合`|
|Queue|[Queue](#queue)|`队列`|
|UUID|[UUID](#uuid)|`uuid`|
|browserSupport|[browserSupport](#browserSupport)|`浏览器支持`|
|Log|[Log](#log)|`定制化的log日志`|
|Store|[Store](#store)|`数据处理,主要是localStorage、session、cookie`|
|LocationParam|[LocationParam](#locationParam)|`location 工具`|
|array2tree|[array2tree](#array2tree)|`将array转化为tree数据`|
|tableFilter|[tableFilter](#tableFilter)|`表格数据过滤`|
|pwdPolicy|[pwdPolicy](#pwdPolicy)|`密码生成器`|
|omit|[omit](#omit)|`omit操作,删除object中的键`|
|pick|[pick](#pick)|`pick操作,获取object指定key组成的新对象`|
|utils|[utils](#utils)|`常用工具`|
|xss|[utils](#xss)|`xss 工具及`|
|strUtils|[strUtils](#strUtils)|`string常用工具`|
|other|[other](#other)|`其它工具集`|

### base64

```js
import { Base64 } from 'amos-tool';
// or import Base64 from 'amos-tool/lib/encrypt/_base64';

var b64 = new Base64();

  b64.encode(input);
  b64.decode(input);
```

### md5

```js
import { MD5 } from 'amos-tool';
// or import MD5 from 'amos-tool/lib/encrypt/_md5';

var result = MD5('value'); // 2063c1608d6e0baf80249c42e2be5804
var result = MD5('value', 'key'); // 01433efd5f16327ea4b31144572c67f6
var result = MD5('value', null, true); // 'c\xc1`\x8dn\x0b\xaf\x80$\x9cB\xe2\xbeX\x04'
var result = MD5('value', 'key', true); // '\x01C>\xfd_\x162~\xa4\xb3\x11DW,g\xf6'
```

### des

> 注意，加密解密时，第一个 `秘钥` 不能为空

```js
DES.DesCore.encode(data, firstKey, secondKey, thirdKey)
DES.DesCore.decode(data, firstKey, secondKey, thirdKey)

DES.encode(data, secretKey);
DES.decode(data, secretKey);
```

* example

```js
import { DES } from 'amos-tool';
// or import DES from 'amos-tool/lib/encrypt/des';

const desCore = DES.DesCore;

desCore.encode('123456', 'a'); // 484FD6D18A5501370873DB5F557A23F9
desCore.encode('123456', 'a', 'b'); // 953AFFF48E49E4B94D8B74AABB6905E5
desCore.encode('123456', 'a', 'b', 'c'); // 7C49B05CCBCBEECC5665732A177E624B

desCore.decode('484FD6D18A5501370873DB5F557A23F9', 'a'); // 123456
desCore.decode('953AFFF48E49E4B94D8B74AABB6905E5', 'a', 'b'); // 123456
desCore.decode('7C49B05CCBCBEECC5665732A177E624B', 'a', 'b', 'c'); // 123456


DES.encode('123456', 'a'); // 484FD6D18A5501370873DB5F557A23F9
DES.encode('123456', 'a,b'); // 953AFFF48E49E4B94D8B74AABB6905E5
DES.encode('123456', 'a,b,c'); // 7C49B05CCBCBEECC5665732A177E624B

DES.decode('484FD6D18A5501370873DB5F557A23F9', 'a'); // 123456
DES.decode('953AFFF48E49E4B94D8B74AABB6905E5', 'a,b'); // 123456
DES.decode('7C49B05CCBCBEECC5665732A177E624B', 'a,b,c'); // 123456
```

> 注意：

secretKey 'a,b,c' 与 `a, b,c` 不同，识别空格。 支持3个秘钥，采用 `,` 分割

同时，`DES.DesCore` 第一个 key 值不可以为 空（'', undefined, null）

### browser

```js
  Browser.isFirefox();
  Browser.isIE();
  Browser.isEdge();
  Browser.isChrome();
  Browser.isSafari();
```

### deepCopy

```js
import { deepCopy } from 'amos-tool';

deepCopy(source);

import deepCopy, { eq } from 'amos-tool/lib/_deepCopy';

eq(value, other)
```

### deepEqual

```js
deepEqual(valA, valB);
```

### fastDeepEqual

```js
fastDeepEqual(valA, valB);
```

### parseText

```js

/**
 * 解析数据
 * @param {string} text
 * @param {object} dataObj
 * @param {string|RegExp} regexps 可选
 * @doc parseText('a/{b}/{c}/d',{a: 1, b:2}) 返回: 'a/1/2/d'
 * @doc parseText('a/b?name={name}&pwd={pwd}',{name: 'ilex', pwd:122}) 返回: 'a/b?name=ilex&pwd=123'
 */
parseText(text, dataObj, regexps);
```

### list
```js
  List props:

    ArrayList: var arrlist = new List.ArrayList();
    parse2string: List.parse2string(obj)
    parse2object: List.parse2object(str)
    simpleEqual: List.simpleEqual(objA, objB)
    isObject: List.isObject(obj)

  // ArrayList
  var arrlist = new List.ArrayList();

  arrlist.size(); // get size of list
  arrlist.values();// all values
  arrlist.isEmpty();// check empty
  arrlist.iterator(callBack);// iterator
  arrlist.get(index);// 取得指定下标的值
  arrlist.add(value); // add item
  arrlist.addAll(value);// add all item, value is a arrayList
  arrlist.set(index, value);// 设置值
  arrlist.remove(value);// remove item
  arrlist.removeAt(index); //  //remove item by index
  arrlist.indexOf(value); // get item index from list
  arrlist.clear(); // clear list
  arrlist.insert(index, value); // insert item in index place
  arrlist.updateValue(key, value); // use value[key] check equal
```

### queue
```js
  var q = new Queue;
  q.push(obj) // 入队
  q.pop();// 出队
  q.head();// 返回队列中头部(即最新添加的)的动态对象
  q.tail();// 返回队列中尾部(即最早添加的)的动态对象
  q.length();// 返回数据队列长度
  q.empty(); // 队列是否为空
  q.clear(); // 清空
```

### uuid

```js
  uuid(len, radix); // radix must be <= 62 , uuid(8, 2)
  uuidFast();
  uuidCompact();
  timeUUID(prefix = 'amos-timeuuid');
  longTimeUUID(prefix = 'longtime');
  otherUUID(tpl = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'); // 同 uuidCompact，无 '-'
```

### browserSupport

* apis

```js
  simpleuse:
    defaultConfig: ['firefox/51.0', 'chrome/56']
    browserSupport();
    browserSupport('firefox/51.0');
    browserSupport(['firefox/51.0', 'chrome/56']);
  withMatchs:
    muitlConfig: ['firefox/', 'chrome/'];
    browserSupport(null, {
      'firefox/': {limit: consts.GREATER_EQUAL, version: 51},
      'chrome/': {limit: consts.GREATER_EQUAL, version: 56}
    });

    browserSupport('firefox/', {limit: consts.GREATER_EQUAL, version: 51});

    browserSupport(['firefox/', 'chrome/'], {
      'firefox/': {limit: consts.GREATER_EQUAL, version: 51},
      'chrome/': {limit: consts.GREATER_EQUAL, version: 56}
    });

  consts:
    GREATER: 1, // 大于
    EQUAL: 2, // 等于
    LESS: 3, // 小于
    GREATER_EQUAL: 4, // 大于等于
    LESS_EQUAL: 5 // 小于等于
```

* demo

```js
// 基本使用
const result = browserSupport();

const paramsList = ['firefox/', 'chrome/', 'ie'];
const limit = {
  'firefox/': { limit: consts.GREATER_EQUAL, version: 50 },
  'chrome/': { limit: consts.GREATER_EQUAL, version: 55 },
  'ie': { limit: consts.GREATER_EQUAL, version: 6 }
};

// 自定义使用 （注意适配ie时 写法）
const result2 = browserSupport(paramsList, limit);
```

### log

```js

  window.LogConfig
  window.LogConfig.isDebug

  Log.trace()
  Log.debug()
  Log.info()
  Log.warn()
  Log.error()
  Log.fatal()

  // 展示 pkg 信息，不受 LogConfig 配置影响
  Log.pkgInfo(name, version)

```

### store

```js
`default function list`
  // 所有的cookie数据，均采用 escape/unescape 进行转码、解码
  encrypt(str) // 加密
  decrypt(str) // 解密
  setCookieByDays(name, value, days)
  getAllCookies() // 获取所有的cookie，同时每个key对应的value，均执行了 JSON.parse(value)
  setCookieByHour(name, value, hour)
  getCookieByName(name)
  removeCookieByName(name)
  clearAllCookie()

`localStorage`

  const ls = Store.lsTool;

    ls.read(key)
    ls.write(key, data)
    ls.each(fn)
    ls.remove(key)
    ls.clearAll()

  `sessionStorage`

    const session = Store.session;

    session.read(key)
    session.write(key, data)
    session.each(fn)
    session.remove(key)
    session.clearAll()

```

### locationParam

```js
  parse(paramString):
    `if paramString is undefined, paramString=window.location.search`
    `return all params Key Pair object`

  paramSearch(name, target):
    `if target is undefined, default window.location.search`
    `and if name is undefined too `
    `return keyValueObjec; else if name not empty return value;`

  getLocationParams():
    `get all locationParams, and return a key-value object`

  getLocationParamByName(name):
    `get param value by name, and return value or null`

  getParameter(url, name):
    `get target url Parameter by name, and return value or '' `
  extractParam(url, name): `解析指定 url 中的参数，返回指定 name 的参数`
  extractParams(url): `解析指定 url 中的参数，参数对象，如果 url 为undefined，则默认采用 window.location.href`

  `LocationSearch` LocationParam.LocationSearch
    `other search tool`
    private: _keyValuePairs
    public:
      init():
        `init this tool,set private property _keyValuePairs and return a LocationSearch`
      getValue(key):
        `return target value`
      getParameters():
        `return all param value`
```

### array2tree

```js

import { array2tree } from 'amos-tool';

const data = [{
  value: 'a',
  children: [{
    value: 'b',
    children: [{
      value: 'c'
    }, {
      value: 'd',
    }]
  }],
}];
const values = ['a', 'b', 'c'];
const result = array2tree(
  data, (item, level) => item.value === values[level]
);

console.log(result);
// [
//   { value: 'a', children: [...] },
//   { value: 'b', children: [...] },
//   { value: 'c', children: [...] }
// ]

```

### tableFilter

```js
  getChildrenlength(children)

  flatToHierarchy(arr)

  filterParentPosition(arr)

  isInclude(smallArray, bigArray)
 /**
  * 过滤数据
  *
  * @param {Array} vals 数据集合
  * @param {any} treeData tree数据
  * @returns
  */
  filterAllCheckedData(vals, treeData)

  /**
   * 递归
   *
   * @param {any} children
   * @param {any} cb
   */
  recursive(children, cb)
```

### pwdPolicy

```js

  /**
  * 普通密码生成策略
  * @param {string} password
  * @return {object} { password, secretKey }
  */
  normalPolicy(password)

  /**
  * 普通密码生成策略
  * @param {string} password 密码
  * @param {string} secretKey 秘钥
  * @return {object} { password, secretKey }
  */
  advancePolicy(password, secretKey)

  /**
   * 采用MD5生成密码 （不可逆）
   * @param {string} password
   * @param {string} secretKey
   */
  useMd5Policy(password, secretKey)
```

### omit

```js
  const ilex = {name: 'ilex', age: 18};
  const copy = omit(ilex, ['']); // {name: 'ilex', age: 18};

  const copy = omit(ilex, ['age']); // {name: 'ilex'}
  const copy = omit(ilex, ['name', 'age']); // {}

```

### pick

```js
  const ilex = {name: 'ilex', age: 18};
  const copy = pick(ilex, ['']); // {};

  const copy = pick(ilex, ['age']); // {age: 18}
  const copy = pick(ilex, ['name', 'age']); // {name: 'ilex', age: 18}

```

### utils

```js
  isString(obj);
  // Is a given value an array?
  // Delegates to ECMA5's native Array.isArray
  `If you want to judge object and judge array, you need to judge array first`
  isArray(obj);
  // Is a given variable an object?
  isObject(obj);
  // Is a given array, string, or object empty?
  // An "empty" object has no enumerable own-properties.
  isEmpty(objOrArray);
  // Is a given value equal to null?
  isNull(obj);
  // Is a given variable undefined?
  isUndefined(obj);
  // Is json
  isJson(obj);
  // is image src，支持的格式（jpe?g|png|gif|bmp|ico|tga） 及其 base64 格式
  isImageSrc(url);
  /**
   * 将数字部分内容转化为 *
   * @param {Number} number 目标 Number
   * @param {Number} start 起始位置
   * @param {Number} len 转换位数
   * @param {String} sign 替换的字符
   */
  encodeNumber(number, start = 3, len = 4, sign = '*');
  /**
    * some
    * some 为数组中的每一个元素执行一次 callback 函数，直到找到一个使得 callback 返回一个“真值”
    * @param {Array} arr
    * @param {function} fun
    */
  some(arr, fun /*, thisArg */ );
  //
  every(arr, callbackfn, thisArg);
  //
  reduce(arr, callback /*, initialValue*/);

  mergeAll(targetAndSources, overwrite);

  merge(target, source, overwrite);

  clone(source);
```

### xss

```js
import htmlEncode from 'amos-tool/lib/xss/htmlEncode';
import implementEncode from 'amos-tool/lib/xss/implementEncode';

htmlEncode('<'); // &lt
htmlEncode('>'); // &gt
htmlEncode('\''); // &#39;
htmlEncode('\"'); // &quot;
...

implementEncode('<script language=text/javascript>alert(document.cookie);</script>');
implementEncode('</script>');
implementEncode(' eval(abc);');
implementEncode('<img src="" onerror="alert(document.cookie);"></img>');
...
```

### strUtils

```js
  toCapitalStr(obj);
  // 驼峰化, 仅支持首字母大写、或者采用中杠连接的两个字母首字母大写
  // 如果要支持其它输入，将正则改为： /(-|(\s+)|_)(\w)/g
  camelCase(obj);
  // 将中缸连接的字符串 驼峰化
  transCamel(obj);
  // 字符串首字母大写
  capFirst(objOrArray);
  // 获取字符串的hashCode码
  hashCode(obj);
  // 进制与单位处理
  dealScaleAndUnit(obj);
```

### DB

```js
import { StorageDB, RayDB } from 'amos-tool';

// 使用 RayDB
const rdb = new RayDB('my-data');

rdb.setItem('key', 'value', successCb);
rdb.setItem('key', 'value').then(() => {}).catch(err => console.log(err));

rdb.getItem('key', (err, value) => {});
rdb.getItem('key').then(v => {}).catch(err => console.log(err));

// 使用 StorageDB, storeName 即为 key 值
const st = new StorageDB({ name: 'db-name', storeName: 'my-table' });

st.init(() => {
  // 此处可以使用 st.get 获取初始数据
});

// 设置
st.set(value, evt => {

});

// 获取
st.get((value) => {
  //
});
```

### other

* cookie:

* isNode
  isNode();

* objectAssign:

      objectAssign(target, source);

* parseJson:

    parseJson(data)

* stringify:

    stringify(json)

* supportWs:

    supportWs()

* trim:

    trim(str)

* arrayFilter:

* merged:

    merged(args): combine object property

* objectPath

    @see [doc/objectPath.md](doc/objectPath.md)

* random

    random(len)
    random.randomInt(min, max)

#### extra

* pathToTree

```js
import pathToTree from 'amos-tool/lib/extra/pathToTree';

const arr = [
  'main/lib',
  'console/tt/design1',
  'console/mm/vizlib'
];

const mapper = {
  main: 'RootView',
  console: 'ConsoleView'
};

var result1 = pathToTree(arr, {
  pathKey: 'path',
  childrenKey: 'childRoutes',
  processor(item, wantedNode){
    if (mapper[wantedNode]){
      item.component = mapper[wantedNode];
    }
  }
});
```

#### dom

* canvas2img

> saveAsImage(canvas/*canvasElement*/, width, height, type)
> saveAsPNG(canvas, width, height)
> saveAsGIF(canvas, width, height)
> saveAsBMP(canvas, width, height)
> convert2Image(canvas, width, height, type)
> convert2data(canvas, type, width, height)
> convert2Blob

```js
/**
  * @param {Canvas} canvas
  * @param {function} fn (blob) => {}
  * @param {Object} options {
  *  type: '', // 图片类型 默认 'image/png',其它类型详见MIME手册
  *  width: number, // 宽
  *  height: number, // 高
  *  encoderOptions: 0-1 // 图片质量
  * }
  */
convert2Blob(canvas, fn, options)
```

> convert2PNG(canvas, width, height)
> convert2JPEG(canvas, width, height)
> convert2GIF(canvas, width, height)
> convert2BMP(canvas, width, height)

## changelog

* v1.6.13
  `*` fix color Log

* v1.6.3
  `*` fix Log

* v1.6.1
  `*` fix saver

* v1.4.1
  `*` add `pathToRoutes`

* v1.4.0
  `*` add `pathToTree` to calc react router path

* v1.3.21
  `*` modify colorUtil

* v1.3.19
  `*` modify colorUtil
  `*` modify `utils#getFileExtension`
  `*` modify `index.d.ts`

* v1.3.14
  `*` modify cookie encode method
  `+` browser/indexDB
* v1.3.13
  `+` htmlEncode
  `+` implementEncode
