1.9.11 • Published 11 days ago

tools2 v1.9.11

Weekly downloads
-
License
ISC
Repository
-
Last release
11 days ago

工具库

正在完善中……

const str = 'https://qshfu.com/lib?v=1.0'
str.before('?') // 'https://qshfu.com/lib'
str.before('//', '?') // ['https:', 'qshfu.com/lib']
'https://qshfu.com/lib?v=1.0'.after('?') // 'v=1.0'

random() // 6
random(10, 29) // 18
random(10, 199) // 123

'sum(1+1+sum(2+3))+sum(2+4)'
        .replace2(/sum\([^]*?\)/g, {m: 'sum', '*': /\+/g})
        // 'm(1*1*sum(2*3))+m(2*4)'
        
'sum(1+1+sum(2+3))+sum(2+4)'
        .replace3({prev: 'sum', start: '(', end: ')'}, {m: 'sum', '*': /\+/g})
        // 'm(1*1*sum(2*3))+m(2*4)'
        
[1, 2, 3, 4, 5].forEachReverse(i => i === 2 ? false : console.log(i)) // 5,4,3
[1, 2, 3, 4, 5].forEach2(i => i === 4 ? false : console.log(i)) // 1,2,3

const data = {}, key = {}
data.$set(key, '123')
data.$get(key) // '123'

isEmpty({}) // true
isEmpty({}, {qwe: 123}) // false

new Date('2022/01/01').format('yyyy-MM-dd 周D')
// '2022-01-01 周六'

isObject(undefined) // false

class StatusEnum extends Enum {
    RESOLVE = 1
    REJECT
    
    constructor() {
    
        super().init()
    }
}

const status = new StatusEnum()

status[status.REJECT] // 'REJECT'

class Main extends Singleton {

    constructor() {

        super()
    }
}

new Main() === new Main() // true
// 使用create可能会创建失败,推荐使用异步版本createId
let id
id = create()
id = create()
id = create()
id = await createId()
id = await createId()
id = await createId()
// 递归删除文件夹
rmdir('./tmp')
// 解析url参数
u2o('localhost?qwe=123&asd=456&code') // { qwe: '123', asd: '456', code: 'code' }
// 简单的加解密
const key = createKey('abc123')
const data = encrypt({name: '张三', age: '21'}, key).toString()
console.log(decrypt(data, key))
// 或者
const data = Buffer.from(JSON.stringify({name: '张三', age: 21}))
const key = Buffer.from('abc123')
console.log(XOR(data, key).toString())
console.log(XOR(data, key).toString())
// 封装了加密类
new Cipher

实例文件test.mjs

运行指定版本

目录结构

folder ┳ 0.1 ┳ index.mjs // 入口、必需
       ┃     ┗ ...
       ┣ ...
       ┣ 2.1 ┳ index.mjs // 入口、必需
       ┃     ┗ ...
       ┣ node_modules // 共用库
       ┗ package.json
// ./index.mjs 入口文件,需要和版本文件夹同目录,版本文件夹内一定要有index.mjs文件
// import {} from "tools2/version.mjs"; // 没有指定版本会在目录中通过文件夹名找最新版本
import {} from "tools2/version.mjs?v=2.0&e=index.mjs";
// import {} from "tools2/version.mjs?version=2.0&entry=index.mjs";

轻量级的代理工具

import {createProxy} from 'min-proxy'

createProxy({
    map: {
        '/target': 'http://domain/',
        '/': '/dir',
        'http://domain2/': 'http://domain3/'
    },
    port: 80,
    httpsOptions: {
        key,
        cert
    },
    preReq: (req, res) => false,
    preRes: (req, res) => false,
})

封装express

import {Base, Express} from "tools2/router.mjs";

const app = new Express({
    port: 8080,
    callback: () => console.log('running...')
})

class Test extends Base {

    cache = 0
    // 当提供3个参数的函数实现时则加入认证队列
    AUTH(req, res, next) {

        console.log(req.headers)

        next()
    }

    get path() {

        return super.path + '/test'
    }
}

class Admin extends Test {

    id = 0

    AUTH(req, res, next) {

        console.log(req.cookies)
        console.log(req.query)

        next();
    }

    async GET(req, res) {

        res.end(this.view) // new Express({root: 'wwwroot'}) 与 root 参数有关 
        
        // 服务器端渲染,每次访问都会重新计算渲染,会增加服务器负担,建议权限控制较高使用不频繁的场景使用
        // this.render(this.view, {})
        // /<script server>[^]*?<\/script>/g 支持服务器端脚本 <script server>write(`<b>hello~${data.qwe}</b>`)</script>
        // /{\/[^]*?}/g 支持服务器端引入 {/com/head.html}
    }

    async POST(req, res) {

        await this.queue() // 必须和this.pass()成对使用

        res.end(`id: ${this.id++}`)

        this.pass() // 必须和this.queue()成对使用
    }

    get path() {

        return super.path + '/admin'
    }
}

app.use((req, res, next) => res.setHeader('Access-Control-Allow-Origin', '*') && next())

app.use(Admin)
// app.use(new Admin())
// app.load('./lib')

将mjs的库打包

*重要

1、打包时候node版本要对应

2、使用--experimental-vm-modules模式

> node --experimental-vm-modules index.mjs

结构

root ┬ lib1 ┬ index.mjs
     │      ├ data.json
     │      └ ...
     ├ index.mjs // 编译后生成
     └ ...

实例

import {build} from 'tools2/module.mjs'

build('lib1', 'index') // 打包

import {} from './lib1/index.mjs' // 开发模式

import {} from './index.mjs' // 生产模式,打包后

支持开发代码

let env = 'prod'
// IF DEV
env = 'dev'
// END DEV
console.log(env) // 开发模式:prod;生产模式(打包后):prod

Note:

class Base {
    /**
     * 定义成员函数,制定规则
     * @param {any[]} arg
     */
    func(...arg) {

        if (this === undefined) return

        // init

        this.func = (...arg) => {

            // todo
        }

        this.func(...arg)
    }
    /**
     * 定义成员变量,提供工具
     * @param {String} key
     * @param {Function} init
     */
    define(key, init) {

        Object.defineProperty(this, key, {

            get() {

                const value = init()

                Object.defineProperty(this, key, {

                    get() {

                        return value
                    }
                })

                return value
            },

            configurable: true
        })
    }
}

硬件信息

import {cpu, mem, sys, node, disk} from 'tools2/info.mjs'

console.log(cpu()) // 处理器信息
console.log(mem()) // 内存信息
console.log(sys()) // 系统信息
console.log(node()) // node版本信息
console.log(disk()) // 硬盘信息

mysql ssh 连接

import Query from 'tools2/mysql2ssh2.mjs'

const query = new Query({...}, {...})

query`SELECT * FROM t_test`.then(...)

query.close()

微服务功能

基于tcp或者udp连接

tcp支持集群

import cluster from 'cluster'
import {cpus} from 'os'

if (cluster.isPrimary) {

    cpus().forEach(() => cluster.fork())

} else {

    // todo

    console.log(`Worker ${process.pid} started`)
}

udp

import {udpService, tcpService} from './index.mjs'
const pools = {
    s: {test: 'localhost:9000/test'}
}
// 9000端
const s = udpService(pools, {port: 9000, callback(path, data, next) {

    next('9000')
}})
// s.close()
// 9001端
const map = new Map
map.set('/test', data => new Promise((resolve, reject) => reject('9001')))
udpService(pools, {port: 9001, map}).s.test().then(r => console.log(r.toString())) // '9000'

tcp

const pools = {
    s: {test: 'localhost:9000/test'}
}
// 9000端
const map = new Map
map.set('/test', data => '9000')
const s = tcpService(pools, {port: 9000, map})
// s.close()
// 9001端
tcpService(pools, {port: 9001, callback(path, data, next) {}})
    .s.test().then(r => assert.equal(r, '9000')) // '9000'
1.9.11

11 days ago

1.9.10

13 days ago

1.9.9

14 days ago

1.9.8

14 days ago

1.9.7

14 days ago

1.9.6

1 month ago

1.9.5

1 month ago

1.9.4

1 month ago

1.9.3

1 month ago

1.9.2

1 month ago

1.9.1

1 month ago

1.9.0

1 month ago

1.8.3

1 month ago

1.8.2

1 month ago

1.8.1

1 month ago

1.8.0

1 month ago

1.7.0

2 months ago

1.6.0

2 months ago

1.4.6

2 months ago

1.5.0

2 months ago

1.4.5

3 months ago

1.4.4

5 months ago

1.4.3

5 months ago

1.4.2

5 months ago

1.4.0

6 months ago

1.3.17

6 months ago

1.3.13

7 months ago

1.3.14

7 months ago

1.3.15

7 months ago

1.3.16

7 months ago

1.2.0

12 months ago

1.1.0

12 months ago

1.3.7

11 months ago

1.3.6

11 months ago

1.3.5

11 months ago

1.2.6

11 months ago

1.3.4

11 months ago

1.2.5

11 months ago

1.3.3

11 months ago

1.2.4

12 months ago

1.3.2

11 months ago

1.2.3

12 months ago

1.3.1

11 months ago

1.2.2

12 months ago

1.0.4

12 months ago

1.3.0

11 months ago

1.2.1

12 months ago

1.3.10

10 months ago

1.3.11

10 months ago

1.3.12

9 months ago

1.3.9

10 months ago

1.3.8

10 months ago

1.0.2

1 year ago

0.9.12

1 year ago

1.0.1

1 year ago

0.9.14

1 year ago

0.9.15

1 year ago

0.9.10

1 year ago

0.9.11

1 year ago

0.9.16

1 year ago

0.9.17

1 year ago

0.9.18

1 year ago

1.0.3

1 year ago

0.9.19

1 year ago

0.9.9

1 year ago

0.9.8

2 years ago

0.9.7

2 years ago

0.9.6

2 years ago

0.9.5

2 years ago

0.9.4

2 years ago

0.9.3

2 years ago

0.9.2

2 years ago

0.9.1

2 years ago

0.9.0

2 years ago

0.8.0

2 years ago

1.0.0

2 years ago